Run any shell command β or a full script β directly from a Stream Deck button on macOS.
Type your commands in the property inspector, press the key, done.
Each Stream Deck button gets its own multiline command editor. Type your commands (one per line), press the key, and choose how they run:
| Mode | Behaviour |
|---|---|
| π₯ Show | macOS Terminal opens visually and runs your commands. Optionally closes when done. |
| π» Hidden | Commands run silently in the background β no window, no noise. Just β
or |
- Multiline command editor β as many commands as you need, one per line
- Show / Hidden terminal toggle β visible or silent execution per button
- Real shell execution β zsh or bash, so pipes,
&&, variables, and env paths all work - Auto-close option β Terminal window closes itself after the last command (Show mode)
- Comment support β lines starting with
#are skipped set -ein hidden mode β execution stops on first error and flashesβ οΈ - Visual feedback β β
on success,
β οΈ on error or empty config - macOS only β built exclusively for macOS via AppleScript + direct shell exec
The plugin is written in TypeScript using the Elgato Stream Deck SDK v3. It runs as a Node.js process managed by the Stream Deck application and communicates via WebSocket.
keyDown β read settings β write /tmp/sd-shell-xxx.sh
β osascript β Terminal.app opens
β (optional) poll busy state β close window
β delete temp script after 10s
Hidden mode
keyDown β read settings β write /tmp/sd-shell-hidden-xxx.sh
β execFile("/bin/zsh", [scriptPath])
β awaits exit code
β delete temp script immediately
β showOk β
or showAlert β οΈ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Stream Deck hardware (USB/BT) β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β keyDown (WebSocket)
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β plugin.js (Node.js, managed by SD app) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β RunShellAction.onKeyDown() β β
β β β read settings (commands, shell, terminalMode) β β
β β β write temp .sh script to /tmp/ β β
β β β β
β β terminalMode === "show" β β
β β β execFile("osascript") β Terminal.app β β
β β β β
β β terminalMode === "hide" β β
β β β execFile("/bin/zsh", [scriptPath]) β β
β β β silent, no window β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
See INSTALL.md for full setup instructions.
TL;DR β for developers:
git clone https://github.com/paulfxyz/stream-deck-shell.git
cd stream-deck-shell
npm install
npm run build
cp -r com.paulfleury.shell.sdPlugin \
~/Library/Application\ Support/com.elgato.StreamDeck/Plugins/- Open Stream Deck.
- Find Stream Deck Shell in the Actions panel (under Developer Tools).
- Drag Run Shell Commands onto any key.
- Click the key to open the Property Inspector.
- Type your commands β one per line.
- Choose Show (Terminal opens) or Hidden (silent background run).
- Choose your shell (
zshorbash) and whether to close Terminal after (Show mode only). - Press the physical key on your deck.
# Restart a local dev server (hidden β no window needed)
pkill -f "node server.js"
cd ~/Projects/myapp && npm run dev
# Quick git push (show β see the output)
cd ~/Projects/myapp && git add -A && git commit -m "wip" && git push
# Open your favourite apps (hidden β just fire and forget)
open -a "Spotify"
open -a "Slack"
open -a "Figma"
# macOS notification after a hidden task
osascript -e 'display notification "Build finished!" with title "Stream Deck Shell"'stream-deck-shell/
βββ com.paulfleury.shell.sdPlugin/ β compiled plugin (install this)
β βββ bin/
β β βββ plugin.js β compiled entry point
β βββ imgs/ β SVG icons
β βββ ui/
β β βββ inspector.html β property inspector UI
β βββ manifest.json β plugin metadata & actions
βββ src/
β βββ actions/
β β βββ run-shell.ts β core action logic (show + hidden modes)
β βββ plugin.ts β entry point & action registration
βββ package.json
βββ rollup.config.mjs
βββ tsconfig.json
βββ README.md
βββ INSTALL.md
βββ CHANGELOG.md
PRs are welcome. Open an issue first for anything beyond a bugfix.
git clone https://github.com/paulfxyz/stream-deck-shell.git
cd stream-deck-shell
npm install
npm run watch # builds on save, hot-reloads into Stream Deck- Windows support (PowerShell + cmd)
- Custom button icon derived from first command
- Multi-action grouping (chain N buttons as a sequence)
- iTerm2 support as alternative terminal
- Environment variable injection per-button
- Warp terminal support
- Notification on hidden mode completion (native macOS alert)
MIT β Paul Fleury, 2026
Disclaimer β 100% Vibe Coding
A candid note: I'm not a software engineer by trade. I'm a former hacker turned Internet entrepreneur who has a very good relationship with AI and tools like Claude and Perplexity Computer. This plugin was designed and built through pure conversation with AI assistants β no IDE gymnastics, no Stack Overflow spelunking. Just describing what I wanted until it worked.