Reworking my sports guessing game - 2026 edition

As some of you may recall, I built a sports guessing game two years ago: A tiny web app for me and some friends to guess the outcomes of soccer matches.

The project mainly served to let me learn Go, which has been helpful for my current job.

Surprisingly, in my circle of friends, the app caught on. So in 2026, we used the same software again for the FIFA World Cup.

What a great opportunity to work on some unfinished features from back then plus some new ideas!

A redesign for 2026

I began with a redesign, giving the UI a new look and feel. I drew some illustrations myself for a little minigame. You can play it if you’re not logged in.

The home page:

Screenshot of GoTipp’s homepage (not logged in)

The main screen to log your guesses:

Screenshot of interface to guess matches

The leaderboard table:

Screenshot of GoTipp’s leaderboard page

GoTipp now has an API

I added an API so that users could submit their guesses via script or curl command. One friend wanted to build an importer and sync his guesses from the popular kicktipp platform (GoTipp’s main competitor at around 1000x the user base!).

Of course, my API comes with (super minimal) API docs.

Screenshot of API documentation

A bot joined our ranks

I myself used the API to add a bot to our group: A script equipped with current FIFA world rankings that uses an LLM to predict match outcomes.

The bot’s logic is plain and it’s only a simple script on my MacBook that I run whenever new matches need to be guessed. Quite surprisingly (and a little annoyingly), the bot outperformed us all most of the time.

See for yourself: Top line = the bot. Bottom line = me. Oh well.

Screenshot of points chart

(Screenshot taken when there were three matches to go – will the humans still win?)

Dockerized self-hosting via Coolify

My old hosting has long been canceled, so I decided to deploy the web app in a slightly more modern way: through a Docker container using Coolify. My Coolify installation is running on a cheap Netcup server and it makes it easy to deploy GoTipp, connect it to a database and configure scheduled tasks (i.e. cronjobs). I’m no sysadmin, but self-hosting with Coolify has been a good experience.

Screenshot of my Coolify setup

The full changelog for 2026

In case you really want to know, here’s what I added in the past few weeks:

- Support for multiple tournaments (no longer hardcoded to one event)
- Complete visual redesign: new font, colors, button styles, table styles
- Interactive penalty kick mini-game on the homepage
- Countdown to next match on homepage
- Auto-scroll to live or next upcoming match
- Leaderboard chart with hover/tap to highlight individual players
- Admin can reset user passwords
- Admin can manage group memberships
- Admin can sync individual matches from API
- Admin can add TV channel and stream link per match
- Admin dashboard for data consistency monitoring
- Job execution tracking with admin overview
- Read/write API with token auth, rate limiting, and batch submissions
- Leaderboard API endpoint with group/global filtering
- API documentation page
- Rebalanced scoring system
- Separated CLI into dedicated commands (fetch-results, sync-phases)
- Docker setup for Coolify deployment
- Reliable match tracking via API match IDs (resilient to team name changes)
- Various live match display fixes (correct score during live updates, proper "nach 90 Minuten" result mapping)
- Mobile UX improvements for match tables and charts
- Hide inactive players from leaderboard chart by default

It’s still open-source

The World Cup is in its final phases now. It looks like the bot is winning. And my software feels like it has matured.

GoTipp is still open-source on Github, but more as a “build in public” kind of thing. It’s not designed for independent self-hosting. In fact, a friendly stranger on the internet approached me about it some weeks ago, but my honest answer was: This thing works, but it very much works for me. This may change when I pick up the project again. In 2028 maybe?