I am Anthony Foussette and this is what I’ve built.

Product, frontend, backend, infra, data — designed, shipped, and operated by one person. Six products in production, and the systems that keep them running.

AST / UTC−4 · FULL US-EAST OVERLAPOPEN TO FULL-REMOTE ROLES, USSEE THE WORK ↓
01
01INPLAY STUDIO

The broadcast control room.

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.

CONSOLENext.js 15 · React 18 · tRPC 10 · TanStack Query · Tailwind
TRANSPORTMQTT 5 · ws 8 · ioredis fan-out · JWT-scoped channels
DATASupabase Postgres · Prisma · NextAuth · Stripe billing
REPOpnpm workspace · web, admin, websocket, Stream Deck, docs
INPLAY STUDIO — PRODUCT FILM
NEXT.JS 15 · tRPC · MQTT → WEBSOCKET · SUPABASE · STREAM DECKIN PRODUCTION
02
02INPLAY SCORE

The same match, from the stands.

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.

APPReact Native 0.81 · React 19 · Expo SDK 54 · expo-router 6
DATATanStack Query 5 · Supabase · react-native-sse · MMKV
UINativeWind 4 · Reanimated 4 · FlashList 2 · react-native-svg
REPOpnpm workspace · 14 packages shared by mobile, web and API
INPLAY SCORE — PRODUCT FILM
REACT NATIVE · EXPO · SUPABASE · SSEIN PRODUCTION
03
03 — INPLAY API + RADAR ENGINE

The engine room.

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.

LIVE RADAR — LOADING THE ENGINE
LIVE RADAR — REAL ENGINE, REPLAYING A RECORDED MATCHMQTT · PROTOBUF · 3D STADIUM
THE PATH OF ONE FRAME
01
Collect

A Node collector holds one MQTT subscription per live match and never stops writing.

wss broker · topic live/m1/{matchId}
Matches discovered by polling a diary
Dropped 30 min after full time
02
Log

Every frame is appended raw to disk before anything interprets it, so nothing is ever lost to a bad parse.

data/matches/{matchId}.jsonl
{ t: epochMs, buffer: base64 }
Append-only, survives restarts
03
Decode

The payload is protobuf. A hand-written varint reader decodes it by push-message code — no generated stubs.

10101 MLive — ball, score, events
10102 stats · 10103 odds
10105 detail · 10106 trend · 10107 timeline
04
Fold

A router queues frames and folds each one into a single state object. Everything downstream reads from it.

Handlers per code, back-pressured queue
Score · chrono · possession · phase
One source of truth, no per-widget fetch
05
Draw

The radar is DOM, not canvas: positions become CSS transforms, projected onto a trapezoid in stadium mode.

2D · 3D score90 · 3D stadium
Trajectories, event cards, match states
Heatmap, pass network, shots, turnovers
06
Speak

Commentary tries a template first; only an event no template covers reaches the model, then the voice.

Template-first, LLM fallback
Streaming TTS over a WebSocket
Stadium ambience ducks under 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.

6
PUSH CODES, ONE HAND-WRITTEN DECODER
3 modes
2D · 3D SCORE90 · 3D STADIUM
Replay = live
SAME ROUTER, SAME HANDLERS — LIKE THE RADAR ABOVE
04–07 — MORE PRODUCTS

Also designed, built, and run by me.

04STUDIO LAGON

Studio Lagon

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.

APPNext.js 16 App Router · React · TypeScript
DATASupabase Postgres · database webhooks · scoped RPC
UIRadix · shadcn · react-hook-form + zod · dnd-kit
REPOpnpm workspace · Turborepo · shared TS and ESLint config
STUDIO LAGON — PRODUCT FILM
NEXT.JS 16 · SUPABASE WEBHOOKS · SCOPED RPC · TURBOREPOIN PRODUCTION
05VEILLEKINÉ

VeilleKiné

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.

AGENTClaude Code scheduled task · 3 passes: scout → discover → audit
TOOLSpnpm CLIs · rss-parser · cheerio · crt.sh · Playwright MCP
DATANeon Postgres · Drizzle ORM · events, pricing, matrix, execs
APPNext.js 15 App Router · Tailwind v4 · Vercel · Resend + Slack
VEILLEKINÉ — PRODUCT FILM
CLAUDE CODE AGENT · NEON · DRIZZLE · NEXT.JS 15IN PRODUCTION
06ONYRA

Onyra

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.

FRONTReact 18 · Vite · React Router 6 · Tailwind · Framer Motion
I18Ni18next · browser detection · Google Cloud Translate
BACKExpress · Firebase Hosting · Firestore · Cloud Scheduler
PMSMews Connector API · rate limiter + backoff · Up2Pay · queued writes
ONYRA — PRODUCT FILM
REACT · VITE · EXPRESS · FIREBASE · MEWS CONNECTOR APIIN PRODUCTION
07SPACEFUL

Spaceful

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.

APPExpo SDK 56 · React Native 0.85 · New Architecture · expo-router
MOTIONReanimated 4 · worklets · gesture-handler · haptics
STATEzustand · react-native-mmkv · FlashList for the trash grid
BUSINESSGoogle Mobile Ads · tracking transparency · no paywall
SPACEFUL — PRODUCT FILM
EXPO SDK 56 · RN 0.85 NEW ARCH · REANIMATED 4 · ZUSTANDSHIPPING
08
Anthony Foussette
08 — ABOUT

One person, whole products.

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.

AST / UTC−4EN + FRREMOTE-FIRSTAVAILABLE NOW
09
09 — STACK

The system, by layer.

Not a badge wall — this is how the pieces stack in every product above.

InterfaceNext.js · TypeScript · React Native / Expo
ServicesFastify · WebSockets · MQTT · protobuf
DataSupabase · Drizzle · Event logs
InfraDocker · Fly.io · Cloudflare Workers
AgentsAI scouting & monitoring agents · TTS pipeline
10 — CONTACT

Hiring for a team that ships?

hello@anthonyfoussette.com
RESUME (PDF) ↓GITHUBLINKEDIN
© 2026 ANTHONY FOUSSETTEANTHONYFOUSSETTE.COMSAINT-MARTIN, CARIBBEANEN / FR