← All projects

Project case study

Soccer Radar

A spoiler-safe football fixtures workspace with global match discovery, local-time filters, shareable fixtures, and score-safe offline support.

Status
live
Visit live project
footballspoiler-safe-designflaskjavascriptdata-provenanceprogressive-web-app
Soccer Radar
Project preview · Soccer Radar

Soccer Radar is a football fixture workspace designed so match scores stay hidden until a visitor chooses to reveal them. It combines broad fixture discovery with local-time controls, clear source and freshness states, and score-safe sharing and offline behavior.

Product experience

Visitors can browse fixtures by local calendar date and IANA timezone, then narrow the schedule by competition, country, time window, match status, and other filters. Competition groups, canonical team names, and crest fallbacks make a wide schedule easier to scan. A selected fixture opens additional match context, while shareable URLs preserve the chosen date, filters, and fixture.

The seven-day calendar and .ics downloads support planning outside the site. Soccer Radar is also installable as a progressive web app. Its offline snapshot deliberately excludes live fixtures and removes scores before anything is cached.

Soccer Radar fixture workspace with scores hidden, filters, match groups, and match context

Spoiler boundary and data quality

Score visibility is explicit and starts hidden. Until a visitor reveals scores, the interface keeps them out of rendered text, element attributes, and accessibility content. Calendar exports never contain scores, and the service worker recursively removes them from cached payloads.

The application also distinguishes a successful provider response from a confirmed empty schedule, partial data, stale data, rate limiting, and an unavailable provider. An outage is not presented as an empty day of football.

System design

The browser requests fixtures from a versioned Flask API. Provider adapters run behind a shared bounded deadline. A canonicalization service normalizes fixtures, assigns stable provider-qualified public IDs, merges records across providers, and filters results to the requested local date.

PostgreSQL stores fixture identities and aliases. Redis coordinates shared caching and single-flight requests across workers. In-memory fallbacks support development, while production readiness requires the durable services. The browser interface uses native JavaScript modules without a client framework or bundler.

Scope and trade-offs

Soccer Radar is guest-only: it has no user accounts, persistent favorites, saved defaults, or cross-device synchronization. Provider-dependent details such as lineups and detailed match statistics remain outside the current feature set unless a legitimate data source supports them.

The live site was checked on November 7, 2026. The implementation and its deployment have their own release and production smoke checks; this case study does not claim uptime or coverage percentages.