03 / 2026 · DESIGN + BUILD
Quiniela World Cup
Built for internal company use—a corporate World Cup pool for 2026 with group predictions, knockout bracket, and live ranking instead of spreadsheets.
The problem
Our team wanted a World Cup pool that felt official, not a shared spreadsheet with broken formulas and disputed standings. The 2026 format—48 teams, best-third-place math, dynamic knockout slots—was too easy to get wrong by hand. It had to work for internal company use only: coworkers with company Google accounts, one trusted ranking, and admins who could enter results without redeploying the app.
What I built
Quiniela World Cup was created as an internal quiniela for my organization ahead of USA/MEX/CAN 2026. Employees sign in with Google, predict group scores and knockout winners, and follow live tables and the company leaderboard as match results land. Access is limited to the corporate email domain; branding and app name are configurable so it reads like an in-house product, not a generic side project. The same codebase doubles as a white-label template: demo mode runs from bundled seed data with no database, while production uses Supabase (Auth, Postgres, RLS) and a full admin panel for results, scoring rules, and global recalculation. Source: github.com/Cartagena2001/quiniela-moovit
Technical choices
- Tournament engine in TypeScript (
lib/tournament/) — FIFA group tiebreakers, 495 third-place combinations, bracket resolution (1A,W73,3ABCDF), and global recalculate when results change. - Next.js 16 + Tailwind 4 for app shell, calendar, groups, knockout rounds, and autosaved predictions.
- Supabase for Google OAuth, Postgres, domain-restricted access (
allowed_email_domain), and configurable scoring rules without redeploying. - Tests on the hard parts — standings, bracket resolver, and scoring so rule changes do not silently break the pool.
What I'd do differently
I'd ship a read-only public leaderboard earlier. Even on an internal pool, people wanted to share progress in Slack before I had a simple export or embed story.
Outcome
What started as a company-only World Cup pool became a deployable template: restrict sign-in to your domain, brand via env vars, seed from the bundled dataset, and hand admins a single place to run the competition. Open source on GitHub for other teams who would otherwise default to a spreadsheet.
SCREENSHOTS