A Stream Deck plugin that records audio from your microphone with a single press of a key or dial.
- Keypad action — one press to start, one press to stop. The icon flips between idle and recording states.
- Dedicated dial (encoder) action for Stream Deck + / Stream Deck + XL
- Turn the dial to cycle through your audio input devices on the fly
- Live elapsed-time timer and recording status on the touchscreen
- Elapsed-time timer displayed on the key button during recording
- Pick any audio input — USB microphones, audio interfaces, the built-in mic, anything macOS exposes.
- Configurable save folder — defaults to
~/Desktop. - Clean WAV output — 16-bit PCM, 48 kHz, mono.
- Universal native helper — runs on Apple Silicon and Intel.
Stream Deck button behavior
Stream Deck dial (Stream Deck + and Stream Deck + XL only) behavior
Stream Deck + / + XL users get the best experience: press the dial to start/stop recording, and rotate it to switch between audio input devices without opening any settings — the current device name and recording timer update live on the touchscreen display.
- macOS 10.15 (Catalina) or later
- Stream Deck application 6.5 or later
- Node.js 20+ — only required if you build from source
Download the latest .streamDeckPlugin from the
Releases page
and double-click it. The Stream Deck app will install and load the plugin
automatically.
See Development below.
First-run permission: the first time you record, macOS will ask for Microphone permission. Grant it under System Settings → Privacy & Security → Microphone. The permission is requested by the helper app
StreamDeckAudioRecorder, not by Stream Deck itself.
- Open the Stream Deck app and find Audio Recorder in the action drawer.
- Drag Record Audio onto a key, or Record Audio (Dial) onto a dial.
- Open the action's Property Inspector and:
- Pick an input device from the dropdown.
- Pick a save folder (optional — defaults to your Desktop).
- Press the key (or push the dial) to start recording. Press again to stop.
Recordings are saved as
<save folder>/recording-YYYY-MM-DDTHH-MM-SS.wav.
| Setting | Default | Notes |
|---|---|---|
| Input device | System default | Per-action. The dial action lets you cycle devices by rotating. |
| Save to | ~/Desktop |
Stored globally — shared across every Audio Recorder action. |
git clone https://github.com/HypeUpErik/StreamDeckAudioRecorder.git
cd StreamDeckAudioRecorder
npm install
npm run build # TypeScript -> com.erik.streamdeck-audio-recorder.sdPlugin/bin/plugin.js
npm run link # registers the plugin with Stream Deck
npm run watch # rebuilds and restarts the plugin on every save
npm run validate # Elgato CLI sanity check on the bundle
npm run pack # produces a distributable .streamDeckPluginThe compiled bin/plugin.js is gitignored, so a fresh clone needs npm run build before npm run link or npm run pack will work.
The Swift helper that actually captures audio
(StreamDeckAudioRecorder.app) is precompiled as a universal binary and
committed to the repo. You only need to rebuild it if you edit
com.erik.streamdeck-audio-recorder.sdPlugin/bin/record.swift.
SD_PLUGIN="com.erik.streamdeck-audio-recorder.sdPlugin"
APP="$SD_PLUGIN/bin/StreamDeckAudioRecorder.app"
swiftc -O -target arm64-apple-macosx10.15 \
-o /tmp/StreamDeckAudioRecorder-arm64 "$SD_PLUGIN/bin/record.swift" \
-framework AVFoundation -framework CoreAudio
swiftc -O -target x86_64-apple-macosx10.15 \
-o /tmp/StreamDeckAudioRecorder-x86_64 "$SD_PLUGIN/bin/record.swift" \
-framework AVFoundation -framework CoreAudio
lipo -create /tmp/StreamDeckAudioRecorder-arm64 /tmp/StreamDeckAudioRecorder-x86_64 \
-output "$APP/Contents/MacOS/StreamDeckAudioRecorder"
codesign --force --deep --sign - "$APP"The plugin has two halves:
- A Node.js plugin (
src/, compiled tobin/plugin.js) that talks to Stream Deck via@elgato/streamdeckand handles the UI side: Property Inspector, key states, dial layout, device list. - A native macOS helper (
StreamDeckAudioRecorder.app, written in Swift, source inbin/record.swift) that owns the actualAVFoundationrecording pipeline. The plugin launches it withopen -aso it runs in its own process and is the one that holds the macOS Microphone permission.
When you press record, the helper writes its PID to
/tmp/com.erik.streamdeck-audio-recorder.pid. Stopping a recording calls
StreamDeckAudioRecorder --stop, which reads that PID and sends SIGINT so
the WAV header is finalized cleanly.
- Pressing record does nothing and the icon flips back to idle.
macOS denied microphone permission. Open
System Settings → Privacy & Security → Microphone and enable
StreamDeckAudioRecorder. If it is not listed or still doesn't work,
reset and try again:
tccutil reset Microphone
- My device doesn't appear in the dropdown. Unplug and replug the device, then click the dropdown again — it re-queries on open.
- A recording got stuck and the icon is still red.
Force-stop the helper:
pkill -INT -x StreamDeckAudioRecorder
MIT © HypeUpErik
Built on the Elgato Stream Deck SDK.