Sofia, Bulgaria Software engineer

I build the seam between physical hardware and language models.

Firmware on the bench, a database nobody else hosts, and an MCP server so an agent can read both. The last mile is a wire, a soldering iron, or a PDF nobody thought was machine readable.

Years shipping software
11
Repositories of my own
5
Tests in one firmware gate
167
Vendor lock-in
none
01 — Selected work

Things you can read the source of.

Most of what I ship lives in private repositories. Four of these you can open today; the other two are here because the problem is worth describing.

Embedded · firmware Private

Fleet firmware that has to survive the field

ESP32 nodes reporting over a flaky uplink, where the interesting part is the gate: Python pipeline tests, the committed intermediate representation revalidated without a network, the C rules modules run against host harnesses, the dashboard renderer exercised against a stub DOM, and finally the whole sketch cross-compiled for the target. Only the last step catches a missing extern "C" — every host test is C on both sides of the call.

Outcome Release confidence without a lab full of hardware.

  • C
  • ESP-IDF
  • arduino-cli
  • Python
Reverse engineering homebridge-tapo

Devices the vendor never exposed

TP-Link ships a cloud “Things” API that HomeKit can’t see. I mapped the undocumented endpoints, wrote the research down, then turned it into a Homebridge plugin — including the IR hub, whose LAN path is blocked by a pairing-time device password, so the cloud path with a signed request is the one that works.

Outcome Hardware I own, controlled by the system I chose.

  • TypeScript
  • Homebridge
  • Protocol work
MCP · open source equibles-api

An API shaped for agents, not dashboards

A read-only HTTP surface over that database: SEC filings, XBRL financials, 13F holdings, insider and congressional trades, short interest. Every endpoint answers the question an agent actually asks, and none of them let it write.

Outcome A model that cites filings instead of guessing at them.

  • Python
  • MCP
  • FastAPI
Data platform Private

Market data you actually own

A self-hosted Postgres with ParadeDB on a single VPS: ingest pipelines, migrations, full-text and vector search over filings, and a query layer thin enough to run on a €5 box.

Outcome Years of history, no vendor, no per-seat pricing.

  • Postgres
  • ParadeDB
  • Coolify
  • Hetzner
Local inference mflux-playground

Image models with no API key

Flux on Apple Silicon: a web UI, LoRA training runs, and a job queue wrapped around a FastAPI service and an ASP.NET Core host. Everything stays on the machine it runs on.

Outcome Generation, training and experiments on a laptop.

  • Python
  • C#
  • React
  • Apple Silicon
Platform compatibility fitnotes-research

An app that has to open someone else’s database

FitNotes users have years of training history in a file format nobody published. I mapped it, then rebuilt the app on Expo so the same data opens unchanged — offline by default, analysis on the device, no account anywhere.

Outcome Switching apps stops meaning abandoning the history.

  • Expo
  • React Native
  • Java
02 — Under NDA, described by outcome

The work I can’t link to.

Client and company systems. No repository names, no screenshots — just what changed.

  1. A

    A logistics integration that stopped being a spreadsheet

    Monthly reconciliation by hand, replaced by a service that reconciles continuously and complains loudly when reality diverges from the plan.

  2. B

    A device fleet with a test gate instead of a prayer bench

    Firmware, host tooling and visualisation moved into one pipeline, so a regression is caught on a pull request rather than on a customer site.

  3. C

    An analytics stack a single person can operate

    Self-hosted, containerised, backed up and monitored. It has survived an unclean database stop without losing a migration.

  4. D

    Agent access to systems that were never designed for it

    Thin, read-only, well-typed surfaces in front of legacy data — so an assistant can answer questions and cannot break anything.

03 — Approach

Measure, then change.

01 Reproduce before you fix

A bug I can’t make happen on demand is a rumour. First a failing test, then the smallest change that turns it green.

02 Fix the seam before the boxes

Interfaces, data shapes and who owns what outlive every implementation behind them. I settle those in writing first, then let the modules churn inside the line I drew.

03 Every change reversible

Backups, migrations and the test gate are not paperwork — they are what makes an ambitious change safe to attempt. The exits are built before the feature.

04 Prefer the boring tool

Postgres, a shell script and a single binary beat a diagram of nine services. Complexity has to earn its place.

04 — Stack

What I reach for.

Languages

  • TypeScript
  • Python
  • Rust
  • C#
  • C

Systems

  • Postgres · ParadeDB
  • Docker · Coolify
  • Hetzner · Linux
  • ESP-IDF

AI surfaces

  • MCP servers
  • Anthropic & OpenAI APIs
  • Local inference
  • RAG over filings

Testing

  • Playwright
  • pytest
  • C host harnesses
  • arduino-cli cross-compile

Leading

  • Hiring & onboarding
  • Design review
  • Roadmaps & scoping
  • Mentoring
05 — Contact

Have something that talks to the
physical world?

Contract work, a strange integration, or a device that needs a better interface than the one it shipped with. I read everything.