Install & Setup

If you can install Python, you can run this. Clone, install, launch — then add the overlays you want to OBS as browser sources.

📋 Requirements

  • WindowsiRacing only runs on Windows, so the overlays live there too. (iCASControl's simulator and replay modes also run on macOS and Linux.)
  • Python 3.10+From python.org — tick “Add Python to PATH” during install.
  • iRacingRunning on the same machine, with a session loaded.
  • OBS StudioOr any tool that supports browser sources, for the stream.

📥 Install

git clone https://github.com/halvar20000/iracing-overlays.git
cd iracing-overlays
pip install -r requirements.txt

That's it. The dependencies are Flask, pyirsdk, Pillow, requests and (Windows only) pywin32.

Run the overlays

Recommended The iRacing Overlay Launcher desktop app with a status dot, Start/Stop per overlay and Start All / Stop All controls

GUI launcher

Double-click launch_gui.bat. A small desktop app opens with a Start/Stop button and status dot per overlay, plus Start All / Stop All and a log pane.

Simple

Batch launcher

Run launch_all.bat to start every overlay in its own console window — no GUI, just go.

One terminal

Single command

Run python launch_all.py to start all overlays in one terminal with colour-coded log prefixes. You can also run any single overlay directly, e.g. python iracing_standings.py.

🎬 Add overlays to OBS

  • 1. Start the overlays you wantEach runs on its own port — e.g. 5005 for standings, 5007 for the track map.
  • 2. Add a Browser sourceIn OBS: Sources → + → Browser, URL http://localhost:<port>.
  • 3. Toggle transparent stream modeMost overlays start with a dark debug background. Click into the browser source (Interact) and press H to switch to the transparent stream mode. The Live Indicator and Flag overlays are always transparent.

The overlays bind to 0.0.0.0, so a second PC on your LAN can reach them at http://<your-ip>:<port> — handy for a dedicated streaming PC.

Tip

Self-healing browser sources — no manual refresh

OBS loads each browser source once at startup; if the overlay server isn't running yet, the source stays blank until you hit Refresh. To avoid this, use the loader pages in obs_loaders/: in the browser-source properties, tick Local file and pick e.g. obs_loaders/standings.html instead of typing a URL. The loader retries automatically until the server responds — start order no longer matters, and overlays come back on their own after a restart. Regenerate the loaders with python make_obs_loaders.py after adding a new overlay.

🗺 Offline track map & optional sharing

  • Offline track libraryThe track map needs no iRacing login and no internet — geometry for ~300 configurations is bundled in tracks/ as JSON. If a track isn't bundled it shows a friendly “TRACK MAP NOT BUNDLED” message. Geometry comes from the SIMRacingApps library (Apache 2.0) and OpenStreetMap (ODbL).
  • Car brand logosThe standings overlay shows manufacturer logos from brands/*.svg. To add a brand, drop brands/<slug>.svg into the folder and, if needed, add a prefix mapping in car_brands.py.
  • Optional public sharingThe race logger has read-only public endpoints (/share/chart, /share/standings) so Twitch/Discord viewers can open a self-service chart. Expose them with a free Cloudflare Tunnel — only /share/* paths are served remotely; all admin endpoints stay local.

🔧 Troubleshooting

  • “Waiting for iRacing”iRacing must be running with a session loaded, not just the UI.
  • Changed a script but see old behaviourOverlays keep the old code in memory — restart the overlay.
  • Black box instead of transparency in OBSPress H in the browser source (Interact) to toggle stream mode.
  • Port already in useAnother overlay or app owns that port; each script's port is set at the bottom in app.run(...).
▶ Full README on GitHub