v1.7.13 now available

Your physical dashboard,
fully customized.

Turn your Ulanzi D200 or Elgato Stream Deck into a command center for iRacing, OBS, Discord, and more. Live telemetry on buttons, one-click pit commands, auto page switching. All configurable from a browser.

CtrlDeck main interface showing button grid, sidebar, and editor panel

Works with

๐Ÿ–ฅ Ulanzi D200
๐ŸŽฎ Elgato Stream Deck
๐Ÿ iRacing
๐Ÿ”ด OBS Studio
๐Ÿ’ฌ Discord
๐Ÿ•น USB Wheels & Controllers

Everything you need,
nothing you don't.

Configure every button from a clean web UI. Changes push to the device instantly.

๐Ÿ—‚

Multi-page layouts

Organize buttons across multiple pages per profile. Flip between pages from any button with page actions.

โšก

Auto page switching

Pages switch automatically based on iRacing session state: practice, qualifying, pit road entry, race start, and more.

๐Ÿ“ฑ

Multi-device support

Connect a Ulanzi D200 and an Elgato Stream Deck at the same time. Each gets its own independent profile.

๐ŸŽจ

Custom icons & labels

Upload any image or choose from 200+ built-in icons. Set a display name. Your button, your way.

๐Ÿ“ก

Live telemetry on buttons

Assign a button to show iRacing data: speed, gear, RPM, fuel level, brake bias, lap time. Updated at 1 Hz.

๐Ÿ•น

Wheel & joystick bindings

Bind any button on a sim racing wheel or USB controller to any CtrlDeck action, independent of the D200/Stream Deck grid. Bind the same shortcut in iRacing's own controls and on a wheel button, and that one action works from either the wheel or the deck.

๐Ÿ”„

Import from Ulanzi or Elgato

Already using the official Ulanzi Studio or Stream Deck software? Import your profiles directly, icons included.

๐Ÿ’พ

Backup & restore

Export your full layout and icons as a zip. Import on any machine. Auto-backup runs before any profile import.

๐Ÿ–ผ

Wallpaper profiles

Set a full-deck background image with Fill, Contain, or Custom fit. Custom mode lets you drag and zoom to crop across all buttons โ€” rendered seamlessly, accounting for physical bezels.

๐Ÿ”†

Brightness control

Adjust device brightness from the sidebar. Persists across sessions.

๐Ÿ”ƒ

Auto-updater

Updates download in the background. When ready, a prompt lets you install and walk through the latest version at your own pace.

See it in action.

CtrlDeck main view

Main deck view

Sidebar shows device status, profiles, and pages. Center grid displays your configured buttons. Right panel is the button editor. Assign icons, labels, and actions without leaving the browser.

Wallpaper profile with custom fit

Wallpaper profiles

Set a full-deck background image with Fill, Contain, or Custom fit. Drag and zoom to find the perfect crop โ€” rendered seamlessly across all buttons, gap-aware so lines flow right through the bezels.

Auto page switching modal

Auto page switching

Map iRacing session states and pit road events to pages. The deck switches automatically as the race unfolds.

Page settings modal

Page & profile settings

Reorder with a live position list, rename, or delete with confirmation. All in one gear modal.

iRacing keybindings browser

iRacing keybindings browser

Browse all bound controls. Yellow = device/wheel button, blue = keyboard combo. Fully searchable.

iRacing unbound controls

Unbound controls

Every iRacing action with no key assigned, each with a suggested free combo to bind.

Settings panel

Settings & integrations

OBS WebSocket, Discord OAuth, profile import from Ulanzi/Elgato, and backup/restore. All in one place.

Built for the tools
you already use.

Deep, native integrations. Not just hotkey passthroughs.

๐Ÿ
iRacing
SDK + keybind actions, live telemetry
  • Pit service: fuel, tires, fast repair, windshield
  • Live telemetry on buttons (speed, gear, fuel, biasโ€ฆ)
  • Replay & camera control via SDK
  • Black box panel shortcuts (F1โ€“F11)
  • Auto page switch on session/pit road state
  • Import controls.cfg keybindings
  • Conflict checker & unbound control finder
๐Ÿ”ด
OBS Studio
WebSocket live state, scene switching
  • Scene switch (glows green when active) Live
  • Record toggle (glows red while recording) Live
  • Stream toggle (glows orange while live) Live
  • Connects via OBS WebSocket v5
  • Password-protected connections supported
๐Ÿ’ฌ
Discord
OAuth voice controls, per-user volume
  • Mute/deafen (glows red when active) Live
  • PTT toggle (glows orange in PTT mode) Live
  • Join voice or text channels
  • Your own output volume
  • Per-user volume: raise, lower, or set any participant

Live data, right on your buttons.

Assign any button to display a live iRacing readout, updated at 1 Hz while you're driving.

3rd
Gear
87
Speed
km/h
6,240
RPM
72%
Throttle
34%
Fuel
55.2
Brake Bias
%
1:38.4
Last Lap
P4
Position

100+ actions.
One button each.

Every action is configurable. Set params, pick an icon, done.

Pages & Navigation
Page Next
Page Prev
Page Go To
Page Back
Volume & Media
Volume Up
Volume Down
Volume Mute
Volume Set
App Volume Up
App Volume Down
App Volume Set
App Volume Mute
Media Play/Pause
Media Next
Media Prev
Now Playing
Now Playing Display
Play/Pause
Next Track
Prev Track
System
Hotkey (scan code)
Type Text
Run Command
OBS Studio
Scene Switch
Record Toggle
Stream Toggle
iRacing: Key Picker
Bound Key
Free Key
iRacing: Pit Service
Pit Fuel
Pit All Tires
Pit Tire LF / RF / LR / RR
Pit Windshield
Pit Fast Repair
Pit Clear All
Pit Clear Tires
Pit Clear Fuel
iRacing: Replay & Camera
Replay Play / Pause / Slow Mo
Replay Rewind / Fast Forward
Replay Live
Prev / Next Lap
Prev / Next Incident
Camera Group
Camera My Car
Prev / Next Car
iRacing: Car Controls & UI
Ignition
Starter
Pit Limiter
DRS
Brake Bias ยฑ
Black Box Panels (F1โ€“F11)
Look Left / Right / Up / Down
Toggle Driving Line
Toggle Mirror
Recenter VR
FFB ยฑ
Mark Event
Giant Screenshot
Chat Macro
Reload Textures
Telemetry Log
Video Toggle
iRacing: Live Telemetry Display
Speed (km/h or mph)
Gear
RPM
Throttle %
Brake %
Fuel %
Fuel (L)
Fuel Burn (L/h)
Brake Bias %
Lap
Position
Lap Time
Best Lap
Last Lap
Track %
Time Left
Laps Left
Air / Track Temp
Discord
Mute
Deafen
Push to Talk Toggle
Join Voice Channel
Join Text Channel
Your Volume
User Volume Up / Down / Set

Up and running
in minutes.

No drivers, no complex configuration. Connect your device and open the UI.

1

Install CtrlDeck

Download the installer and run it. CtrlDeck starts automatically at login and sits in the system tray.

2

Connect your device

Plug in your Ulanzi D200 or Elgato Stream Deck. CtrlDeck detects it automatically. Hot-plug, no restart needed.

3

Open the config UI

Click the tray icon to open the web UI at localhost:57271. Click any button to assign actions and icons.

4

Import or build your profile

Import from Ulanzi Studio or Stream Deck software, or build from scratch. Changes push to the device instantly.

Already using official software?

Import your existing profiles from Ulanzi Studio or Elgato's Stream Deck app. Button icons, labels, hotkeys, media keys, and Discord actions all carry over. A backup of your current config is created automatically.

Ulanzi Studio โœ“
Hotkeys, page navigation, folder โ†’ sub-page, volume & media, Discord actions, button icons & labels
Elgato Stream Deck โœ“
Hotkeys, child profiles โ†’ sub-pages, volume & media, embedded button icons, titles. Supports Mini, MK.2, XL, Stream Deck +

What's new.

v1.7.13
Latest
  • + Added the "Lovely Sim Racing" icon pack (305 icons: apps, lights, messages, music, scenes, settings, sources, streaming, vehicle) to the icon browser, credited and licensed CC BY-NC-SA 4.0
  • + Added a curated set of THK84's Stream Deck Icons (apps, car brands, categories, function icons, games โ€” flat and glow variants) to the icon browser, credited in-app and in the pack's CREDITS.md
v1.7.12
  • ~ Discord voice control (mute/deafen/PTT toggle, live mute state) is currently unavailable โ€” Discord now restricts the "rpc" permission this needs to approved partners only, with no code-side fix possible. The Connect Discord button now says so clearly instead of silently failing
  • + Added a documented workaround: set a keybind in Discord's own Settings โ†’ Keybinds, then bind a CtrlDeck button to that same combo with the existing Hotkey action โ€” works today, no Discord approval needed
v1.7.11
  • + Now Playing buttons can be pinned to a specific app (e.g. only Spotify) instead of always showing whatever's currently playing, with a picker listing active sources
  • + Added a way to give a friendly name to media sources Windows doesn't identify properly (e.g. Firefox), so they show up as something readable instead of a raw id
  • ~ Fixed the Now Playing source picker's Rename button being clipped off-screen in the button editor
v1.7.10
  • + Now Playing: see the current track/artist/album art on a button and control play/pause/next/prev for whatever's actively playing (Spotify desktop, a browser tab, VLC, etc.) — no account or login needed
v1.7.9
  • ~ Fixed button labels and icons appearing mirrored on the Stream Deck+
  • ~ Fixed Stream Deck+ (and likely every other Elgato model) showing as connected then immediately dropping to disconnected: image uploads were sending a malformed HID report (an extra stray byte before the report ID), which the device rejected
  • ~ Fixed Stream Deck detection silently breaking entirely when another process (e.g. the official Elgato software) held an exclusive handle on any single Stream Deck model's USB connection
  • + Added a device scan tool under Settings โ†’ Debug for diagnosing a Stream Deck that isn't being detected
v1.7.6
  • + Stream Deck+ rotary dials: bind a different action to a dial push, clockwise turn, and counter-clockwise turn
  • ~ Fixed the Stream Deck+ not being detected at all, caused by a wrong USB product ID in the device driver
  • ~ Fixed Elgato profile import finding zero profiles on newer Stream Deck software, which moved profiles from the ProfilesV2 folder to ProfilesV3
v1.7.5
  • + Wheel/joystick controller bindings: map a physical button on a sim racing wheel or other USB controller to any CtrlDeck action, independent of the D200/Stream Deck grid
  • ~ Fixed the iRacing key picker hiding controls that are already bound to a wheel/joystick button, so they now show up under "Free Key" with a note showing what they're currently bound to
v1.7.4
  • ~ Fixed the brightness slider not actually changing the Ulanzi D200's screen brightness
  • ~ Fixed the D200's bottom status strip going blank and drifting out of sync with the physical info-window button after a few presses
v1.7.3
  • ~ Fixed CtrlDeck sometimes showing SimHub's UI instead of its own after launch, caused by both apps defaulting to the same local port
  • ~ The app now falls back to another local port automatically if its default port is ever taken by something else, instead of failing to start
v1.7.2
  • ~ Eliminated periodic screen blink on the Ulanzi D200 by using a lightweight keepalive instead of re-uploading all button images
v1.7.1
  • ~ Fixed backend crash on launch when a previous Python process was still running (e.g. after Electron crashed with minimize-to-tray on)
  • ~ Fixed settings reset after update: config migration now works correctly when the AppData folder already exists
v1.7.0
  • + Wallpaper profiles: set a full-deck background image with Fill, Contain, or Custom fit modes
  • + Custom fit mode: drag to reposition and zoom to find the perfect crop across all buttons
  • + Gap-aware wallpaper rendering: images are sliced accounting for physical bezels so lines and shapes flow seamlessly across buttons
  • + Process picker for auto-switch rules: browse running apps from a dropdown instead of typing names manually
  • ~ Auto-switch rule UI redesigned for clarity
v1.6.1
  • ~ Improved crash diagnostics: the app now writes a local log file to help debug startup issues
v1.5.0
  • + Pit road auto page switching: automatically jump to a page when entering or exiting pit road
  • + Page and profile gear modal: reorder with live position list, rename, and delete with confirmation
  • + Auto page switching now supports Session Type and Pit Road trigger groups
  • + iRacing Keybindings browser: browse all bound controls, check for conflicts, find unbound controls with suggested combos
  • + Per-app volume controls and per-user Discord volume
v1.4.0
  • + iRacing live telemetry display on buttons (speed, gear, RPM, fuel, brake bias, lap time, and more)
  • + Auto page switching based on iRacing session state
  • + Discord voice activity integration: mute, deafen, PTT, channel join, volume controls
  • + Built-in icon browser with 200+ icons
  • + Label overlay rendered directly on physical device buttons
v1.3.0
  • + Elgato Stream Deck support alongside Ulanzi D200
  • + Import profiles from Ulanzi Studio or Elgato Stream Deck software
  • + Multi-page layouts with page navigation actions
  • + Per-app volume controls
  • + Profile management and backup/restore
v1.2.0
  • + Multi-device support: Ulanzi D200 and Stream Deck simultaneously, each with its own profile
  • + Multiple Stream Deck model support (Mini, MK.2, XL, Stream Deck +)
  • + OBS Studio integration: scene switching, record and stream toggle with live state
  • + Full iRacing SDK actions: pit service, replay, camera control

Ready to take control?

Download CtrlDeck and configure your first button in under 5 minutes.

โฌ‡ Download CtrlDeck for Windows
Windows 10/11  ยท  Ulanzi D200 and/or Elgato Stream Deck required  ยท  Auto-updates included