Plugins for deckd, the Linux daemon for
Elgato Stream Deck hardware. They use the standard Elgato plugin format
(.sdPlugin), are plain Node.js with no dependencies and no build step, and
need Node.js ≥ 22.
| Plugin | What it does |
|---|---|
| OBS Control | Scenes, recording, streaming, replay buffer, audio inputs and stats in OBS Studio |
| Discord Voice | Mute, deafen, push-to-talk and voice volume in the Discord app |
| Key Light Control | Power, brightness and colour temperature of Elgato Key Lights |
| Hyprland Shader | Cycle or toggle Hyprland screen shaders |
| Server Monitor | Prometheus metrics and web service health checks |
| qBittorrent | Transfer speeds and controls for your qBittorrent client |
| Claude Usage | Claude Code plan limits and token counts |
In deckd's UI, go to Plugins → Plugin sources and add this repository:
https://github.com/amir-the-h/deckd-plugins
Every plugin here is then listed with an Install button, and new releases
show up as updates. Single plugins can also be installed from a release's
download link (Plugins, paste the link) or with
deckd install <link>.
To work on a plugin, link its folder into deckd instead, so edits apply without reinstalling:
git clone https://github.com/amir-the-h/deckd-plugins
ln -s "$PWD/deckd-plugins/me.the-h.obs.sdPlugin" ~/.config/deckd/plugins/
systemctl --user restart deckdscripts/pack.sh builds dist/<uuid>.streamDeckPlugin for every plugin plus
the dist/index.json deckd reads; pushing a v* tag publishes both as a
release.
Each plugin then appears in the Actions tab of the deckd UI. Drag an action
onto a key or dial and click it to open its settings. Settings marked "all
buttons" (server addresses, passwords) are shared by every button of that
plugin and stored in ~/.config/deckd/plugin-data/<plugin>.json.
Talks to the WebSocket server built into OBS Studio 28 and newer. Enable it in OBS under Tools → WebSocket Server Settings, then enter the port and, if authentication is on, the password in any OBS button's settings.
- Scene: switch to a scene; the key is outlined while that scene is live.
- Record, Stream, Replay Buffer: start or stop; outlined while on.
- Save Replay: save the replay buffer.
- Audio Input: mute or unmute an input; on a dial, turn to change its volume in dB.
- Stats: frame rate, CPU use and dropped frames.
Buttons follow changes made in OBS itself, and reconnect when OBS restarts. The connection stays open after you leave a page with OBS buttons, so OBS doesn't announce a new connection every time you come back. To turn those announcements off entirely, untick Enable System Tray Alerts in OBS's WebSocket Server Settings.
Talks to the Discord desktop app (native, Flatpak or Snap) over its local RPC socket.
- Mute, Deafen: toggle; outlined in red while on.
- Push to Talk: unmutes while the key is held.
- Voice Volume: output or microphone volume; on a dial, turn to change it and push to deafen or mute.
Discord only allows voice control for apps you own, so this needs a free app of your own:
- Create an application at https://discord.com/developers/applications.
- Under OAuth2, copy the client ID and client secret into any Discord button's settings.
- Under OAuth2 → Redirects, add
http://localhost. - With Discord open, accept the Authorize prompt it shows once.
The secret and the sign-in token are stored in plain text in deckd's plugin data.
Controls Elgato Key Light, Key Light Air, Ring Light and Light Strip over their local HTTP API.
- Light On/Off (key): toggle; hold to make the light blink.
- Light Brightness, Light Temperature (dials): turn to adjust; push for 50% / neutral, hold for 100% / coolest.
- Choose Light (dial): turn to pick which light the other actions control; push to search again.
- Blink Light (key): make the selected light blink so you can tell which one it is.
Lights are found with mDNS (avahi-browse, from Avahi). If yours aren't found,
list their IP addresses in the settings. Each button's colours can be changed
there too.
Applies the .glsl screen shaders in ~/.config/hypr/shaders (or its
animated/ folder) through hyprctl.
- Cycle (dial): turn to pick a shader, push or tap the strip to turn it on or off. The strip shows its name, ON/OFF and its position in the folder.
- One shader (key or dial): press to turn a chosen shader on or off.
Works with both Lua (hyprctl eval) and classic hyprlang configs. While a
shader is on, damage tracking is turned off so the whole screen stays shaded.
- Prometheus stat: the result of any PromQL query as a number or gauge, with warn/critical thresholds (above or below), units, formats (percent, bytes, bit rates, OK/FAIL), an optional second query for the bottom line, and a link to open on press. Use Test query in its settings to check it.
- Service health: up/down dots for a list of
Name=URLlines. Anything answering below HTTP 500, redirects and login pages included, counts as up.
Set the Default server once in any stat button's settings; it falls back to
http://localhost:9090. Services with certificates from a private CA work as
long as the CA is in the system trust store.
A remote for the qBittorrent client you run, through its built-in WebUI. It shows what the client is doing and offers the same controls as the WebUI's toolbar; it doesn't search for or add anything.
- Transfer Status: download and upload speed and the number of active torrents. Press to stop or start all of them; on a dial, tap the strip to toggle the alternative speed limits.
Enable the WebUI in qBittorrent under Tools → Options → Web UI and set its
address as the Default URL (falls back to http://localhost:8080). The
username and password are only needed when the WebUI doesn't bypass
authentication for your network; they're stored in plain text in deckd's page
files.
Shows Claude Code plan usage:
- Session limit / Weekly limit: percentage used and time until reset.
- Tokens: tokens used this session, this week or today.
- Overview (dial or key): both limits as bars, plus tokens.
Each button can watch a different Claude Code login (config directory:
~/.claude, or another CLAUDE_CONFIG_DIR); logins found in your home
directory are listed in its settings.
Limits come from the same endpoint Claude Code's /usage command uses. It is
undocumented and may change or stop working. The plugin reads (and never
refreshes) the login token Claude Code stores in .credentials.json, so it
works on Linux but not on macOS, where Claude Code keeps the token in the
Keychain. Limits refresh every 5 minutes. Token counts are read from Claude
Code's local transcripts and never leave your machine.
These plugins are independent and not affiliated with or endorsed by Elgato, Corsair, the OBS Project, Discord, qBittorrent or Anthropic. Product names are used only to say what each plugin works with.
deckd's repository includes a plugin template and a guide to the protocol as
deckd implements it: see .claude/skills/deckd-plugin-dev/ there.
MIT. Icons drawn from Material Design Icons are Apache 2.0.