Wireless StreamDeck
Turning a Stream Deck into a Bluetooth controller.
I designed a small macOS application that controls a Stream Deck over Bluetooth. To add Bluetooth to the Stream Deck, I use a Radxa Zero 3W connected to the Stream Deck.
This setup allows you to use the controller on battery power, and the application makes it easy to run small AppleScripts to control various applications from the Stream Deck.
Overview
graph LR
subgraph AVANT[" "]
direction LR
n2["🔋 External Battery"]
subgraph s1[" "]
SBC["🧠Microcomputer<br>(USB → BLE bridge)"]
n1["SD Card"]
end
SD1["🎛️ Stream Deck"]
MAC["đź’» Mac"]
end
class SD1,MAC device;
class SBC bridge;
style AVANT fill:transparent,stroke:transparent,color:transparent
style s1 fill:transparent,stroke:transparent,color:transparent
SD1 -->|"USB (short cable)"| SBC
SBC <-->|"Bluetooth (BLE)"| MAC
n1 --- SBC
n2 --- SBC
SBC -.->|"SD storage via cable for installation-free launch (optional)"| MAC
| Component | Role | Required | Notes |
|---|---|---|---|
| Elgato Stream Deck (any model) | Physical controller (keys + display) | âś… | Only the 15-key Stream Deck has been tested. |
| Radxa Zero 3W or another microcomputer compatible with Linux and Bluetooth | "Bridge" microcomputer USB → BLE | ✅ | Runs ble_streamdeck.py and exposes a BLE service to the Mac. In theory, any microcomputer with Bluetooth will work, as long as it has a USB OTG port (if you're using "mass storage" mode). |
| microSD card (≥ 16–32 GB) | OS + scripts + image/config storage | ✅ | Ideally "endurance" rated and fast to minimize issues in the field. If you use the OTG / USB Mass Storage option, the OS must not be on the microSD (otherwise it can't be exposed to the Mac while the Radxa is running). |
| USB-C power supply | Powers the Radxa (and therefore the Stream Deck via USB) | âś… | From mains power or via power bank; aim for stable power delivery. |
| External battery (power bank) | Mobile / wireless use | âś… | Required if you want a 100% mobile setup. |
| Short USB cable (Stream Deck → Radxa) | USB HID link + Stream Deck power | ✅ | Short length to avoid clutter; adapter depending on ports (USB-A/USB-C). |
| Mac (Apple Silicon) | Host machine + Stream Deck Connect.app | âś… | Application tested only on Apple Silicon. macOS 26 |
| Case / mount for Radxa | Protection + mounting on set | â• | Practical on a set (velcro, mount, protection). |
| Spare cables | Field redundancy | â• | Recommended on shoots (cables are a common point of failure). |
How I used it before
Before, like many operators, I would use a Stream Deck. Connected to Capture One via cable, it allowed me either to easily run scripts / automations / Capture One shortcuts, or, in certain setups, to hand it over to clients.
In that case, they could do the image selection themselves: navigate, apply tags or star ratings. It saved time on a shoot and kept the client from touching the computer directly. They only had a few simple buttons to use, for quick and clear selection.
For this, I used the official Elgato Stream Deck Software for macOS. With the great plugin created by Emory Dunn (C1 Stream Deck Plugin, available on the Elgato marketplace), I could control Capture One very easily from the Stream Deck.
The problem
This method works well, but it requires having the Stream Deck next to me, connected to the computer.
Physical constraints
For the editing / selection phase, this creates several problems: the client either has to stay next to me the whole time behind my screen, or constantly move back and forth between my station and the client monitor, closer to the set, where they can see images from the Capture One viewer.
I often use a client monitor so everyone on set can see the images clearly. But depending on the setup (and sometimes with iPads), these screens are sometimes far from my workstation. Result: I have to use a long cable (several meters) for the Stream Deck, with the risk of people stepping on it. Not practical.
Installing on third-party machines
The second problem is that I regularly work on computers provided by clients or photographers. In those cases, I can't—or prefer not to—install too many things on the machine, and I want to be able to add / remove my plugins easily.
This setup forced me to install every time:
- Elgato Stream Deck Software
- C1 Stream Deck Plugin
- Preset file
And that's on top of the scripts and configuration files I also install on the machine for each shoot.
The solution
My solution relies on a small setup around a microcomputer (a Radxa Zero 3W): it acts as the intermediary between the Stream Deck and my Mac. In practice, the Radxa is connected to the Stream Deck via USB and runs a script that translates Stream Deck events (button presses, state, etc.) into Bluetooth messages that my macOS application can understand.
Benefits of this approach
Flexible placement Thanks to this, I no longer have to plug the Stream Deck directly into the main computer. I can place it wherever it's most practical: near the client, near the set, at a secondary station, or even next to the client monitor if I have power available. And most importantly, I can use it on battery, which immediately solves the problem of long cables running across the set.
Portable mode with OTG This setup also solves my second problem: installing on third-party machines. The Radxa Zero 3W has an OTG port: I use it to power the whole system, but also to expose its storage as a removable drive. In practice, my macOS application and my files (scripts, images, configuration) live on this drive: I plug it in, launch the app, and instantly have my environment back—without installing Elgato software, without plugins, and without copying presets to the host machine.
No permanent installation required Finally, the application was designed for "portable" use: it can launch from this drive, copy itself to memory, then continue running even if I eject the volume. Result: I can start the app, properly unmount/eject, use the Stream Deck wirelessly, and keep the tool running throughout the shoot—without leaving any permanent installation on the client's computer.
Features
Stream Deck configuration
- Modify the image on each Stream Deck key
- Assign an AppleScript to each key
- Configure long press on a key (duration and/or action)
Usage modes
- Portable mode: no installation, no files to copy to the computer
- Wireless mode: Bluetooth connection
- Remotely power off the Stream Deck
Usage
-
Stream Deck Connect.app: Portable macOS application
Stream Deck Connect.app (on Mac or SD card) is the application that can be run from a removable drive (or on any Mac).
Compatibility: Application tested only on Apple Silicon. macOS 26.
-
ble_streamdeck.py: Python script for Radxa Zero 3W
ble_streamdeck.py (on the microcomputer side) is a Python script to install on the microcomputer.
Functions:
- Detects the Stream Deck and sends events to the Mac ("button 3 pressed / released", "Stream Deck connected / disconnected")
- Allows the Mac to request
shutdownorrebootof the mini-PC - Receives and displays images on the Stream Deck buttons (persistent storage on the mini-PC)
System requirements
| Component | Required | Command |
|---|---|---|
| python3-dbus | âś… Required | sudo apt install python3-dbus |
| Bluetooth Linux (BlueZ) | âś… Required | sudo apt install bluez |
| bluez-tools | âś… Recommended | sudo apt install bluez-tools |
| Python modules | âś… Required | pip install bluezero streamdeck Pillow |
Sudo permissions (recommended)
If you want the shutdown, reboot commands and Bluetooth optimization via hcitool to work without prompting for a password, you need to allow sudo without password for:
| Command | Path |
|---|---|
| shutdown | /sbin/shutdown |
| reboot | /sbin/reboot |
| hcitool | /usr/bin/hcitool |
-
ums-microsd-on.sh: USB Mass Storage mount script
ums-microsd-on.sh is used to turn the Radxa into a "microSD card reader plugged in via USB" for a Mac.
Auto-launch at startup
For ble_streamdeck.py and ums-microsd-on.sh to run at startup, you need to use systemctl (systemd) to define these two scripts as services that launch automatically at boot.
