All modules

Redis Data Layer

Always-fresh reads, no stale-data disasters

Live

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 Problem

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.

Why Redis, Why Now

The unglamorous fix that made everything above it reliable.

Read-after-write freshness

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.

Outage, root-caused

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.

Production-hardened

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.

Build Phases

Live in production; here's the migration that shipped and the resilience work that would follow.

D1 Shipped

Blob → Redis migration

  • Moved all mutable league state (scores, players, settings) off Vercel Blob onto Upstash Redis.
  • Eliminated the CDN-cache read path that caused the mid-convention outage.
  • Verified read-after-write freshness end to end.
D2 Shipped

Production validation

  • Ran live at HMGS-South under real event traffic with no stale-read failures.
  • Backs the live board, TV scoreboard, and admin console off one consistent source.
D3 Later

Durability + operability

  • Scheduled backups / export of league state for disaster recovery.
  • Key-schema versioning and a documented migration path as the model grows.
  • Per-tenant usage metrics to watch hot leagues and plan capacity.

Status

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.

Back to Product Vision

Internal strategy page. Keep this honest as the build changes.