Product, frontend, backend, infra, data — designed, shipped, and operated by one person. Six products in production, and the systems that keep them running.
A live TV graphics studio for football. Directors drive the on-air look from a Next.js console — score bug, line-ups, stats, odds, live radar — over tRPC for the state and a WebSocket service for the wire, with the match feed arriving over MQTT from the engine. Every change reaches the stream in under a quarter second. Runs real broadcasts for streamers and football talk shows — client streams total 20 M+ views a month — and the gallery drives it from physical Stream Deck keys.
The fan-side app, fed by the same event log as the studio. Scores stream over Server-Sent Events into a TanStack Query cache; each match gets one Supabase Realtime channel carrying postgres_changes and presence, with the two rooms routed client-side. Line-up ratings animate through Reanimated worklets on the UI thread.
Everything above — console, radar, phone — runs on one real-time data spine. Built and operated by one person. The radar below is not a video: it is the engine itself, replaying a recorded match through the same MQTT-and-protobuf pipeline that drives it live.
A Node collector holds one MQTT subscription per live match and never stops writing.
Every frame is appended raw to disk before anything interprets it, so nothing is ever lost to a bad parse.
The payload is protobuf. A hand-written varint reader decodes it by push-message code — no generated stubs.
A router queues frames and folds each one into a single state object. Everything downstream reads from it.
The radar is DOM, not canvas: positions become CSS transforms, projected onto a trapezoid in stadium mode.
Commentary tries a template first; only an event no template covers reaches the model, then the voice.
The last piece is what makes the radar above possible: a recorded log is pushed back through the same router and the same handlers as the live feed. Replay is not a separate code path — which is why a match from April looks exactly like a match tonight.
Back-office for a Saint-Martin web studio. A lead landing in Postgres fires a database webhook into a token-guarded route, which runs a PageSpeed and SEO audit and computes a sell score before anyone opens the tab. Event-driven — no cron, no polling — and the writes go through scoped RPC, never the service role key.
Thirteen competitors and forty-four sources watched by an agent where the worker used to be: a scheduled Claude Code task runs three passes — scout, discover, audit — pulling RSS, HTML, pricing pages and crt.sh certificate logs, and chaining short pnpm CLIs for everything deterministic. 2,124 items filed, 2,112 of them carrying the link they came from; the dashboard is read-only, so nothing reaches it without a source.
Direct booking for a villa in Saint-Cyr-sur-Mer. A React and Vite SPA, prerendered for SEO and translated into five locales through i18next, sits on an Express API on Firebase that speaks the Mews Connector API — every call a POST, tokens in the body rather than a header, nothing to refresh. Mews allows 200 requests per 30 seconds, so the client holds itself to 180 with backoff and retries. A paid booking becomes three calls in a row: find or create the customer, add the reservation, attach the external payment — queued with idempotence so a retry can never double-book. Checkout runs on Up2Pay.
Swipe through your camera roll and get the storage back. Every card owns its own Reanimated shared values and the gesture runs in worklets on the UI thread, never JS. Filtering is a native expo-media-library Query — type, year, month, or any custom range. The bin is a zustand queue persisted in MMKV: one tap restores, and the system prompt does the deleting, so nothing disappears behind your back.
I’m a solo founder-engineer based in Saint-Martin, in the Caribbean. For the last several years I’ve been designing, shipping, and operating my own SaaS products — everything on this page, from the pixel to the deployment pipeline, is my work.
Saint-Martin runs on Atlantic time — the same working day as New York, no jet lag, fiber at home. I’ve worked remote-first for my entire career, in English and French. I like small teams, real-time systems, and owning problems end to end.
Not a badge wall — this is how the pieces stack in every product above.