Always-fresh reads, no stale-data disasters
Upstash Redis backs all mutable state. Reads are always current — no CDN caching, no eventual consistency. This replaced a Vercel Blob layer that caused a mid-convention “league not found” outage. It is the quiet piece that makes the loud pieces — the live board and the TV scoreboard — trustworthy in front of a crowd.
The original build stored league state on Vercel Blob. Blob is content-addressed and CDN-cached — great for static assets, wrong for a live scoreboard. Writes didn't propagate instantly, and at HMGS-South that surfaced as a mid-convention 'league not found' outage: the data existed, but a cached read couldn't see it.
A tournament platform cannot tolerate that. When a scorekeeper adds gold and the public board or TV shows an old value — or worse, can't find the league at all — the product looks broken at the exact moment a crowd is watching.
The data layer had to guarantee read-after-write freshness for every mutable value: scores, players, settings, all of it, current the instant it's written.
The unglamorous fix that made everything above it reliable.
Upstash Redis serves the current value on every read — no CDN layer, no eventual consistency. A score entered in admin is visible on the board and TV immediately.
The HMGS-South 'league not found' failure was traced to Blob's cached reads and fixed by moving all mutable state to Redis. Same bug can't recur — the caching layer that caused it is gone.
Battle-tested live at a real convention under event load. The data layer every other module reads from is now the reliable part, not the fragile one.
Live in production; here's the migration that shipped and the resilience work that would follow.
Origin: A cached Vercel Blob read caused a 'league not found' outage mid-convention. Rebuilt on Redis so live reads are always current.
Prereqs: None outstanding — migration complete; all mutable state is on Upstash Redis.
Status: Live in production and battle-tested at HMGS-South. D3 (backups, schema versioning, metrics) is resilience hardening for later.
Internal strategy page. Keep this honest as the build changes.