Web Applications
Fourth Quarter
Built by Randolf Agbayani
A one-thumb basketball stat keeper for our inter-department league, because I was the volunteer statistician and paper cannot keep up with a fast break.
Builder email verified
Verification

- Type
- Personal
- Category
- Web Applications
- Published
- Jul 26, 2026
- Updated
- Jul 26, 2026
About this project
- What I built & why
Our office league plays Wednesday nights, and I inherited the statistician role the way these things happen — I kept score once and was never released from the duty. The paper system collapsed every game: by the second quarter the sheet was a smear of tally marks, and the postgame argument about who scored what outlasted the postgame meal. I decided that if I was going to be the league's record keeper, the records were going to be worth keeping.
- The problem
Record basketball events at game speed, standing courtside, holding a phone in one hand and usually a drink or a whistle in the other. Every event has to land in two taps or fewer, and mistakes have to be correctable in the moment, because a stat keeper who says 'wait, go back' to a live game gets ignored by the game. The users are me and whoever gets conscripted when I'm playing.
- What I owned
Everything — the event model, the interface, the box score generator, and the league's historical record, which now spans two seasons and lives in an export I guard with appropriate solemnity. Also the printing, physically, at the office printer on Thursday mornings.
- Technical & product decisions
The core design is an append-only event stream with an undo stack, because I learned within one game that fat-fingering is not an edge case, it's the primary case — the interface is built around tap-tap-undo-tap as the expected rhythm, with the last five events visible for instant correction. Rebounds default to the team with optional player attribution afterward, since credited rebounds at game speed are fiction anyway, and I'd rather record less and have it true. I rejected accounts, logins, and cloud sync entirely: it's a PWA that works courtside where the signal is bad, and the box score renders to a print stylesheet, because the league's real user interface is a sheet of paper taped to the pantry refrigerator on Thursday.
- Hardest challenge
Designing tap targets for adrenaline. My first layout was accurate when tested calmly at my desk and useless during an actual fast break — buttons too close, sequences too long, my thumb landing on 'turnover' when a three-pointer went in, which nearly caused the incident the app was built to prevent. I rebuilt the layout around thumb reach with the most frequent events largest and centermost, tested it by simulating game pace against recorded footage, and the error rate stopped being a topic.
- Result & impact
Two full seasons, forty-plus games, every one with a complete box score — the league has a records page now, and the postgame arguments have moved up an abstraction level, from 'who scored more' to 'whether assists are being counted generously', which I consider civilizational progress. Two other floors' leagues asked for it and run their own instances. My own stats are in there too, unflattering and undoctored, which is more than can be said for the karaoke system.