vdo-streamdeck

VDO.Ninja Stream Deck Plugin

This is the native Stream Deck plugin implementation workspace. For everyday setup, start with the plain-language guide. For screenshots, the supported-action matrix, and install notes, see the repo README.

Current positioning: early native prototype/MVP. It is not yet a full replacement for the Bitfocus Companion VDO.Ninja module because presets, named connections, and broader dynamic feedback are still in progress.

Actions

Every action targets a VDO.Ninja page opened with &api=KEY.

Action Controller What it does
Connection Status Key Connection and status feedback for the configured API key.
Local Control Key Mic, camera, speaker, record, screen share, hand, keyframe, reload, and hangup on the local page. Mic also supports push-to-talk and push-to-mute.
Select Guest Key Selects a fixed slot/stream, the next or previous guest, the first held guest, or clears the selection.
Guest Command Key Guest control targeted by slot, stream ID, selected guest, or first held guest.
Guest Scene Key Arbitrary scene ID/name toggles, fixed-scene force on/off, and scene membership feedback.
Mixer Control Key Layout selection, guest slot assignment, all-guest mute, and a guarded all-guest transfer.
PTZ Key Key Local zoom/pan/tilt/focus/exposure and guest zoom/pan/tilt/focus/autofocus.
PTZ Dial Stream Deck + Local or guest zoom/pan/tilt/focus, local exposure, and guest autofocus press actions.
Value Dial Stream Deck + Local volume, panning, bitrate, buffer delay, and guest volume.
Custom Command Key Any { action, target, value, value2 } payload.

Both dial actions support selected-target mode, inversion, optional acceleration, and rate-limited sends.

Beyond the actions themselves:

Build

npm install
npm run build

The build output is ninja.vdo.streamdeck.sdPlugin/.

Use

  1. Add the Connection Status action in Stream Deck.
  2. In the property inspector, generate or enter a private API key.
  3. Pick the page to control and enter its room or stream ID.
  4. Open the ready-to-use URL and keep that VDO.Ninja page open.
  5. Press Test connection.
  6. Add Local Control, Select Guest, Guest Command, Guest Scene, Mixer Control, PTZ Key, PTZ Dial, Value Dial, or Custom Command actions.

The manifest targets the Node 20 runtime bundled with Stream Deck 6.8+; newer local Node versions work for development.

No-hardware checks

npm test
npm run check
npm run build
npx @elgato/cli@1.7.4 validate ninja.vdo.streamdeck.sdPlugin --no-update-check
npx @elgato/cli@1.7.4 pack ninja.vdo.streamdeck.sdPlugin --dry-run -f --no-update-check

pack refuses to run when a .streamDeckPlugin file from an earlier build is already there, so -f keeps the dry run repeatable.

These verify command payloads, TypeScript, generated plugin layout, manifest rules, and package contents. Tests cover every exposed command choice, property-inspector buttons and registry alignment, manifest image wiring, custom value parsing, transport behavior, and state normalization. Interactive button/dial testing still requires the Stream Deck app with either hardware or Stream Deck Mobile.

Icons

All artwork is generated from one spec by npm run assets, so the vector and raster forms cannot drift apart:

Edit the spec, not the output. Keypad state images keep their glyph in a corner badge so the two-line title the plugin draws stays legible. src/manifest-assets.test.ts fails the build if the manifest references an image that does not exist, if a raster image is the wrong size, or if a generated image is never referenced.

Runtime alignment

VDO.Ninja state

Targeting

Scenes

Mixer

PTZ

Values and momentary controls

Transport

Version requirements

See ../docs/runtime-comparison-audit.md for the current comparison against VDO.Ninja’s local signaling and callback paths.