iRaceDeck is an Elgato Stream Deck and Mirabox plugin for iRacing. Turn your Stream Deck or Mirabox into a fully-featured button box with live telemetry, pit controls, camera management, and more.
- Features
- Installation
- Project Structure
- Releasing
- Contributing
- Troubleshooting
- Usage and license
- For companies
- Inspiration
- Acknowledgements
31 actions with 257+ modes across 8 categories, with Stream Deck+ dial rotation support on most modes:
| Category | Actions | Modes | Examples |
|---|---|---|---|
| Display & Session | 2 | 7 | Incidents, laps, position, fuel, flags |
| Driving Controls | 6 | 30 | AI spotter, audio, black box cycling, look direction, car control, pit crew |
| Cockpit & Interface | 5 | 33 | Wipers, FFB, splits & reference, telemetry, UI toggles |
| View & Camera | 5 | 87 | FOV, replay, camera controls, broadcast tools |
| Media | 1 | 7 | Video recording, screenshots |
| Pit Service | 3 | 15 | Fuel, tires, compounds, tearoff, fast repair |
| Car Setup | 7 | 44 | Brakes, chassis, aero, engine, fuel mix, hybrid/ERS, traction control |
| Communication | 2 | 34 | Chat, macros, whisper, reply, race admin commands |
Key highlights:
- Live telemetry at 4 Hz with automatic iRacing connection/reconnection
- Pit Crew action with Radar directional proximity ticks via multi-channel audio mixer (miniaudio); a voice Race Engineer feature is planned for a follow-up release
- All keyboard shortcuts are user-configurable via the Property Inspector
- SDK-first design: uses iRacing broadcast commands where possible, keyboard simulation only as fallback
- Native C++ addon for low-latency Win32 API access (iRacing SDK, keyboard input, audio engine)
- Download the latest
.streamDeckPluginrelease - Double-click to install
- Find iRaceDeck in the Stream Deck action list
Prerequisites:
- Windows 10+ (iRacing is Windows-only)
- Node.js 24+
- pnpm 10+
- Python 3.x and Visual Studio Build Tools with the C++ workload (for the native addon)
- Elgato Stream Deck software
git clone https://github.com/niklam/iracedeck.git
cd iracedeck
pnpm install
pnpm build# Build only the Stream Deck plugin packages
pnpm build:stream-deck
# Watch mode with hot-reload (restarts Stream Deck automatically)
pnpm watch:stream-deck
# Run tests
pnpm test
# Lint and format
pnpm lint:fix
pnpm format:fixA pnpm monorepo built with Turborepo:
packages/
iracing-actions/ Platform-agnostic iRacing action implementations
deck-adapter-elgato/ Elgato Stream Deck adapter (bridges Elgato SDK to deck-core)
deck-adapter-mirabox/ Mirabox VSD Craft adapter (WebSocket protocol to deck-core)
deck-core/ Platform-agnostic base classes, types, and shared utilities
icon-composer/ Standalone SVG icon assembly (zero dependencies)
icons/ SVG icon templates (Mustache)
iracing-native/ C++ N-API addon (shared memory, window messaging, scan codes)
iracing-sdk/ TypeScript SDK (telemetry, broadcast commands, session parsing)
logger/ Shared logger interface
iracing-plugin-mirabox/ Mirabox device plugin
pi-components/ Shared Property Inspector assets (web components, EJS templates, partials, data)
iracing-plugin-stream-deck/ Elgato Stream Deck plugin
website/ Documentation website (iracedeck.com)
| Package | Role |
|---|---|
@iracedeck/iracing-actions |
All 31 action implementations, platform-agnostic |
@iracedeck/deck-core |
Base classes, types, keyboard service, icon templates, global settings |
@iracedeck/deck-adapter-elgato |
Bridges the Elgato SDK to deck-core's IDeckPlatformAdapter interface |
@iracedeck/deck-adapter-mirabox |
Bridges the Mirabox VSD Craft WebSocket protocol to deck-core |
@iracedeck/icon-composer |
Standalone SVG icon assembly (pure functions, zero dependencies) |
@iracedeck/icons |
SVG icon Mustache templates with colorization support |
@iracedeck/iracing-native |
C++ Node.js addon for Win32 APIs (memory-mapped files, window messaging, scan-code input) |
@iracedeck/iracing-sdk |
TypeScript SDK for reading telemetry and sending iRacing broadcast commands |
@iracedeck/logger |
Shared logging interface with scoped loggers |
@iracedeck/pi-components |
Shared PI web components, EJS templates + partials, template data, and Rollup EJS plugin |
@iracedeck/iracing-plugin-stream-deck |
Elgato Stream Deck plugin — registers actions, PI templates, manifest |
@iracedeck/iracing-plugin-mirabox |
Mirabox plugin — registers the same actions for Mirabox devices |
@iracedeck/website |
Documentation website at iracedeck.com |
Button press (Stream Deck or Mirabox)
-> adapter (deck-adapter-elgato or deck-adapter-mirabox)
-> actions (platform-agnostic action handler)
-> deck-core (keyboard service / SDK commands)
-> iracing-sdk (broadcast command) or iracing-native (scan-code keystroke)
-> iRacing
iRacing telemetry (shared memory)
-> iracing-native (reads memory-mapped file)
-> iracing-sdk (parses telemetry buffer, 4 Hz update loop)
-> deck-core (notifies subscribers)
-> actions (updates button display via adapter)
All packages share a single version number. Releases are automated using release-it with the conventional-changelog plugin.
pnpm release # auto-detect version bump from commits
pnpm release -- 2.0.0 # force a specific version
pnpm release:dry # preview without making changesThe release script will:
- Analyze conventional commits since the last tag to determine the version bump (
fix= patch,feat= minor,BREAKING CHANGE= major) - Update
CHANGELOG.mdwith grouped entries (Features, Bug Fixes, etc.) - Bump the version in the root
package.json, allpackages/*/package.jsonfiles, and the Stream Deckmanifest.json - Create a commit (
chore(release): vX.Y.Z), git tag (vX.Y.Z), and push to origin - Create a GitHub Release with the changelog as release notes
A GitHub Actions workflow (.github/workflows/release-pack.yml) triggers automatically when a version tag is pushed. It:
- Builds the full project on Windows
- Packs the Stream Deck plugin using
streamdeck pack - Attaches the
iracedeck-vX.Y.Z.streamDeckPluginfile to the GitHub Release
- GitHub CLI (
gh) must be authenticated — the release script reads your token viagh auth token
Contributions are welcome! Here's how to get started:
- Fork the repo and create a branch (
feature/123-your-feature) - Follow conventional commits with package scope (e.g.
feat(iracing-plugin-stream-deck): add new action) - Add tests for new code (Vitest)
- Make sure
pnpm buildandpnpm testpass - Open a pull request
Actions live in packages/iracing-actions/src/actions/<action-name>/, one folder per action. Each action needs:
<action-name>.ts— action class extendingConnectionStateAwareActionfrom@iracedeck/deck-core<action-name>.test.ts— unit tests<action-name>.ejs— Property Inspector template (compiled toui/<action-name>.html)icon.svg+key.svg— static category and key icons (copied into each plugin'simgs/actions/<name>/at build time)- Mustache SVGs in
packages/icons/<action-name>/for any dynamic variants - Registration in both
packages/iracing-plugin-stream-deck/src/plugin.tsandpackages/iracing-plugin-mirabox/src/plugin.ts - Manifest entry in each plugin's
manifest.json - Entries in
packages/iracing-actions/src/actions/data/{key-bindings,docs-urls,icon-defaults}.jsonwhere applicable
See the existing actions for reference, or check packages/iracing-plugin-stream-deck/CLAUDE.md for step-by-step instructions.
| Problem | Solution |
|---|---|
Double-clicking .streamDeckPlugin doesn't install |
Rename the file to add .zip at the end, extract the contents to %APPDATA%\Elgato\StreamDeck\Plugins, and restart Stream Deck |
| Plugin doesn't connect | Make sure iRacing is running and you're in a session (on track) |
| Buttons show nothing | iRacing telemetry is only available while driving; the plugin reconnects automatically |
| Native addon build fails | Install Python 3.x and VS Build Tools with C++ workload. Try npm config set msvs_version 2022 |
| Key presses don't work | Check your key bindings in the Property Inspector match your iRacing configuration |
iRaceDeck is source-available and licensed under the iRaceDeck Non-Commercial License v1.1.
Free for personal and non-commercial use, including use in sim racing events and competitions.
For full details, see USAGE.md.
The name “iRaceDeck” and associated branding are not included in the license and may not be used for derived versions without permission.
If you're unsure whether your use case is allowed, feel free to reach out.
iRaceDeck is source-available rather than open source.
The goal is simple:
- Keep iRaceDeck free for sim racers, hobbyists, and the community
- Allow people to build on top of it (profiles, icons, tools, integrations)
- Prevent others from selling or commercializing the plugin itself without permission
- Require that anyone who distributes a modified version of iRaceDeck makes their modifications publicly available, so the community keeps benefiting from improvements
If you're just using, modifying, or contributing to iRaceDeck, nothing changes for you.
If you're building something commercial around iRaceDeck, that's usually fine — just don't redistribute or sell the plugin itself. If you're unsure, feel free to reach out.
If you're working on something commercial based on iRaceDeck, feel free to reach out.
I'm open to licensing, collaboration, or helping you build on top of it.
Contact: niklas@iracedeck.com
This project was inspired by iRaceIT, a Stream Deck plugin for iRacing.
- Elgato Stream Deck SDK
- iRacing SDK
- Node-API (N-API)
- pyirsdk (reference implementation)
