← back

Fuzz2026

TypeScriptSupabaseReal-time

My friends and I kept trying to make the tennis majors more fun to follow together, and a one-shot bracket filled out before day one never survived contact with the first upset. So I built Fuzz: a pick'em league where you predict every match individually as the draw unfolds. You sign in, join a tournament, and pick winners round by round; picks lock the moment a match goes live, results are scored automatically, and a leaderboard tracks points, accuracy, and the gap to whoever's on top. When a result lands, every open bracket updates in place. No refresh. The whole thing is fronted by Fuzz, a pixel-art tennis ball who hops when you pick and slumps a little when you're wrong. Technically, the app was an exercise in building with deep modules, the central idea of John Ousterhout's A Philosophy of Software Design: small, stable interfaces hiding rich implementations. The bracket module exposes essentially one call (hand it a tournament edition, get back a fully formed bracket) and keeps the fiddly draw-sheet math out of sight. The sync module is deeper still, presenting a handful of plain verbs like "sync this edition" and "evaluate picks for this match" over a whole external tennis-data integration. Pages, by contrast, stay deliberately shallow: they compose those interfaces and hold no logic of their own. The payoff shows up during a tournament, when the app mostly runs itself. A pipeline of eight scheduled jobs polls live scores every two minutes, locks picks as matches start, scores everyone the moment a result is final, and emails the league before picks close. I get to just play, and lose to my friends on the leaderboard like everyone else.

view project →
Fuzz 1Fuzz 2Fuzz 3