A pit wall for fans.
Broadcasts show what happened. A pit wall knows what's next. Three live-timing feeds, one normalized model, transparent predictions on top — a race engineer on your couch.
Three series. One obsession. Every feed independently reverse-engineered, normalized into a single stream.
Every sector. Live. Decoded.

The official live-timing SignalR feed, reverse-engineered end to end: negotiate, subscribe, inflate the compressed deltas, deep-merge into a living NormalizedState. A Bun + TypeScript monorepo serves it to a React dashboard with the PredictionEngine fanning out over WebSockets.
Same model. New grid.

The F2 feed speaks a different dialect — streaming/GetData2, clientProtocol 2.1 — but lands in the same NormalizedState. Predictions and views are series-agnostic, and F2 rules come built in: the Feature-race mandatory pit stop, F2 points, F2 format. Hover a model to read its math.
Quali pace
Who takes pole, from evolving track grip and each driver's push-lap deltas.
Readable math
pace = best_lap − grip_evolution(t) ± push_delta · σ(last 3 runs)
Race pace
True long-run speed, corrected for fuel burn and tyre phase — not headline laps.
Readable math
pace = median(clean laps) − fuel_corr · lap + tyre_deg(compound, age)
Race outcome
Finishing-order probabilities, updated every lap as stints and gaps evolve.
Readable math
P(finish) = f(pace_delta, pit_window, track_position, deg_curve)
The shared contract — normalized data model (Zod) and prediction types.
SignalR client, decompression, delta merge, state store — and the session recorder.
Transparent statistical models for pace, quali and outcome.
Broadcast + prediction host. REST /api/snapshot, WebSocket fan-out.
The dashboard — Vite + React + Zustand, per-session views.
Record a live session, or replay a captured one at any speed.
24 hours on your lock screen.
Endurance racing outlasts your attention span — so the WEC companion follows you instead. A FastAPI backend on a Mac mini polls public timing endpoints behind a single swappable adapter; a native SwiftUI app connects over Tailscale and pins the race to your Dynamic Island.
Race state on the lock screen and Dynamic Island, with optional APNs pushes — no app open, no stream running.
FastAPI serves /api/sessions/live and per-session snapshots; the timing source can be swapped for an official feed later.
launchd services on a Mac mini, Tailscale serve for secure remote access, a pytest suite and live-session verification scripts.
Record it. Replay it. Backtest it.
Full race weekends are captured as replay fixtures. That means offline development, demos without a live session — and the real prize: backtesting strategy calls against what the teams actually did.
The road to a virtual race engineer.
Undercut windows and pit timing, scored against actual team decisions across recorded weekends.
Live strategy talk — "box now, the undercut is open" — generated from the prediction stream.
Refine per-field JSON shapes from more live session captures.
Official feeds slotted in behind the existing adapters — the architecture is ready.