Free, open-source per-app volume mixer for macOS — from the menu bar.
Windows-style volume control for Mac · No drivers · No kernel extensions · 100% native Swift
Features · Preview · Install · Permissions · How it works · Development
Menu bar popover — independent volume for every app playing audio
macOS gives you one volume slider for everything. Music too loud during a Zoom call? Discord notifications too loud while you work? Your only option is to mute the whole system.
Sound Bar is a lightweight macOS menu bar app that adds a per-application volume mixer — the Windows volume mixer experience, built natively for Mac with Core Audio.
Keywords: macOS volume mixer · per-app volume control · menu bar utility · mute apps individually · audio mixer Mac · Sonoma volume control · Swift open source
|
Independent sliders from 0% to 150% for every app. Turn Spotify down without touching your meeting. One click to mute. Another click restores your previous level. Switch between speakers, headphones, or AirPods without opening System Settings. |
Runs as a menu bar utility — no Dock icon, no clutter. Built on Apple's Core Audio Process Taps API. No virtual audio drivers. Right-click the menu bar icon to enable auto-start. |
| macOS | 14.2 (Sonoma) or later |
| Build tools | Xcode Command Line Tools (source builds only) |
| Architecture | Apple Silicon & Intel |
On older macOS versions there is no public API for per-app volume without virtual drivers like Background Music.
brew tap manuxstack/sound-bar
brew install --cask sound-bar- Go to Releases
- Download
Sound.Bar.zip - Unzip, then move Sound Bar.app to
/Applications - Open the app from Applications (right-click → Open the first time if macOS blocks it)
Official releases are notarized when published from CI with a Developer ID certificate.
git clone https://github.com/manuxstack/sound-bar.git
cd sound-bar
./scripts/build.sh
open "Sound Bar.app"Install system-wide:
cp -R "Sound Bar.app" /Applications/Releases are automated with GitHub Actions. To ship a new version:
# 1. Bump version in App/Info.plist (CFBundleShortVersionString + CFBundleVersion)
# 2. Commit, tag, and push
git tag v1.1.0
git push origin v1.1.0GitHub Actions will build Sound Bar.app, zip it, and publish it to Releases.
After the release, update the Homebrew cask:
./scripts/bump-cask.sh 1.1.0
git add Casks/sound-bar.rb && git commit -m "Bump Homebrew cask to 1.1.0"Add these GitHub Actions secrets to notarize releases automatically:
| Secret | Description |
|---|---|
APPLE_CERTIFICATE_BASE64 |
Developer ID Application .p12, base64-encoded |
APPLE_CERTIFICATE_PASSWORD |
Password for the .p12 |
SIGN_IDENTITY |
e.g. Developer ID Application: Your Name (TEAMID) |
APPLE_ID |
Apple ID email |
APPLE_APP_SPECIFIC_PASSWORD |
App-specific password from appleid.apple.com |
APPLE_TEAM_ID |
10-character Team ID |
Local notarization:
export APPLE_ID="you@example.com"
export APPLE_TEAM_ID="XXXXXXXXXX"
export APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
SIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" ./scripts/build.sh
./scripts/notarize.sh "Sound Bar.app"For local development, set up a persistent signing identity so the Audio Capture permission survives rebuilds:
./scripts/setup-signing.sh # one-time
./scripts/build.shmacOS will ask for Keychain access the first time — click Always Allow:
Without a stable signing identity, the app is ad-hoc signed and macOS will re-prompt for permission after every build.
The first time you move a volume slider, macOS requests Audio Capture access:
System Settings → Privacy & Security → Audio Capture → Sound Bar
Sound Bar intercepts other apps' audio to replay it at your chosen volume. It does not access your microphone.
Sound Bar uses Core Audio Process Taps (macOS 14.2+):
flowchart LR
A["App audio\n(e.g. Spotify)"] --> B["Process Tap"]
B --> C["IOProc\n(gain applied)"]
C --> D["Speakers / AirPods"]
B -. "original output\nsilenced" .-> X["System mixer"]
- Creates a tap on the target app's audio process
- Silences its original output in the system mixer
- Routes captured audio through a private aggregate device
- Applies your volume in real time
Browsers and Electron apps often play audio from helper subprocesses (com.brave.Browser.helper). Sound Bar resolves the parent app's name and icon automatically.
Apps keep their position once they appear. The list won't jump around when audio starts or stops.
sound-bar/
├── App/Info.plist
├── Sources/sound-bar/
│ ├── SoundBarAppDelegate.swift # Menu bar + popover
│ ├── ContentView.swift # SwiftUI UI
│ ├── MixerStore.swift # State & mixing logic
│ ├── VolumeMixer.swift # Core Audio tap + IOProc
│ ├── AppIdentity.swift # Parent app name/icon resolution
│ ├── AudioProcessList.swift
│ └── OutputDeviceList.swift
├── docs/ # README assets
└── scripts/
├── build.sh
└── setup-signing.sh
swift build # dev build
./scripts/build.sh # release .app bundle
CONFIG=debug ./scripts/build.shStack: Swift 5.9 · SwiftUI · AppKit · Core Audio · SPM (zero dependencies)
- Fork the repo
git checkout -b feature/my-improvement- Commit and push
- Open a Pull Request
Made for macOS · Back to top

