Projects
Entered
2026-10-03
First commit
2026-10-03

Scoreboard

App · live scoring · club hall

Every table’s score on one big screen, live, scored from any phone.

A live scoreboard for sports clubs running several tables at once. Four screens in the browser — the big screen, the umpire console, the organiser console and the spectator view — share one Durable Object per event on Cloudflare’s free tier, with nothing to install.

  • TypeScript
  • React
  • Cloudflare Workers
  • Durable Objects
  • WebSocket
  • Vitest
Open live (opens in a new tab)Source (opens in a new tab)
Live3 · X · 2026
Drawing: the hall’s big screen showing two live tables and the finished ones, and an umpire’s phone scoring table 3 with a button per player and one to undoLIVETABLE 1Henry010Lopez18TABLE 3Roche29Vidal17TABLE 23–1 · finishedTABLE 43–0 · finishedTABLE 5next · 14:30TABLE 3UMPIRERoche9Vidal7+1+1UNDOSAME POINTon every screen at onceEVERY TABLE, ONE SCREENlive matches take the spaceONE TAP A POINTone more to undo it
Drawn for this register, not a screenshot
Entered
2026-10-03Live
First commit
2026-10-03Scaffold the workspace with the scoring rules and the wire contract
Commits
34on main, read 2026-10-04
Coverage
36%lines run by the scoring rules, the Worker and the screens, read 2026-10-04
House packages
7 of 11installed from npm

What shipped

  1. Each umpire scores their own match from whatever device is at hand, and every match in progress shows up on one big screen across the hall.
  2. One Durable Object per event keeps the ordered scoring events in its own SQLite storage and fans them out over WebSocket.
  3. Points scored while offline are queued and resent on reconnect, and a mistake is undone in one tap.
  4. Scores, the server and timings are all derived from the events, so the organiser can fix a wrong score or move a match to another table live.
  5. Table tennis is the first ruleset; the scoring rules are pluggable so other sports can follow.

How it works

one log per event, every screen replays it

Diagram: one Durable Object per event keeps the ordered log of points; the umpire’s phone and the organiser write to it, points queued offline are resent, an undo is one more event in the log, and the big screen and the spectators’ phones each get every event over a WebSocket and replay the scores from the logUmpireany phonequeued offline, resentOrganiserfixes it liveDurable Objectone per event+1 Roche+1 Vidal+1 Vidalundo+1 RocheBig screenon the hall’s TVSpectatorson their phonesa WebSocket eachEvery screen replays the scores from the log.

History

Straight from the git log, abridged: 6 of 34 commits, newest first.

  1. Deploy the worker from CI on every push to main
  2. Keep lime for live states and give long pairs room on the display
  3. Explain the organiser fields a volunteer could hesitate over
  4. Ask for games to win instead of a best-of format
  5. Name a retirement where its score would read 0-0
  6. Scaffold the workspace with the scoring rules and the wire contractFirst commit

Installs

7 of the 11 house packages, from npm, down to the compiler and linter settings.

Your team, 2026

I am looking for my next job. Write to me, or take the CV: a designed one, and a plain one for applicant tracking systems.