During Euro 2024, the app reached 7,000 users. I was running it on Fly.io and, despite the great DX, I realized I hadn't spent enough time on my caching strategy. I ended up hitting over 100GB of outbound traffic in a month for what is essentially a text-heavy app. For v3, I’ve spent my time rethinking the data-fetching architecture and ensuring I'm not "re-downloading the world" on every match update.
The tech-stack:
- nuxt v4 & tailwind
- sqlite + drizzle ORM. I’m a huge advocate for SQLite in production for these types of hobby apps—it’s fast, simple, and the performance for thousands of concurrent users has been surprisingly solid
- auth: Better Auth
The rules: It’s the standard "guess the score" format, but I’ve added a twist where points double starting from the Round of 16 to keep the leaderboard competitive until the very end.
I built this because I wanted an ad-free, tracker-free alternative to the cluttered betting apps out there. It’s just me and a few friends playing, but it’s been a fun way to learn about modern web architecture and the "surprises" that come with even modest scale.