← All work
Live · 2025–Present · Product · Solo build

BarTop.

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

Bar tournaments are run on paper.

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

A bracket engine that doesn't break.

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

Choices I'd make again.

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

Operations brain, builder hands.

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.

Next case study →

MMAWA

AI-powered web app generator. In active development.

Want one of these for your business?

Start a project →

I take on a small number of build engagements per quarter.