About Features · Files Privacy Set It Up → Support
Origin Story

Built On
Someone
Else's
Genius.

TRACE — Telemetry Racing Analytics & Comparative Engine — wouldn't exist without one person whose open-source work saved the whole thing from the bin. Here's the real story.

// chapter 01

It Was
A Disaster.

Getting telemetry out of GT7 is not obvious. The PS4/PS5 broadcasts UDP packets — fine, that part's documented. But the actual data is encrypted with Salsa20, a stream cipher, using a key that Polyphony Digital baked into the game binary. The packet structure is completely proprietary. There's no official API, no documentation, nothing.

I spent a long time getting nowhere. Packets were coming in but the decryption was wrong. Numbers made no sense — speed reading –12,000 km/h, tyres at 6,000°, gear stuck on 0. The coordinate system was unclear. The byte offsets were guesswork. Every fix introduced two new breakages.

$ python gt7telem.py

RECV 296 bytes ... decrypting ...

speed: -12847.3 km/h   gear: 0   rpm: 4294967295

tyre FL: 6144.0° ... something is very wrong

It was genuinely demoralising. The GT7 telemetry UDP stream had been reverse-engineered by the community, but piecing together scattered forum posts, half-finished GitHub repos, and conflicting byte offset tables was a nightmare. Nothing worked end-to-end.

// chapter 02

Then I Found
Bornhall.

Somewhere deep in a late-night search spiral I stumbled across Bornhall's repository. And it had everything. The correct Salsa20 key. The full packet structure mapped to proper Python structs. Working decryption. Real values coming out the other side.

For the first time — actual numbers. Speed showing 187 km/h. Gear 4. Tyres reading 88–94°. The car dot moving around the track map in the right direction. It just... worked. Because Bornhall had already done the hard part.

I'm not exaggerating when I say this project would not exist without that repo. The decryption logic, the packet struct, the understanding of what each offset means — all of that foundation came from Bornhall's work. Everything built on top of it (the live dashboard, the lap analyst, the chart groups) only happened because that groundwork was already solid.

The least I can do is make sure that's front and centre every time anyone uses this tool.

// credit where it's due

Thank You,
Bornhall.

Full credit, full respect. The core GT7 telemetry protocol implementation in this project is built on top of Bornhall's reverse engineering work. Please go star the original repo.

Original Work By
Bornhall
Reverse-engineered the GT7 telemetry UDP protocol — including the Salsa20 decryption key and full packet byte structure — making community tools like this one possible. Without this work, none of it runs.
Car & Track Database By
ddm999
Every car name shown across the live dashboard, lap analyst, and race analyst — instead of a bare numeric car ID — is resolved through ddm999's gt7info project. This is the auto car discovery in TRACE: the telemetry stream only ever hands over a raw ID number, and ddm999's community-maintained database is what turns that into "Toyota GR86" the instant a session starts, with zero manual lookup. That database covers every car, every track, and every manufacturer in GT7, kept current by ddm999 and the gt7info contributors as Polyphony adds new content — this project just pulls a snapshot (car_ids.csv) and rides on top of it. No name-matching logic, no scraping, no guesswork on our end — just their data doing the actual work every time a car rolls onto the track. The car database is actually the smaller half of what ddm999 runs: gt7info itself is a full live site tracking GT7's daily-changing dealerships - Legend Cars, Used Cars, and the weekly Daily Race lineup - updated by hand, every day, for the whole community to check before they log in.
The TRACK dropdown in the Live Dashboard runs on the same source. GT7's telemetry doesn't expose a track ID the way it does a car ID — there's genuinely nothing to auto-detect there — so instead of leaving that field free-typed (and every lap you record splitting across "suzuka" / "Suzuka Circuit" / "suzuka_circuit" depending on how you typed it that day), it's a picker seeded from ddm999's course database: every circuit, every reverse layout, every sub-layout GT7 has, kept current the same way the car list is. One more corner of this app that only works because ddm999 already did the actual cataloguing.
Also On PyPI
pip install gt7tracetelem
TRACE is also published as a Python package. The distribution name is gt7tracetelem, but the importable module is gt7telemimport gt7telem, or just run gt7telem from a terminal after installing. See the full file manifest for what's inside every download.
Enjoying TRACE?
Support the Project
TRACE is free and always will be. If it's made your GT7 sessions better and you want to throw a few bucks toward keeping it maintained, a coffee goes a long way.
// chapter 03

This Wasn't
Even The Plan.

Here's the part most people don't know. None of this — the live dashboard, the lap analyst, any of it — was ever meant to be the main project. It started as a side requirement for something else: a Raspberry Pi Pico set up to drive the car autonomously in GT7, by replaying recorded laps back through the inputs.

The plan was a closed loop. Record a lap, feed it into a bot, the bot drives that exact lap back perfectly — steering, throttle, braking, all of it reproduced. The telemetry recorder (what eventually became this whole project) only existed in the first place to capture the lap data the bot would replay. There was even a half-built per-car profile system — brake scale, throttle scale, steer scale, speed bias — meant to let the bot adjust its driving per car.

The bot never made it past the workbench. The Pico just flat-out wouldn't run its own code.py — not flaky, not intermittent, it simply refused to execute. A powered USB hub got wired in to send signals to the PS4, hours went into troubleshooting it, and the reason it wouldn't run was never actually figured out. So the bot got scrapped.

But the telemetry recorder it needed didn't go away. It just kept getting built out on its own — more charts, more tabs, a real dashboard, a real analyst — until one day it was the entire project. TRACE exists because the thing it was built to support never worked.

All of it — the live telemetry polling (10 to 60 Hz), the matplotlib charts, pandas crunching G-forces on every sample while GT7 hammers the network in the background — has been built and run the whole time on a laptop with an Intel i3. No upgrade, no dev machine, just whatever was already on the desk. If TRACE feels a little slow to open sometimes, that's why. 😂

Genuinely,
Thank You.

Open source at its best — someone does the hard thing, shares it, and a hundred other things become possible.

// full stack

What This Is
Built With.

Protocol
Bornhall's gt7telemetry — GT7 UDP packet format, Salsa20 decryption, byte struct. The whole foundation. The parser also cross-references MacManley's gt7-udp and Nenkai's PDTools for the per-version packet lengths (A/B/~/C) and extended-field offsets.
Language
Python 3.10+ — the core dashboard/analyst tools run entirely locally, no cloud or account needed. The optional leaderboard is the one piece that talks to a server.
Crypto
pycryptodome — Salsa20 decryption of the telemetry packets.
Charts
Matplotlib — all chart groups in the lap analyst, alongside pandas and numpy for data processing.
GUI
tkinter — live dashboard window, scrollable stats panel, the lot.
Packaging
PyInstaller - standalone builds for Windows, Linux, and macOS, no Python install needed. The macOS build runs on a GitHub-hosted Apple Silicon runner, so no physical Mac is needed to produce it.
Car Database
ddm999's gt7info — powers the automatic car-ID-to-name lookup everywhere a car shows up in TRACE. Every car name you see came from here, not from us. (Same database backs the track row below.)
Track Database
ddm999's gt7info — same source, different table. Backs the TRACK dropdown in the Live Dashboard with every real circuit/layout name GT7 has, since telemetry itself never says which track you're on.
Backend
Supabase (Postgres + Auth) — stores anonymous usage analytics, the global lap leaderboard, and crowdsourced car/track submissions. Anti-cheat and the consensus racing-line aggregation both run as database functions, not app code. Submitting a lap now requires a free account (just a display name, no email or password) — the leaderboard row still shows a PSN name you type at submit time, but it's now anchored to a real account server-side rather than being pure free text. See Privacy for exactly what's stored and when.
// chapter 04

That's
The Whole Thing.

This is where TRACE stops growing. The live dashboard, both analysts, the leaderboard, ghost laps, the consensus line, optional accounts — that's the complete feature set. From here on it's maintenance mode: bug fixes when something breaks, and the car/track database refreshed as ddm999's gt7info updates. No more new features planned.

Given how this whole project started — a side tool for a robot that never worked — it feels right to actually finish it on purpose for once, rather than let it keep sprawling forever. If something's broken, open an issue.