A wall dashboard built for the 2026 World Cup, retired now that the tournament has ended. The main panel showed live match scores with real-time updates sourced from a hybrid ESPN data overlay, including a stoppage-aware game clock that ticked locally in the browser and re-anchored on each server poll so drift never accumulated. A timeline bar beneath the scoreline marked the half-time and full-time positions with an open-ended stoppage zone for injury time.
A second rotating panel was an LIRR transit tracker: per-station summary cards paired with a subway-style dot-and-line stop diagram that color-coded branches and rendered departure countdowns in real time, shown automatically in the window around NYC matches. A third panel carried the tournament-wide standings during the group stage and switched to a live knockout bracket once the field narrowed. A compact local weather strip ran across the top panel throughout.
The architecture was deliberately thin on the client side. A server-side Redis updater polled a mix of sources on independent schedules - the ESPN and football-data.org match feeds, a LAN weather-radar service, and an LIRR transit aggregator - and wrote normalized JSON into Redis with a short TTL. The React frontend was a pure read-through to that cache, which kept browser logic simple and latency predictable even when an individual upstream source was slow or down.
The 2026 World Cup ran June 11 through July 19, with the final at MetLife Stadium ending Spain 1, Argentina 0. The dashboard's last live view of the tournament was that knockout bracket, shown above.
Architecture
The dashboard ran as three Docker Swarm services behind Traefik: a Flask app serving both the API and the built static frontend, a Redis cache, and a Python redis_updater worker (APScheduler-driven) that owned every outbound poll. The Flask routes read only from Redis and never touched an upstream API directly, so a slow or failing data source degraded to stale-but-served data instead of blocking a request. The frontend was a Vite-built React SPA with no server-side rendering, shipped as static assets from the same Flask container. Live score updates during matches merged a fast ESPN scoreboard poll on top of a more complete but slower football-data.org base schedule, tagging each match with which source last touched it.