vdo-streamdeck

Professional Parity and No-Regression Review

Review date: 2026-06-30. Product-state recheck: 2026-07-10.

This review asks whether the native Stream Deck plugin would be a regression for current VDO.Ninja + Bitfocus Companion users, and what must be true before the plugin is positioned as Marketplace-ready.

Sources Checked

Executive Finding

The current native plugin is not yet a full Companion replacement, mainly because packaged profiles, named connections, stats displays, and physical hardware verification remain open. It now ships:

The main remaining professional gaps are:

Therefore, the native plugin needs a no-regression release gate before Marketplace positioning.

What Users Actually Want

First-time / Casual Users

They want:

Current native status: mostly covered by the setup-first property inspector and local controls.

Director / Producer Users

They want:

Current native status: first-pass guest command, guest scene, and selected-target actions exist for common controls, but presets and broader feedback are still pending.

Technical Operators

They want:

Current native status: partial local controls and connection health; most operator controls are planned.

Camera / PTZ Operators

They want:

Current native status: first-pass PTZ Key action exists for local and guest PTZ buttons. First-pass Stream Deck + PTZ Dial exists for local/guest relative PTZ with selected-target support, rate limiting, inversion, optional acceleration, guest autofocus press actions, and control cycling. Hold-to-repeat, packaged profiles, presets, and hardware smoke testing are still pending.

Companion Feature Baseline

The native plugin should reach at least this baseline before being considered a non-regression:

Area Companion behavior Native requirement
Connection API key plus custom/self-hosted WebSocket host. Keep API key, host, TLS, timeout, and fallback settings.
Local controls Mic, camera, speaker, volume, chat, record, reload, hangup, bitrate, panning, hand, screenshare, keyframe, slide controls, local PTZ. First-class local action coverage, not only raw custom commands.
Guest controls Forward/transfer, add scene, mute scene, group, mic, hangup, solo talk, speaker, display, overlay, keyframe, solo video, volume. First-class guest command action and presets.
Feedbacks Mic, camera, speaker, guest in scene. Same feedback plus connection, timeout, stale stream, queue/held, hand raised, stats.
Variables Director state; guest by position labels/mic/camera/scenes; stream ID variables. Title templates and property inspector choices using labels, stream IDs, slots, and scene lists.
Presets Dynamic director and guest presets. Device-specific profiles plus dynamic target/title behavior.
PTZ Added local PTZ actions in v2.4.0. Local PTZ plus guest PTZ and Stream Deck + dial support.
Action variables v2.5.0 supports variables in actions. Target/value fields should allow tokens such as selected target, slot label, stream ID, scene ID, and custom text.

GitHub Request Signals

The public request/issue history points to these priorities:

  1. Original Companion request explicitly asked for group-room scene add/remove with feedback, feed mute/unmute with feedback, director push-to-talk, and own camera toggle.
  2. Self-hosted VDO.Ninja support was requested and later addressed in Companion; native plugin must not lose custom host support.
  3. Guest labels and stream IDs as variables were requested because users build button titles and external workflows around them.
  4. Guest mic feedback correctness matters beyond Guest 1/2; fixed-position assumptions are risky.
  5. Push-to-talk/release reliability matters; a missed release leaves talent live when they should be muted.

Common Pro Stream Deck Expectations

Across OBS, StreamYard, Companion-style workflows, and production control surfaces, professional users expect:

Current Native Plugin Gap Assessment

Requirement Current status Regression risk
Setup wizard Implemented. Low. Better than Companion for first-time setup.
API host/custom server Implemented in settings. Low. Must remain visible in advanced setup.
Connection state Implemented with page-present distinction. Low. Better than Companion.
Local mic/camera/speaker Implemented. Low.
Local PTT press/release First-pass push-to-talk and push-to-mute implemented on Local Control mic with explicit key-down/key-up states; physical key/pedal release testing is pending. Medium.
Local volume/panning/bitrate/buffer First-pass Value Dial implemented for local volume, panning, bitrate, and buffer delay; hardware tests and per-stream buffer/bitrate targeting are pending. Medium-low.
Director/guest actions First-pass Guest Command, Guest Scene, and Select Guest actions implemented for common controls. Medium until presets and richer stale/timeout states are done.
Scene feedback First-pass Guest Scene action reads getDetails[streamID].scenes. Medium until presets and stale-target states are done.
Dynamic labels/stream IDs Implemented for guest command/scene/select titles and target pickers. Medium until profile presets are done.
Variables/tokens in actions Title tokens implemented for guest actions; command value tokens are still pending. Medium.
Presets/profiles Not implemented. High.
PTZ keys/dials First-pass PTZ Key and PTZ Dial actions implemented; presets/profiles and hardware smoke tests are pending. Medium.
Multi-connection/named endpoints Not implemented. Medium-high.
Queue/held guest UX First-held targeting and Activate Guest are implemented; activation requires VDO.Ninja v30.2+ because older pages expose no native queue-activation command. Medium.
Stats/operator health Not implemented. Medium.

No-Regression Release Gate

Do not present the plugin as a full Companion replacement or Marketplace-ready until these are implemented and tested:

  1. Guest command action:
    • Target by slot, stream ID, UUID, selected target, first held guest.
    • Guest mic, camera, speaker, display, volume, hangup, solo video, solo talk, two-way solo talk, overlay/chat, group, transfer, keyframe, refresh/recover.
    • Current status: first-pass action supports slot, stream ID, selected guest, and first-held-guest targeting plus common commands. UUID/manual UI polish still needs work.
  2. Guest scene action:
    • Arbitrary scene ID/name support.
    • Scene membership feedback from getDetails[streamID].scenes.
    • Custom scene explicit set-on/set-off without breaking older pages.
    • Current status: fixed scenes use legacy aliases; arbitrary scene IDs/names use live scene feedback plus the legacy addScene toggle and alert if safe forcing is not possible.
  3. Dynamic titles and target pickers:
    • Guest labels and stream IDs in dropdowns.
    • Title templates for slot, label, stream ID, scene, connection state, command result.
    • Stream ID variables/tokens usable in action value fields.
  4. Momentary controls:
    • Press/release local mic for push-to-talk and push-to-mute.
    • Release-safe behavior: command queue/order guard so the final release state wins.
    • Visible warning if a release command times out.
    • Current status: first-pass local mic pushToTalk and pushToMute modes send explicit mic=true/false on key-down/key-up and use sequence guards for stale async completions. Physical Stream Deck/Pedal release testing is pending.
  5. Presets/profiles:
    • Mini, 15-key, XL, Stream Deck +, and Pedal starter profiles.
    • Director profile with dynamic guest rows.
    • Stream Deck + profile with dials for selected target volume/PTZ.
    • Current status: first-pass Value Dial exists for local volume, panning, bitrate, buffer delay, and guest volume with selected-target support. Packaged profiles and physical dial verification are pending.
  6. PTZ:
    • Local PTZ buttons.
    • Guest PTZ buttons.
    • Stream Deck + dial actions for zoom, pan, tilt, focus, exposure where supported, guest autofocus, and control cycling.
    • Current status: first-pass PTZ Key supports local zoom/pan/tilt/focus/exposure and guest zoom/pan/tilt/focus/autofocus. First-pass PTZ Dial supports local/guest relative PTZ turns, selected-target support, guest autofocus press actions, inversion, optional acceleration, and rate-limited sends. Hold-to-repeat, profiles, presets, and physical Stream Deck + verification are pending.
  7. State and feedback:
    • Mic/camera/speaker feedback for local and all guest positions.
    • Guest-in-scene feedback.
    • Held/queued and hand-raised feedback.
    • Stale/missing target state.
    • Command timeout/error feedback.
  8. Multi-page production support:
    • Named connections for director room, guest push page, clean output page, and backup room.
    • Per-action connection override.
    • Continue warning against same API key on multiple pages unless broadcast control is intended.

Implementation Priority

P0: Avoid Professional Regression

P1: Beat Companion

P2: Advanced Production

Current Product Positioning

Use this wording until the release gate is passed:

Early native VDO.Ninja Stream Deck plugin prototype. Provides setup, connection status, local controls, selected guest targeting, guest commands, guest scene toggles, PTZ keys, first-pass PTZ/value dials, and custom commands. Companion-parity presets, hardware dial verification, and broader dynamic feedback are still in progress.

Do not use:

Full replacement for Bitfocus Companion VDO.Ninja.