Performance Optimizations
Major memory & CPU overhaul (by @23Kev)
A substantial set of fixes targeting memory growth and CPU cost that previously built up over long sessions, especially with full grids. This is the headline change of the release for anyone running long stints, endurance races, or full 60+ car fields.
- Memory growth during long sessions cut by ~95% — in extended practice, the standings/relative renderer went from accumulating +13 MB/min to +0.7 MB/min. During a 20-minute race phase, app-wide memory growth dropped from +5.7 MB/min to under +5 MB/min (within target). In practice this means you can leave the app running for an entire endurance race without the memory footprint creeping up
- Standings calculations no longer scale quadratically with field size — the per-frame lookup was rewritten from O(N²) to O(N) using map-based grouping, giving a meaningful CPU saving on every render at full grids
- Disconnected drivers are properly released from memory — when a driver leaves the session, their cached refs and live position state are cleaned up instead of accumulating for the rest of the session
- Reference lap saves no longer cause frame stalls — saves are now coalesced (1 per event instead of 3 per renderer) and written asynchronously with a 250ms debounce, removing short hitches during lap completion and pit events
- Hardened native iRacing SDK message handling to avoid crashes during telemetry/session edge cases
- Spurious lap-time resets fixed —
LapTimesno longer resets state on unrelated events - Allocation storm in
PitLapStorefixed — eliminated a burst of per-frame allocations that was contributing to the memory slope above
Reference lap engine rewrite (by @BatMichoo)
- ReferenceLapStore now does a single bulk update per tick covering all cars on track, instead of one update per driver — ~22% CPU win at 64-car grids
- The entire reference-lap calculation engine no longer triggers React re-renders (down from 25/sec to 0 during active telemetry streaming)
- A
Float32Arraybuffer pool reuses lap data arrays, eliminating ~1.5 MB of transient allocations every 2 minutes in a 60-car race and stabilizing memory usage over long sessions
Sector Delta Improvements (by @BatMichoo)
The Sector Delta widget is smarter about which lap it compares you against, and recovers gracefully from old saved data.
- Automatically picks the best available reference lap (Session Best → Class Best → Ghost) — no manual selection needed
- Outdated reference lap files saved from older versions are now handled safely instead of breaking the widget
Standings Widget Enhancements (by @creagel)
The driver standings rows now show extra context during a race, while rendering more efficiently than before.
- Pit stop duration and pit exit info are displayed inside the driver row
- Smoother updates for the flag, pit box, tow, tires, and car manufacturer icons
- Standings and Relative rows re-render less often when flags, tires, pit box, tow icons, and car manufacturer icons haven't actually changed
Bug Fixes
- Nashville Superspeedway — drivers now render correctly on the track map; previously track did not render at all (by @tariknz)
- Session-wide blank-out from setup names — when an iRacing setup folder had a stray newline in its name, the entire session (drivers, standings, relative, fuel) would silently stop updating; the parser now tolerates this (by @tariknz)
- Standings crash on all-digit driver handles — the standings widget no longer crashes when a driver's iRacing name is all digits (by @tariknz)
- Lost global shortcuts — if a saved shortcut used an unsupported key (e.g. the Pause/Break key), every shortcut would silently fail to register on startup; bad accelerators are now skipped instead of taking down the whole list, and the recorder rejects them upfront (by @tariknz)
- Outdated reference lap files — old reference lap files saved in a previous format are now handled cleanly instead of breaking sector delta (by @BatMichoo)
- PostHog event flood — repeating warnings/errors are now de-duplicated for an hour so a single recurring issue can't flood the analytics backend (development/observability fix, by @tariknz)
Changelog
- fix: site download button points to latest release by @tariknz in #552
- fix: parse session YAML when DriverSetupName contains a newline by @tariknz in #554
- fix: throttle posthog log transport to avoid event floods by @tariknz in #555
- fix: skip invalid keybinding accelerators instead of crashing by @tariknz in #556
- fix: add raw input values to telemetry allowlist by @BatMichoo in #557
- fix: handle outdated reference lap files by @BatMichoo in #559
- fix: coerce driver UserName to string before trim by @tariknz in #563
- fix: nashville superspeedway, refine start/finish intersection by @tariknz in #568
- fix: pixelated car manufacturer logos by @tariknz in #571
- perf: optimize ReferenceLapStore with batch processing and memory pooling by @BatMichoo in #548
- perf: phase 2a integration by @23Kev in #551
- chore: simplify reference lap logic & store reactivity by @BatMichoo in #549
- chore: tires car manufacturer pitting towing optimization by @creagel in #565
Full Changelog: v0.3.3...v0.4.1