- F1 25 broadcasts telemetry as UDP packets of different types — motion, session, lap data, participants, car telemetry, car status, car damage and more — each carrying data for every car.
- StintLab reads seven packet types for your car and writes each lap to its own file the moment the game times it: a trace every 5 m plus the lap's time, sectors, validity, conditions, assists, fuel and tyres.
- Laps are judged strictly: an invalid lap stays invalid to the line, out-laps and pit laps never set a best, and a lap time is never invented.
- The F1 25 and 2026 Season Pack formats differ in a handful of places. StintLab reads both, and checks the newer one packet by packet.
What F1 25 telemetry is
While you drive, F1 25 can send a continuous stream of small data packets to an address on your network — by default, to your own PC. It is the game narrating the session: where every car is, how fast it is going, what the driver's feet are doing, which lap it is on and how long the last one took. The format is published by the game's developers, which is why dashboards, motion rigs and analysis tools can all read the same stream.
Each packet starts with the same header: which format and game version sent it, what kind of packet it is, which session it belongs to, the session clock, a frame counter, and — importantly — which car on the grid is yours. Most packet types then carry an entry for every car at once, 22 of them in the F1 25 format and 24 in the 2026 Season Pack format. A tool that reads “the first car” instead of the player's car will happily record somebody else's lap; StintLab always indexes by the player's car.
Nothing here is on by default. You switch it on in the game's Telemetry Settings, choose where it goes and how often, and pick the format.
The packets StintLab reads, and why
The game sends more packet types than any one tool needs. StintLab reads seven, for your car only, and each has a job:
| Packet | What StintLab takes from it | What it is used for |
|---|---|---|
| Session | Track, track length, session type, formula, weather, track and air temperature, AI difficulty, and the assists: steering, braking, gearbox, ERS, DRS, racing line | Naming the session, and matching laps so a target is only ever a fair one |
| Lap Data | Lap number, distance round the lap, current and last lap time, sector 1 and 2 times, the lap-invalid flag, pit status, pit-lane and stationary timers, penalties served, speed trap | Lap times, sectors, validity, pit visits — and the distance every trace sample is placed on |
| Car Telemetry | Speed, throttle, brake, steering, gear, engine rpm, DRS, tyre inner temperatures | The lap trace, and tyre temperatures in the strategy panel |
| Motion | Your car's position on the circuit | The track map, drawn on the line you actually drove, and the replay marker |
| Participants | Your team | Which car the lap was driven in — in F1, the car is the team |
| Car Status | Fuel in the tank, the MFD fuel estimate, tyre compound, tyre age | Fuel per lap and tyre history |
| Car Damage | Tyre wear, per wheel | Tyre wear history |
The rest — race events, car setups, the final classification, lobby data, session history, tyre sets, extended motion data and more — are useful to other kinds of tools, but not needed to time, trace or judge your own laps, so StintLab ignores them.
From packets to a lap you can compare
Raw telemetry is a stream in time: sixty speed readings a second, say, stamped with the session clock. That is the wrong shape for comparing laps, because two laps are the same only in space — the braking zone is at the same place every lap, not at the same moment.
So StintLab pairs each Car Telemetry packet with the latest lap distance from Lap Data and keeps a sample every time the car has moved at least 5 m since the last one. The result is a lap described on a distance grid — up to about 1,160 samples for Monza, fewer on fast straights at low send rates — where each sample holds the elapsed lap time at that metre alongside speed, throttle, brake, steering, gear, rpm, DRS and position. Two laps of the same circuit land on the same axis, so the gap between them at any metre is the difference between their elapsed times there. That is the whole trick behind lap comparison.
The lap is written to disk the moment the game reports its time — one small JSON file per lap. That file is the database: there is no queue, no sync and no connection that can be down, so a lap is either saved or it is not, and quitting or pulling the plug cannot take back one already written.
What one lap looks like on disk
Every lap is self-describing: it carries its own identity, conditions and settings, so it can be read, mailed or compared on its own. Abbreviated, a lap file looks like this:
{
"game_id": "f1_25",
"run_uid": "…", // the session (a restart gets its own)
"seq": 8, // lap number
"recorded_at": "2026-09-17T19:16:00.412+00:00",
"venue_id": "monza",
"vehicle_id": "ferrari", // in F1, the car is the team
"lap_time_ms": 80950, // exactly as the game timed it
"splits_ms": [28530, 28190, 24230],
"valid": true,
"weather": "clear", "track_temp_c": 32, "air_temp_c": 24,
"top_speed_kph": 320, // the session's speed-trap best so far
"session_type": 1,
"ruleset": { "packet_format": 2025, "game_year": 25, "game_version": "1.0",
"formula": 0, "steering_assist": 0, "braking_assist": 0,
"gearbox_assist": 2, "ers_assist": 0, "drs_assist": 0,
"dynamic_racing_line": 0, … },
"track_length_m": 5793,
"sample_every_m": 5.0,
"samples": { // one entry per sample, up to ~1,160 at Monza
"distance_m": [2.1, 7.4, 12.6, …],
"time_ms": [26, 91, 157, …],
"speed_kph": [318, 319, 319, …],
"throttle": […], "brake": […], "steer": […], "gear": […],
"rpm": […], "drs": […], "world_x_m": […], "world_z_m": […]
},
"stint": { "fuel_start_kg": …, "fuel_end_kg": …, "fuel_used_kg": …,
"fuel_margin_laps": …, "compound": …, "tyre_age_laps": …,
"wear_pct": […], "inner_temp_c": […], "pit_visits": […], … }
}At the default spacing a lap is about 50 KB. They live in %LOCALAPPDATA%\StintLab\traces\<session>\lap_<n>.json; Laps → Open saved laps folder takes you there. Copy the folder anywhere and the season is backed up. The same file format is what you send a friend to chase.
How a lap is timed and judged
A telemetry tool is only as trustworthy as its lap list. These are the rules StintLab applies — several stricter than the game's own.
- The lap time is the game's. A lap completes when the lap counter ticks over; the game's “last lap” figure is often still zero or stale on that exact frame, so StintLab waits a few frames for the real time. If it never arrives, the lap is dropped and logged — never estimated.
- Invalid stays invalid. The game's lap-invalid flag describes the lap in progress and resets when a new lap starts. StintLab latches it: cut a corner anywhere and the lap stays invalid to the line, even if the game clears its own flag first. Invalid laps are listed — you will want to see the quick one you binned — but never set a best, a sector best or an average.
- Out-laps are not flying laps. F1 measures lap distance from the start line, so a lap started from the pit exit reads negative until it crosses the line. It covers less ground and can carry a misleading time, so it is marked “out-lap” and never counted.
- Pit laps stay, but never set the pace. A lap that went through the pits is kept and marked for the strategy history, and excluded from pace targets, best sectors, consistency and the optimal lap.
- Menus are not a new session. The game reports session id zero whenever you are in a menu. StintLab holds everything and waits for you to come back to the same lap, instead of splitting your evening into fragments.
- Flashbacks rewind the trace too. When the distance goes backwards, the lap's trace restarts so it can never double back on itself; a flashback inside a lap also throws away the fuel and pit readings from before the rewind rather than counting them twice.
- A restart is a new stint. Restarting keeps the game's session id but sends the lap counter back to one, so the new stint gets its own id and its laps can never overwrite the old ones.
- The last lap is not lost. Cross the line and quit straight to the menu, and the lap the game had already timed is still written.
F1 25 and the 2026 Season Pack: what changed
The 2026 Season Pack sends telemetry in its own layout, which the game lets you choose instead of the F1 25 one. Most of it is identical. What differs, per car, in the packets StintLab reads:
| Per car | F1 25 format | 2026 Season Pack |
|---|---|---|
| Cars in every per-car list | 22 | 24 |
| Car Telemetry | 60 bytes | 59 — engine temperature narrowed |
| Participants | 57 bytes | 60 — driver, network and team ids widened |
| Motion | 60 bytes | 54 — g-forces stored more compactly |
| Car Status | 55 bytes | 59 — an extra ERS field after the ones StintLab reads |
| Lap Data · Car Damage | 57 · 46 bytes | unchanged |
A change of size is the dangerous kind. Read a 2026 Car Telemetry packet with the 2025 layout and nothing fails: car 0 even reads correctly, because everything a trace needs sits in front of the byte that moved — but every other car drifts one byte further out per entry, and the player is rarely car 0. The result is plausible numbers that are not yours.
The 2026 layouts in StintLab were transcribed from published implementations rather than read off the official specification, so StintLab does not take them on trust: it compares the length of every Lap Data, Participants and Car Telemetry packet with the length the layout predicts. An entry of the wrong size is off by whole bytes per car across 24 cars and cannot pass that check — though a field misplaced inside an entry of the right size would. On a mismatch StintLab stops reading the format for the rest of the run, turns amber and tells you to switch to F1 25 — the failure is one setting change, never a season of quietly wrong lap times.
Which should you choose? Both record every lap and both carry fuel, tyres and pit stops. If you want the most proven option, choose F1 25 — see the settings guide.
What the game shows, and what telemetry adds
F1 25 already shows a lot while you drive: lap and sector times with the familiar purple and green, the gap to the car ahead, a fuel figure on the MFD, tyre wear. What it does not do is remember any of it in a form you can study. Quit the session and the detail is gone. Telemetry recorded to disk adds:
- Where the time went, to the metre — two laps overlaid, with a delta line.
- How you brake in every corner, and how repeatably — the braking table.
- The lap you have already driven — theoretical best and optimal lap.
- What to practise, ranked by cost — the practice plan.
- Fuel and tyres per lap for race planning — the strategy panel.
- Whether any of it worked — a season's record, because the game forgot June.
Where the data goes
With the IP address set to 127.0.0.1, telemetry travels from the game to StintLab inside your own PC. StintLab then writes it to your own disk and makes no outbound connection of any kind: no server, no account, no analytics, no licence check. The pages it builds from your laps are self-contained HTML files that open offline, in any browser, and keep working after StintLab is uninstalled.
Questions
Is F1 25 telemetry the same data real F1 teams see?
No — it is the game's data about the game's car. Real F1 cars carry hundreds of sensors and stream far more to their teams than any broadcast shows. The game's stream covers the channels that matter most for driving — speed, throttle, brake, steering, gear, DRS, position, lap and sector times, fuel and tyres — and the game reports your distance round the lap directly.
Does StintLab record every game mode?
It records whatever session the game is sending telemetry for — practice, qualifying, sprint, race or Time Trial. Each lap keeps its session type, and laps from different session types are never picked as targets for each other.
Does it record other cars?
No. Most packets carry data for the whole grid, but StintLab records your car — the one the game marks as the player's — and nothing else.
Are ERS and DRS recorded?
DRS is recorded with every trace sample. ERS deployment and battery level are not recorded in this edition; the ERS and DRS assist settings are, and laps are only matched against laps driven with the same assists.
How much disk space do laps take?
About 50 KB per lap at the default 5 m spacing — roughly 3 MB for sixty laps. Nothing is deleted unless you set keep_sessions in settings.toml, and then whole sessions go, oldest first, never half of one.
Can I read the lap files with my own tools?
Yes. Each lap is a plain JSON file in %LOCALAPPDATA%\StintLab\traces, and each session report writes a lap-times.csv beside it with one row per lap for the sessions in the report — your 20 newest. The data is yours to keep, copy, publish or delete.