Skip to main content

Packaging and Distribution

Pack only the compiled plugin

Stream Deck plugins are distributed as .streamDeckPlugin installer files generated from the compiled *.sdPlugin directory.

1. Build before packing​

npm run build

Then validate:

streamdeck validate com.example.deploy-tools.sdPlugin

Then pack:

streamdeck pack com.example.deploy-tools.sdPlugin

The pack command validates supporting files, bundles the plugin directory, and outputs a .streamDeckPlugin installer file.

2. What belongs in *.sdPlugin​

com.example.deploy-tools.sdPlugin/
├── bin/
│ └── plugin.js
├── imgs/
├── logs/
├── ui/
│ └── deploy.html
└── manifest.json

Include:

  • compiled JavaScript,
  • property inspector HTML and local assets,
  • icons and images,
  • manifest,
  • runtime files required by the plugin.

Exclude:

  • source maps if not intended,
  • tests,
  • local notes,
  • .env files,
  • private keys,
  • generated caches,
  • development-only logs.

Use .sdignore to exclude files from packaging. It follows .gitignore-style patterns.

3. Local install test​

Before sharing a plugin:

  1. Stop the watch process.
  2. Build from a clean source tree.
  3. Pack the plugin.
  4. Install the generated .streamDeckPlugin.
  5. Restart Stream Deck.
  6. Add every action to a new profile.
  7. Open every property inspector.
  8. Test fresh settings and imported/old settings.
  9. Test after Stream Deck app restart.
  10. Test on Windows and macOS if you support both.

4. DRM readiness​

Elgato's distribution docs describe DRM protection for Marketplace-distributed plugins. Current docs note:

  • Node.js plugins need @elgato/streamdeck v2 or newer for DRM readiness.
  • Distributed plugin files are immutable.
  • The manifest is protected and should not be read as runtime configuration.
  • DRM protection is applied after upload and processing in Maker Console.

Practical rule: never design runtime behavior around modifying packaged files.

Do this instead:

  • store runtime state in action settings,
  • generate runtime files outside the plugin bundle,
  • keep non-sensitive constants in a separate JSON file or embedded code,
  • use OS-level storage for secrets.

5. Marketplace checklist​

Before submitting:

  • Validate the plugin.
  • Use stable UUIDs.
  • Check plugin and action names for clarity.
  • Provide good icons and gallery material.
  • Confirm images are not blurry on physical hardware.
  • Confirm property inspectors work offline if they use local assets.
  • Confirm no secrets or local paths are packaged.
  • Confirm logs do not expose sensitive data.
  • Review Elgato's current plugin guidelines.
  • Upload through Maker Console.

6. Versioning​

Use a clear versioning policy:

1.0.0.0 initial release
1.0.1.0 bug fix
1.1.0.0 new action or non-breaking behavior
2.0.0.0 breaking behavior or settings migration

Do not change UUIDs when releasing a new version.

7. Release notes template​

## 1.1.0.0

Added:
- New Deploy Status action.

Changed:
- Improved production confirmation copy.

Fixed:
- Prevented stale titles after Stream Deck restart.

Compatibility:
- Requires Stream Deck 7.1 or newer.

8. Quick smoke test script​

npm run build
streamdeck validate com.example.deploy-tools.sdPlugin
streamdeck pack com.example.deploy-tools.sdPlugin

Run this before every release candidate.