Route application audio to different outputs (Bluetooth, USB, HDMI, etc.) by rule. Runs as a standalone GUI on Linux with PipeWire or PulseAudio.
What it does: Pick a default output, then define rules so specific apps (browsers, meetings, music players) always use the device you choose. The router runs inside the app—use Start / Stop in the toolbar. You see active streams, which rule applies, and can close to tray or launch at login.
- First run — If no config exists, SinkSwitch auto-generates an initial set of routing rules from your connected devices (e.g. browsers, meetings, media → Bluetooth or USB headset when present). You can edit or remove these in the Routing Rules tab.
- Router off until you start it — Until you click Start in the toolbar, the router does nothing; all apps use the system default output.
- Default output — Once the router is running, streams that do not match any rule go to the Default output you set in the toolbar. Matched streams go to the device specified by their rule.
- Download the Linux binary from Releases.
- Run it (e.g.
chmod +x sinkswitch && ./sinkswitch). - On first run the app creates config at
~/.config/sinkswitch/. Use the GUI to add routing rules and start the router. Settings → Add to application menu or launch at login if you like.
pip install -r requirements.txt
python3 run_app.pySame config and behavior; config dir is ~/.config/sinkswitch/ (or set AUDIO_ROUTER_CONFIG).
./build.sh
./dist/sinkswitchVersion comes from the git tag at build time. The GitHub Action builds the binary and creates the release when you push a tag.
- Tag and push:
git tag v0.7.11 && git push origin v0.7.11 - The workflow builds the binary with that version and creates the GitHub release with the asset.
For a local build, run ./build.sh — it sets the version from the current repo tag.
- Config dir:
~/.config/sinkswitch/(orAUDIO_ROUTER_CONFIG) - Bundled example layout:
config/routing_rules.yamlin this repo (the app uses~/.config/sinkswitch/config/routing_rules.yamlat runtime)
Use the GUI to add rules and pick devices; the Default output in the toolbar is where unmatched apps go. See examples/ for YAML samples.
With dependencies installed from the repository root:
python3 src/audio_router.py list-devices
python3 src/audio_router.py generate-config --output config/routing_rules.yaml
python3 src/audio_router.py apply-rules config/routing_rules.yaml
python3 src/audio_router.py monitor config/routing_rules.yamlThe GUI runs the monitor internally; these commands are optional.
- Linux with PipeWire or PulseAudio
- For the release binary: desktop and glibc
- For source: Python 3.8+, PyQt6
MIT