An introduction to the Logi Actions SDK, with example plugin source code for the MX Creative Console and compatible devices.
The plugins in this repo are self-contained projects you can build and run immediately. They are intended both as learning references for new developers and as concrete examples for AI-assisted development.
The baseline plugin — a good place to start. Demonstrates the basic building blocks of a plugin: simple commands, parameterised commands, an adjustment and image-based actions.
Actions:
- Toggle Mute (
PluginDynamicCommand) — mutes and unmutes system volume by sending aVolumeMutekey press throughClientApplication. Ships with a custom icon template (.ict). - Counter (
PluginDynamicAdjustment) — counts dial rotation ticks, with a reset. - Thumb up/down (
PluginDynamicCommand) — toggles between two embedded PNG images on each press. - Button Switches (
PluginDynamicCommand) — one command with four parameters (Switch 0–Switch 3), each toggling its own on/off state shown in the button's display name.
Key patterns:
- Minimal
PluginandClientApplicationsetup RunCommand()handling, andAddParameter()for commands with several variantsActionImageChanged()to refresh a button's name or image after state changes- Loading embedded images via
PluginResources - Custom icon templates in
package/icontemplates/
Source: DemoPlugin/DemoPlugin/
Demonstrates how to trigger haptic feedback from a plugin using the PluginEvents API.
Actions:
- Press Counter (
PluginDynamicCommand) — increments a counter on each button press, firing aState Changewaveform every press and aSpecialwaveform every 10th press. - Tick Counter (
PluginDynamicAdjustment) — counts dial rotation ticks, firing aCollisionwaveform per detent and anAlertwaveform on reset.
Key patterns:
- Registering named haptic events in
OnLoad()viaPluginEvents.AddEvent() - Raising events with
PluginEvents.RaiseEvent()from command and adjustment handlers - Mapping events to waveform families in
events/extra/eventMapping.yaml
Source: HapticsPlugin/src/
Demonstrates PluginDynamicFolder by implementing a fully playable Snake game rendered across the 3×3 button grid.
[EXIT][ ↑ ][ ]
[ ← ][ ■ ][ → ] ■ = centre: start / pause / unpause
[ ][ ↓ ][ ]
Key patterns:
PluginDynamicFoldertaking over all 9 button slots as a single canvasGetNavigationArea()returningEncoderAreato free all 9 slots- Atomic tile rendering: all 9
BitmapImages built in one lock so every tile sees the same game snapshot CommandImageChanged(rawSlotKey)called from a backgroundTask.Runloop — raw key required (notCreateCommandName)Close()for programmatic folder exit- Embedded PNG resource loaded via
PluginResources
Source: SnakePlugin/src/
Each plugin is a standard .NET project. Build from the directory containing its .csproj:
| Plugin | Project directory | Target |
|---|---|---|
| DemoPlugin | DemoPlugin/DemoPlugin/ |
.NET 8 |
| HapticsPlugin | HapticsPlugin/src/ |
.NET 10 |
| SnakePlugin | SnakePlugin/src/ |
.NET 10 |
dotnet build -c Debug # builds and hot-reloads into Logi Plugin Service
dotnet build -c Release # builds a release version ready for packagingTo package for distribution:
logiplugintool pack ./bin/Release ./<PluginName>.lplug4logiplugintool is installed via:
dotnet tool install -g Loupedeck.PluginTool- Logi Options+ installed (provides
PluginApi.dll) - .NET SDK matching the plugin you are building (see the table above)
- MX Creative Console or compatible device (Loupedeck CT, Live, Live S, Razer Stream Controller)
MIT — see LICENSE