Skip to content

Latest commit

Β 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ–₯️ Stream Deck Shell

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.


What it does

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 ⚠️ on the key.

Features

  • 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 -e in 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

How it works under the hood

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.

Show mode

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                            β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Installation

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/

Usage

  1. Open Stream Deck.
  2. Find Stream Deck Shell in the Actions panel (under Developer Tools).
  3. Drag Run Shell Commands onto any key.
  4. Click the key to open the Property Inspector.
  5. Type your commands β€” one per line.
  6. Choose Show (Terminal opens) or Hidden (silent background run).
  7. Choose your shell (zsh or bash) and whether to close Terminal after (Show mode only).
  8. Press the physical key on your deck.

Example commands

# 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"'

Project Structure

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

Contributing

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

Roadmap

  • 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)

License

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.

About

πŸ–₯️ Stream Deck Shell (2.0.0) β€” Run shell / terminal commands on macOS directly from your Stream Deck

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages