Comprehensive guidance for developing Elgato Stream Deck plugins in Node.js using the Stream Deck CLI and SDK.
This skill guides you through end‑to‑end development of Stream Deck plugins in Node.js, using the official Stream Deck CLI and Stream Deck SDK.
It is designed to be used with coding agents compatible with the add-skill specification.
References:
Use this skill whenever you need to:
streamdeck create, streamdeck dev, streamdeck link, streamdeck restart, streamdeck pack, streamdeck validate, etc.)Before writing or modifying code, keep these core concepts in mind:
Stream Deck app & device
Plugin vs. actions
.streamDeckPlugin file) with one or more actions.Manifest (manifest.json)
Plugin process & Node.js
willAppear, keyDown, keyUp, sendToPlugin) and sends commands back (setTitle, setImage, setSettings, etc.).Property Inspector (PI)
sendToPlugin / sendToPropertyInspector messages.CLI vs. SDK docs
Before starting implementation, verify all of the following:
Environment
CLI installation (one‑time per machine)
streamdeck (or sd) CLI is installed from npm, as described in the CLI docs:npm install -g @elgato/streamdeck-cli
streamdeck --help
Project workspace
Technical decisions
When using streamdeck create, the CLI will scaffold a recommended structure. It may vary slightly by template, but a typical Node.js plugin looks like:
my-streamdeck-plugin/
manifest.json # Plugin metadata and action definitions
plugin/ # Node.js plugin source
index.js # Main entrypoint (or compiled JS)
package.json # Node dependencies and scripts
src/ # Optional TS/JS source
property-inspector/ # Property inspector UI
index.html
index.js
styles.css
images/ # Icons for plugin and actions
pluginIcon.png
actionDefault.png
actionPressed.png
localization/ # Optional localization files
README.md
Always inspect the scaffolded template to confirm the exact structure and any additional tooling (TypeScript, bundler, etc.).
Key commands from the CLI docs:
streamdeck create
Interactive wizard or flag‑driven scaffolding for a new plugin project.
streamdeck link [path]
Links the plugin in your directory to the Stream Deck app.
streamdeck restart <uuid>
Restarts the plugin process (stops if running, then starts).
streamdeck stop <uuid>
Stops the plugin.
streamdeck list
Lists installed plugins and their status.
streamdeck dev
Enables developer mode; often used to simplify testing and logging.
streamdeck validate [path]
Validates the plugin structure and manifest.
streamdeck pack [path] / bundle
Bundles the plugin into a .streamDeckPlugin file for distribution.
streamdeck config
Manages local CLI configuration.
The streamdeck command is also available as sd for convenience.
Follow these steps to create a new Stream Deck plugin using Node.js:
streamdeck create
If the CLI supports non‑interactive mode for templates, you can pass flags (check streamdeck create --help for details).
After creation:
manifest.jsonplugin/index.js or similar)property-inspector/index.html, index.js)Do not arbitrarily change generated filenames without understanding how the manifest and/sdk loader reference them.
manifest.jsonOpen manifest.json and ensure at minimum:
Plugin metadata
UUID is globally unique and stable.Name, Description, Author, Version, Category are set appropriately.Icon paths point to actual files under images/.Platform/OS support
Actions
UUID.Name and Tooltip.Icon references for default and pressed states.States definitions (for multi‑state actions).PropertyInspectorPath if it uses a configuration UI.Use the SDK getting started and schema references to verify keys and structures are valid.
In the Node.js entry file (e.g. plugin/index.js), ensure you:
Establish connection with the Stream Deck app
Handle SDK events
willAppear / willDisappearkeyDown / keyUptitleParametersDidChangesendToPlugin (from Property Inspector)Send commands back to Stream Deck
setTitle).setImage).setState).getSettings / setSettings (per‑action instance).getGlobalSettings / setGlobalSettings (plugin‑wide).Logging & error handling
For actions that need configuration:
HTML structure
property-inspector/index.html:index.js) that will talk to the plugin using the SDK PI API.PI–Plugin communication
didReceiveSettings to populate the UI.sendToPlugin.setSettings (or equivalent) to persist the configuration when the user changes values.Validation
Use the CLI to link and run your plugin in the Stream Deck app:
streamdeck link .
streamdeck restart <your-plugin-uuid>
streamdeck list to confirm your plugin is recognized.streamdeck stop <uuid> when you need to fully stop the plugin.streamdeck dev if needed (for logging / hot‑reload behavior as supported).Ensure that:
Create a small test plan:
Basic behavior
keyDown / keyUp responses.willAppear initializes key state correctly.Settings
Edge cases
Performance
while loops, sleep‑like sync calls, or large synchronous file operations).Once functionality is stable:
streamdeck validate .
streamdeck pack .
.streamDeckPlugin file that can be double‑clicked to install or shared with others.version field in manifest.json for each release.Use this checklist when designing or reviewing a Node.js plugin:
Architecture
src/ or similar.Performance
async/await and non‑blocking I/O.Resilience
Settings & UX
Security
Cross‑platform considerations
streamdeck CLI installed and verified (streamdeck --help works).streamdeck create.manifest.json completed and validated.streamdeck link and visible in the Stream Deck app.streamdeck validate . passes with no errors.manifest.json exist.manifest.json is updated for this release..streamDeckPlugin bundle generated via streamdeck pack ..When you invoke a coding agent to work on a Stream Deck Node.js plugin:
streamdeck create.manifest.json and actions.streamdeck link, restart, list, validate, and pack correctly.This ensures a consistent, robust Stream Deck Node.js plugin development workflow aligned with the official CLI and SDK documentation.