About Polla 2026

It’s hard to believe that 20 years have passed since I wrote and ran the first polla. This post goes into the technical details of the application.

The first polla was a monolithic PHP application written from scratch. Instead of using a database and in order to keep things simple, it stored all data in text files (bad idea). I didn’t even use source code control (bad idea). Regardless, it worked well and was a big success.

For each subsequent polla, I took the last polla’s source code as a starting point and make large improvements. Using a database, responsive design (the first polla predates iPhone!), invitations, filters, tournament winners, and lots of small tweaks all over the place.

But one of the reason these things even exist is that it allows me to learn to use things that I don’t get to play with in my day job (I’m a software engineer, but I don’t work on web-related things). Making another PHP monolithic application in 2026 would not teach me anything as was no fun. Thus, I took on the giant project of rewriting Polla 2026 from scratch during my scant free time using modern technologies and best practices. Insanity? Yes.

This is a high-level description of the new polla, which uses individual services orchestrated using Docker Compose:

  • Caddy as a reverse proxy.
  • The main backend application is written in Python:
  • Authentik for authentication, which turned out to be what I had the most trouble with and what I like the least about the polla. I will likely replace it next time.
  • Redis which is needed by Authentik.
  • Database is now Postgres (it used to be MySQL).
  • A very simple microservice running a shell script that pushes database backups periodically into S3 storage.
  • Adminer in case I need to get to the database easily.
  • For local development mailpit let’s me conveniently test email.

I am also relying on a few external services, many of them I just learned about and all of them very cool:

  • Mailing lists are handled by Brevo.
  • Cloudinary stores profile pictures and the hero images of News posts.
  • Cloudflare R2 is where the database backups go. I wanted them completely outside of where the application lives for obvious reasons .
  • Goatcounter for analytics. No Google!
  • For hosting, I have my very own VM in Hetzner.
  • The code is all stored in – where else – GitHub. No, it’s not Open Source.

This was a huge undertaking that required me to learn a bunch of neat things. It goes without saying that there is no way in hell I could have pulled this off without the help of GitHub Copilot and its excellent integration with VSCode. It’s a massive accelerator! I was able to rewrite the full system using things I never used before, and add many improvements (not finished yet) that were not part of the previous pollas nor of my original plan. The speed at which changes can be made makes it almost addictive. Visually, it looks better than ever. I am super pleased how things are turning out.

I hope all the effort is worth it, I don’t run into major bugs, and lots of my friends join in the fun.

Leave a Reply