LoupixDeck is a Linux and Windows application for controlling the Loupedeck Live S and Razer Stream Controller.
It provides a highly customizable interface to assign commands, control external tools, and build dynamic layouts using touchscreen and rotary inputs.
NEW: Full support for Razer Stream Controller with 6 rotary encoders, 8 LED buttons, 4ร3 touch grid, and narrow side displays!
- Custom touchscreen button rendering:
- Images, background colors, text
- Per-page wallpapers: Set different wallpapers for each page with independent opacity controls
- Wallpaper management: Easy select and remove buttons in settings
- Rotation support for narrow side displays (0ยฐ, 90ยฐ, 180ยฐ, 270ยฐ)
- Full input support:
- Touch input, rotary encoder turns/clicks, and physical button presses
- Per-button vibration control: Enable/disable and choose from 28 haptic patterns for each touch button
- Smart vibration defaults: Center buttons use minimal vibration, narrow buttons use short haptic feedback
- Visual touch feedback with configurable color and opacity
- Touch sliding prevention: No accidental multi-triggers when finger slides across buttons
- Dynamic page system:
- Independent pages for touch and rotary buttons
- Silent page switching: No visual page indicator (clean switching)
- Flexible command actions:
- Execute shell commands on button press
- Send keyboard macros
- Per-Page Global Commands: Add prefix/suffix commands to all buttons on a specific page
- Select which page to configure via dropdown
- Touch buttons: Global pre/post actions for all touch buttons on current page
- Simple buttons: Global pre/post actions for physical LED buttons on current page
- Knobs: Separate prefix/suffix for left rotation, right rotation, and press on current page
- Perfect for page-specific logging, mode switching, or state management
- Device configuration:
- Adjust display brightness
- Set individual RGB colors for each physical button
- Configurable touch feedback (enable/disable, color, opacity)
- Enable When OFF: Keep specific physical buttons/knobs functional even when device is OFF
- Persistent configuration:
- Save and restore full device layout and settings
- Template-based initial configuration
- Device-specific config files (no conflicts between devices)
- Command selection menu:
- Assign commands directly with parameters
- External tool integration:
- Control OBS Studio via WebSocket (e.g., toggle virtual camera)
- Manage Elgato Key Lights (power, brightness, color temperature)
- System interaction:
- Show system notifications via D-Bus
- Power management:
- Device clears on app exit (brightness=0, LEDs off)
- Device clears on system suspend and restores on resume
- Clean startup sequence (clear โ apply config)
- Display: Single 480ร270 touchscreen
- Touch Grid: 5ร3 = 15 buttons (90ร90 each)
- Rotary Encoders: 2 knobs (left side)
- Physical Buttons: 4 RGB LED buttons
- Config File:
config.json
- Display: Unified 480ร270 touchscreen with three zones:
- Left narrow: 60ร270 (1 tall button with rotation support)
- Center grid: 360ร270 (4ร3 = 12 buttons, 90ร90 each)
- Right narrow: 60ร270 (1 tall button with rotation support)
- Total Touch Buttons: 14 (12 center + 2 narrow)
- Rotary Encoders: 6 knobs (3 left + 3 right)
- Physical Buttons: 8 RGB LED buttons
- Config File:
config_razer.json - Special Features:
- Rotation control for narrow displays (perfect for vertical text/images)
- Template-based initial configuration
- Automatic device clear on exit/suspend
The Razer Stream Controller uses the same protocol as Loupedeck Live. Support for additional Loupedeck models may be considered in the future.
- .NET 9.0 SDK or later (Download)
The easiest way to install is using the automated build script:
# Clone or download the repository
git clone https://github.com/ovehbe/LoupixDeck.git
cd LoupixDeck
# Run the automated build script
./build_release.shThis script will:
- Build the application
- Create necessary directories
- Add symbolic links
- Create a desktop launcher automatically
- Make everything ready to use!
After installation, run: loupixdeck from terminal or launch from your application menu.
After you launch the app for the first time:
- Button 0 (first physical button): App window toggle (show/hide)
- Button 7 (last physical button): Device ON/OFF toggle
These defaults help you get started quickly!
See INSTALL.md for detailed manual installation instructions, additional setup options, and keyboard shortcut configuration.
git clone https://github.com/ovehbe/LoupixDeck.git
cd LoupixDeck
dotnet publish LoupixDeck.csproj -c Release -r win-x64 --self-contained true `
/p:PublishSingleFile=true `
/p:PublishTrimmed=false `
/p:EnableCompressionInSingleFile=true `
/p:ReadyToRun=true `
-o publish/win-x64git clone https://github.com/ovehbe/LoupixDeck.git
cd LoupixDeck
dotnet runThe app automatically detects your Razer Stream Controller on first run. If you encounter connection issues:
- Check USB connection:
lsusb | grep 1532:0d06 - Add udev rule (Linux):
Add:
sudo nano /etc/udev/rules.d/99-razer-stream-controller.rules
Then reload:SUBSYSTEM=="usb", ATTRS{idVendor}=="1532", ATTRS{idProduct}=="0d06", MODE="0666"sudo udevadm control --reload-rules sudo udevadm trigger
[Knob1] [Left-Display] [Grid 4ร3] [Right-Display] [Knob4]
[Knob2] [Knob5]
[Knob3] [Knob6]
[Button0-7 with RGB LEDs]
- Main config:
~/.config/LoupixDeck/config_razer.json- Your settings - OFF config:
~/.config/LoupixDeck/config_razer_off.json- Device clear state - Both are created automatically from templates on first run
The left and right narrow displays are perfect for:
- Volume indicators (use Rotation: 90ยฐ for vertical text)
- Status displays
- Labels for the adjacent knobs
Configure them like any other button, but use the Rotation slider in settings!
Control your device from the terminal while the app is running!
dotnet run
# Or published version:
~/Applications/LoupixDeck/LoupixDeckDevice Control:
./loupixdeck-cli off # Turn device OFF (brightness=0, LEDs black, screen clears)
./loupixdeck-cli on # Turn device ON (restore brightness, LEDs, graphics)
./loupixdeck-cli on-off # Toggle device ON/OFF
./loupixdeck-cli wakeup # Reconnect device and turn ON (for suspend/resume)Button Control:
# Update button display properties
./loupixdeck-cli updateButton 0 text=Hello textColor=Red backColor=Blue
./loupixdeck-cli updateButton 1 image=/path/to/icon.pngWindow Control:
./loupixdeck-cli toggle # Toggle window show/hide
./loupixdeck-cli show # Show window
./loupixdeck-cli hide # Hide windowApp Control:
./loupixdeck-cli quit # Exit app (applies OFF config first)- X button on window: Hides window (app keeps running)
- To actually quit: Use hamburger menu โ Quit
You can also assign these commands to physical buttons or touch buttons:
Device Control:
System.DeviceOff- Turn device OFFSystem.DeviceOn- Turn device ONSystem.ToggleWindow- Show/hide GUI window
Page Navigation:
System.NextPage- Next touch pageSystem.PreviousPage- Previous touch pageSystem.NextRotaryPage- Next rotary pageSystem.PreviousRotaryPage- Previous rotary page
Button Control:
System.UpdateButton(index,text=...,textColor=...,backColor=...,image=...)- Update button properties
Note: For direct page navigation (page 1, 2, 3, etc.), use the CLI commands instead
Elementary OS / Pantheon:
- System Settings โ Keyboard โ Shortcuts โ Custom
- Add shortcuts:
- Super+D:
~/Applications/LoupixDeck/LoupixDeck off - Super+Shift+D:
~/Applications/LoupixDeck/LoupixDeck on - Super+L:
~/Applications/LoupixDeck/LoupixDeck toggle
- Super+D:
Any Linux DE: Bind to your preferred keys - perfect for quickly turning off your device when locking screen or going AFK!
Commands communicate via Unix socket: /tmp/loupixdeck_app.sock
Note: Tray icon disabled due to compatibility issues with some desktop environments.
This fork adds comprehensive support for the Razer Stream Controller:
- Complete Razer Stream Controller implementation
- 6 rotary encoders (vs 2 on Live S)
- 8 physical buttons (vs 4 on Live S)
- 4ร3 touch grid + 2 narrow side displays
- Unified 480ร270 display rendering
- Visual touch feedback: Configurable flash animation on button press (Settings โ General)
- Per-button vibration control:
- Enable/disable vibration for each touch button individually
- Choose from 28 different haptic patterns per button
- Smart defaults: Center buttons use minimal vibration (AscendFast), narrow buttons use short feedback (ShortLower)
- Settings accessible in touch button properties dialog
- Touch sliding prevention: Prevents accidental command triggers when sliding finger across buttons
- Enable When OFF: Keep specific physical buttons and knobs functional when device is in OFF mode
- Perfect for "Turn ON" buttons or window toggle controls
- Configurable per button in button settings
- Per-Page Global Commands (Settings โ Global Commands):
- Configure different global commands for each page via dropdown selector
- Add prefix/suffix commands to all buttons on the selected page
- Touch Buttons: Wrap all touch button commands with pre/post actions
- Simple Buttons: Global pre/post for physical LED buttons
- Knobs: Separate prefix/suffix for rotate left, rotate right, and button press
- Each page can have completely different global command behavior
- Example uses: Page-specific logging, different notification styles, mode-dependent actions
- Per-Page Wallpapers:
- Set unique wallpapers for each page
- Independent opacity control per page
- Easy wallpaper selection and removal
- Configure via Settings โ Wallpaper with page dropdown
- Clean Page Switching: No visual page indicator on display (silent page changes)
- Rotation control: Rotate content on narrow displays (0ยฐ/90ยฐ/180ยฐ/270ยฐ)
- Template-based config: Clean initial setup with default layouts
- Power management: Auto-clear device on exit
- Smart config loading: Preserves settings between runs (no overwrites)
- Device-specific configs: No conflicts when using multiple devices
- CLI Commands: Control device from terminal (
on,off,toggle, etc.) - Window management: X button hides window, Quit from menu exits
- Device state management: OFF/ON configs for clean power cycling
- Dynamic UI layout (adapts to device type)
- Device registry system for easy device addition
- Unified display rendering (correct X-coordinate positioning)
- Enhanced error handling (graceful fallbacks)
- Suspend/resume detection with automatic state management
Controllers/RazerStreamControllerController.cs- Razer device controllerLoupedeckDevice/Device/RazerStreamControllerDevice.cs- Device implementationServices/SystemPowerService.cs- Power event monitoringTemplates/RazerDefaultConfig.json- Initial configuration templateTemplates/RazerOffConfig.json- Device clear state template
- Open the official Loupedeck software on a Windows computer
- Go to Device Settings โ Device Haptics
- Disable or turn off the automatic haptic feedback
- This prevents conflicts between firmware vibration and LoupixDeck's per-button control
Once disabled in Loupedeck software:
- Right-click any touch button in the LoupixDeck GUI
- Scroll down to "Vibration Settings"
- Check "Enable Vibration" to turn on haptic feedback
- Choose from 28 patterns: Short, Medium, Long, Buzz, Rumble, etc.
- Tip: Use
ShortLowerfor a quick, subtle feedback
Perfect for essential controls that should work even when device is "OFF":
- Right-click a physical button or knob
- Check "Enable When Device Is OFF"
- Now this button works even in OFF mode
- Use case: Assign
System.DeviceOnto a button so you can always turn device back on
Add logging, notifications, or state management to all buttons on a specific page:
Example 1 - Page-specific logging:
- Settings โ Global Commands
- Select "Page 0" from dropdown
- Touch Buttons โ Enable Suffix: โ
- Suffix command:
echo "Page 0 button: $(date)" >> /tmp/page0_log.txt - Select "Page 1" from dropdown
- Configure different suffix:
echo "Page 1 button: $(date)" >> /tmp/page1_log.txt - Now each page logs to its own file!
Example 2 - Page-specific notifications:
Page 0 - Gaming Controls:
Prefix: notify-send "Game Control"
Page 1 - Music Controls:
Prefix: notify-send "Music Action"Example 3 - Volume knob with feedback:
Knob Left Suffix: notify-send "Volume Down"
Knob Right Suffix: notify-send "Volume Up"
Knob Press Prefix: notify-send "Mute Toggle"Set different backgrounds for different pages:
Example - Professional vs Personal Pages:
- Settings โ Wallpaper
- Select "Page 0" - Your work page
- Click "Select..." and choose a professional background
- Adjust opacity for readability
- Select "Page 1" - Your gaming page
- Click "Select..." and choose a gaming-themed background
- Each page now has its own unique look!
Remove Wallpaper:
- Simply click the "Remove" button to clear a page's wallpaper
- Minimal: AscendFast, ShortLower, Lowest
- Short: Short, ShortLow, ShortLower
- Standard: Medium, Low, Lower
- Long: Long, VeryLong
- Special: Buzz, Rumble1-5, RiseFall, DescendSlow/Med/Fast
- Original LoupixDeck: RadiatorTwo/LoupixDeck
- Razer Stream Controller Support: Added by @ovehbe
- Protocol Reference: foxxyz/loupedeck (Node.js implementation)
- Additional Reference: flowernert/loupedeckapp (Python implementation)
MIT License - See LICENSE file for details.

