Skip to main content
Off The Pace home dashboard showing race analysis and lap decomposition charts

The Off The Pace home dashboard showing lap decomposition analytics, driver ratings, and strategy projections running entirely client-side.

Off The Pace answers the question lap time alone can’t: when a car is off the pace, exactly why? Every lap’s gap to the field is split into five named, additive components fuel, tyre degradation, constructor pace, dirty air, and driver skill so you can see precisely how much of the gap is the car, the tyres, the traffic, or the driver. Underneath that product is a full data and ML platform: a CI-enforced decomposition, a layered dbt warehouse, ONNX models with train/serve parity, and a zero-server browser app.

Are you here to…

Evaluate the work

The sixty-second tour for a reviewer: the eight things to notice, then the skills demonstrated and who built it.

Assess the system

The architecture, the build-time vs request-time split, and how it clears a production data-engineering bar.

Use or run it

Clone the repo and ingest your first race, or launch the live app.

How the pipeline fits together

Raw timing data becomes an interactive chart through four layers, each documented in its own tab:

Data

Where the timing data comes from and how to ingest it yourself.

Transform

The five-term decomposition: dbt models enforced by a CI contract.

Machine Learning

XGBoost models predicting tyre cliff onset and degradation, exported to ONNX.

App

The browser app every chart and simulator above ships from.

By the numbers

8 seasons

2018–2025 of F1 timing data ingested end to end.

173 races

Every lap decomposed and verified against the additive identity.

94 dbt models

1320 tests enforce the pipeline on every build.

5 ML models

XGBoost trained, exported to ONNX, running live in the browser.

31 app features

Interactive visualizations, zero server, sub-10ms queries.

0ms server

DuckDB-Wasm + ONNX Runtime Web run the whole stack client-side.

Data highlights

Tyre wear cap binding (edge case): 337 laps (0.215% of 156k known-age laps) sit on the compound wear model’s hard limit of 10 s/lap degradation. These are long stints (ages 34–67) where the model runs out of support: 2019 MEDIUM (144 laps), 2023 HARD (142 laps), 2023 SOFT (31 laps), 2021 MEDIUM (17 laps), 2018 (3 laps). The baseline field pace still passes all checks; this is a known limitation of the wear fit, not a data quality issue. Decompositions on these laps are valid; tyre degradation estimates are conservatively bound by the cap.

The stack

Data Pipeline & ML

FastF1

Telemetry & lap timing API

Jolpica

Championship standings & pit API

Python

Ingestion & orchestration

DuckDB

In-process data warehouse

dbt

Transform layer & data tests

XGBoost

Gradient-boosted models

App & Inference

React + Vite

App framework & build tool

DuckDB-Wasm

In-browser SQL analytics

ONNX Runtime Web

In-browser ML inference

Infrastructure

Google Cloud Storage

Gold-mart CDN

Firebase

Static hosting

GitHub Actions

CI: tests, drift gates, deploy

What you can do

Degradation Simulator

Dial in a stint compound, fuel load, and dirty air and watch the trained models project pace loss and cliff risk live.

Ghost Race Standings

Every driver re-ranked in equal machinery a counterfactual championship built from the structural pace model.

Lap Decomposition Waterfall

Any lap, any driver: five causes stacked into one bar that always closes to zero.

Tyre Cliff Survival

How long each compound lasts before the cliff, by circuit and season.
1

A question

“Did Mercedes’ pit call or Hamilton’s driving win São Paulo 2021?”
2

A decomposition

fct_lap_residuals splits every lap of the race into fuel, tyre, rubber, ambient, constructor, dirty-air, and driver-skill components see the case study.
3

A model

The same physics terms feed the ONNX degradation models that power the live simulator.
4

A chart

The React app queries the gold Parquet mart with DuckDB-Wasm and renders the answer client-side, in milliseconds.

Key Concepts

The vocabulary used throughout the docs pace delta, clean laps, the tyre cliff.

Quick Start

Clone the repo and ingest your first race in five minutes.

Case Studies

Real race decompositions, starting with Hamilton vs Verstappen at São Paulo 2021.