Per-app volume control for macOS β a quick mixer in the menu bar, plus a full window when you want more room. No kernel extension, no audio driver: it uses the modern Core Audio process-tap API (macOS 14.4+) to tap each app's audio, mute its direct output, and re-render it through a private aggregate device at an adjustable per-app gain.
- Per-app volume sliders, live as you drag β from the menu bar or the window
- Per-app mute
- Master channel β one slider/mute scaling every app
- Pin apps to keep them in the main menu (vs. the "All apps" submenu)
- Stays out of the way β lives in the menu bar only; a Dock icon appears just while the window is open
- Persistent β levels are remembered per app (by bundle id) across launches
- Auto-attach β a saved level re-applies the moment an app starts playing
- Follows your output device β rebuilds taps when you switch headphones/speakers
- Presets β save your mix as "Work", "Gaming", "Streaming" and switch in one click from the window, the menu bar, the Dock menu, or a shortcut
- Per-device presets β bind a preset to an output device and it applies itself the moment that device becomes the default. Plug in your earbuds and your earbud mix loads automatically; devices you haven't bound behave exactly as before.
- Global keyboard shortcuts β control audio from anywhere, fully rebindable:
- ββ₯β / ββ₯β β raise / lower the focused app's volume (5% steps, repeats while held)
- ββ₯M β mute / unmute the focused app
- Bind your own for the master channel, for specific apps, and for presets
- A small on-screen HUD shows the change (like the system volume overlay)
- Light / Dark / System appearance β System follows the OS and updates live
- Launch at Login toggle
AudioTune runs in the menu bar. Click its icon for the quick mixer: the master slider, every app that's playing, and a Preset submenu.
For the full interface choose Open Window (βO) from that menu. The window has three tabs:
| Tab | What's there |
|---|---|
| Mixer | Master plus every app, with slider, mute and pin |
| Presets | Save the current mix as a named preset; apply, rename, update or delete it, give it a shortcut, or bind it to an output device so it loads automatically |
| Shortcuts | Rebind the global shortcuts and assign raise/lower/mute shortcuts per app |
A shared footer β Reset all, appearance, Launch at Login β sits under all three tabs. Closing the window leaves AudioTune running in the menu bar.
- macOS 14.4 or later (Apple Silicon or Intel)
- Grab
AudioTune.zipfrom the latest release and unzip it. - Move
AudioTune.appto/Applications. - First launch only: because the app isn't notarized, macOS blocks it once.
Either:
- Open it, then go to System Settings β Privacy & Security, scroll down, and click "Open Anyway", or
- run this in Terminal to clear the download flag:
xattr -dr com.apple.quarantine /Applications/AudioTune.app
- The first time you move a volume slider, macOS asks for audio-recording permission β click Allow (this is what lets AudioTune tap app audio).
Why the warning? AudioTune is open-source and ad-hoc signed, not notarized through Apple's paid program. The warning is about distribution, not safety β the code is all in this repo. It works identically once past the first launch.
Needs the Swift toolchain (Xcode or Command Line Tools). Locally-built apps aren't quarantined, so there's no warning:
git clone https://github.com/ZechariahJ/audiotune.git
cd audiotune
./build.sh # -> AudioTune.app (ad-hoc signed, local use)
open AudioTune.appAudioTune needs audio-recording permission to tap other apps' audio. The first time you move a volume slider, macOS shows the prompt β click Allow.
This is a one-time grant, not per-launch. macOS remembers it across every future open, and you can review or revoke it under System Settings β Privacy & Security β Microphone (audio capture is grouped under "Microphone").
You may be asked to approve again if you install a new version (a different build has a different signature) or build from source repeatedly β each build looks slightly "new" to macOS. Normal day-to-day use never re-prompts.
Audio engine
| File | Role |
|---|---|
ProcessTap.swift |
Tap + aggregate device + realtime gain render callback |
AudioProcessMonitor.swift |
Enumerates Core Audio process objects β app roster |
CoreAudioHW.swift |
Default output device helpers |
AudioMixer.swift |
Shared state: app roster, levels, presets, hotkey dispatch |
Interface
| File | Role |
|---|---|
main.swift |
Entry point; starts as a menu-bar-only (accessory) app |
AppDelegate.swift |
Menus, window lifecycle, hotkey registration, device listener |
MainWindowView.swift |
Window tabs: Mixer / Presets / Shortcuts |
MixerView.swift |
Mixer tab |
ProfilesView.swift |
Create, apply, rename and delete presets |
ShortcutsView.swift |
Rebind global and per-app shortcuts |
WindowFooter.swift |
Shared footer: reset, appearance, launch at login |
AppVolumeRowView.swift |
A menu row: icon, name, slider, mute, pin |
KeyRecorder.swift |
Click-to-record shortcut field |
VolumeHUD.swift |
On-screen overlay shown when a shortcut changes volume |
Supporting
| File | Role |
|---|---|
GlobalHotKeys.swift |
System-wide hotkeys (Carbon), with hold-to-repeat |
Profiles.swift |
Preset + hotkey models |
SettingsStore.swift |
Persisted levels, presets and shortcuts (UserDefaults) |
LoginItem.swift |
Launch-at-login via SMAppService |
Log.swift |
Size-capped diagnostic log in ~/Library/Logs/AudioTune |
AudioTune makes no network requests β no telemetry, no analytics, no auto-update β and asks for exactly one permission (audio recording, required by the tap API). Tapped audio is never written to disk. See SECURITY.md for details and how to report a vulnerability.
