Complete instructions for installing and setting up streamdeckd on Linux.
streamdeckd includes native NixOS support with modules for both system-level and user-level configuration.
Add streamdeckd to your flake inputs:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
streamdeckd = {
url = "github:unix-streamdeck/streamdeckd";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { nixpkgs, streamdeckd, ... }: {
nixosConfigurations.yourhostname = nixpkgs.lib.nixosSystem {
modules = [
streamdeckd.nixosModules.default
{
hardware.streamdeck.enable = true;
users.users.yourname.extraGroups = [ "plugdev" ];
}
];
};
homeConfigurations.yourname = home-manager.lib.homeManagerConfiguration {
modules = [
streamdeckd.homeManagerModules.default
{
programs.streamdeckd = {
enable = true;
package = streamdeckd.packages.${system}.default;
settings = {
decks = [
{
serial = "YOUR_SERIAL";
pages = [ ];
}
];
};
};
}
];
};
};
}NixOS Module (hardware.streamdeck.enable):
- Loads the
uinputkernel module - Creates the
plugdevgroup - Installs udev rules for all Stream Deck models
- Sets correct permissions for device access
Home Manager Module (programs.streamdeckd.enable):
- Creates a systemd user service that starts with your session
- Generates the JSON configuration file at
~/.config/.streamdeck-config.json - Provides type-safe configuration options
- Automatically restarts on failure
# Rebuild your system
sudo nixos-rebuild switch
# Rebuild your home configuration
home-manager switch
# Check service status
systemctl --user status streamdeckd- streamdeckui - GUI configuration tool (highly recommended)
- Go 1.25+ - Only needed if building from source
udev rules allow non-root users to access Stream Deck devices.
Download and install the udev rules file:
sudo curl -o /etc/udev/rules.d/50-elgato.rules \
https://raw.githubusercontent.com/unix-streamdeck/streamdeckd/master/50-elgato.rules
sudo udevadm control --reload-rulesCreate /etc/udev/rules.d/50-elgato.rules with the following content:
SUBSYSTEM=="input", GROUP="input", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0060", MODE:="666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0063", MODE:="666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006c", MODE:="666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006d", MODE:="666", GROUP="plugdev"
These rules cover:
0060- Stream Deck Original (15 keys)0063- Stream Deck Mini (6 keys)006c- Stream Deck XL (32 keys)006d- Stream Deck MK.2 (15 keys)
Reload udev rules:
sudo udevadm control --reload-rulesUnplug and replug your Stream Deck, then verify permissions:
ls -l /dev/input/by-id/*Stream*You should see rw-rw-rw- permissions.
git clone https://github.com/unix-streamdeck/streamdeckd.git
cd streamdeckdgo buildThis creates the streamdeckd binary in the current directory.
Copy to your local bin directory:
mkdir -p ~/.local/bin
cp streamdeckd ~/.local/bin/Or install system-wide:
sudo cp streamdeckd /usr/local/bin/./streamdeckdOr with a custom config file:
./streamdeckd -config /path/to/config.jsonCreate ~/.config/systemd/user/streamdeckd.service:
[Unit]
Description=Stream Deck Daemon
After=graphical-session.target
[Service]
Type=simple
ExecStart=%h/.local/bin/streamdeckd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.targetEnable and start:
systemctl --user daemon-reload
systemctl --user enable streamdeckd.service
systemctl --user start streamdeckd.serviceCheck status:
systemctl --user status streamdeckd.serviceView logs:
journalctl --user -u streamdeckd.service -fOn first run, streamdeckd looks for a config file at:
$XDG_CONFIG_HOME/.streamdeck-config.json
If XDG_CONFIG_HOME is not set, it defaults to ~/.config/.streamdeck-config.json.
Install and run streamdeckui to configure your Stream Deck with a graphical interface.
Create a basic config file:
cat > ~/.config/.streamdeck-config.json << 'EOF'
{
"modules": [],
"decks": []
}
EOFSee the Configuration Guide for detailed configuration options.
-
Check USB connection:
lsusb | grep 0fd9Should show Elgato device.
-
Verify udev rules:
udevadm info -a -n /dev/hidraw0 | grep -i elgato -
Check permissions:
ls -l /dev/hidraw* -
Reload udev and reconnect device:
sudo udevadm control --reload-rules sudo udevadm trigger
-
Check for duplicate instances:
ps aux | grep streamdeckdstreamdeckd prevents multiple instances. Kill any existing processes.
-
Check D-Bus connection:
dbus-send --session --print-reply \ --dest=org.freedesktop.DBus \ /org/freedesktop/DBus \ org.freedesktop.DBus.ListNames
-
Run with verbose output:
./streamdeckd 2>&1 | tee streamdeckd.log
If using Wayland, some features may require additional setup:
- KDE Plasma: Should work with recent versions
- Hyprland: Supported
- GNOME: May have limitations with window detection
Consider using X11 session for full compatibility.
- Read the Configuration Guide to set up your buttons
- Install streamdeckui-wails for easier configuration
- Explore the D-Bus API for programmatic control
- Create Custom Modules to extend functionality