Skip to content

v1.0.0 — Super Bowl Sunday 2026

Latest

Choose a tag to compare

@nkrebs13 nkrebs13 released this 17 May 02:45
· 52 commits to main since this release

First production release

Football Squares ran live on Super Bowl Sunday 2026 with ~50 concurrent players. Zero downtime. Zero support requests.

What's in this release

Real-time grid

  • Sub-100ms cross-client updates via dual Supabase Realtime channels (broadcast for speed, postgres_changes for correctness)
  • Optimistic claims with automatic rollback on failure — taps feel instant, failures self-heal
  • Multi-player drag selection for claiming rectangular regions in one gesture

Game management

  • Host PIN–protected party creation, grid lock, score entry, and party deletion
  • Four payout structures: Rising (10/20/30/40), Equal, Big Finish, Custom
  • Scores entered at quarter-end; winners computed and announced automatically

PWA + sharing

  • Installable on iOS and Android via Web App Manifest
  • Push notifications for game events (quarter winner announcements)
  • QR code generation, native share sheet integration, copy-to-clipboard fallback
  • ESPN live score auto-detect — links to the active NFL game without manual setup

Observability

  • Sentry integration with Web Vitals (CLS, INP, LCP, FCP, TTFB) — optional, no-op without DSN
  • Production runbook in GAME-DAY.md

Testing

  • 668 tests across unit (Vitest + Testing Library), integration (real local Supabase), and E2E (Playwright — Chromium + Mobile Chrome)
  • Coverage thresholds enforced in CI: ≥93% lines, ≥93% functions, ≥81% branches
  • 5-job GitHub Actions pipeline gating every PR

Deployment

  • Single source ships to Cloudflare Pages, Vercel, Netlify, or self-hosted Node via @sveltejs/adapter-auto
  • Fully rebrandable via PUBLIC_* env vars — no code changes needed to fork for any sport

Architecture decisions

Three key design choices are documented as ADRs:

  • ADR-0001: Why Svelte 5 runes in components but legacy stores in shared state
  • ADR-0002: Why .then() instead of await in the optimistic update chain
  • ADR-0003: Why both broadcast AND postgres_changes channels

Quick start

git clone https://github.com/nkrebs13/Squares.git && cd Squares
npm install && cp .env.example .env.local
# set VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY
supabase db push && npm run dev

See docs/DEPLOY.md for full deployment instructions.