I Built a World Cup Pool Tracker So My Friends Can See Me Lose in Real Time
Every four years, my friend group runs a World Cup pool. The format is simple: everyone gets randomly allocated a bunch of countries, and you earn points as your countries progress through the tournament. The more games your countries win, the more points you accumulate, until eventually someone’s Argentina or France makes it to the final and that person becomes insufferable about it for the next four years.
This year I decided to build a website for it. Naturally, it escalated.
The result is kickpool.ohare.id.au — a real-time tracking site showing live scores, group standings, the friend leaderboard, and AI-powered match predictions. Built in a couple of weekends, deployed on AWS Amplify, and ready just in time for the tournament to prove me wrong about everything.
The Allocation
Eight friends, 48 countries, roughly 6 countries each. The draw was random, which means Ben somehow ended up with Morocco, Paraguay, and Australia while Jake ended up with Germany, Ivory Coast, and — critically — England. Whether that’s a blessing or a curse depends entirely on how the tournament goes and how much emotional investment you have in watching England exit on penalties.
My own haul: South Korea, Czechia, Scotland, France, Argentina, Algeria. This is either a very good draw (France, Argentina) or a very bad draw (Scotland) depending on how you weight hope against lived experience.
Why Build a Site
Primarily because tracking 48 countries across WhatsApp messages is a nightmare. Every time a match ends, someone posts the score, someone else doesn’t know which countries they have, someone asks “wait which group is Egypt in again”, and within three messages we’ve completely lost track of the standings.
The secondary reason is that I’ve been building tools on AWS for a while now and had most of the infrastructure patterns already figured out. The tertiary reason is that I cannot see a problem without wanting to build software to solve it. This is a personality flaw I’ve made peace with.
The Architecture
Next.js 14 with the App Router and TypeScript on the frontend, deployed to AWS Amplify. DynamoDB for storing scores, standings, and prediction cache. Lambda functions for the heavier lifting. The same stack I used for the NRL predictor, because the best architecture is the one you already know how to debug at 11pm.
Match data comes from football-data.org, which has a free tier and a decent API. Flags and country details come from the REST Countries API. Match times are all displayed in AEST (UTC+10) because the tournament runs in North America and “2:00am local kick-off” is not useful information when you live in Sydney.
The friend leaderboard is the heart of it: each country’s points flow through to its owner based on how far they advance. Win a group stage match, your country gets points, your total goes up, you may briefly move ahead of someone you’ve been feuding with since the 2022 pool.
The AI Layer
I added Claude predictions for each match, partly because it’s interesting and partly because I wanted to compare them against the picks people make informally. For each fixture, Claude gets the group standings, recent form, head-to-head history, and any relevant context, and writes a prediction with reasoning.
The “with reasoning” part matters. A bare prediction is just a number. Knowing why someone expects Germany to beat Ivory Coast — what specific factors are being weighed — is what makes it worth reading, even when it turns out to be completely wrong.
I also built three agentic systems that run throughout the tournament: a match preview agent that generates writeups before key games, a post-match analysis agent that reflects on how predictions held up, and a tournament narrative agent that tracks the emerging storylines across the group stage. The details are in AGENTIC_SYSTEMS.md if you want the full breakdown.
The WhatsApp Problem
One feature I was particularly pleased with: automatic WhatsApp notifications via Twilio. When a match ends, the site posts the score and updated leaderboard to our group chat automatically. This eliminates the manual “who’s going to post the result” overhead and means nobody can claim they missed an update.
Whether this is convenient or annoying depends on whether your countries just lost. I expect my own opinions on this feature to fluctuate significantly over the next month.
Does It Work
The tournament has just kicked off, so ask me again in July. The live scores are updating, the leaderboard is functioning, and the predictions are being generated. Whether the predictions are good is a separate question that will be answered empirically.
What I can say is that the site does exactly what I wanted: it gives the group a single place to see who’s winning the pool, when the next match is (in a time zone that makes sense), and what an AI thinks is going to happen before we all tune in anyway.
Try It
The site is at kickpool.ohare.id.au. If you want to run something similar for your own group, the code is at github.com/timothyohare/kickpool.
Now if you’ll excuse me, I have a France vs. whoever match to follow. I have a financial interest in the result and I am completely calm about it.