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 Switch 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

On Windows, pin a device that is currently off, like a Bluetooth headset; on Linux and macOS, choose it while it is connected. If it is off when you switch, it is applied the moment it reconnects as the same device, unless the defaults have been changed since.

Every control is a picture

The header carries no text labels: each control is drawn artwork in one visual language, naming itself through a tooltip on hover (on Windows, even while another program has focus). Help then Guide opens the key to all of them, with the same pictures beside their meanings.

Partial switching

If one device in a profile is missing, the rest are still applied and the missing one is reported. So is a device the system refused, one Windows set for only some of its roles (naming the roles it missed) and one the system accepted while keeping the old default, which is checked by reading the default back after every switch.

Live device rescan

The device list refreshes on system device changes and periodically. The Rescan 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 release for your platform, 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 no second copy starts to compete over the same profiles; on Windows the window you already have comes to the front. 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, macOS CoreAudio, PulseAudio/PipeWire) 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 · CoreAudio · pactl · JSON store implements dependencies point inward → a pure Domain