Skip to content

Web

F1 Telemetry Dashboard

Live and historical Formula 1 telemetry: speed, throttle, brake, RPM, gear, DRS, tyre strategy and a GPS track map, streaming from F1's official timing feed with no paid tier.

Built
Jun 2026 to Jul 2026
Role
Project lead
Uniform resample grid
5 mUniform resample grid
Live SignalR topics consumed
4Live SignalR topics consumed
Medallion ETL layers
3Medallion ETL layers
Cost of the live data tier
FreeCost of the live data tier

Overview

Comparing two Formula 1 laps sounds like a plotting exercise and is not. Plot speed against time for two drivers and the traces drift apart immediately, because they crossed the start line at different moments and carried different speeds through it. By the second corner you are comparing two different parts of the circuit to each other.

The fix is to change the x-axis. Both drivers' telemetry is interpolated onto a shared uniform five-metre distance grid, so index 400 means “two kilometres into the lap” for both of them. Only then does a braking-point comparison mean anything.

The other half of the project is getting the data at all. F1's live timing feed is a SignalR endpoint that broadcasts base64 and zlib payloads, and it only transmits on race weekends, roughly ten percent of the year. So the app probes the endpoint and, finding nothing live, degrades to the most recent completed Grand Prix rather than showing an empty screen.

What it does

  • Direct connection to F1's official live timing SignalR endpoint, with no paid data subscription.
  • Distance-resampled telemetry so two drivers can be compared at the same point on track.
  • Channel charts for speed, throttle, brake, RPM, gear and DRS.
  • Lap-time progression with pit-stop indicators and tyre-strategy stacked bars.
  • GPS track map reconstructed from raw X/Y positional telemetry.
  • Graceful fallback to the most recent completed Grand Prix when no session is live.
  • Session record and replay: live streams saved to JSON and Parquet, then played back as simulated realtime for offline development.

How it works

  • FastF1's SignalRClient plus the LiveF1 package against wss://livetiming.formula1.com/signalrcore, subscribing to CarData.z, Position.z, TimingData and SessionInfo.
  • Payloads arrive base64-encoded and zlib-compressed; they are decoded and normalised into DataFrames on arrival.
  • numpy.interp onto a uniform five-metre grid, which is the single transformation that makes cross-driver comparison valid.
  • Medallion ETL: bronze holds the raw zlib JSON, silver the decoded per-topic frames, gold the resampled driver-merged output the charts read.
  • Layered module structure. Data adapters (FastF1, live, Jolpica) feed a telemetry processor which feeds the Streamlit UI, so a new source is an adapter rather than a rewrite.

Problems and answers

  • Speed-against-time does not align between two drivers.

    Resample every channel onto a shared five-metre distance grid before plotting anything.

  • Live timing only broadcasts on race weekends, which leaves most of the year with no data.

    Probe the endpoint on load and fall back to the last completed Grand Prix, so the dashboard is never blank.

  • Developing against a live feed that exists a few weekends a year is impossible.

    Record live sessions to Parquet and replay them as simulated realtime streams.

  • Commercial live telemetry APIs charge for the real-time tier.

    Go to F1's own SignalR endpoint directly and decode the compressed payloads.

NewerKurt, an Offline-First AI TutorOlderImage-to-LaTeX Handwriting OCR