Features

Built for people who
keep changing their setup.

Speakers for music, a headset for calls, an interface for recording. Save each as a profile and move between them without touching your system's sound settings.

Named profiles

Each profile pins one default output device and one default input device. Switch to a profile and both change at once.

One-click switching

The Quick Switch view lists every profile. Press ▶️ in the header tray or just double-click a profile to apply it.

Command line

--list and --profile NAME run headless with a process exit code, so any script or launcher can drive it.

Stream Deck ready

Map a profile to a physical key with BarRaider's Advanced Launcher plugin on Windows; any macro deck or macro buttons that can run a command work on every OS. One press, one setup.

Offline devices

Pin a device that is currently off, like a Bluetooth headset. The moment it reconnects, the pending switch is applied automatically.

Partial switching

If one device in a profile is missing, the rest are still applied and the missing one is reported, so a switch never silently half-fails.

Live device rescan

The device list refreshes on system device changes and periodically. The 📡 tray button forces an immediate rescan on demand.

Local-first

Profiles are stored as JSON in your platform's per-user app-data folder. Runs per user, no admin rights; nothing about you or your profiles ever leaves your machine.

Update check

A quiet check against GitHub's releases shortly after launch, daily and on demand from the Help menu: Download the installer, Skip This Version for good or Later. Anonymous; silent when GitHub is unreachable.

Dark and light themes

A sun and moon toggle in the header tray restyles the whole app at a click, on every platform. Dark is the default and the choice persists between launches.

Keyboard first

Everything is reachable without the mouse: Tab and the arrow keys walk one explicit focus ring, lists walk with Up and Down and a green ring always shows exactly where you are.

One window

Launch it twice and the window you already have comes to the front, rather than a second copy competing over the same profiles. Command-line switching is exempt, so Stream Deck keys keep working while the window is open.

Automation

Drive it from a key,
a script or the shell.

With no arguments Audio Deck opens the GUI. With --list or --profile it runs headless and returns an exit code, which is exactly what a Stream Deck button or a batch file needs. Headless switches are never blocked by the running window, so a key still works while the app is open.

Command line
# List all profiles
AudioDeck.exe --list

# Switch to a profile by name
AudioDeck.exe --profile "Gaming Setup"

# Version, help or launch the GUI
AudioDeck.exe --version
AudioDeck.exe --help
AudioDeck.exe           # no args = GUI
Stream Deck button (Advanced Launcher)
# Application
AudioDeck.exe

# Arguments
--profile "Gaming Setup"

# One key per setup. Press it,
# the default output and input
# devices switch instantly.
Architecture

Clean by construction

Audio Deck follows a four-layer clean architecture: UI and CLI are clients of the application layer, which orchestrates a pure domain, while infrastructure implements the domain's interfaces against each platform's audio stack (Windows Core Audio, PulseAudio/PipeWire, macOS CoreAudio) and the filesystem. Dependencies point inward and are wired by constructor injection in an explicit composition root, one for the GUI and one for the CLI. Structural tests parse the source on every run, so a layering violation fails the build rather than being caught in review.

UI · CLI PySide6 + argv Application use cases Domain pure, no I/O Infrastructure pycaw · pactl · CoreAudio · JSON store implements dependencies point inward → a pure Domain