The draft was the next morning. Twenty-five coworkers were going to pick their 2026 World Cup brackets together, and there was nowhere good to do it.
The public bracket sites are ad-choked, gated behind accounts nobody wanted to make, or careless with people's data in ways that feel wrong for a group of colleagues. We didn't need scale. We needed a quiet, private place we could trust, ready before kickoff. So I built one that evening.
What shipped that first night
I started from the real constraint: 48 teams, 104 matches, a draft in roughly twelve hours, and a group that would forgive a rough edge but not a broken pick. So night one was about the spine, not the polish.
By the time I went to bed, the core was live:
- Validated 2026 fixtures and a scoring engine. The whole tournament structure, group stage through final, with the bracket derivation and points logic that turns predictions into a leaderboard.
- Passwordless sign-in. Email a code, you're in. No accounts to manage, no passwords to leak, which matters when the users are people you work with.
- Two-step picks. Order each group, then call the knockouts, with a hard lock at the deadline so nobody edits after the first whistle.
- A league leaderboard. The reason anyone plays: see where you stand against the room.
It ran on Next.js, React, and Supabase, with Resend handling the sign-in emails, deployed on Vercel. Nothing exotic. The point was a dependable thing in the group's hands before the draft, not a clever thing.

The morning it had to work
Twenty-five people picked their brackets the next morning. It held. No lost picks, no locked-out logins, no "is this site even safe" in the group chat. That was the only success metric that mattered on day one, and it's the one most side projects skip past on the way to building features nobody asked for yet.
The week I turned a form into a companion
A bracket pool is dull once the picks are locked. The tournament is where it lives or dies. So over the following week I shipped almost every day, and the additions sorted themselves into four jobs.
Make the picks foolproof. Drag-and-drop group reordering, knockout picks broken into gated round-by-round steps instead of one overwhelming tree, and per-match completeness cues so you always knew what was left. The first version worked. This version was hard to get wrong.
Make it live. An in-progress score banner, a match center wired to live data, a native statistics card, and "where to watch" links for each game. Finished matches grew a small verdict dot showing whether your pick came in. The app stopped being a form you submitted and became something you opened during a match.

Make it social. A home dashboard that surfaced your placement, shareable per-user brackets, and a stats page with the things a group actually argues about: who has the safest bracket, who's the biggest risk-taker, which two people are bracket twins. Grounded AI previews and trivia gave each match a little texture without inventing facts.

Make it trustworthy. A fail-closed data feed so a flaky upstream could never corrupt a result the pool had already seen, security hardening on the cron and data routes, and an accessibility pass. Trust was the whole reason this existed instead of a public site, so it got real attention, not a checkbox.
What the constraint taught me
The thing that made this work was the thing that looked like a limitation. Twenty-five coworkers is not an audience you grow. It's an audience you already have. I never had to think about distribution, because distribution was a group chat. I never had to design for strangers, because there weren't any. That freed me to optimize for the one thing a public bracket site can't promise a group of colleagues: this is private, this is simple, and your picks are safe here.
So the night-one build wasn't the smallest thing I could ship. It was the smallest thing that could earn the draft. Then real use, not a roadmap, told me what to build next. The verdict dots, the bracket twins, the live banner: none of those were on a plan the first night. The group reached for them, and I followed.
Ship the smallest thing that earns the moment. Protect the trust that made people show up. Then let real use write the rest of the roadmap.
You can poke around a public demo of the app with the leaderboard, brackets, and stats running on sample players. The real pool stays private, with the real names where they belong: only ever visible to the twenty-five people who drafted that morning.
Related work
Related services
Want to work together?
I help teams ship better products. Let's talk about your situation.
Get in touch