BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
F1 race weekend companion: session-by-session replay, charts and (soon) predictions, built on FastF1
翻訳待ち
Loading the full README.
Read the full README ↗A companion app that follows a Formula 1 weekend session by session. After each session (FP1 → FP2 → FP3 → Qualifying, and Sprint sessions on sprint weekends) it refreshes the charts and updates a prediction of the race result - for a past weekend replayed step by step, or for a live weekend before its race.
Status: Day 3 of a 3-day build. Built: data pipeline, replay and live weekends, per-session
charts, race prediction with a backtest, race-result view, generated commentary, a "race starts soon"
banner, and a new website for a general F1 audience (web/, Next.js on Vercel). The original
Streamlit app is kept in the repo but is no longer deployed.
Two front ends read the same data:
web/, static Next.js, deployed on Vercel): the fan-facing version and the only one
published. 2026 weekends only, a start-light timeline with autoplay, plain-language explanations,
race-control style commentary, and a "lights out" race reveal. See web/README.md.app.py): the original analysis view, including earlier seasons' data and the
backtest charts. Taken offline on 2026-10-27, now that the website covers the same ground; the
code is kept and still runs locally with streamlit run app.py.Four predictors, and Auto (the default) picks between them:
Percentages come from simulating the race 20,000 times, with retirement chances per team and uncertainty sized - and, for the baseline and Grid + recovery, shaped (wider before Qualifying, tighter for the front six after it) - from each predictor's own past mistakes. Full description: docs/model.md.
Scored on the first 15 races of 2026 (R1-R15), each predicted using only what was known at the time (expanding-window backtest). After Qualifying:
| Order (Spearman ↑) | Winner log-loss ↓ | Podium Brier ↓ | Whole-grid RPS ↓ | |
|---|---|---|---|---|
| Baseline | 0.697 | 0.78 | 0.070 | 0.108 |
| Grid + recovery | 0.709 | 0.75 | 0.070 | 0.107 |
| Auto (default) | 0.704 | 0.745 | 0.069 | 0.108 |
| Ridge, all seasons | 0.699 | 1.18 | 0.075 | 0.110 |
| Ridge, same season | 0.692 | 1.34 | 0.068 | 0.110 |
The model is frozen at tag frozen-2026-r15b; races from R16 on are an untouched holdout
(results in docs/evaluation.md).
2026 has been unusually qualifying-dominated, so beating the grid order is hard; over 2023-26 the
models' edges are larger and significant (e.g. Grid + recovery +0.018 after Qualifying). What each
score means, all stages, and how differences are judged: docs/evaluation.md.
pip install -r requirements.txt
streamlit run app.py
The app reads only the files in data/; it needs neither FastF1 nor network access.
pip install -r requirements-dev.txt
python scripts/auto_update.py --push # pull what's due, re-score, re-export, publish
auto_update.py runs the steps below for any session that finished 30 minutes ago (the race, 60)
and does nothing if none has. Put it on a timer during a weekend — see
docs/season-checklist.md for the cron line and its caveats. To run the
steps yourself:
python scripts/backfill.py --years 2026 --in-progress # during a weekend: sessions run so far
python scripts/backfill.py --years 2026 # after the race
python scripts/backtest.py # re-score and re-predict
python scripts/export_site.py # refresh the website's data
python -m pytest tests
Then commit data/ and push; the deployed app reloads its code on its own. The full routine,
traps (rate limits, pulling too early, offline rebuilds) and what to re-check through the season:
docs/season-checklist.md.
This is the beginning of the README. Read the rest at the original. Read the full README ↗