A free, open-source Streamlit dashboard for the 2026 FIFA World Cup. Live scores, match schedules, group standings, news, and ML-powered predictions — all without a paid API.
| Page | What you see |
|---|---|
| 🟢 Live Scores | Today's fixtures, results, goal scorers, group standings, top scorers |
| 📰 News Feed | Latest WC 2026 articles from BBC, Guardian, ESPN, Goal.com — no API key |
| 🔮 Match Predictions | Win/Draw/Loss probabilities, most likely scoreline, card forecast |
| ⭐ Player Ratings | Predicted ratings for all 48 team squads, with confidence ranges |
Everything is free. No paid API required.
| Source | What it provides | Key |
|---|---|---|
| openfootball/worldcup.json | Live scores and goal scorers (updated post-match) | None |
| openfootball/world-cup | All 104 fixtures, correct confirmed team names | None |
data/wc2026_data.py |
Groups, squads, stadiums, referees, FIFA rankings | None — static file |
| RSS feeds | News from BBC, Guardian, ESPN, Goal.com, Google News | None |
The app uses the same data source as wcup2026.org — openfootball, which is public domain.
wc2026/
├── app.py ← Entry point — run this
├── requirements.txt
├── Dockerfile
│
├── data/
│ ├── __init__.py
│ └── wc2026_data.py ← All static data: 48 teams, 104 fixtures,
│ squads, referees, stadiums, FIFA rankings
│
├── models/
│ ├── __init__.py
│ ├── prediction_engine.py ← 3 ML models (XGBoost, NegBin, Random Forest)
│ ├── train_models.py ← Optional: run to train on real historical data
│ └── saved/ ← Trained .joblib files saved here
│
├── pages/
│ ├── __init__.py
│ ├── live_scores.py ← Scores, standings, goal scorers
│ ├── news_feed.py ← RSS news aggregator
│ ├── predictions.py ← Match prediction panel
│ └── player_ratings.py ← Squad viewer + rating predictions
│
└── utils/
├── __init__.py
├── api_client.py ← All data fetching with disk cache
└── data_helpers.py ← Travel fatigue model, data parsers
git clone https://github.com/yourusername/wc2026-dashboard.git
cd wc2026-dashboard/wc2026
python -m venv .venv
source .venv/bin/activate # macOS / Linux
# .venv\Scripts\activate # Windowspip install -r requirements.txtstreamlit run app.pyOpen http://localhost:8501 in your browser.
That's it. The app works immediately with no API keys and no manual setup. On first launch, the ML models auto-train on synthetic data (takes ~10 seconds, once per session).
The prediction models auto-train on synthetic data by default. To train on real WC 2018 and 2022 historical data from the API, add your RapidAPI key first (see Configuration below), then run:
python models/train_models.pyThis saves trained .joblib files to models/saved/. The app loads them on the next start instead of re-training. Expected accuracy with real data: 55–65% for match results (compared to 38–48% on synthetic data).
The app works with zero configuration. API keys are only needed for optional enhancements.
Create .streamlit/secrets.toml:
# Optional: real historical data for model training (free tier available)
# Get key at: https://rapidapi.com/api-sports/api/api-football
RAPIDAPI_KEY = "your_key_here"
# Optional: real news articles
# Get key at: https://newsapi.org/register
NEWSAPI_KEY = "your_key_here"When no keys are set the app falls back to:
- Fixtures / scores: openfootball GitHub JSON (free, always works)
- News: RSS feeds from BBC, Guardian, ESPN (free, no key)
- ML models: auto-train on synthetic data on first run
Three models run inside the app, each auto-training on first use if no saved file exists.
Predicts Win / Draw / Loss probabilities.
| Feature | Why it matters |
|---|---|
| FIFA ranking difference | Strongest team-level signal |
| Expected goals (xG) | Attack quality for each team |
| H2H historical win rate | Past head-to-head record |
| Home travel fatigue | Distance flown between venues (unique to WC 2026) |
| Away travel fatigue | Opponent's travel burden |
| Knockout stage flag | Higher stakes = different patterns |
Travel fatigue is a feature unique to WC 2026. The tournament spans three countries — USA, Canada, and Mexico — across 16 cities. A team playing in Vancouver then flying to Miami covers ~4,350 km, roughly London to Tehran. This is modelled using the Haversine formula in utils/data_helpers.py.
Predicts expected yellow and red cards per match.
Negative Binomial is used instead of standard Poisson because card counts are over-dispersed — some games have 0 cards, others have 8. The model's strongest single predictor is the assigned referee's historical cards-per-game rate.
Predicts each player's in-match rating (scale 5.0–10.0) with a confidence range.
The confidence range (Low / High) comes from the spread of predictions across all 200 individual trees in the forest. A narrow range means high confidence. Forwards consistently have the widest range — matching real-world data where a striker can score 9.5 one game and 5.8 the next.
- Push the project to a public GitHub repository
- Go to share.streamlit.io and connect the repo
- Set
app.pyas the entry point - Add any optional API keys under Settings → Secrets
- Deploy — the app handles cold starts automatically (no pre-training needed)
# Build
docker build -t wc2026-dashboard .
# Run
docker run -p 8501:8501 wc2026-dashboard
# With optional API keys
docker run -p 8501:8501 \
-e RAPIDAPI_KEY=your_key \
-e NEWSAPI_KEY=your_key \
wc2026-dashboardOpen http://localhost:8501.
openfootball is not a real-time API. Scores appear in the JSON file within a few hours of each match ending, added manually by the maintainer. The app fetches the file every 5 minutes (disk-cached) and merges any new scores into the fixture list automatically.
For the group stage (June 11 – June 27) and knockout rounds (June 28 – July 19), check the Live Scores page after each match ends.
| Stage | Dates |
|---|---|
| Group stage | June 11 – June 27, 2026 |
| Round of 32 | June 28 – July 3, 2026 |
| Round of 16 | July 4 – July 7, 2026 |
| Quarter-finals | July 9 – July 11, 2026 |
| Semi-finals | July 14 – July 15, 2026 |
| Third place | July 18, 2026 |
| Final | July 19, 2026 — MetLife Stadium, New Jersey |
- Python 3.10 or higher
- See
requirements.txtfor all package versions
MIT — free to use, modify, and deploy. Data from openfootball is public domain.
- openfootball — the open public domain football data project that powers this dashboard
- wcup2026.org — community fan site using the same data source, used for cross-verification
- Streamlit — the framework that makes this possible in pure Python