Case 02 · AI · 2026
Tournament Management App
I built a school ping pong tournament app with Claude Code, mostly in one weekend, and designed each view for where it’s used. The backup needs no app.
- Role
- Designer, product owner and AI builder, with Claude Code · volunteer tournament organiser
- Team
- Claude Code agents building, reviewing and fixing · the headteacher on sign-ups and printing
- from handing Claude Code the brief to a live site
- 18 h
- pivots: outdoors, a paper backup, a games-to-7 switch, a rebuilt sign-up form
- 4
- issues raised by AI reviewers in two rounds
- 110
01
It starts with a wait I remember
I offered to run a school’s ping pong tournament in Madrid: kids and parents on three tables. I used to compete in martial arts, and not knowing was always a bit stressful. When’s my fight? Who’s next? “Find me” tells a kid their group, next match, opponent, and what to do if they lose.
Losers umpire the next match on their table, so Find me says where to stay. Names are fictional test data.
02
The admin has one hand free
My phone is the admin console, held at the edge of a table. Tap targets are at least 44 px, score buttons 56. When Carla O. beats Lily B., I tap Carla, then Lily’s points, then Save. Deuce, the cap at 15 and best-of-three finals need no extra screens.
Each button shows the full score it means, so 10 reads as 12–10.
03
Parents glance over from lunch
From five metres, the first big screen couldn’t be read, so it failed review. Tables and up next stay in view, “Warm up” tags mark who’s called soon, standings and brackets rotate beside them, and there’s always a QR code.
The big screen in play, on test data. Only the right-hand panel rotates.
04
Claude wrote it, I made the calls
I handed Claude Code the brief on Friday 23 October. It was live by Saturday afternoon. A simulation put games to 11 at about 168 minutes, against a 135-minute window. I kept 11, with a switch to 7 if the day runs late. Claude spotted that switching would block correcting an earlier 11–5, so every match remembers its rules.
One web app on Firebase’s free plan. Its tournament logic never touches Firebase, so the backups follow the same rules.
05
Correct numbers can still mislead
When 26 real sign-ups came in, I imported them into a practice run, checked everyone in, and every division said “0 players checked in”. I told Claude I’d found a bug. I hadn’t: the check-ins had saved, but nobody was in a division yet. Now the draw page says so and links to Divisions.
The fixed draw page, recreated on test data, so it counts 31 players rather than 26.
06
The backup needs no app at all
What if the app stops at 11:45? I’d asked for a fallback in passing, picturing blank brackets. Claude came back with a three-step plan, a spreadsheet that writes “Check” when a three-way tie is only partly split, and a paper pack for any helper. One of the headteacher’s first questions was about paper. It already existed.
The bracket names slots, so it works before anyone has won.
Looking back
Put the backup in the brief. Mine arrived as an aside on day two, and it’s the piece I trust most. It fitted in late only because the rules didn’t depend on the database. Ask for it first and you’ll build that way on purpose.