Blog
The Start
Why this blog exists — the real origin of Atmos Football as an AI stress test on private football data, plus the honest reasons behind building the blog itself.
The Data
How the Atmos Football dataset went from chaotic OneNote scribbles (2015) to a clean, historic master table — and why the early AI tests kept failing until Claude finally cracked it in 2026.
The Elo Problem: When Fair Teams Don't Feel Fair
The team generator says the teams are balanced. The players say they're not. Then the game happens and the numbers were right all along. How Elo ratings work in casual 5-a-side football, and why trusting them is harder than understanding them.
Building with AI: How Claude Helped Write This App
An honest account of using Claude as a development partner for a real side project — what works, what doesn't, and when it gets in the way.
From 60k Reads a Day to Under 1k: Cutting Firestore Costs on the Free Tier
How a casual football app was burning through Firestore's free tier quota and the techniques used to reduce reads by over 95%.
The Two-Environment Workflow: How We Actually Build Features with AI
Planning in one environment, implementing in another. After 40 versions and several months of building an app with AI, here is the system that made it work — and why separating thinking from doing turned out to be the most important decision.
What 40 Versions Taught Me About AI-Assisted Development
After several months and roughly 40 releases built with AI assistance, here is what actually worked, what did not, and what I would tell someone starting the same journey today.
Push Notifications for a PWA — FCM on Web and Android with Capacitor
How we added weekly match notifications to a React PWA and Android app using Firebase Cloud Messaging — covering web push, Capacitor native, and the permission flow.
GDPR for a Hobby App: What I Learned Building a Privacy-Compliant Football Tracker
What GDPR actually means for a small web + Android app — data minimisation, consent banners, the right to erasure for shared game records, and how to handle it without a legal team.
How a £0.10 Firebase Bill Revealed Two Hidden Cost Drivers
Our Firebase bill went from £0.00 to £0.10 after adding push notifications. The cause wasn't what we expected — it was a region mismatch and an O(N) query hiding inside every notification trigger.
Adding Fitness Tracking to a Football App: What Sounded Simple Wasn't
We wanted to let players see "how far did I run in last week's game?" The feature needed GDPR Article 9 compliance, Health Connect integration, a workout scoring algorithm, and a complete privacy notice rewrite — for data only one person would ever see.
Running a Blog Inside Your Own React App — A Dual-Output Pipeline
Most indie dev blogs sit on Substack or Ghost. We chose to host the blog inside the React app itself — partly for SEO consolidation, partly to avoid another subscription. Here is the markdown → HTML + MD + index.json pipeline, the two renderers it feeds, and the trade-offs that came with it.
Building Group Discovery for a Multi-Tenant Football App
Three releases shipped a feature that lets a player open the app, grant location access, see nearby football groups, and request to join one — without the organiser ever seeing the player's email. Here is the architecture: rating snapshots for cheap reads, opt-in discovery listings for the geosearch, and portable rating cards for cross-group identity.
Why Auto-Rotating a Football Heat Map Is Harder Than It Looks
I tried four progressively more sophisticated algorithms to make a GPS heat map auto-align the football pitch to my screen. None of them worked reliably. The reason is something the maths can't see.