A playground for trying things properly.

11 products I build and run outside my main role, some alone and some with friends or colleagues. Each started as a question, whether a stack could really carry a problem, and most kept going: real users, real data, and a support rota of one.

11Side builds
5Languages shipped
20+Client surfaces
8Live in production

Infrastructure I run, 30 days to 8 Oct 2026

28.5Mrequests served
4.39MWorker invocations
25Worker errors
3.3 msCPU time, p90

Every zone and Worker on my Cloudflare account, client work included — not traffic to the products below. Read from the analytics API at build time.

Cloudflare account analytics for the last 30 days: 45.48M total requests,
                  2.33M Worker invocations, 3 Worker errors, 56.14% cache hit rate, 3 ms CPU time p90
Cloudflare dashboard, same account and window. The figures above are read from the API on each build, so they drift a little from the capture.
SarmaPlayerManaged IPTV platform

A managed player for IPTV subscribers, built as a platform rather than an app: native TV and mobile clients, a zero-install web player, an owner dashboard and a staff operator console.

One API behind many clients.

cryptographic device identityoffline licence verificationadaptive playback
Open
Active JoinOperating system for jiu-jitsu academies

Gyms lose members quietly — people drift off the mat weeks before anyone cancels.

A single GraphQL API over modular services, with authorisation enforced at field level so six audiences share one schema instead of one API per role.

field-level GraphQL authorisationStripe Connect three-way billingidempotent webhook reconciliation
Open
Photo TrimiPhone photo library manager with USB backup

For people whose photo library outgrew their phone: browse 80,000 photos at 120fps, see at a glance what is on the device versus stranded in iCloud, clear whole months at once, and copy straight to a USB drive without a computer in the middle.

A native engine with an app around it.

thermal-aware background workmulticore enumerationadaptive batching
Open
My Photo CopyVerified photo backup to a drive you own

Photo Trim decides what you can delete.

The same native core as its sibling, pointed at a different promise: a job engine that copies originals to an external volume and then reads them back to check them.

SHA-256 verification passesper-drive manifestsincremental re-runs
Open
MammitoMulti-tenant care platform

Families searching for a midwife find one in a verified catalogue by postcode and service, book and pay for the appointment, and meet in an encrypted browser consultation with nothing to install.

One modular API serving several host-routed frontends, with the tenant boundary pushed down into the database rather than enforced by convention in application code.

database-enforced tenant isolationmulti-tenant routingprovider-agnostic video
Open
WiesnScoutSeconds-level availability monitor

Oktoberfest tables sell out months ahead, so the only real supply is cancellations — and they are gone in under a minute.

An edge-resident watcher feeding an alert path, with detection, deduplication and delivery as separate stages so latency can be measured and bounded at each one.

sub-minute change detectionself-healing schedulerfail-closed error semantics
Open
Content StudioHeadless publishing platform and editorial app

A publishing platform born out of a rescue: a long-running news site on a legacy PHP stack, with roughly 100,000 articles, 65 GB of media and two decades of search ranking that could not be put at risk.

Headless: a read-mostly public API with a statically generated reader in front of it, and the editorial application as a separate client.

100K-row content migrationURL / SEO equity preservationcanonical content model
Open
CBCameraBridgeSelf-hosted camera platform

Consumer cameras keep your footage behind someone else's subscription.

A module-first backend with camera vendors behind a provider contract, so supporting a different kind of camera is an adapter rather than a rewrite.

vendor-neutral adaptersrate-limit disciplinelocal video inference
Open
PointPalReal-time estimation for agile teams

Planning poker that holds up in a real session: persistent rooms, owner and host controls, rounds with reveal and reset, reactions and an activity feed — and state that survives a refresh, a dropped connection or a laptop closing mid-vote..

One durable coordinator per room makes each session a single-threaded authority, which removes distributed locking and split-brain votes from the problem instead of solving them.

Durable Object state machineWebSocket reconnectiontyped message protocol
Open
LWLive WallAmazon Vega OS demo app — a live photo wall for a conference booth

A demo app for Amazon Vega OS, the new Fire TV operating system, built to show it at the next.app devCon 2026 booth in Berlin.

A Vega OS TV app as the centrepiece, with two supporting pieces around one typed contract: a phone page with a hidden booth view, and an edge API.

Amazon Vega OSReact Native on Fire TVconference demo app
Open
SkiWillaConcept build — product design, brand and marketing site

Booking and scheduling software for ski schools and outdoor instructors, taken far enough to judge whether the product is worth building: positioning, feature architecture (dispatch calendar, POS with Austrian and German fiscal compliance, wallet ticketing, shop widgets, accounting exports), brand, copy and a marketing site — without writing the application behind it..

Deliberately no application: a prerendered site over a design system with the brand as a swappable layer, built to answer a product question rather than to run.

design researchTailwind v4 @theme tokensper-locale static prerender
Open

The stack behind them

None of this is CV padding. Every technology here is running one of the builds above right now. I picked each one for a specific problem, then lived with it long enough to know where it hurts.

Languages

TypeScriptSwiftKotlinSQL7Python

Frontend

React 193React Native4Expo4Astro3Vite7TanStack Query / Router / StartApollo ClientTailwind v43Radix4Skiai18next / Lingui

Native

Jetpack Compose TVReact Native for Vega OS (Fire TV)SwiftUIMedia3 / ExoPlayerAVPlayerVLCKitPhotoKit2Neural Enginecustom Expo modulesStoreKit2Room / DataStore

Backend

Node 243Bun2Hono10GraphQL (Pothos)REST + OpenAPIZod6Drizzle8Better Auth + passkeys2BullMQWebSockets2

Data

PostgreSQL4row-level securitySQLite / D1Redis2Durable Objects3R2 / S3full-text search

Infra & delivery

Cloudflare Workers / Pages / KVDocker2self-hosted VPShome server deploymentGitHub Actions3EAS build & OTATurborepo3pnpm / bun workspaces

Money & comms

Stripe2Stripe Connect2Resend2React EmailWeb PushExpo push

Media

LiveKitDailyKrispffmpegHLS / MPEG-TSsharp