Skip to content
Andrii SavenkoAll systems operational

What I’ve shipped

I don’t list technologies.
I show where they sit.

Courier features at Flink, DevOps for Fujitsuat Gemeente Groningen, tech lead on a device control plane. Below is every system I’ve shipped — open one to see the request path and the problem that shaped it.

5products shipped
3live in production
2owners run it themselves
5+years, commercial

Services

Click a row to open its architecture

anne-studio.com2026Trilingual booking · admin · transactional email

Request path

BROWSEREDGE / SSRBOOKING APIFIRESTOREMAIL QUEUERESEND
Race condition

Two clients tapping the same slot in the same second

Impact

A double-booked chair means one client is turned away at the door — and the owner only finds out when both show up.

What I did

The booking's own key is the lock: the document id is {date}_{time}, written with create() that fails if it already exists. Uniqueness comes from the key, so no transaction is needed; the second request gets a 409.

Trade-off

Manual entries use an auto-id, so the owner can deliberately double-book when real life calls for it — the invariant holds on the public site and bends for the human.

Next.js 16React 19TypeScriptFirestoreResendnext-intl
chaterbox2025Device control plane · live telemetry · tech lead

Request path

PI FLEETDEVICE APIPOSTGRESSTATUS CACHEDASHBOARD
Read consistency

A dashboard that live-polls every device falls over at a hundred devices

Impact

Polling each Raspberry Pi on every page load ties the UI to the slowest, flakiest device on the shop floor.

What I did

Two-tier status: the list reads a cached online/offline flag (instant), and full telemetry is fetched on demand only when you open a single device.

Trade-off

The cached flag can be briefly stale — a device that just dropped still shows online until the next heartbeat. I chose staleness over a UI that doesn't scale.

ReactNodePostgreSQLPostGIS
blink2025WhatsApp-verified order pipeline · bilingual NL/EN

Request path

BROWSEREDGE FNWHATSAPP APIORDER APISUPABASE
Untrusted input

Orders from strangers with unverified phone numbers

Impact

A cleaning crew driving to a fake address loses a morning. At launch volume, a couple of those a week would sink a new business.

What I did

The phone number is verified over WhatsApp before the order enters the pipeline, and the same number carries the order's lifecycle updates. Phone is the primary identity; email is optional.

Trade-off

Friction moves before the order is created, not after. A few people drop at the gate; no crew drives to a fake address.

Next.jsTypeScriptSupabaseWhatsApp APInext-intl
devotament.ro2026Self-serve platform · owner publishes projects

Request path

OWNERADMIN APIFIREBASECLOUDINARYVISITOR
Lifecycle coupling

A furniture maker who couldn't publish a project without a developer

Impact

Before the rebuild, every new project meant emailing me. New work sat unpublished for weeks and the site aged.

What I did

The owner runs a thin admin; images go through Cloudinary with each file's lifecycle tied to its database record — delete a project and its images are deleted too. Everything a visitor sees is server-rendered; keys never reach the browser.

Trade-off

A hosted media pipeline instead of self-hosting image processing — a monthly dependency in exchange for never being the owner's bottleneck.

Next.jsTypeScriptFirebaseCloudinaryVercel
hair-studio-one2024First commercial build · booking by email link

Request path

CLIENTEMAIL LINKVERIFY TOKENFIRESTOREOWNER ADMIN
No-account booking

Clients who will never make an account just to cancel

Impact

Cancellations came by phone at 9pm, or not at all — empty chairs the owner learned about when nobody walked in.

What I did

Every booking carries a tokenized one-time link in its confirmation email. Cancelling is one tap, no login, and the slot returns to the calendar.

Trade-off

A signed link is a weaker secret than a session — so it's scoped to a single booking. The blast radius is one haircut.

ReactFirebaseFirestoreEmail
✓anne-studio.com — in production · booking, admin, transactional email
✓devotament.ro — the owner publishes projects without a developer
✓hair-studio-one — original offline; booking flow rebuilt as a live demo

Have something that has to survive the handover?

Tell me the problem in two sentences. If I’m not the right fit, I’ll say so in the first reply.