Per-app volume control for macOS.
VibeFader sits in your menu bar and lets you independently control the volume of each app on your Mac. Lower Spotify while keeping Discord loud, mute a browser tab's audio without touching the system volume — that kind of thing.
VibeFader uses the Core Audio Tap API (macOS 14.2+) — no virtual audio drivers, no kernel extensions, no jank.
- When you lower an app's volume, a muting tap intercepts its audio stream
- An IOProc reads the captured audio into a ring buffer
- An AVAudioEngine plays it back at your chosen volume
- When you set volume back to 100%, the tap is removed and audio passes through natively
No audio quality loss, minimal latency. Taps are only active for apps you've adjusted — zero overhead otherwise.
- macOS 14.2 (Sonoma) or later
- Xcode 16+ (to build from source)
- XcodeGen (
brew install xcodegen)
git clone https://github.com/le-big-mac/vibefader.git
cd vibefader
./build.shThis builds a Release binary, copies it to /Applications/VibeFader.app, and sets up the required permissions.
The script also regenerates VibeFader.xcodeproj with XcodeGen before building.
VibeFader needs Audio Capture permission to intercept app audio. The build script automatically grants this by inserting kTCCServiceAudioCapture into your user TCC database via sqlite3. This is necessary because macOS does not auto-prompt for this permission — manually granting "Screen & System Audio Recording" in System Settings is often not sufficient on its own.
You should also grant Screen & System Audio Recording permission in: System Settings → Privacy & Security → Screen & System Audio Recording
On macOS Tahoe, this may appear as System Audio Recording Only. VibeFader includes the system-audio usage description key required by newer macOS versions.
Note: The build script modifies
~/Library/Application Support/com.apple.TCC/TCC.dbto grant the audio capture permission. This is the same database macOS uses to track your privacy choices. The entry can be removed with:sqlite3 "$HOME/Library/Application Support/com.apple.TCC/TCC.db" "DELETE FROM access WHERE client='com.chadon.VibeFader' AND service='kTCCServiceAudioCapture'"
- Launch VibeFader — it appears as a slider icon in your menu bar
- Click it to see all apps with audio sessions
- Drag a slider to adjust that app's volume
- Click the speaker icon next to an app to mute/unmute it
- Use the output device picker at the bottom to switch audio output
Some apps, including browsers and Spotify, play audio from helper or renderer processes. VibeFader resolves those helpers back to the owning app and shows a single row when possible.
# Generate the Xcode project
xcodegen generate
# Build Release
xcodebuild -project VibeFader.xcodeproj \
-scheme VibeFader \
-configuration Release \
CODE_SIGNING_ALLOWED=NO \
buildOr open VibeFader.xcodeproj in Xcode and build from there.
VibeFader/
├── VibeFaderApp.swift # Menu bar app entry point
├── Audio/
│ ├── AppAudioController.swift # Per-app tap + ring buffer + engine
│ ├── AudioManager.swift # Coordinator (ObservableObject)
│ ├── AudioDeviceManager.swift # Output device enumeration
│ ├── AudioProcessDiscovery.swift # Find apps with audio sessions
│ └── CoreAudioHelpers.swift # Low-level Core Audio wrappers
├── Models/
│ └── AudioApp.swift # App model (pid, name, icon, volume)
└── Views/
├── VolumePopoverView.swift # Main popover
├── AppVolumeRow.swift # Per-app slider row
└── OutputDevicePicker.swift # Output device selector
The core audio pipeline in AppAudioController:
CATapDescription→AudioHardwareCreateProcessTap(intercept app audio)- Tap-only aggregate device →
AudioDeviceCreateIOProcIDWithBlock(capture to ring buffer) AVAudioSourceNode→AVAudioEngine(play back at controlled volume)
- FaceTime, Zoom, Teams — These apps route audio through system daemons (
avconferenced,callservicesd) rather than their own process. You can control them by adjusting the volume onavconferencedin the app list. Note that the tap captures these daemons at a much lower amplitude than normal apps, so VibeFader applies a 10x gain boost with soft clipping to match native levels. Volume control works but may not be as precise as for regular apps like Spotify or Firefox. - macOS 14.2+ only — The Core Audio Tap API was introduced in macOS 14.2 Sonoma.
- Permission setup — Requires
kTCCServiceAudioCapturewhich macOS doesn't auto-prompt for. The build script handles this via direct TCC database insertion.
This entire app was vibe-coded. Every line of code was written by Claude Code (Claude Opus 4.6) in a single session. No human wrote any code. The name "VibeFader" reflects both what it does (fade audio levels) and how it was made (vibes).
It works on the author's machine. It might work on yours. It interacts with low-level Core Audio APIs and your system's TCC permission database. Use at your own risk.