Clean and complete 2026 FIFA World Cup companion: schedule, groups, bracket, squads, venues, weather, where to watch, match win probabilities and tournament forecast, in 23 languages.
👉 Click me to use 2026 World Cup Open Source Companion now! ⚽ (26worldcup.github.io)
Faster, simpler, easier way to look things up than FIFA.com, Google or Wikipedia: every fact about the tournament is one or two taps away, in your language and your time zone, with nothing you don't need (no ads, no news feeds, no videos, no cookie banners, no sign-in).
Unofficial, fan-made, not-for-profit, open-source project, hosted on GitHub Pages. Not affiliated with, endorsed by, or connected to FIFA, any national football association, team, player, or broadcaster. Code and curated data are MIT-licensed (see LICENSE); third-party data terms are inventoried in COPYRIGHT.
- 📅 All 104 matches with kick-off times, stadiums, group/stage chips, and semi-live scores
- 🔍 Schedule filterable by team(s), stage, and venue; filters live in the URL, so views are shareable
- 📊 Group tables computed with the official FIFA tiebreakers, plus the ranking of third-placed teams (top 8 of 12 advance) with qualification colour-coding
- 🪜 Knockout bracket as a centre-converging tree that fills in automatically as teams qualify, with no horizontal scrolling; reflows to a round-by-round list on phones
- 📋 Match pages: venue facts, win/draw/loss probabilities, kick-off weather forecast (typical-climate fallback for far-off dates), full referee crew, starting line-ups drawn on an SVG pitch with formations, goal timeline, and TV channels for your country
- 🧢 48 team pages: live FIFA ranking, coach, group table, full fixtures, training base camp (with map + Google Maps links), official website, and Wikipedia links
- 👥 Official 26-player squads: numbers, positions, ages, caps, goals, clubs; every player links to their English Wikipedia article
- ⭐ Favorites: star the teams you follow and filter the schedule to them
- 🌎 Real-geography map of all 16 stadiums (Natural Earth data, Lambert conformal conic projection) with capacity, roof type, time zone, and June/July climate for every venue
- 🏕️ Team base camps plotted on the same map as flag pins (collision-free layout), with a team filter that highlights only the cities where a selected team plays
- 📡 Broadcast guide for 32 countries/regions with free-to-air channels highlighted; your country is auto-detected from the device time zone (changeable in Settings)
- 👟 Golden-boot table and tournament stats, updated throughout the competition
- 🎲 Match probabilities & tournament forecast: every fixture gets a win/draw/loss probability from an Elo model replayed over 49,000 historical internationals blended with the official FIFA ranking, and the forecast page lets you simulate the whole tournament (group tables, knockout bracket, extra time, penalty shoot-outs) 1 to 10,000 times, starting from now, the opening match, a date, or any match number, then shows not just each team's title odds but a full outcome table: how every team finishes its group, the round it bows out in, and its final placing, all the way to the trophy, like a fun prediction machine
- 23 languages, covering the languages of all participating teams plus some popular ones: English · Français · Español · Português (Portugal) · Português (Brasil) · Deutsch · Nederlands · Čeština · Hrvatski · Svenska · Norsk · العربية · فارسی · Türkçe · Oʻzbekcha · 日本語 · 한국어 · 简体中文 · 繁體中文 · Italiano · Bahasa Indonesia · Русский · Українська
- Automatic detection and full RTL support for Arabic and Persian
- Team, stadium, and referee names are additionally served in FIFA's own localisation for 12 of these languages; the rest fall back to English names while the interface stays translated. The language can be switched any time from the header; dictionaries load on demand
- 🕒 Time zones: match times default to your clock; switch to stadium-local time or any fixed zone (the host-anchor default is America/New_York)
- 📲 PWA: installable on desktop and mobile, works fully offline after the first visit (everything except live score refreshes)
- 📆 Calendar export: download an
.icsfile of your teams' matches - 🌗 Light & dark themes, automatic by default
- 🔒 Self-contained: flags, fonts, map data, and all tournament data are served locally; the app makes zero third-party requests at runtime
- Screens: responsive from small phones (360 px) to large desktops; bottom tab bar on mobile, full navigation on desktop
- Browsers: current Chrome, Edge, Firefox, and Safari (desktop and iOS)
- Install: as a PWA from the browser menu on Android, iOS ("Add to Home Screen"), and desktop Chrome/Edge
- Accessibility: keyboard-navigable controls, visible focus states, WCAG AA contrast in both themes,
prefers-reduced-motionrespected
All data comes from free, authoritative sources, with no API keys anywhere:
| Source | Provides |
|---|---|
| FIFA public API | fixtures, scores, line-ups, referees, localized names, world ranking |
| Wikipedia | official 26-player squads (numbers, caps, goals, clubs, coaches) |
| Open-Meteo | hourly stadium weather forecasts and base-camp geocoding |
| martj42/international_results (CC0) | historical results feeding the Elo win-probability model |
| Hand-curated files | venues, broadcasters, base camps, climate normals, team colours |
Automatic updates (GitHub Actions, included in this repo):
- ⏱️ every 15 minutes while matches are being played (plus a line-ups pull 10 minutes before each kick-off)
- 🌙 daily at 00:00 New York time
- ✅ every update is sanity-checked before publishing and triggers a site redeploy
Scores are semi-live, not real-time: they typically trail the broadcast by up to ~15 minutes. This is by design; the whole app is static JSON refreshed by CI, with no servers, sockets or push infrastructure.
For developers of this project.
bun install
bun run update # fetch the latest data
bun run dev # http://localhost:5173Production build (fully static output in dist/):
bun run build
bun run preview| Script | What it does |
|---|---|
bun run dev |
Vite dev server at localhost:5173 |
bun run build |
type-check and production build into dist/ |
bun run preview |
serve the built dist/ locally |
bun run update |
refresh all tournament data (FIFA, Wikipedia, Open-Meteo) into public/data/ |
bun run gencron |
regenerate the CI cron schedule from the match calendar |
bun run genmap |
rebuild the venues map from Natural Earth source data |
bun run typecheck |
TypeScript type check (tsc -b, no emit) |
bun run format |
Biome auto-format (writes) |
bun run lint |
Biome lint + format check (includes a11y rules) |
bun run smoke |
headless smoke test: every route across languages and themes |
bun run a11y |
axe-core WCAG A/AA audit: routes × light/dark × RTL |
bun run checkall |
quick gate: typecheck + format + lint |
bun run checkall:build |
full gate: checkall + build + smoke + a11y |
🌐 Adding a language
- Create
src/i18n/<code>.tswith every key fromen.ts, same order (pluskey#one-style plural variants where the grammar needs them). - Wire it:
Langunion intypes.ts;LOCALE_TAG+LANG_LABELini18n/strings.ts(key order = menu order); loader ini18n/index.tsx; detection prefix inSettingsContext.tsx;RTL_LANGS/DATA_FALLBACKif applicable. - If
api.fifa.comserves the language, add it toLANGSinscripts/update.mjs; otherwise add it toCLDR_LANGSthere (team names then come from CLDR country names) and add England/Scotland toteam-names-l10n.json— they are GB subdivisions CLDR cannot name. - Translate the curated bits: 16
rainNoteentries (climate.json), 90 broadcaster notes (broadcasters.json), the SF Bay Area label (Venues.tsx), 16 city names (city-l10n.json, non-Latin scripts only), and a full 48-name block inteam-names-l10n.jsononly if local naming conventions differ from CLDR (as Traditional Chinese does). - Add a smoke pass, update this README's language list, run
bun run update && bun run build && bun run smoke.
The app is a static site with hash routing and relative asset paths. For GitHub Pages:
- Push to the repository.
deploy.ymlbuilds and publishes on every push tomain(documentation-only and pipeline-only changes are skipped).update-data.ymlrefreshes the data on the match-driven schedule above and redeploys. Its cron table is generated from the fixed match calendar; runbun run gencronif a kick-off time ever changes.
React 19 · TypeScript · Vite · no backend, no runtime dependencies beyond React + Router. SVG throughout: the pitch with line-ups, the projected North America map, the bracket, the logo.
scripts/update.mjs data pipeline (bun run update)
scripts/gencron.mjs regenerates the match-driven CI schedule
scripts/genmap.mjs rebuilds the map from Natural Earth data
scripts/smoke.mjs headless smoke test across routes, languages, themes
scripts/curated/ hand-checked datasets
public/data/ generated JSON the app loads at runtime
src/ application code (pages, components, i18n, settings)
Code and curated data: MIT. Detailed third-party data and image licensing: COPYRIGHT. Data courtesy of FIFA's public API, Wikipedia, and Open-Meteo; verify broadcast rights with local listings.