A live web dashboard for EA SPORTS F1 25 UDP telemetry. Python receives UDP from the game, decodes it, and streams JSON to a browser over a WebSocket. Built per SKILL.md.
F1 25 (PC) --UDP 20777--> server.py --WebSocket 8765--> browser dashboard
python3 server.pyThen open http://localhost:8000 in a browser.
Requires websockets and pandas/pyarrow (pip3 install websockets pandas pyarrow).
The server kills any previous instance holding its ports on startup, so you can just re-run it — no more "address already in use".
Every run records the full session — all 22 cars, all telemetry, laps, and
sectors — to logs/session_<UTC timestamp>.parquet. Disable with
LOG=0 python3 server.py for a dashboard-only run.
Play a logged session back through the same dashboard:
python3 replay.py # most recent session
python3 replay.py logs/session_X.parquet # a specific fileOpen http://localhost:8000; a control bar appears with play/pause, a seek scrubber, and speed (0.25x–4x). Gauges, map, traces, and sector colors all replay exactly as they appeared live.
When a lap completes, each sector is colored by the standard sim-racing convention, both live and in replay:
- purple — fastest that sector has been all session
- green — a personal best for that sector (reserved; see note)
- yellow — slower than your best
Note: in a single-driver session, the session-best and personal-best are the same reference, so sectors are purple (new best) or yellow (not). Green is wired in for future multi-reference use (e.g. comparing against an AI car).
Options → Settings → UDP Telemetry Settings
| Setting | Value |
|---|---|
| UDP Telemetry | On |
| UDP IP Address | this machine's local IP (ipconfig getifaddr en0) |
| UDP Port | 20777 |
| UDP Send Rate | 20–60 Hz |
| UDP Format | 2025 |
If the game runs on the same Mac as the server, the IP can be 127.0.0.1.
Telemetry only flows while you're on track (Time Trial / Practice / a session) —
menus send nothing.
- Core driving — gear, speed, RPM, rev-light strip, throttle/brake/steer, DRS, pit, lap-valid (CarTelemetry, packet 6)
- Lap & timing — current/last lap, sectors, position, lap number, gap ahead, lap progress (LapData, packet 2)
- Tyres & temps — per-wheel surface/inner temp + pressure, color-coded (CarTelemetry, packet 6)
- Track map — draws a live trail that grows as you drive (no full lap required), with a yaw-rotated car marker + g-force (Motion, packet 0)
- Throttle · Brake — the in-game telemetry trace: green throttle line and red brake line (each 0–100%), responsive to your pedals (CarTelemetry, packet 6)
| File | Purpose |
|---|---|
server.py |
UDP receiver, packet decoders, WebSocket + HTTP server |
static/index.html |
dashboard layout and styling |
static/dashboard.js |
WebSocket client, gauges, minimap rendering |
main.py |
original minimal byte-count listener (sanity check) |
20777UDP — telemetry in (match the game)8765WebSocket — server → browser8000HTTP — serves the dashboard