A Stream Deck plugin for Milestone XProtect Smart Client — playback, evidence, PTZ, view navigation and any camera or view by number, on physical keys. Windows natively; on a Mac through Parallels, VMware Fusion or Microsoft Remote Desktop.
Two builds of the same plugin (same UUID, either updates the other): the GitHub download above adds a Buy me a Ko-fi key; the Elgato Marketplace build (dist/com.4xsdev.milestone-sc.streamDeckPlugin) leaves it out, as Marketplace guidelines forbid sponsor links inside plugins.
Download com.4xsdev.milestone-sc-kofi.streamDeckPlugin (or install from the Elgato Marketplace) and double-click it. Stream Deck adds the Deck for Milestone XProtect action group and a ready-made profile for your device — XProtect (15 keys), XProtect Mini (3×2) or XProtect XL (8×4).
Requirements: Stream Deck software 6.9+, Windows 10+ or macOS 12+, XProtect Smart Client — on a Mac inside Parallels, VMware Fusion or Microsoft Remote Desktop (the client itself is a Windows application). On macOS the Stream Deck app needs Accessibility permission to send keystrokes (it already has it if you use Elgato's Hotkey action).
XProtect Smart Client has a handful of fixed default shortcuts for view navigation on the numeric keypad (Enter to open/maximize, 8/2/4/6 to move between view items, / Enter to reset an item, / / Enter to reset a view) and a numeric-keypad language for content: / <camera number> Enter shows that camera in the selected item, * <view number> Enter opens a view. Everything else — play/pause, next/previous image, PTZ, snapshot, export, and so on — you assign yourself in Settings → Keyboard (Global / Playback / Live / Setup scopes).
So the plugin works like this:
- Every Command key sends a shortcut. The view-navigation defaults are marked ✓; the rest are suggestions (e.g. Play/Pause =
Ctrl+Space) — assign the same combo once in Settings → Keyboard, or type the shortcut your XProtect already uses into the key's Hotkey field. - The Hotkey key is free-form: title + shortcut/sequence.
/ 5 Enter→ camera 5,* 3 Enter→ view 3, or any combo you assigned. A Stream Deck XL becomes a camera-wall selector. - Every key shows the shortcut it sends in small print.
| Action | What it does |
|---|---|
| XProtect Command | 32 Smart Client actions in six groups — View navigation (open/maximize, item up/down/left/right, reset item/view — the numeric-keypad defaults), Playback (play/pause, previous/next image, first/last, fast forward/backward, live/playback), Evidence (snapshot, export, print, bookmark, smart search), PTZ (zoom, presets 1–3, home), Views & layout (next/previous view, full screen, hide panels, carousel), System (setup mode, help). Shortcut editable per key. |
| XProtect Hotkey | Any shortcut or sequence with your own title and colour — a camera by number (/ 5 Enter), a view by number (* 3 Enter), or anything you assigned in Settings → Keyboard. |
| Activate XProtect | Brings Smart Client to the front so the next shortcut lands in it. Windows: matches the window title (default "XProtect Smart Client"). Mac: activates the hosting app (default "Parallels Desktop"; set "VMware Fusion", "Windows App"…). |
Shortcut format: Ctrl+Shift+P, parts of a sequence separated by spaces (/ 5 Enter). Modifiers Ctrl / Alt / Shift; keys A–Z, 0–9, F1–F12, Space, Tab, Esc, Enter, Backspace, Insert, Home, End, PageUp, PageDown, arrows, Plus, Minus, /, *.
| Mini | XL |
|---|---|
![]() |
![]() |
Generated by profile/build_profile.py (LAYOUTS); the plugin manifest binds each to its device type. The XL's bottom row carries camera/view examples (Cam 1–3 = / n Enter, View 1 = * 1 Enter) to rename to your own shortcut numbers.
Stream Deck key → plugin (Node.js, Elgato SDK v2) → keystroke to the front window: Windows via PowerShell SendKeys, macOS via System Events (osascript). Activate uses WScript.Shell.AppActivate on Windows and tell application … to activate on macOS. No network, no MIP SDK, no server-side footprint, nothing stored.
cd plugin && npm install && npm run build && cd .. # bundle → plugin/com.4xsdev.milestone-sc.sdPlugin/bin/plugin.js
python3 profile/build_profile.py # three .streamDeckProfile files
cp profile/*.streamDeckProfile plugin/com.4xsdev.milestone-sc.sdPlugin/
node site/render.mjs # key art + icons from the plugin's own SVGs (needs playwright)
python3 site/render_media.py # deck mockups, actions sheet, marketplace media (Pillow)
python3 site/build_site.py # docs/index.html
npx @elgato/cli validate plugin/com.4xsdev.milestone-sc.sdPlugin
bash plugin/package.sh # → dist/com.4xsdev.milestone-sc.streamDeckPlugin (Marketplace)
bash plugin/package.sh --kofi # → dist/com.4xsdev.milestone-sc-kofi.streamDeckPlugin (GitHub)- Keystroke-based: Smart Client must be the front window (use Activate first, or chain it in a Multi Action), and the plugin cannot read state back.
- The numeric-keypad defaults are sent as ordinary keys; if your setup depends on the physical keypad, assign a normal-key shortcut in Settings → Keyboard instead.
- The Mac path drives Smart Client inside Parallels / VMware / Remote Desktop, where ⌃ Control arrives as Ctrl.
- Written to Milestone's documented defaults but not yet tested against a running Smart Client — reports welcome via issues.
MIT — Pavel Kotyza · 4xs.dev. Free and open source; if it saves you clicks, buy me a Ko-fi. Independent project; not affiliated with Milestone Systems or Elgato. Milestone and XProtect are trademarks of Milestone Systems A/S.



