A Logitech Actions SDK plugin that turns the MX Creative Console, MX Master 4, and Actions Ring into a tactile surveillance control surface for Frigate NVR.
Built for the Logitech DevStudio 2026 challenge — Actions SDK category.
- Timeline Scrub — dial rotation sends Up/Right arrows to Chrome (velocity-scaled: slow = 1s, fast = 10s)
- Next / Prev AI Event — jump across Frigate review events in the same Chrome tab via CDP
- Review Mode / Live View — one-press browser navigation
- Camera Rack — dynamic folder with live camera thumbnails, tap to switch camera while preserving exact playback timestamp
- Play / Pause — sends Win32 Space key to active Chrome window (zero latency)
- Speed — folder with 0.5x / 1x / 2x / 4x / 8x / 16x tiles, active tile highlighted green
- Filters — toggle person / car / motorcycle labels via
/review?labels=...URL - Export — folder with 1h / 4h / 8h / 24h buttons; exports recordings and haptic-notifies on completion
- Show Reviewed — CDP click on Radix UI switch (locale-independent)
- Event Type — cycles severity tabs (Alerts → Detections → Motion)
- 8 ring slots mapped to plugin actions; nested folder with Camera CH1–CH9 tiles (plugin supports CH1–CH13)
- Haptic alerts — MQTT-driven vibrations on zone violation AI detections
- Ctrl+Alt+N / P / R / L hotkeys — bound to side buttons via Logi Options+, handled by a Win32
RegisterHotKeylistener inside the plugin (Next / Prev / Review Mode / Live View) - Horizontal scroll — thumb wheel tilt redirected to Frigate 24h timeline scroll by the companion Chrome extension
| Component | Version / Notes |
|---|---|
| Logi Options+ | Required for all Logi devices |
| Frigate NVR | Running on localhost:5000 (HTTP, not 8971 HTTPS) |
| Mosquitto MQTT broker | localhost:1883 |
| Google Chrome | Launched with --remote-debugging-port=9222 |
| .NET 8 SDK | For building the plugin |
| LogiPluginTool | dotnet tool install --global LogiPluginTool |
git clone https://github.com/omkardongre/SentinelDeskPlugin.git
cd SentinelDeskPlugin
dotnet build src/SentinelDeskPlugin.csprojThe build auto-installs a .link file into %LocalAppData%\Logi\LogiPluginService\Plugins\ for hot-reload. Restart Logi Options+ → the SentinelDesk group appears under All Actions.
Minimum frigate/config/config.yml:
mqtt:
enabled: true
host: localhost
port: 1883Start both services:
docker-compose up -dVerify: http://localhost:5000 loads the Frigate UI.
The plugin drives Chrome via the Chrome DevTools Protocol. Close all Chrome instances, then launch:
# Windows PowerShell
& "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222Open http://localhost:5000 in this Chrome window and leave it open.
Several features will silently fail without the extension — exact timestamp preservation on camera switch, Export at current playback position, and MX Master 4 horizontal scroll → timeline.
- Open
chrome://extensions - Enable Developer mode (top-right toggle)
- Click Load unpacked
- Select the folder:
SentinelDeskPlugin/frigate-extension/ - Reload the Frigate tab
The extension injects a tiny reader for React's internal playback state and redirects horizontal wheel events to the Frigate timeline. It only runs on localhost:5000.
Open Logi Options+ → pick your device → drag actions from the SentinelDesk group. See CHECKLIST.md for the tested mapping (Dialpad 4 buttons + dial, Keypad 9 tiles, Actions Ring 8 slots, MX Master 4 hotkeys Ctrl+Alt+N/P/R/L).
| Concern | Mechanism |
|---|---|
| Navigate Chrome without new tabs | CDP Page.navigate on the existing localhost:5000 tab |
| Toggle video play/pause | Win32 keybd_event sending VK_SPACE (sub-ms latency) |
| Read exact playback timestamp | Chrome extension walks React fiber, exposes window.__sentinel.currentTime |
| Switch camera without losing scrub position | document.querySelector('[data-camera="x"]').click() via CDP |
| Real-time haptic alerts | MQTT subscribe to frigate/events, raise Logi PluginEvents |
| MX Master 4 side buttons | Win32 RegisterHotKey listener on Ctrl+Alt+N/P/R/L |
See ARCHITECTURE.md for the non-trivial design decisions and FEATURES.md for every test → implementation mapping.
SentinelDeskPlugin/
├── src/
│ ├── SentinelDeskPlugin.cs # Plugin entry, event registration
│ ├── BrowserNav.cs # All CDP interactions
│ ├── FrigateClient.cs # Frigate REST client
│ ├── MqttListener.cs # MQTT → haptic events
│ ├── CdpWatcher.cs # Persistent CDP Network.enable watcher
│ ├── HotkeyManager.cs # Win32 RegisterHotKey (MX Master 4 bridge)
│ ├── EventNavigator.cs # Shared Next/Prev navigation
│ ├── PlaybackState.cs # Thread-safe state
│ └── Actions/ # 12 commands + folders
├── frigate-extension/ # Chrome MV3 extension (REQUIRED)
│ ├── manifest.json
│ ├── content.js # Injects page script + wheel redirect
│ └── injected.js # React fiber reader
└── package/ # Loupedeck metadata, icons, event YAML
MIT