Wireless StreamDeck

Turning a Stream Deck into a Bluetooth controller.

Wireless StreamDeck

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
ComponentRoleRequiredNotes
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 supplyPowers 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 RadxaProtection + mounting on setâ­•Practical on a set (velcro, mount, protection).
Spare cablesField 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

  1. 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.


  1. 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 shutdown or reboot of the mini-PC
  • Receives and displays images on the Stream Deck buttons (persistent storage on the mini-PC)

System requirements

ComponentRequiredCommand
python3-dbusâś… Requiredsudo apt install python3-dbus
Bluetooth Linux (BlueZ)âś… Requiredsudo apt install bluez
bluez-toolsâś… Recommendedsudo apt install bluez-tools
Python modulesâś… Requiredpip install bluezero streamdeck Pillow

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:

CommandPath
shutdown/sbin/shutdown
reboot/sbin/reboot
hcitool/usr/bin/hcitool

  1. 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.