Side project · Built with AI
A single-page explorer for the 2026 World Cup: live group standings, full squads and scouting profiles for all 48 teams, match previews with plain-English breakdowns, in-game win probabilities, real results, and the official knockout bracket. Plus a prediction model I actually backtested.
The live tool, embedded. Tap into any team for its squad and win probability, preview a match, or run the bracket.
Why I built it
The World Cup owns our house for a month. This year we’re all in on Colombia (my wife’s family) and the US, and with it finally on home soil, every match feels must-watch. I’ve watched more group-stage soccer in the last two weeks than in the previous four years, and I’ve loved every minute of drawing up both teams’ paths to the final.
But following along meant bouncing between tabs the entire time. FIFA’s site for the world rankings. ESPN for the bracket. Somewhere else for live scores. Another for the squad lists. Every time I wanted to answer a simple question, “who’s actually favored in this one, and who would they meet next,” I was stitching it together across five sources in my head.
So I built the thing I wanted: one screen that holds all of it, and a model that answers “who wins” with an actual number instead of a gut feel. It runs entirely in the browser. No backend, no login, no app to install.
What it does
All 12 groups, live points, goal difference and form, ordered by FIFA's real tiebreakers (head-to-head first).
A full schedule of fixtures and results. Tap a match for the preview, tap a team to dive into its squad, then back again.
Every player is clickable: strengths and role, club-vs-country form, and World Cup context. 230 stars hand-researched.
Every preview opens with a plain-English read: where the teams stand, what to expect, and exactly what's at stake.
Model win/draw/loss, expected goals, the likeliest scoreline, and a side-by-side of what's driving it.
In-progress games show live score, clock and win probability; finished games show the actual result against the forecast.
The real FIFA structure with fixed slots, third-place placement per Annex C, connector lines, and a click-to-fill predictor.
Pulls the latest scores and standings on every load (or one tap) and recomputes everything — a toast tells you how fresh it is.
The model
Most “who will win” widgets just rank teams by FIFA points. That overstates favorites, because football is low-scoring and underdogs draw all the time. So I built it in two layers.
Each team gets a strength score blending five standardized factors: FIFA ranking points, recent form (weighted by opponent quality), attack and defense (goals for and against, shrunk toward the field average to tame the small sample), and momentum. Because two games of form is mostly noise, the in-tournament factors ramp up gradually over a team’s first few matches while FIFA points anchor it early.
The gap between two ratings sets each side’s expected goals, plus a small edge for host nations. A Poisson grid turns those into win, draw and loss probabilities and the most likely scoreline. This is the part that keeps it honest: even a big favorite leaks real upset probability, which is exactly why a side like DR Congo can hold Portugal to a draw.
Title odds come from simulating the entire knockout tree 3,000 times, settling each tie by its win probability (a drawn knockout goes to a strength-tilted shootout). You can also click through the bracket yourself and watch the odds shift.
Every input is a slider. FIFA weight, form, attack, defense, momentum, the goal rate, even the host edge. You can re-tune the whole model live and watch every prediction recompute.
The honest part
A model you can’t test is just a vibe. So I ran it against the 2022 World Cup, walk-forward, predicting each match using only the data available before kickoff. No peeking at results.
Two things I’ll say plainly. First, on a single 32-team tournament these numbers sit within noise of a plain FIFA-only baseline, so I’m not claiming a crystal ball. The value of the extra layers is sharper, better-calibrated probabilities and realistic scorelines, not magic. Second, 2022 was a wild, upset-heavy tournament, and the model’s biggest misses were the exact shocks nobody saw coming: Saudi Arabia over Argentina, Japan beating both Germany and Spain. When a model’s errors line up with the famous upsets, that’s reassuring, not alarming.
The backtest also killed one of my own ideas. I added squad market value as a sixth factor, certain it would help. It didn’t, it was redundant with FIFA points and slightly hurt accuracy, so it ships switched off by default. Letting the data overrule me was the point.
How it’s built
The whole thing is a single self-contained HTML file, around 210KB, running pure JavaScript in the browser. No framework, no server, no database. The model, the Monte Carlo simulation, the bracket logic, the player profiles and the live-sync all run client-side. It loads instantly and works on a phone.
The bracket follows FIFA’s official 2026 structure down to the 495-combination table that assigns the eight best third-place teams to their slots. Standings use FIFA’s real tiebreaker order. Live data syncs on demand from a public sports feed.
And I built it conversationally, with AI as the pair programmer, which is how I work now: describe the behavior, interrogate the tradeoffs, backtest the claims, ship. The fun part wasn’t the code. It was getting to argue with a model about whether Brazil are really favored against Morocco.