C# library that wraps all the communication with the Stream Deck App, allowing you to focus on actually writing the Plugin's logic.
Author's website and contact information: https://barraider.com
- Derive from
KeypadBase(keys),EncoderBase(dials), orKeyAndEncoderBase(both) - Decorate with
[PluginActionId("your.action.uuid")] - Call
SDWrapper.Run(args)inMain()
[PluginActionId("com.example.myplugin")]
public class MyAction : KeypadBase
{
public MyAction(ISDConnection connection, InitialPayload payload) : base(connection, payload) { }
public async override void KeyPressed(KeyPayload payload)
{
using SKBitmap image = SkiaTools.GenerateGenericKeyImage(out SKCanvas canvas);
canvas.Clear(SKColors.DarkBlue);
using var font = SkiaTools.CreateFont("Arial", 18, SKFontStyle.Bold);
using var paint = new SKPaint { Color = SKColors.White, IsAntialias = true };
canvas.DrawTextLine("Hello!", font, paint, new SKPoint(30, 60));
canvas.Dispose();
await Connection.SetImageAsync(image);
}
public override void KeyReleased(KeyPayload payload) { }
public override void OnTick() { }
public override void Dispose() { }
public override void ReceivedSettings(ReceivedSettingsPayload payload) { }
public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) { }
}- Encapsulates all Stream Deck communication -- just implement your action logic
- Cross-platform SkiaSharp-based graphics API (
SkiaTools,SkiaGraphicsTools,SkiaExtensionMethods) - Target frameworks: netstandard2.0, net48, net8.0, net10.0
- Built-in NLog integration via
Logger.LogMessage() - Auto-populate settings from the Property Inspector with
Tools.AutoPopulateSettings() - Global Settings support
PluginActionIdattribute for action UUID mapping- Stream Deck+ support (keys, dials, and combined)
See the full Migration Guide for type mapping tables, code recipes, and step-by-step instructions.