A real-time telemetry dashboard for sim racing and real racing. Connects directly to your sim or to your car's OBD-II port via an ELM327 adapter, and displays live data, lap analysis, race strategy, post-session coaching, and a self-building track map.
Built around a violet/dark design system with two density modes — dense, glance-while-driving live tabs (Dashboard, Race, Strategy, Tyres, Coach) and roomy analysis tabs (Telemetry, Lap Analysis, Lap Comparison, Session, Replay).
- Open the latest release.
- Under Assets, download
S1napse-Setup-<version>.exe(about 150–200 MB).
- Double-click
S1napse-Setup-<version>.exe. - Windows may show "Windows protected your PC." Click More info → Run anyway. This is normal for an unsigned beta build; the warning will go away once SmartScreen has seen enough installs.
- Pick a Start Menu group (default
S1napse) and optionally a desktop shortcut, then finish the wizard.
Antivirus warning? Some antivirus tools flag PyInstaller executables as suspicious. The app is safe — you can add it as an exception or check the source code in this repo.
S1napse will check for new beta releases on startup and show a small banner at the top of the window when one is available — click Download to jump straight to the release page.
To uninstall: Settings → Apps → S1napse → Uninstall.
When S1napse launches you'll see a welcome screen with two options:
- Select SIM RACING and click NEXT
- Launch your sim first, then open S1napse
- S1napse will auto-detect whichever sim is running
- The status bar at the top will show ● CONNECTED when it picks up data
| Sim | What to do |
|---|---|
| ACC | Just launch the game — S1napse connects automatically |
| Assetto Corsa | Enable UDP telemetry in AC's settings: Options → General → Enable Custom Shaders Patch is not required — just go to Options → General and enable UDP telemetry on port 9996 |
| iRacing | Launch iRacing, go to the track — S1napse connects automatically |
| Le Mans Ultimate (LMU) | One-time plugin install required (rF2 Shared Memory Plugin). See docs/lmu-setup.md. After that, just launch the game — S1napse connects automatically. |
- Select REAL RACING and click NEXT
- Choose your connection type — WiFi or Bluetooth
- Enter your adapter's connection details (IP:port for WiFi, serial port for Bluetooth)
- Click CONNECT — or use DEMO MODE to test without hardware
- The real racing dashboard shows live speed, RPM, throttle, gear, fuel, and temperatures
See REAL_RACING_GUIDE.md for full setup instructions, adapter recommendations, and troubleshooting.
| Game | Windows |
|---|---|
| Assetto Corsa Competizione (ACC) | ✅ |
| Assetto Corsa (AC) | ✅ |
| iRacing | ✅ |
| Le Mans Ultimate (LMU) | ✅ |
| Source | Windows | Mac |
|---|---|---|
| ELM327 OBD-II (WiFi) | ✅ | ✅ |
| ELM327 OBD-II (Bluetooth) | ✅ | ✅ |
The app samples telemetry at 50 Hz in the background and renders the UI at ~5 Hz. A title bar at the top is always visible: brand, live source pill (with green dot when a reader is connected), session context (lap / stint / last lap), and the source/track/host/port controls.
Selective gauges row — RevBar, throttle and brake PedalBars, SteeringBar — plus a 2×2 stat-card grid for Speed, Gear, Last lap, and Fuel.
Rolling graphs for the current lap: speed, throttle/brake, steering, RPM, gear, ABS/TC. Math-channel side panel for user-defined formulas.
Multi-panel view:
- Sectors — running lap timer + S1/S2/S3 splits vs your reference lap (green = faster, red = slower)
- Track Map — builds itself from real car coordinates as you drive. Color-coded by throttle (green) and braking (red). Saved automatically after each lap so it loads instantly next session.
- Telemetry graphs — distance-based speed, throttle, gear, RPM, steering for the current lap
- Delta graph — time gained/lost vs your reference lap at every point on track
Live, glance-while-driving layout in three columns plus a headline strip:
- Headline — current race position (P4/22 style) with the active strategy banner inline next to it
- Pace column — last lap time, lap-trend sparkline (last 12 laps with PB reference), S1/S2/S3 sector splits
- Position column — gap to rivals ahead/behind in seconds, ±3s gap-bar visualizer, per-lap gap-trend ("closing/opening +0.18s this lap"), pit window range from the strategy engine
- Car column — live tyre temps quad (cold/hot tinting), tyre stint laps + degradation projection, fuel remaining, stint summary (lap, average, best)
Headline strip on top + two columns:
- Now — pit window, fuel-save cost, rival watch (gap-jump pit detection), weather/track-temp watch
- Plan — tyre degradation projection (fits a slope to recent lap times — needs ≥3 laps), pit summary, fuel-save calculator (laps-to-go input), undercut/overcut calculator (pit-loss + pace-delta inputs)
The headline reads from StrategyState.headline() and surfaces the highest-priority active alert (rival pit, pit window open, weather change, etc.).
Per-corner TyreCard quad on the left, plus pressure / wear / IMO temp distribution panels on the right.
Pick any two laps from your session and overlay them on the same graphs. See exactly where you gained or lost time.
Full lap table with times, sector splits, and validity flags. Export everything to CSV with one click.
Scrub through any saved lap with playback controls, telemetry graphs, and a time-synced track-map cursor.
Post-lap analysis: a "quick win" tip card, per-tyre temperature feedback, and a session-progress card with a lap-time sparkline and per-corner grade history. Driven by the LapCoach engine.
A dedicated single-page layout for real car telemetry via ELM327 OBD-II:
- Speed, RPM, Gear — large hero gauges front and center
- Throttle — live percentage with fill bar
- Fuel level — percentage remaining with fill bar
- Coolant & intake temps — engine temperature monitoring
- Live graphs — scrolling speed, throttle, and RPM traces (~10 seconds of history)
- Manual lap trigger — press the LAP button or L key to mark laps
- Lap timer — live running time and last lap display
Standard OBD-II does not provide brake, steering, tyre, or ABS/TC data — these channels are only available in sim racing mode.
S1napsse builds the track map automatically — no pre-loaded layouts needed.
- Load into any session on a new track
- Complete the outlap (S1napsse skips it to avoid pit-exit noise)
- Drive — the map builds in real time
- Cross the finish line — the map saves automatically
On your next session at the same track it loads instantly. Track files are saved in a tracks\ folder next to S1napsse.exe.
You can also press ⏺ REC in the top bar to start/stop a recording manually.
Clone the repo and run from source:
pip install -r requirements.txt
python -m s1napse # or: python s1napse.pyRun the test suite:
pip install -r requirements-dev.txt
pytest tests/ -vBuild the EXE yourself:
pip install pyinstaller
pyinstaller Synapse.spec
# Output: dist/S1napsse.exeProject structure:
acc-telemetry/
├── s1napse.py # Thin entry point
├── s1napse/ # Application package
│ ├── __main__.py # `python -m s1napse`
│ ├── app.py # Main window + render orchestration
│ ├── theme.py # Design tokens + QSS builder
│ ├── constants.py # Channel colors + track constants
│ ├── readers/ # ACC, AC-UDP, iRacing, LMU, ELM327 readers
│ ├── vendor/ # Third-party libs vendored into the repo (MIT)
│ ├── coaching/ # LapCoach, MathEngine, StrategyEngine
│ ├── widgets/
│ │ ├── primitives.py # Card, Pill, Stat, Sparkline, GapBar
│ │ ├── title_bar.py # Always-visible top strip
│ │ ├── tab_bar.py # LiveTabBar (per-tab live-state dot)
│ │ ├── tabs/ # Per-tab modules (race, dashboard, tyres, ...)
│ │ ├── strategy_tab.py # Strategy tab (headline + 2-col)
│ │ ├── coach_tab.py # Coach tab
│ │ └── ... (gauges, graphs, panels, track_map, etc.)
│ ├── tracks/ # Auto-generated track JSON files
│ └── racelines/ # Saved racelines
├── tests/ # pytest test suite
├── installer/ # Inno Setup installer script
├── tools/ # Build helpers (build_installer.py, etc.)
├── docs/ # User-facing documentation
├── Synapse.spec # PyInstaller build config
├── requirements.txt # Runtime dependencies
├── requirements-dev.txt # Test/dev dependencies
└── README.md
S1napsse shows DISCONNECTED
- Make sure the sim is running and you are in a session (not the main menu)
- For AC, confirm UDP telemetry is enabled in game settings
- Try selecting the source manually from the SOURCE dropdown instead of Auto-Detect
Track map is not building
- The outlap is always skipped — drive one full lap first
- If the lap is invalid (track cut, penalty) the map pauses recording to stay clean
The exe is being blocked by antivirus
- This is a known false positive with PyInstaller-built apps
- Add
S1napsse.exeas an exception in your antivirus, or build from source
- ACC, iRacing, and Le Mans Ultimate use shared memory — S1napse must be running on the same Windows PC as the sim
- AC UDP works over a local network too (change the HOST field in the top bar)
- ELM327 OBD-II works on Windows and Mac via WiFi or Bluetooth — see REAL_RACING_GUIDE.md
- OBD-II polling is slower than sim telemetry (~2-4 Hz vs 20 Hz) — this is a hardware limitation, not a bug
S1napse is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for the full text.
In short: you are free to use, modify, and redistribute this software, but any modified version — including network-deployed versions — must be made available under the same license.
This repository vendors the following third-party code, retained under its original license:
s1napse/vendor/pyRfactor2SharedMemory/— Python bindings for the rFactor 2 Shared Memory Plugin. Copyright © 2021 Tony Whitley. Licensed under the MIT License (sees1napse/vendor/pyRfactor2SharedMemory/License.txt). Used bys1napse/readers/lmu.pyto read Le Mans Ultimate telemetry. Source: https://github.com/TonyWhitley/pyRfactor2SharedMemory.pyaccsharedmemory— Python bindings for the Assetto Corsa Competizione Shared Memory API. Copyright © rrennoir. Licensed under the MIT License. Installed as a PyPI dependency (requirements.txt) and used bys1napse/readers/acc.pyto read ACC telemetry. Source: https://github.com/rrennoir/PyAccSharedMemory.TUMFTM/racetrack-database— Open racetrack centerline and raceline dataset. Licensed under the GNU Lesser General Public License v3.0 (LGPL-3.0). Consumed offline bytools/import_tracks.pyto generate the pre-built track JSON files shipped ins1napse/tracks/. Source: https://github.com/TUMFTM/racetrack-database.Lovely-Sim-Racing/lovely-track-data— Per-track turn names, sector boundaries, and pit markers for ACC. Licensed under CC BY-NC-SA 4.0. A snapshot is vendored unders1napse/lovely-track-data/and consumed offline bytools/import_tracks.pyto populate theturnsfield ofs1napse/tracks/*.json. Source: https://github.com/Lovely-Sim-Racing/lovely-track-data.