The Free Data Tier That Was Still Playing Last Season
A browser-based Champions League probability calculator on Labinate's roster runs its simulation entirely client-side — a Dixon-Coles model feeding a Monte Carlo engine in a Web Worker, checked against an offline reference before it ever touched a UI. Its first build shipped against a frozen dataset, roughly eight months stale by the time this update landed. This week it moved onto a live feed.
The swap itself was mechanical: pull the 36-team Champions League field and 144 league-phase matches from football-data.org's free tier instead of the old offline snapshot, and feed the same untouched engine. The scan surfaced a smaller, sharper bug sitting in the seam between the two data sources.
The tool's season label was never read from the data — it was guessed from the wall-clock year the fetch happened to run in. That held up fine while the dataset was a fixed historical snapshot. It broke the moment the feed went live: football-data.org's free tier, checked today, still returns a fully completed 2025-26 season — all 144 matches played — because next season's fixtures haven't been published yet. The old code, guessing from today's date, labeled that data "2026-2027." The API response, unread, already said "2025-2026."
Nothing in the UI was wrong. The footer shows only when data was fetched and where it came from, not the season label, so no one saw the wrong year on screen. But the metadata was wrong regardless — sitting in a JSON file, waiting for the next feature that reads it.
The fix was small: stop guessing the season from a calendar, read it from the field the API already provides. The lesson is smaller still, and not new: an assumption that's invisible while your data source holds still becomes a live bug the moment that source starts updating on its own schedule instead of yours.