bythisis-romar· 1 MCP server
Open-source Stream Deck profile editor engine
$git clone https://github.com/thisis-romar/opendeck-factoryInstalls into the current project.
Install opendeck-factory by running `git clone https://github.com/thisis-romar/opendeck-factory`, then use it for the current task and follow its documentation at https://github.com/thisis-romar/opendeck-factory.
| 1 | # OpenDeck Factory |
| 2 | |
| 3 |   |
| 4 | |
| 5 | Open-source engine for programmatically creating, editing, and repacking Elgato Stream Deck `.streamDeckProfile` files. Define your shortcuts in JSON, generate icons, and produce ready-to-import profiles — no manual button-by-button setup required. |
| 6 | |
| 7 | ## Features |
| 8 | |
| 9 | - **MCP server** — 9 tools for Claude Desktop and Claude Code (extract, pack, validate, list, add shortcut, generate icons, list shortcuts, quality check, live test) |
| 10 | - **Claude Code plugin** — install once, get all tools + the `generate-profile` skill |
| 11 | - **Extract → Modify → Pack** pipeline for `.streamDeckProfile` ZIP archives |
| 12 | - **Hotkey buttons** with full modifier support (Ctrl, Shift, Alt, Win) |
| 13 | - **Multi-action buttons** for chord shortcuts (e.g., `Ctrl+K` then `Ctrl+M`) |
| 14 | - **Template system** — clone a blank profile and populate it programmatically |
| 15 | - **Icon generation** — 144×144 SVG icons, color-coded by shortcut category |
| 16 | - **Validation** — verify profile structure, image refs, and grid bounds before packing |
| 17 | - **Multi-device support** — MK.2, XL, Mini, Stream Deck +, and Neo |
| 18 | - **Pre-commit hook** — auto-validates staged profiles on `git commit` |
| 19 | |
| 20 | ## Quick Start |
| 21 | |
| 22 | ```bash |
| 23 | # Install |
| 24 | npm install |
| 25 | |
| 26 | # Extract an existing profile to inspect/edit |
| 27 | node src/index.js extract "My Profile.streamDeckProfile" my-profile |
| 28 | |
| 29 | # View the button grid |
| 30 | node src/index.js list my-profile |
| 31 | |
| 32 | # Validate structure |
| 33 | node src/index.js validate my-profile |
| 34 | |
| 35 | # Pack back to importable file |
| 36 | node src/index.js pack my-profile "My Profile.streamDeckProfile" |
| 37 | ``` |
| 38 | |
| 39 | ## CLI Commands |
| 40 | |
| 41 | | Command | Description | |
| 42 | |---------|-------------| |
| 43 | | `extract <profile> [outdir]` | Unzip `.streamDeckProfile` to an editable directory (default: `_extracted`) | |
| 44 | | `pack <dir> <output>` | Pack a directory back into a `.streamDeckProfile` ZIP | |
| 45 | | `validate <dir>` | Validate profile structure, manifests, image refs, and grid bounds | |
| 46 | | `list <dir>` | Print ASCII grid layout showing all pages and button labels | |
| 47 | |
| 48 | All commands are run via `node src/index.js <command> <args>`. |
| 49 | |
| 50 | ## MCP Server (Claude Desktop / Claude Code) |
| 51 | |
| 52 | `src/mcp-server.js` exposes 9 tools via stdio transport. Add to `claude_desktop_config.json`: |
| 53 | |
| 54 | ```json |
| 55 | { |
| 56 | "mcpServers": { |
| 57 | "opendeck": { |
| 58 | "command": "node", |
| 59 | "args": ["C:/path/to/opendeck-factory/src/mcp-server.js"] |
| 60 | } |
| 61 | } |
| 62 | } |
| 63 | ``` |
| 64 | |
| 65 | | Tool | Description | |
| 66 | |------|-------------| |
| 67 | | `extract_profile` | Unzip a `.streamDeckProfile` to an editable directory | |
| 68 | | `pack_profile` | Pack an extracted directory back to `.streamDeckProfile` | |
| 69 | | `validate_profile` | Validate structure, manifests, image refs, and grid bounds | |
| 70 | | `list_profile` | Print ASCII grid of all pages and button labels | |
| 71 | | `add_shortcut` | Add a hotkey button at a specific grid position (bounds-validated) | |
| 72 | | `generate_icons` | Generate SVG icons from a `data/shortcuts/<app>.json` file | |
| 73 | | `list_shortcuts` | Read shortcut definitions for an app | |
| 74 | | `quality_check` | Run QC gate on a built profile (file size, button count, icon resolution) | |
| 75 | | `live_test_profile` | Install profile into ProfilesV3, restart Stream Deck app, verify button structure | |
| 76 | |
| 77 | ## Claude Code Plugin |
| 78 | |
| 79 | Install the plugin to get the MCP server + `generate-profile` skill in one step: |
| 80 | |
| 81 | ```json |
| 82 | { |
| 83 | "plugins": [ |
| 84 | { "path": "C:/path/to/opendeck-factory/.claude-plugin/plugin.json" } |
| 85 | ] |
| 86 | } |
| 87 | ``` |
| 88 | |
| 89 | ## Install Skills via `npx skills` |
| 90 | |
| 91 | ```bash |
| 92 | npx skills add thisis-romar/opendeck-factory --skill generate-profile |
| 93 | npx skills add thisis-romar/opendeck-factory --skill capture-streamdeck-reference |
| 94 | npx skills add thisis-romar/opendeck-factory --skill drive-windows-gui |
| 95 | ``` |
| 96 | |
| 97 | Skills install to `~/.claude/skills/` (global) or `.claude/skills/` (project). Works with [vercel-labs/skills](https://github.com/vercel-labs/skills) and any compatible agent runner. |
| 98 | |
| 99 | ## Generating Profiles from Shortcut Data |
| 100 | |
| 101 | Instead of manually placing buttons, define shortcuts in a JSON file and generate the entire profile automatically. |
| 102 | |
| 103 | ```bash |
| 104 | # Generate icons from shortcut definitions |
| 105 | node scripts/generate-icons.js vs-code |
| 106 | |
| 107 | # Generate profile from shortcuts (creates from template if profile doesn't exist) |
| 108 | node scripts/generate-from-shortcuts.js vs-code --profile vs-code-colored |
| 109 | |
| 110 | # Validate and pack |
| 111 | node src/index.js validate profiles/vs-code-colored |
| 112 | node src/index.js pack profiles/vs-code-colored "builds/VS Code Colored.streamDeckProfile" |
| 113 | ``` |
| 114 | |
| 115 | ### Shortcut Data Format |
| 116 | |
| 117 | Create `data/shortcuts/<app-name>.json`: |
| 118 | |
| 119 | ```json |
| 120 | { |
| 121 | "metadata": { |
| 122 | "displayName": "VS Code", |
| 123 | "source": "VS Code Default Keybindings (Windows)", |
| 124 | "categoryStyles": { |
| 125 | "general": { "titleColor": "#4FC3F7", "fontSize": 11 }, |
| 126 | "navigation": { "titleColor": "#81C784", "fontSize": 11 } |
| 127 | } |
| 128 | }, |
| 129 | "shortcuts": [ |
| 130 | { |
| 131 | "command": "workbench.action.showCommands", |
| 132 | "label": "Command\nPalette\n", |
| 133 | "key": "P", |
| 134 | "modifiers": { "ctrl": true, "shift": true |