# Stream Deck Tools hides the socket protocol so you can write the plugin logic

> BarRaider's Stream Deck Tools is a C# library that wraps all the communication with the Elgato Stream Deck application, so a plugin author implements a base class instead of handling the WebSocket protocol. Version 7.0 moved the rendering surface to SkiaSharp for Windows and macOS, and it deprecated PluginBase in favour of three device-specific base classes.

**BarRaider/streamdeck-tools** — The Stream Deck Tools library wraps all the communication with the Stream Deck app, allowing you to focus on actually writing the Plugin's logic

- Repository: https://github.com/BarRaider/streamdeck-tools
- Website: https://barraider.com
- Stars: 561 · Forks: 74
- Language: C#
- License: MIT
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/barraider-streamdeck-tools

## The library's job is the protocol, not the plugin

The library is described as a C# library that wraps all the communication with the Stream Deck app, allowing you to focus on actually writing the plugin's logic. That is the whole value proposition, and it is worth understanding what it saves you. A Stream Deck plugin is a process that connects to the desktop application, receives key and dial events, pushes images to the hardware, and exchanges settings with the Property Inspector. Doing that directly means handling a WebSocket session, a manifest, and the property inspector protocol. The library encapsulates all of the communicating with the Stream Deck, and the README says that getting a plugin working on the Stream Deck only requires implementing the PluginBase class. The repository layout shows the shape of a plugin project: a `barraider-sdtools/` directory for the library, a `SamplePlugin/` directory, a `StreamDeck-Tools.sln` solution, `utils/` with a Visual Studio template and an install script, and a `samples.md` file. The primary language is C# and the licence is MIT.

## Version 7 replaces System.Drawing with SkiaSharp

The headline change in version 7.0 is cross-platform support through a new SkiaSharp-based API surface named `SkiaTools`, `SkiaGraphicsTools` and `SkiaExtensionMethods`, working on Windows and macOS. The target frameworks are netstandard2.0, net48, net8.0 and net10.0, and all the `System.Drawing`-based APIs are marked `[Obsolete]` with migration guidance rather than removed, so an existing plugin still compiles while it warns. New overloads `SetImageAsync(SKBitmap)` and `SetImageAsync(byte[])` were added on `ISDConnection`, and a new `DrawTextLine` extension method on `SKCanvas` uses Y-as-top semantics to match `System.Drawing.Graphics.DrawString`. The release notes describe the cross-platform goal plainly, and the version history shows the shape of a library that has been absorbing new hardware, with version 6.4 adding support for the Stream Deck Plus XL and the Galleon 100 SD, version 6.3 adding support for new Stream Deck types, and version 6.2 adding .NET 8.0. The last push to the repository was on 2026-04-02, the same day as the v7.0 release.

## Two breaking changes that will stop a build

There are two breaking changes in version 7.0, and one of them fails at runtime rather than at compile time. The first is `TitleParameters.FontFamily` throwing `PlatformNotSupportedException` on non-Windows, and the fix is to use `TitleParameters.FontFamilyName` as a string or `TitleParameters.TitleTypeface` as an `SKTypeface` instead. On Windows, `FontFamily` still works but produces an `[Obsolete]` compiler warning. That asymmetry is the detail to plan around, because a plugin that renders titles will pass its own test suite on Windows and then break on a colleague's Mac. New members arrive alongside the deprecation: `TitleParameters.FontFamilyName`, `TitleSKColor`, `TitleTypeface` and a `FontStyleToSKFontStyle()` helper for cross-platform rendering. The second breaking change is that `PluginBase` is now `[Obsolete]`, and the recommendation is to derive from `KeypadBase` if the plugin does not support dials, `EncoderBase` for dials only, or `KeyAndEncoderBase` for both. The migration guide is a `MigrateTo7.0.md` file in the repository root with code recipes and API mapping tables, and the README suggests using that file to let an assistant such as Cursor or Claude perform the migration.

## Device models and the plugin template

The Stream Deck hardware now comes in enough shapes that a plugin has to declare what it supports, and the library reflects that. Instead of `PluginBase`, the choice is between `KeypadBase`, `EncoderBase` and `KeyAndEncoderBase`, matching the three device families: keys only, dials only, or both. The downloadable resources list makes the same point with the empty profiles for the XL with 32 keys, the Classic with 15 keys, the Mini with 6 keys, and the Mobile device. For a new project, the recommended starting point is the StreamDeck-Tools Template, a Visual Studio 2019 or 2022 template packaged as a `.vsix` that automatically creates a project with all the files needed to compile a plugin, described as the best way to start a new plugin. There is also an `install.bat` script that quickly uninstalls and reinstalls your plugin on the Stream Deck, which you put in your BIN folder alongside the Debug and Release sub-folders, and a separate EasyPI library for passing information from the Property Inspector to a plugin.

## What the library handles for you day to day

The library features list is where the practical value shows. It encapsulates all the communicating with the Stream Deck, and it includes a sample plugin in the repository. There is built-in integration with NLog, so you log with `Logger.LogMessage()` rather than wiring a logging stack yourself. Settings that were modified by the Property Inspector are auto-populated into your plugin, and global settings are accessible from anywhere in your code. There is simplified working with filenames coming from the Stream Deck SDK, and a `PluginActionId` attribute that lets you associate your code with a specific action defined in the manifest.json. A large set of helper functions simplifies creating images and sending them to the device, and version 3.0 added `Tools.CenterText` with an optional output value to verify the text does not exceed the image width, a `Graphics.GetFontSizeWhereTextFitsImage` helper to find the best size for one-line text, `Tools.FormatBytes` for human-readable byte values, and a move from MD5 to SHA512 for file handling. The historical note about version 3.2 creating the `ISDConnection` interface implemented by `SDConnection` and used by `PluginAction` is worth knowing, because that interface is where the image overloads now live.

## Where Stream Deck Tools is the wrong tool

The scope is narrow in a way that should be checked before you start. This is a C# library for the Elgato Stream Deck, and there is no path in it to a different device, a different language or a different transport, so a plugin in Python, JavaScript or Rust, or a tool that drives some other hardware, is out of scope entirely. The second limit is the version churn. A library that ships a major version roughly every year and marks large parts of its API `[Obsolete]` in each one means your plugin carries an upgrade obligation that a stable SDK would not, and the cross-platform move in particular forces a rendering rewrite rather than a namespace change. The third is the hardware. The device families differ in key count and in whether dials exist, and the profile downloads confirm the range, so a plugin that assumes fifteen keys and no dials will look wrong on an XL or a Mini. Support for the hardware in the table is also a moving target, with new device types appearing in the version history as they are released.

## Conclusion

Adopt Stream Deck Tools if you are writing a Stream Deck plugin in C# and want the connection, settings population and image helpers handled for you. Skip it if you are not on .NET, and skip it if you are still on the pre-6.0 API and have no plan to migrate, because version 7.0 deprecates PluginBase and removes the System.Drawing surface. Before you start, read MigrateTo7.0.md, and if you support macOS confirm you use TitleParameters.FontFamilyName or TitleTypeface, since FontFamily throws PlatformNotSupportedException off Windows.

## FAQ

### What does BarRaider's Stream Deck Tools library do?

It is a C# library that wraps all the communication with the Stream Deck app, so a plugin author focuses on the plugin's own logic. Getting a plugin working only requires implementing the base class, and the library also provides auto-populated Property Inspector settings, global settings access and image helpers.

### What changed in Stream Deck Tools version 7.0?

Version 7.0 adds cross-platform support through a new SkiaSharp-based API surface for Windows and macOS, targets netstandard2.0, net48, net8.0 and net10.0, marks all `System.Drawing`-based APIs `[Obsolete]`, and adds new `SetImageAsync` overloads on `ISDConnection`.

### What is the macOS breaking change in Stream Deck Tools 7.0?

`TitleParameters.FontFamily` throws `PlatformNotSupportedException` on non-Windows. You should use `TitleParameters.FontFamilyName` as a string or `TitleParameters.TitleTypeface` as an `SKTypeface`. On Windows `FontFamily` still works but produces an `[Obsolete]` compiler warning.

### Which base class should a new Stream Deck plugin derive from?

`PluginBase` is now `[Obsolete]`. Derive from `KeypadBase` if the plugin does not support dials, `EncoderBase` for dials only, or `KeyAndEncoderBase` for both keys and dials. The `MigrateTo7.0.md` file in the repository holds the full migration guide with code recipes and API mapping tables.

## Sources

- [BarRaider/streamdeck-tools on GitHub](https://github.com/BarRaider/streamdeck-tools)
- [License: MIT](https://github.com/BarRaider/streamdeck-tools/blob/master/LICENSE)
- [Project website](https://barraider.com)
- [README](https://github.com/BarRaider/streamdeck-tools/blob/master/README.md)
- [Releases](https://github.com/BarRaider/streamdeck-tools/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/barraider-streamdeck-tools
