Inspiration

Soccer has been the constant background noise of our friendship for years, watching matches together, arguing over lineups, and always ending up in the same debate: could you actually predict this stuff, or is it all just vibes and gut feeling? The 2026 World Cup landing right in the middle of hackathon season felt like the universe handing us the prompt. We didn't want to build another chatbot wrapper that "predicts" games by asking an LLM to guess. We wanted something we could actually explain, match by match, number by number. So we built a predictor grounded in real statistical models instead of AI: Elo ratings and a Poisson goal-scoring model, the same techniques real sports analysts use.

What it does

World Cup 2026 Predictor tracks the tournament's knockout stage, quarterfinals through the final, and generates win/draw/loss probabilities and predicted scorelines for every undecided match. Click into any match and you get a full interactive lineup: both teams laid out on the pitch by position, every player clickable, showing their tournament stats and a formula-derived "goal probability" for that specific match. A "Player Watch" panel surfaces Golden Boot contenders and MVP candidates, all computed transparently from real tournament data.

Nothing in the prediction engine calls an AI model. Every number on screen traces back to a formula you can read and check yourself.

How we built it

The Elo engine. Each team starts with a baseline rating and updates after every match based on the result and goal difference. A win against a stronger opponent bumps a team's rating up more than a win against a weaker one, and the size of the adjustment is controlled by a K-factor that weights how much a single result should move the rating.

The Poisson model. We convert the Elo gap plus each team's average goals scored and conceded into an expected-goals value for each side. That expected-goals number feeds a Poisson distribution, a standard way of modeling how many random events (goals, in this case) happen in a fixed window, which gives us the probability of every plausible scoreline. Stacking these probabilities for both teams gives us win/draw/loss percentages and the single most likely final score.

The player layer. Golden Boot and MVP scores use a simple weighted formula built from goals, assists, and, for MVP, a boost from the player's team's live win probability. We added a smoothing adjustment so no player on the pitch shows a flat, unrealistic 0% chance of scoring.

We built the whole thing as a React Native / Expo app, with real rosters and match data hand-verified against official sources rather than generated. Every player, club, and stat line on screen is real.

Challenges we ran into

  • Fighting hallucinated data. Early on, AI-assisted scaffolding filled in a plausible-looking but entirely fictional bracket, with teams that had already been eliminated showing up in the final. We had to go back and hand-verify every matchup, roster, and stat against official sources before the app could be trusted.
  • Incomplete rosters under time pressure. Sourcing full, accurate 26-player squads for eight different national teams, live, mid- tournament, turned out to be a much bigger data-entry task than we expected. We prioritized getting the teams still alive in the bracket fully accurate first.
  • Keeping the "why" visible. It would've been easy to just spit out a scoreline. The harder, and more valuable, part was surfacing the Elo ratings and expected-goals math behind every prediction so it reads as reasoning, not a black box.

A note on the commit history: the repo shows an "Initial commit" from a few days before we actually started building. That's from Replit's starter template scaffold, which carries its own pre-set commit timestamp, not from when we personally began the project. All of our actual work is in the commits after that, dated [your real build window, e.g. "July 11-12, 2026"].

Accomplishments that we're proud of

The clearest validation came mid-hackathon: our model predicted the Norway vs. England quarterfinal would end 2-1, and that's exactly how it finished after extra time. It didn't get every detail right (the projected starting lineup for the match wasn't the actual XI either manager fielded), but the core statistical engine called the correct scoreline on a genuinely uncertain match. You can check our commit history yourself: we did not touch the prediction code after kickoff, so this wasn't a lucky retroactive edit. It was a real, timestamped prediction that played out on the field.

What we learned

That good predictions don't need AI to feel smart, they need honest data and math you can defend. And that verifying real-world data during a live sporting event is its own kind of hackathon challenge we didn't fully appreciate going in.

What's next for World Cup 2026 Predictor

Filling out the remaining incomplete rosters, adding historical backtesting against past World Cups to validate the Elo/Poisson approach at scale, and extending Player Watch with defensive stats so the MVP model isn't just goals and assists driven.

Built With

Share this project:

Updates

Submission history