The free, self-serve tournament platform bundled with the High Noon retail game. Every store that stocks High Noon can spin up its own branded, in-store league in minutes — a live leaderboard, a cinematic TV scoreboard, and a store-defined prize — turning a game on the shelf into recurring in-store events. Organized Play is the retention engine that ships with the product: it drives foot traffic, repeat play, and repeat sales, the same flywheel that powers every serious tabletop IP.
Shipped, deployed, and running in production today.
Every store gets its own isolated, branded league
A single codebase serves unlimited stores. Each league is fully isolated — its own players, scores, settings, logo, and admin password — routed by slug at /[slug]. This is the backbone that makes a per-store retail product possible.
The public board players watch during an event
Real-time standings with gold totals, three-tier ranks (Buckaroo / Outlaw / Maverick), a live countdown clock, animated progress bars, and a QUALIFIER splash when a player crosses the gold threshold. Auto-refreshes so the room always sees the current state.
Big-screen 16:9 showpiece for the booth
A dedicated /[slug]/tv layout built for a television at the table: High Noon logo, tournament title, live countdown, prize box, scan-to-join QR, and dramatic top-5 rows. One-tap fullscreen hides the browser chrome entirely. This is the in-store centerpiece that draws a crowd.
Run the whole event from one panel
Per-league admin at /[slug]/admin: quick score entry, add/edit/remove players, a +/- gold toggle for corrections, and tournament settings (title, location, end time, prize, QR). Each store has its own password — it can never see or touch another store's data.
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. Battle-tested live at HMGS-South.
Real working code shipped to production, but phases still on the build queue. Each card lists what's done and what's left.
Designed, documented, and on the build roadmap. No production code yet.
A store owner spins up their league with zero help
A public onboarding page: the store owner enters their name, contact, picks a slug, sets an admin password, and uploads a logo — then lands directly in their own admin console. No Dwight in the loop. This is the single feature that turns a booth tool into a self-serve retail product.
The prize is whatever the store wants it to be
Prizes stop being a hardcoded dollar amount. A store types anything — '$100 cash', '$50 store credit', 'a High Noon booster of your choice', even 'a Pokemon booster box'. The leaderboard, admin, and TV board all render the store's own prize text.
Stock a qualifying package, get a sponsored day
Retailers who order a qualifying High Noon stock package receive a sponsored tournament day — flagged and provisioned by us. Everyone else self-funds. Built on the same infra; 'sponsored' is a flag on the league that unlocks a badge now and fulfillment logic later.
Store qualifiers → regionals → a national championship
The v2 hook that makes stores care: store-level events feed regional qualifiers and a national High Noon championship across seasons. v1 ships the data sockets (region, season, event history) so this layers on later with no migration — the bones are in from day one.
What the physical retail SKU points to
The packaged product side: a physical Tournament Kit whose QR code drops a player straight onto their store's board, plus the rules, prize structure, and setup a store needs to run High Noon Organized Play out of the box.
Known issues and cleanup work, tracked so nothing gets forgotten.
What we know is broken, half-done, or worth cleaning
Anything flagged as worth cleaning up later lives here. Items are filed the moment they're found so they do not evaporate into chat history.
Building High Noon Organized Play into a packaged retail product — the roadmap kept honest, module by module.