A free, open-source desktop app for analysing iRacing
.ibttelemetry files. Compare laps side-by-side, inspect suspension data, diff setups, and find time across every corner — all without leaving your desktop.
- What is TRACE.IT?
- Feature Overview
- Installation
- Quick Start Guide
- Feature Guide
- Loading Multiple Sessions
- Keyboard & Mouse Controls
- Glossary
- FAQ
- Project Structure (for developers)
- Contributing
TRACE.IT is a telemetry analysis tool built specifically for iRacing. It reads the .ibt binary telemetry files that iRacing writes to disk after every session and lets you:
- Overlay multiple laps on synchronised charts to find where you're losing or gaining time
- Inspect suspension behaviour — ride height, shock deflection, and damper velocity histograms
- Monitor tyre health — temperature gradients across all four corners
- Compare car setups side-by-side across different sessions
- Follow a live cursor on a track map that moves in sync with every chart
TRACE.IT runs entirely offline. No data is uploaded anywhere. All processing happens in memory on your machine.
| User | How you benefit |
|---|---|
| Club/amateur racer | Find where you're braking too late or understeering — without needing a data engineer |
| Sim racing coach | Share a session file with a student and walk through every trace together |
| Developer | Lightweight codebase with a documented IBT parser — easy to extend with new channels |
| Tab | What it shows |
|---|---|
| Telemetry | Throttle, Brake, Speed, Gear, Steering, RPM — synced line charts across selected laps |
| Ride Height | Splitter + per-corner ride height over lap distance |
| Tire Temp | Inner / mid / outer tyre temperatures for all four corners |
| Damper | Shock velocity histograms with low-speed / high-speed zone breakdown |
| Shocks | Shock deflection traces with bump-rubber gap reference line |
| Shock Vel | Shock velocity traces over lap distance (all four corners) |
| Setup | Car setup diff table across all loaded sessions |
Sidebar (always visible):
- Session list with file names
- Lap list — click to assign a colour slot; hover to see air temp, track temp, humidity, and fuel consumption
- Go to the Releases page.
- Download the installer for your OS:
- Windows:
TRACE.IT-Setup-x.y.z.exe - macOS:
TRACE.IT-x.y.z.dmg
- Windows:
- Run the installer and follow the prompts.
- Launch TRACE.IT from your desktop or Start Menu.
macOS note: On first launch macOS may warn "unidentified developer". Right-click the app → Open → Open to bypass Gatekeeper.
Updates are delivered automatically in the background. When a new version is ready, a banner appears in the top-right corner — click Restart now to apply it.
Prerequisites: Node.js 20+ and npm 10+.
# 1. Clone the repo
git clone https://github.com/naizens/TRACE.IT.git
cd TRACE.IT
# 2. Install dependencies
npm install
# 3. Start the dev server (hot-reload for renderer + live Electron window)
npm run devOther useful commands:
npm run typecheck # TypeScript type-check (no emit)
npm run build # Compile to out/
npm run dist # Build + package installer → release/- Open TRACE.IT. You'll see a drag-and-drop zone.
- Load a file. Either drag one or more
.ibtfiles onto the window, or click Open IBT Files in the sidebar. - Pick laps to compare. In the lap list on the left, click a lap to assign it a colour:
- Each click cycles through four colour slots: green (ref) → blue → pink → lime.
- A second click on an already-coloured lap removes it.
- Up to four laps can be active at once (across any combination of sessions).
- Switch tabs at the top to explore different data views.
- Hover over any chart to see a synchronised crosshair across all panels and a live position marker on the track map.
- Scroll to zoom the X-axis (lap distance). Double-click to reset zoom.
Tip: Hover a lap row in the sidebar to see a tooltip with session conditions — air temp, track temp, relative humidity, and fuel used.
The Telemetry tab shows the classic "trace comparison" view: multiple channels plotted against lap distance (in metres) with every chart locked to the same X-axis.
Available channels (toggle with the buttons at the top):
| Channel | Unit | What to look for |
|---|---|---|
| Throttle | % | Trailing throttle, early application points |
| Brake | % | Brake point, pressure ramp, release shape |
| Speed | km/h or mph | Min speed at apex, top speed on straights |
| Gear | — | Gear selection consistency |
| Steering | degrees | Smoothness, peak angle, steering input while braking |
| RPM | rpm | Shift points |
Interactions:
- Hover — crosshair follows mouse; all charts and the track map cursor update together
- Scroll — zoom in / out on lap distance
- Drag resize handle between charts to adjust panel heights
- Double-click a resize handle to reset all panels to equal height
- Double-click a chart to reset zoom
Three synced panels showing ride height over lap distance:
| Panel | What it shows |
|---|---|
| Splitter | Average of Left Front + Right Front — useful for aero/underfloor clearance |
| Front | LF (bright) vs RF (dark) — asymmetry reveals camber/spring imbalance |
| Rear | LR (bright) vs RR (dark) |
What to look for: Low ride height through high-speed corners indicates the car is running on the floor / splitter. Sudden drops to zero suggest a ride height sensor dropout.
A 2×2 grid (one panel per corner) showing Inner / Mid / Outer surface temperatures over lap distance.
The Y-axis range is adjustable — use the min/max inputs in the header to focus on the relevant temperature window for your tyre compound.
What to look for:
- Outer > Inner → understeer / too little front negative camber
- Inner > Outer → oversteer / too much negative camber
- Consistent across laps → your tyre management is stable; differences point to varying track conditions or driving style
A velocity histogram per corner — how much time (as a fraction of the lap) the shock spent at each velocity bin (mm/s).
Controls:
- Range: ±50 / ±100 / ±200 mm/s — zoom in on slow-speed events or capture the full range
- LS/HS split: The dividing line between Low-Speed (LS) and High-Speed (HS) damper zones. Common values: ±25, ±50, ±75 mm/s
Zone percentages are shown on each bar group — the fraction of time in LS bump, LS rebound, HS bump, and HS rebound.
What to look for: A well-set car typically spends most time in the LS zone. A spike into HS territory on a specific corner suggests a kerb strike or severe bottoming. Comparing a "good lap" against a "bad lap" histogram quickly shows where the suspension was upset.
Front and rear shock deflection over lap distance, with a bump-rubber gap reference line drawn from the car setup YAML embedded in the IBT file.
What to look for: When the deflection trace touches or crosses the bump-rubber line, the car is bottoming on that corner. This is useful for identifying whether your springs or bump stops need adjustment.
Shock velocity (mm/s) for all four corners plotted over lap distance — the time-domain version of the Damper histogram.
Use this alongside the histogram to pinpoint where on track high-speed events occur rather than just how often.
A table comparing car setup values across all loaded sessions. Differences are highlighted so you can instantly see what changed between a morning and afternoon session, or between your setup and a coach's reference file.
Load two or more
.ibtfiles from different sessions to populate this view.
A canvas-based track map reconstructed from telemetry using dead-reckoning (Speed + Yaw). No track database required — the shape is derived entirely from the data in the IBT file.
- The coloured dot moves in sync with the chart crosshair
- The map is shown in the lower section of the sidebar and is visible on all tabs
- The Telemetry Bar above the map shows live channel values at the cursor position
TRACE.IT supports loading several .ibt files simultaneously:
- Click Open IBT Files and select multiple files (or drag them all at once).
- Each session appears as a separate entry in the session list.
- Laps from different sessions can be assigned colour slots and compared on the same charts.
Note: The track map and some views (Telemetry, Ride Height, Shocks) use only the first loaded session's track layout. The Setup tab compares all sessions.
| Action | How |
|---|---|
| Zoom chart X-axis | Scroll wheel over any chart |
| Pan while zoomed | Hold and drag left/right |
| Reset zoom | Double-click any chart |
| Resize chart panels | Drag the handle between panels |
| Reset panel heights | Double-click the resize handle |
| Assign lap colour | Click lap row in sidebar |
| Remove lap colour | Click a coloured lap row until it cycles off |
| See lap conditions | Hover lap row in sidebar |
| Term | Meaning |
|---|---|
| IBT | iRacing's binary telemetry format (.ibt files). Recorded automatically during sessions if telemetry capture is enabled in iRacing settings. |
| LapDist | Distance from the start/finish line along the racing line, in metres. Used as the X-axis for all trace charts. |
| Shock Deflection | How compressed the shock absorber is at a given point. Higher = more compressed. |
| Shock Velocity | How fast the shock is moving (mm/s). Positive = bump (compression), negative = rebound. |
| LS / HS (Low-Speed / High-Speed) | Refers to shock shaft velocity, not car speed. Low-speed events are smooth inputs (aero, weight transfer); high-speed events are kerb strikes and road bumps. |
| Ride Height | The gap between the car's floor / splitter and the road surface, in millimetres. |
| Bump Rubber / Bump Stop | A rubber insert inside the shock that limits travel at full compression. When the shock hits it, behaviour changes abruptly. |
| Colour Slot | One of four assignable colours (green / blue / pink / lime) used to identify a lap on charts. Green is the "reference" lap. |
| Dead Reckoning | Estimating position by accumulating speed and direction over time. TRACE.IT uses this to draw the track shape without a GPS track database. |
Where does iRacing store IBT files?
By default: Documents\iRacing\telemetry\. You need to enable telemetry capture in iRacing → Options → Drive → "Record telemetry". Set it to "Always" or "When in car".
Why does my track map look wrong?
Dead-reckoning drift accumulates over a lap. Out-laps and in-laps look worst because the car is moving slowly or off-line. Full flying laps are usually accurate.
Can I use this offline?
Yes — 100% offline. No internet connection is needed.
Which platforms are supported?
Windows 10/11 and macOS 12+. Linux is not officially supported (Electron runs on Linux but no installer is provided).
Can I export data to CSV / MoTeC?
Not currently. TRACE.IT is a viewer, not an exporter. If you need MoTeC i2 export, look at Mu.
The app says "No shock velocity data found"
Some older IBT files or certain cars don't export suspension channels. There's nothing TRACE.IT can do — the data simply wasn't recorded.
How do I enable telemetry recording in iRacing?
iRacing main menu → Options → Drive → scroll to "Telemetry" section → set Record telemetry to Always (or When in car).
src/
main/
index.ts — Electron main process: window, IPC handlers, auto-updater
ibt-parser.ts — Binary IBT parser → returns ParsedSession via IPC
preload/
index.ts — contextBridge: exposes window.electronAPI to renderer
renderer/src/
App.tsx — Root component: tab routing, TitleBar, Sidebar, DropZone
types/session.ts — ParsedSession, LapInfo, SessionMeta, LapColor types
store/useStore.ts — Zustand store: sessions[], selections{}, activeTab, theme
lib/
constants.ts — LAP_COLORS, COLOR_ORDER, CHART_CONFIGS
interpolate.ts — Binary-search linear interpolation
formatters.ts — formatLapTime, arrayMax/Min, darken()
chartSetup.ts — Chart.js global register + SyncCursor plugin
buildChartData.ts — Shared dataset builder (used by Telemetry, TireTemp, etc.)
syncChartConfig.ts — buildZoomPlugin, buildClickHandler
components/
ui/ — Button, UpdateBanner, ChangelogModal, Modal
layout/ — TitleBar, Sidebar, DropZone
hooks/
useChartSync.ts — Imperative hover/zoom/click sync across all charts
useTrackMapUpdate.ts — Reads Zustand, calls trackMapRef.updateMarker()
features/
sessions/ — SessionList, LapList (with hover tooltip)
telemetry/ — TelemetryView, ChartPanel, createChartOptions
rideheight/ — RideHeightView, RidePanel
tiretemp/ — TireTempView
damper/ — DamperView, CornerHistogram
shocks/ — ShocksView, ShockPanel (deflection + bump-rubber)
shockvel/ — ShockVelocityView (velocity traces)
setup/ — SetupView (setup diff table)
trackmap/ — TrackMap (canvas), TelemetryBar, index.ts (barrel)
IBT Parsing runs entirely in the Electron main process (Node.js). The renderer never touches the file directly — it receives a ParsedSession object via IPC (open-ibt-files channel). Only channels in the NEEDED_VARS Set are extracted; add a new channel name there to expose it to the renderer.
Chart synchronisation is fully imperative — no React state is updated on hover or zoom. Chart.js instances are stored in refs and called directly. This keeps the UI at 60 fps even with 7000+ data points per chart.
Chart options are created once via useMemo([]). Callbacks inside them read live values through mutable refs to avoid stale closures.
Track map uses canvas + forwardRef / useImperativeHandle to expose updateMarker(lapDist). Always import from the barrel (features/trackmap/index.ts).
- Add the channel name to
NEEDED_VARSinsrc/main/ibt-parser.ts. - Add a
CHART_CONFIGSentry insrc/renderer/src/lib/constants.ts. - Wire it into
buildChartData.tsif it belongs on the Telemetry tab, or build a new feature view.
| Field | Offset |
|---|---|
| tickRate | 8 |
| sessionInfoLen | 16 |
| sessionInfoOffset | 20 |
| numVars | 24 |
| varHeaderOffset | 28 |
| bufLen | 36 |
| varBuf[0].bufOffset | 52 |
| numSamples | 140 |
Variable descriptor: 144 bytes — type@+0, offset@+4, name@+16 (char[32], ASCII, null-terminated).
Pull requests are welcome. Before opening one:
- Run
npm run typecheck— no type errors allowed. - Keep changes focused; one feature or fix per PR.
- Follow the existing patterns: no comments unless the why is non-obvious, no new abstractions for a single use-case.
For significant changes (new tabs, new IPC channels, state shape changes) open an issue first to discuss the approach.
Built with Electron, React, Chart.js, and Tailwind CSS v4.