03 · Personal · 2026
Tally Ho!
Proves
A harness is only finished when someone else can pick it up.
Role
Brief, design direction, decisions and approval
Stack
- Next.js
- React
- TypeScript
- Tailwind
- Zustand
- Zod
- Firebase
- Storybook
- Vitest
- Playwright
- Biome
- Claude Code
- rebuilds it, harness included
- 1 prompt
- from the first commit to the version shown
- 7 days
- decisions written down, each with its reasons
- 30
- to run: no server, no billing account
- $0
The problem
Game night ran on a pencil and a pad, with somebody doing sums between rounds. Paper never lost an argument, but it lost plenty of scores.
The brief: faster than paper, one-handed, with no signal at the table, shared across three phones, and never, ever losing a round.
The move
A prototype first
It started as one HTML file: the look, the sounds and the fox, and an app icon. The agents' job was to port it faithfully, not to invent it.
Priorities, in order
- The family's data is never lost: every score is saved on the phone before anything else.
- Game-night speed: scoring is instant, works offline, and never waits on the network.
- Delight: sound, motion, haptics and confetti, faithful to the prototype.
- Portfolio polish: the demo, the Storybook, the docs.
When two conflict, the higher one wins, every time. One table settled more arguments than any review.
The harness, again
The same move as this site, a size up. A conventions file and two themes of design tokens. A decision log, and a lessons file where every entry is written as symptom, cause, rule. Path rules that load only for the code they cover, eight skills (add a game, a new component, a sync change, ship) and two reviewer agents, one for design and one for sync.
And the part I would keep for every project: the harness checks itself.
The thing itself
Every game ends the way its rulebook says: race to a score, a fixed number of rounds, "Who won?", or open-ended, and any of them can be set so the lowest score wins.
The feel is most of the work. A synthesised sound for every action, with no audio files, audible on a silenced iPhone and handing your music back afterwards. Haptics, including the iPhone's own tick. Suit-shaped confetti, and crowns that drop in.
Fox Trot
Every game becomes a song that tells how it was won. Each round is a note in the colour of the player who won it, and the coda is in the champion's. Rematches get their own soundtrack.
It's silent here. Play the demo to hear it.
The little things
Die-cut stickers, never quite straight. A theme that changes as a circle growing from your finger. A launch screen that hands over to the app without a jump.
The theme, revealed from your finger.
A sticker book. Thirteen to collect.
The launch screen.
Two kinds of visitor. The three of us sign in to one live scoreboard, shared across our phones. Everyone else gets a playable demo with made-up players.
What it took
The sync
- Phone first: every score is saved on the phone, then sent from a queue that survives a restart.
- Frozen when finished: a late round from an offline phone can't change a crowned result.
- Nothing deleted: games are archived, never hard-deleted.
- Both land: two phones scoring at once never overwrite each other.
iOS
Audio that ignores the silent switch without stopping your music. No double-tap zoom, and no text selection on a long press. An app that opens offline after one visit. Each of these cost an afternoon once, and is in the lessons file so it never costs another. One entry, in full: no sound on a silenced iPhone, because the default audio session obeys the switch, so the app claims playback only from a tap that plays a sound, and lets go after six seconds' quiet.
The gates
On every push: every story checked by axe in both themes, end-to-end tests on a phone-sized screen, the database rules tested against an emulator, sync end to end, and the harness check.
The honest part
It's an app for three people. The problems are real (sync, offline, iOS audio); the scale isn't.
Nobody else has run the prompt yet. Until someone does, it's a claim, not a result.
The prompt is long because the first build learned a lot the hard way. That's the point, and also the cost.
The outcome
Game night runs on it now, and the pad is retired.
The part I'd point to is the write-up: the whole build, harness included, as one prompt. It makes the claim of this whole site testable. Run it, and you get your own.