Tournament software for bars. Pool, darts, cornhole. Double-elimination brackets that actually work, real-time TV displays that look great on a 55" mounted above the rack, and a credits-based pricing model that keeps it free for the bar's first night.
9
Phases shipped
3
Sports supported
1
Person team
∞
Bar nights saved
The problem
Walk into any neighborhood bar on a Tuesday night and the pool tournament bracket is taped to the wall, half the names are nicknames, and the bartender is somehow keeping score with a Sharpie. It works, badly. Disputes happen. The TV plays a basketball game nobody's watching while the actual sport happening in the room goes unbroadcast.
The existing software for this is enterprise gear built for organized leagues — too heavy, too expensive, too clinical for the kind of bar that runs a tournament because Tuesday is otherwise dead.
The build
The hardest piece of BarTop is the double-elimination bracket engine. Wiring losers to the right losers-bracket slot, handling byes, supporting grand-finals reset — every corner case has a paper-bracket equivalent that the bar staff will spot immediately if it's wrong. I rewrote it three times. Each match carries explicit next_win_match_id and next_lose_match_id pointers, so advancement is one update instead of a recomputation.
On top of that: real-time TV views (Now Playing, Leaderboard, Bracket, Winner) driven by Server-Sent Events, table assignment, score entry with an undo flow for fat-fingered scores, and a credits system gated by Stripe webhooks for monetization.
The decisions
Vanilla JS over a framework. The TV views are mostly read-only and SSE-driven. React would have been ceremony. Plain DOM updates are faster to write, faster to render on the bar's old TV box, and easier to debug in a kitchen at midnight.
Postgres + Supabase over Firebase. Brackets are relational. Queries against a real schema beat denormalized JSON every time. Supabase gave me row-level security without standing up auth from scratch.
Free-tier first. First tournament free, no card. Bars try it on a slow Tuesday before they pay. Credit packs after that. Webhooks verify Stripe signatures, then add credits — no manual intervention.
What it taught me
Every "edge case" in the bracket engine is a Lean Six Sigma defect class. Every undo flow is a PDCA loop. The work I did at GEP and Honda — process maps, audits, root-cause analysis — turns out to be exactly the work a one-person engineering team has to do on themselves. The discipline transfers cleaner than I expected.
BarTop is the product. The proof point is that I shipped it alone.