Skip to main content

Architecture and SDK Map

The decision that matters

First decide whether you are building a Stream Deck app plugin or a direct hardware controller. The language choice follows from that decision.

1. The layers​

Stream Deck hardware
|
| HID protocol
|
Official Stream Deck desktop app
|
| plugin WebSocket and SDK abstractions
|
Plugin runtime
|
+-- Node.js SDK plugin code
+-- Native console plugin code
+-- Property inspector HTML UI

Python direct-control tools usually sit below the Stream Deck desktop app and talk to the device through HID. Official plugins sit above the desktop app and receive events from Stream Deck.

2. Choose the runtime​

RuntimeBest forAdvantagesTrade-offs
TypeScript / JavaScript with @elgato/streamdeckNormal plugins, Marketplace, fast iterationOfficial path, CLI scaffold, hot reload, property inspectors, packagingNode runtime, SDK lifecycle follows Elgato requirements
Python with streamdeckLocal automation stations, lab dashboards, custom front-endsDirect device control, excellent scripting, easy OS/API glueNot the normal Stream Deck plugin packaging model; can conflict with official app access
C#/.NET with StreamDeckToolkitNative-style plugins, Windows integrations, existing .NET codeStrong typing, native app patterns, .NET ecosystemCommunity toolkit, older template baseline, more manual SDK alignment
Raw WebSocket native pluginC++, Go, Rust, custom runtimesMaximum runtime freedomAdvanced path, more protocol work, more packaging complexity

3. JavaScript or TypeScript​

Use TypeScript by default. The official scaffold is TypeScript-friendly, the SDK exposes typed events, and action settings benefit from real types.

Use plain JavaScript only when:

  • the plugin is tiny,
  • the team does not want TypeScript build steps,
  • you are adapting an old plugin,
  • type safety is not worth the extra project ceremony.

For new plugins, TypeScript usually wins because Stream Deck actions become event-driven quickly: key events, dial events, settings, device events, UI messages, and lifecycle hooks.

4. Python​

Python is the right tool when you want the Stream Deck to become a physical dashboard for your own process:

  • home automation,
  • observability panels,
  • internal operations consoles,
  • test rigs,
  • media/control rooms,
  • kiosk-like local workflows,
  • hardware experiments.

The key difference: Python direct control owns rendering. You draw images, set brightness, register callbacks, and decide every state transition. That is powerful, but it is not the same user experience as installing a Stream Deck app plugin.

5. .NET and native plugins​

C# makes sense when the plugin naturally belongs in a .NET environment:

  • Windows APIs,
  • existing C# libraries,
  • enterprise desktop integrations,
  • local services already written in .NET,
  • strongly typed native app workflows.

Elgato's current official docs recommend the Node.js SDK for most plugin authors and describe raw WebSocket plugins as advanced. Treat C# as a deliberate choice, not the fastest default.

6. Marketplace readiness​

QuestionOfficial TS pluginPython HID appC# native plugin
Works inside Stream Deck appYesNo, not by defaultYes, if implemented as plugin
Uses manifest.jsonYesNoYes
Property inspector supportYesNo, unless you build your own UIYes, via plugin UI
Packaged as .streamDeckPluginYesNoYes
Best for MarketplaceYesNoPossible, but heavier
Best for local-only automationGoodExcellentGood

7. Practical recommendation​

Start with TypeScript unless the product requirement says otherwise.

Switch to Python when the project is not really a plugin, but a custom controller application that should use the deck as hardware.

Switch to C# or another native runtime only when the plugin must reuse native code or framework-specific integrations that would be worse through Node.js.