About Pitwall
An F1 season-analysis app built around two open data sources and a hand-rolled HTMX UI.
What it does
- Race weekend tracker on the landing page — shows the round currently happening, or counts down to the next session.
- Per-GP analysis — race, sprint, and qualifying results for any round, with sortable tables and country flags.
- Title contenders — drivers and constructors who can still mathematically win the championship, computed against the latest standings snapshot.
- Most improved — second-half-vs-first-half points-per-round delta for both drivers and teams.
- Fun stats — fastest lap per GP, slowest classified finisher, season top speed-trap.
- Lap by lap — for any 2018+ race, per-driver stint summary (compound + lap count) and full lap-by-lap detail.
- Telegram bot — the same features exposed as
/contenders,/standings,/round,/topspeeds,/laps, etc.
Data sources
Results & standings
jolpica-f1
The Ergast successor — race results, qualifying, sprints, driver and constructor
standings, circuit info, season schedules. Covers 1950 → today.
Pitwall pulls one season at a time via sync_year, or the full archive via
backfill_history.
Telemetry & laps
FastF1
Lap-level timing for every driver, tyre compound and stint structure,
speed-trap readings. Covers 2018 → today. Pulled per-session via
sync_session; the multi-megabyte Parquet cache lives in a dedicated
docker volume so re-syncs are instant.
jolpica is the truth for points and standings. FastF1 is additive — it never overwrites jolpica's tables.
How it's built
- Django 5 + HTMX for server-rendered UI with modal overlays — no SPA, no JS framework.
- Postgres (or SQLite locally) for storage; Redis for cache and Celery broker.
- Celery for nightly jolpica sync; cache invalidation via a version key bumped on every successful sync.
- FastF1 imported lazily so the pandas/numpy weight only loads when telemetry is actually being synced.
- pyTelegramBotAPI bot — two transports (long-polling for dev, webhook for prod), same handlers.
- Idempotent ingest — every writer uses
update_or_createorbulk_create(update_conflicts=True)against natural keys; re-running a sync is a no-op. - Rate-safe jolpica client — 4 req/s burst, 500 req/hr sustained, with exponential backoff on 429.
Project
Source code on GitHub. Licensed MIT. Contributions and issues welcome.
Pitwall is not affiliated with Formula 1, the FIA, or any team. All trademarks and rights belong to their respective owners. Data via the open jolpica-f1 and FastF1 projects — please support them upstream.