A short-lived NYPD operational board for the Knicks' 2026 NBA Finals run, built as the basketball analog of the FIFA World Cup lobby dashboard. Game state (is it close, is it a blowout, when do roughly 19,500 people egress Madison Square Garden) is an input to crowd and traffic planning, so the board paired a live score panel with the same LIRR fan-movement tracker and game-day weather strip from the FIFA build, since Penn Station sits directly under MSG.
Rather than build a new app for a series that would run at most two or three weeks, the dashboard was forked wholesale from fifa-dashboard: same Flask and Redis substrate, same Vite React SPA, same lobby rotation, SSE refresh, and Swarm and Traefik plumbing, with only the sport-specific surface swapped out. The standings and bracket panel was dropped entirely (a seven-game series does not need a bracket) in favor of a compact series-lead tag, and the live-score panel was repointed from ESPN's soccer feed to ESPN's NBA feed, which needed no API token at all, one less credential than the FIFA build required.
The Knicks beat the San Antonio Spurs 4 games to 1 to win the title, the franchise's first championship since 1973. The board's last live view was Game Day showing that result and a CHAMPIONS badge in the header, shown above.
Architecture
The stack is identical to the FIFA dashboard's: a Flask app serving both the API and the built static frontend, a Redis cache, and a Python redis_updater worker that owns every outbound poll to ESPN, the LAN weather service, and the LIRR transit aggregator. The Flask routes read only from Redis, so a slow upstream degrades to stale-but-served data rather than blocking a request. Live game state merges ESPN's NBA scoreboard for in-progress games with the season schedule for upcoming ones, and a small series-derivation step in the data layer tracks the Knicks' win count and clinch status directly from completed games rather than depending on a separate standings feed.