Python developer · Pernik, Bulgaria

I write Python, ship it, and answer the pager when it breaks.

I'm Miroslav. These days I work at Optimal Industries, building tools and integrations on the Beacon Platform for an energy trading client. Before that I spent two and a half years on a live crypto trading project, wiring up integrations and fixing whatever broke in production.

Outside work I build apps like Cue and Snipify. That's where I learn the things the day job doesn't cover.

Now building 2026
Cue

Episode alerts for anime, posted straight to your Discord server.

  • Re-reads every schedule in the background, down to every ten minutes in the last two hours before a show airs.
  • Retries a failed announcement, and never dumps a backlog into your channel after an outage.
  • Switches data source when one goes down, and keeps working from what it already knows when they all do.
Read how it's built →

Selected work

Things I've built on my own time.

Projects I design, build and run myself, so every decision in them is mine to explain.

cue-banner
Newest 2026 · in progress

Cue

Episode alerts for anime, posted straight to your Discord server.

Pick your shows, pick a channel, and Cue posts when a new episode is out. Air dates move all the time, so Cue keeps re-checking the schedule and correcting itself instead of trusting the first answer it got.

  • Re-reads every schedule in the background, down to every ten minutes in the last two hours before a show airs.
  • Retries a failed announcement, and never dumps a backlog into your channel after an outage.
  • Switches data source when one goes down, and keeps working from what it already knows when they all do.
  • FastAPI
  • SQLAlchemy
  • PostgreSQL
  • Redis
  • Alembic
  • Tailwind CSS
  • Discord
Aug to Sep 2026

Woodrich

A bilingual site for a furniture workshop, with a gallery they manage themselves.

  • The workshop adds and rearranges its own project photos, with no developer involved.
  • Bulgarian and English throughout, down to the photo captions.
  • Phone photos are straightened and resized on upload, so nobody has to think about it.
2026 · in progress

This site

Plain pages built on the server, because a portfolio doesn't need anything fancier.

  • Projects, work history and the toolbox are all edited from a private admin panel; nothing is hard-coded
  • Every project has a personal page that tells the story behind it
  • Messages from the contact form land in an inbox with read, archive and search.
Apr to Jun 2026

Snipify

A URL shortener I built so I'd learn every layer myself.

  • Accounts, password reset and activation emails, and a dashboard of every link you have made.
  • Sessions expire after fifteen minutes and renew themselves, so a stolen one is worth little.
  • Per-account limits on each part of the site: tight on sign-in, generous on redirects.

Career

Where I've worked.

Mid Software Developer

  • +Developing software on the Beacon Platform within an ETRM environment
  • +Discussing and creating different API integrations, scheduled jobs, monitoring, and anything that's required to ensure stability
  • +Creating frontend with React wrapper written in Python
  • +Maintaining and extending dependency-graph based caching system

Independent Software Contractor

  • +Built and maintained Python Telegram bot services that formed the user-facing layer of the company's trading platform, handling user input, command flows, and real-time responses for traders
  • +Integrated the bots with the internal backend API and third-party REST services to surface trading actions, account data, and live market information through the Telegram interface
  • +Implemented event-driven messaging with Redis Streams to publish and consume events between the bot layer and backend services, keeping user-facing state in sync with real-time trade and market activity
  • +Managed direct PostgreSQL reads and writes for user message history, scheduled events, and crypto wallet connections linking Telegram accounts to Solana, and built event listeners that triggered notifications and bot actions without polling

Toolbox

What I reach for.

Each tool, and where it shows up in my work.

Tooling

8 tools
  • FastAPI Behind all four projects here.
  • Pydantic Request validation and typed settings in every project.
  • SQLAlchemy Async ORM everywhere; queries live as statics on the models.
  • Alembic Schema migrations for SQLAlchemy.
  • Jinja2 Server-rendered pages for the projects.
  • uv Dependencies and environments, locked, in every project.
  • Ruff Linting and formatting on every commit.
  • pre-commit Ruff and Commitizen checks before each commit.

Integrations

4 tools
  • Discord API Cue's bot: slash commands over REST, with Gateway events to keep the data refresh
  • Discord webhooks Cue's episode announcements and status updates.
  • Telegram API The trading platform's user-facing layer at Soul Systems.
  • GraphQL Reading anime schedules and metadata out of AniList in Cue.

Data and storage

4 tools
  • PostgreSQL Used for all projects, used as the main database.
  • Redis Caching, rate limiting, cross-process locks and health flags.
  • Pillow Validating, resizing and thumbnailing different images.
  • S3 Bucket (Railway) Holds larger files, primarily images for Woodrich's gallery and this site's banners.

Deployment and hosting

5 tools
  • Linux The VPS every one of these projects runs on.
  • NGINX TLS termination and reverse proxy in front of each app.
  • Cloudflare In front of my self-hosted projects.
  • GitHub Actions Deploys over SSH on a push to main, migrations before restart.
  • Railway Used for dedicated database services such as PostgreSQL and Redis and S3 Buckets

Observability

3 tools
  • Grafana Reading Cue's logs and health history in one place.
  • Loki Log aggregation for Cue's two services, shipped straight off the journal.
  • PagerDuty Production incident alerts at Soul Systems.

About

Self-taught, and still at it.

I studied economic informatics at a vocational high school in Pernik, finished in 2023, and had my first developer job by that December. Most of what I know I learned on a live product, where mistakes showed up fast and I had to understand them properly to fix them.

I used to call myself a backend developer. These days that feels too narrow: I write bots, integrations, small tools and the services behind them. It's all Python, and the problem decides the rest.

In my free time I work on cars. It's closer to programming than it sounds: you read the symptoms, make a guess, test it, and change one thing at a time until the fault is gone.

Based in
Pernik, Bulgaria
Languages
Bulgarian (native), English (B2)
Education
Vocational High School of Economics, Pernik
Economic informatics, 2018 to 2023

Contact

Got a Python problem? Tell me about it.

A job, a freelance project, or a bug you can't pin down. Write a few lines and I'll get back to you.