一键导入
capture-streamdeck-reference
Build and validate a reference .streamDeckProfile containing all known built-in Stream Deck action types for reverse engineering
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Build and validate a reference .streamDeckProfile containing all known built-in Stream Deck action types for reverse engineering
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| title | Capture Stream Deck Reference Profile |
| name | capture-streamdeck-reference |
| description | Build and validate a reference .streamDeckProfile containing all known built-in Stream Deck action types for reverse engineering |
| version | 1.0.0 |
| created | "2026-04-21T00:00:00.000Z" |
| lastmod | "2026-04-23T03:05:07.000Z" |
Invoke this skill when asked to build, update, or re-verify the reference profile that documents every known built-in Stream Deck action type. The reference profile serves as a ground-truth JSON corpus for reverse engineering action schemas and validating engine output.
Inputs:
reference-all-actions)Outputs:
profiles/reference-all-actions/ (in opendeck-factory).streamDeckProfile at originals/reference-all-actions.streamDeckProfile (in stream-deck-catalog)| Category | Operations |
|---|---|
| SAFE_READ | node src/index.js list, node src/index.js validate, reading manifest JSON |
| DESTRUCTIVE | Running expand-reference-profile.js, writing manifest files, pack |
| GUI (subagent only) | Right-click gestures (Pin, Wallpaper), Export via Stream Deck app |
Never run DESTRUCTIVE operations against the live %APPDATA%\Elgato\StreamDeck\ProfilesV3\ directory while the Stream Deck app is running — changes write through to app state.
Read the page manifests directly to see which action types are present:
# Note: list/validate commands do NOT work on profiles/reference-all-actions/
# because that directory uses the live-app format (manifest.json + Profiles/<page-uuid>/)
# not the ProfileEditor format (package.json + Profiles/<uuid>.sdProfile/...).
# Read page manifests directly instead:
ls profiles/reference-all-actions/Profiles/ # list page UUIDs
cat profiles/reference-all-actions/Profiles/<page-uuid>/manifest.json
Compare the Actions keys against the known action type inventory (see Reference section below).
The authoritative generator is scripts/expand-reference-profile.js. Run it against the live profile directory:
node scripts/expand-reference-profile.js
This script:
viewBox handling: icons from different plugins use inconsistent SVG coordinate spaces (24px, 72px, 144px). For non-144×144 viewBoxes, the script uses <g transform="scale(N)"> where N = 144/viewBoxWidth. Note: nested <svg viewBox> was tried but the Stream Deck app ignores nested SVG elements — <g transform> is the correct approach.
The validate command does not work on this profile (format mismatch — see Step 1 note). Validation is:
node src/index.js pack profiles/reference-all-actions "builds/Reference All Actions.streamDeckProfile"
cp "builds/Reference All Actions.streamDeckProfile" ../stream-deck-catalog/originals/reference-all-actions.streamDeckProfile
To add an action type not yet in the reference profile:
%APPDATA%\Elgato\StreamDeck\plugins\ICON map in expand-reference-profile.jsstreamdeck-driver subagent to place the action via the app, then export and compare the resulting manifest to learn the schemadocs/obsidian-vault/| Col | Row | Action ID | Label |
|---|---|---|---|
| 0 | 0 | com.elgato.streamdeck.system.website | Website |
| 1 | 0 | com.elgato.streamdeck.system.hotkeyswitch | Hotkey Switch |
| 2 | 0 | com.elgato.streamdeck.system.hotkey | Hotkey Ctrl+A |
| 3 | 0 | com.elgato.streamdeck.system.open | Open |
| 4 | 0 | com.elgato.streamdeck.page.indicator (app-rendered) | Page Indicator |
| 0 | 1 | com.elgato.streamdeck.system.close | Close |
| 1 | 1 | com.elgato.streamdeck.system.text | Text |
| 2 | 1 | com.elgato.streamdeck.system.openapp | Open App |
| 3 | 1 | com.elgato.streamdeck.system.multimedia (actionIdx:0) | Prev Track |
| 4 | 1 | com.elgato.streamdeck.system.multimedia (actionIdx:1) | Play/Pause |
| 0 | 2 | com.elgato.streamdeck.page (nav) | ← Prev Page |
| 1 | 2 | com.elgato.streamdeck.system.multimedia (actionIdx:2) | Next Track |
| 2 | 2 | com.elgato.streamdeck.system.multimedia (actionIdx:3) | Stop |
| 3 | 2 | com.elgato.streamdeck.system.multimedia (actionIdx:4) | Mute |
| 4 | 2 | com.elgato.streamdeck.page (nav) | Next Page → |
| Col | Row | Action ID | Label |
|---|---|---|---|
| 0 | 0 | com.elgato.streamdeck.system.timer | Timer |
| 1 | 0 | com.elgato.streamdeck.system.keybrightness (actionIdx:0) | Brighter |
| 2 | 0 | com.elgato.streamdeck.system.keybrightness (actionIdx:1) | Darker |
| 3 | 0 | com.elgato.streamdeck.system.keybrightness (actionIdx:2) | Max |
| 4 | 0 | com.elgato.streamdeck.page.indicator (app-rendered) | Page Indicator |
| 0 | 1 | com.elgato.streamdeck.system.keybrightness (actionIdx:4) | Medium |
| 1 | 1 | com.elgato.streamdeck.system.keybrightness (actionIdx:5) | Low |
| 2 | 1 | com.elgato.streamdeck.system.keybrightness (actionIdx:6) | Minimum |
| 3 | 1 | com.elgato.streamdeck.system.sleep | Sleep |
| 4 | 1 | com.elgato.streamdeck.vsdtoggle | Toggle VSD |
| 0 | 2 | com.elgato.streamdeck.page (nav) | ← Prev Page |
| 1 | 2 | com.elgato.streamdeck.system.keybrightness (actionIdx:3) | High |
| 2 | 2 | com.elgato.streamdeck.system.multimedia (actionIdx:6) | Vol- |
| 3 | 2 | com.elgato.streamdeck.system.multimedia (actionIdx:5) | Vol+ |
| 4 | 2 | com.elgato.streamdeck.page (nav) | Next Page → |
| Col | Row | Action ID | Label |
|---|---|---|---|
| 0 | 0 | com.elgato.streamdeck.profile.rotate | Switch Profile |
| 1 | 0 | com.elgato.streamdeck.page.goto | Go to Page |
| 4 | 0 | com.elgato.streamdeck.page.indicator (app-rendered) | Page Indicator |
| 0 | 1 | com.elgato.streamdeck.profile.backtoparent | Parent Folder |
| 0 | 2 | com.elgato.streamdeck.page (nav) | ← Prev Page |
| 4 | 2 | com.elgato.streamdeck.page (nav) | Next Page → |
| GUI only | — | com.elgato.streamdeck.profile.openchild | Create Folder (see GUI Capture table) |
| Col | Row | Action ID | Label |
|---|---|---|---|
| 0 | 0 | com.elgato.streamdeck.soundboard.playaudio | Play Audio |
| 1 | 0 | com.elgato.streamdeck.soundboard.stopaudioplay | Stop Audio |
| 2 | 0 | com.elgato.streamdeck.multiactions.routine | Multi Action |
| 3 | 0 | com.elgato.streamdeck.multiactions.routine2 | Multi Switch |
| 4 | 0 | com.elgato.streamdeck.page.indicator (app-rendered) | Page Indicator |
| 0 | 1 | com.elgato.streamdeck.keys.logic | Key Logic |
| 1 | 1 | com.elgato.streamdeck.multiactions.delay | Delay |
| 2 | 1 | com.elgato.streamdeck.system.digitaltime | Digital Time |
| 3 | 1 | com.elgato.streamdeck.keys.adaptor | Key Adaptor |
| 4 | 1 | com.elgato.streamdeck.keys.stack | Key Stack |
| 0 | 2 | com.elgato.streamdeck.page (nav) | ← Prev Page |
| 1 | 2 | com.elgato.streamdeck.multiactions.random | Random Action |
| 2 | 2 | com.elgato.streamdeck.system.pagination | Pagination |
| 4 | 2 | com.elgato.streamdeck.page (nav) | Next Page → |
These action types cannot be placed via JSON injection alone — their schema is incomplete or they require right-click gestures. Use the drive-windows-gui skill for all of these.
| Action | UUID | Status | Reason | Subagent task |
|---|---|---|---|---|
| Create Folder | com.elgato.streamdeck.profile.openchild | ❌ Not captured | Requires sub-profile structure the app creates on placement; JSON-only placement is silently dropped | Drag-drop onto Page 3, export manifest, diff against engine-generated |
| Pinned Action | unknown | ❌ Not captured | Right-click → Pin gesture only; no JSON equivalent | Right-click any button → Pin, export, read manifest |
| Wallpaper | unknown | ❌ Not captured | Right-click → Set Wallpaper from file | Right-click canvas → Set Wallpaper, export, read manifest |
| Multi Action title+icon | com.elgato.streamdeck.multiactions.routine | ❌ Not captured | Engine-placed Multi Action renders display incorrectly vs GUI-placed | Place via GUI, export, diff States and Settings vs engine output |
After capturing each schema, document the discovered fields in docs/obsidian-vault/ and add to expand-reference-profile.js where applicable.
Use the streamdeck-driver subagent for these. After capture, diff the exported manifest against an engine-generated one to identify the missing fields.
Icons are sourced from installed Stream Deck plugins:
%APPDATA%\Elgato\StreamDeck\plugins\<plugin-id>.sdPlugin\Images\<icon-file>.svg
Key plugin IDs:
com.elgato.streamdeck.profile.sdPlugin — profile navigation iconscom.elgato.streamdeck.multiactions.sdPlugin — multi-action iconscom.elgato.streamdeckweb.sdPlugin — web/URL iconscom.elgato.streamdeck.sdPlugin — core system icons (hotkey, open, text, media)App creates extra pages while Stream Deck is running: Stop the app before writing manifests. Scanning near the "+" button coordinate (x_client≈375) can trigger page creation via SendMessage. If this happens: stop app, remove the spurious UUID from the root package.json Pages array, delete its directory, re-run the generator, restart app.
Page 6 accidentally created: This happened during coordinate scanning (x_client=375, y=380–500 range hit the "+" button). Fix: stop app → remove UUID from root manifest → delete directory → re-run script → restart app.
SVG icons display as blank: Check that the viewBox wrapper is applied. Icons with non-144×144 viewBoxes (e.g., 0 0 20 20, -12 -12 48 48, 0 0 72 72) need the nested <svg viewBox> treatment in writeComposite().
User-invocable front door for managing the OpenDeck Roadmap (GitHub project
Orchestrate the streamdeck-driver subagent to perform GUI operations in the Elgato Stream Deck app that cannot be done via JSON injection
End-to-end workflow for generating a .streamDeckProfile from an application's keyboard shortcuts