CmdDeck is an open-source, cross-platform Stream Deck-style command launcher for Windows and macOS. It features a software macro pad that runs commands, scripts, and terminal shortcuts. Choose which shell runs each command and optionally attach a console to monitor output.
Ideal for developers or power users who want a lightweight desktop command palette / macro pad without dedicated hardware.
- Profiles and pages - multiple decks with tabbed pages
- Macro packs - import/export macro packs; import example packs in Settings
- Global hotkeys - optional shortcut per macro (e.g.
Ctrl+Shift+1) - Workflow variables -
{{date}},{{cwd}},{{env:VAR}},{{gitBranch}}in commands - Macro actions — run command, open URL, open path, or SSH, and more!
- Download the latest installer from Releases
- Run the installer and follow the prompts
- Download the
.dmgfrom Releases and drag CmdDeck to Applications - macOS may say the app is “damaged” - that is Gatekeeper blocking an unsigned download, not a bad file. Go to System Preferences -> Security & Privacy, then "Open anyway".
bun install
bun run devbun run buildBump the version in package.json and push to master. The GitHub Actions workflow builds Windows and macOS installers, uploads updater metadata, and creates a GitHub Release.
- Click + (or the empty tile) to add a command
- Enter a command and pick Run with (PowerShell, cmd, etc.)
- Optionally enable Show terminal window, set a display name, image, and working directory
- Click a button to run; click again while running to stop
- Right-click a button for Run / Edit / Duplicate / Delete
These match the built-in starter packs in packs/. Import a pack from the app, or copy a command below into a new macro.
Boot project (set cwd to the app):
git pull
composer install
npm install
php artisan migrate
docker compose up -dArtisan serve / Queue worker / Vite dev:
php artisan servephp artisan queue:worknpm run devPR check:
git status
npm run lint
npm testnpm installnpm run devnpm testnpm run lintdocker compose up -ddocker compose logs -f --tail=200docker compose downgit statusgit diffgit pushStart workday (PowerShell):
Start-Process https://mail.google.com
Start-Process https://calendar.google.com
Start-Process https://github.com/notificationsGitHub — action type Open URL: https://github.com
Open Projects — action type Open path: {{env:USERPROFILE}}\Projects
Tidy Downloads (confirm before run):
$downloads = [Environment]::GetFolderPath('UserProfile') + '\Downloads'
Get-ChildItem $downloads -File | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item -ForceScene: Main / Scene: BRB (edit OBS host/port and scene names):
curl -s -X POST http://127.0.0.1:4455/api/requests -H "Content-Type: application/json" -d "{\"requestType\":\"SetCurrentProgramScene\",\"requestData\":{\"sceneName\":\"Main\"}}"curl -s -X POST http://127.0.0.1:4455/api/requests -H "Content-Type: application/json" -d "{\"requestType\":\"SetCurrentProgramScene\",\"requestData\":{\"sceneName\":\"BRB\"}}"Open OBS — action type Open URL: obs64://
SSH macros (edit host/user/key per machine). Commands run on the remote:
df -hdocker pscd ~/stack && docker compose restartsudo apt update && sudo apt upgrade -yStream Deck alternative, command launcher, terminal shortcuts, macro pad, always-on-top command grid, Tauri desktop app, Windows Terminal launcher, shell command buttons
Contributions are welcome! Please feel free to submit a Pull Request.
MIT