The 2026 World Cup starts June 11. 48 teams. 104 matches across the US, Canada, and Mexico. When a tournament this size comes around you either watch it or you make something for it, and I’m constitutionally incapable of the former without doing the latter.
So I built a fantasy tipset. VM 2026 Tipset on Fotbollsfeber — predict results, create a private pool, invite your friends, see who actually knows football.
What it does
The core loop is simple: you predict the score of every group stage match before the tournament starts, then fill in the knockout bracket once the draw is set. You earn points for each match — 3 for the right outcome (win/draw/loss), 2 for the correct home score, 2 for the correct away score. Exact result: 7 points. You can also pick a winner for each knockout match when it goes to extra time or penalties, which adds a bonus point.
On top of that there are eight special predictions — things like top scorer, most clean sheets, which host nation goes furthest. Those are worth 10–15 points each and are scored at the end of the tournament.
Then there are private pools. You create one, get a 6-digit code or a shareable link, your friends join, and everyone competes on the same leaderboard. Your tips apply to every pool you’re in.
The part I found interesting to build
The scoring engine is a pure function. Match result in, point breakdown out. No side effects, fully testable. Getting that right first — before worrying about any UI or database — meant the rest of the system had something solid to build on top of.
The locking logic was more subtle than I expected. Group stage tips lock all at once when the opening match kicks off (June 11). But knockout tips lock per round — R32 locks when the first R32 match starts, R16 locks separately, and so on. That’s the correct user experience — you shouldn’t be locked out of predicting the final just because the round of 32 has started — but it means the backend has to look up the earliest kickoff for each specific stage rather than just checking “has the KO phase started.”
The knockout bracket was the most fun. Picks propagate visually as you fill it in — if you pick Brazil to win their round of 32 match, Brazil appears as the opponent slot in the round of 16. It’s a nice feedback loop that makes the filling-in feel like something.
On the stack
This all runs on the existing Fotbollsfeber Next.js 15 / Prisma / MariaDB stack. The fantasy game is essentially a separate domain sharing the database and auth layer. The match data comes from the same sync pipeline that powers the rest of the site, which made the data wiring fairly straightforward.
The one thing I’d call out: keeping the scoring engine as a pure module with 144 unit tests before writing any API layer is the kind of thing that sounds like discipline but is actually just practical. When you can run scoreMatch(prediction, result) in isolation, you catch the edge cases — what happens when a KO match ends 1–1 and you picked the right winner on penalties but got the goals wrong — without needing a test account and a live tournament.
The tournament starts in three weeks. If you follow Swedish football or just want to run a pool with your friends, try VM 2026 Tipset on Fotbollsfeber. It’s free, no ads, just a bet between you and whoever you invite.