README.md
Fader
Volume control for macOS that lives in the menu bar: switch the output device with one click, connect Bluetooth headphones, and set a separate volume for every app. Site: fader.pantafive.dev.
Fader is free and open source. It sends nothing anywhere — no telemetry, no analytics, no network access at all. Audio is processed on your Mac through the system's own Core Audio process taps (an API introduced in macOS 14.4; Fader supports macOS 15+), so there is no kernel extension and no virtual audio driver to install.
Features
- One-click switching between output devices — headphones, speakers, AirPlay — with the active one marked.
- Bluetooth management: paired headphones connect straight from the popover, and audio routes to them automatically.
- Per-app volume sliders and mute. An app at 100% is untouched: Fader only taps an app's audio after you adjust it, the default audio path stays bit-perfect.
- System output volume and mute, in sync with the volume keys and Control Center.
- Volumes persist per app across launches and reboots.
Install
| 1 | brew install --cask pantafive/tap/fader |
Or download the latest dmg — signed and notarized. Requires macOS 15+.
Permissions
Adjusting an app's volume uses a Core Audio process tap, which macOS gates behind the System Audio Recording permission. Fader asks for it the first time you move a per-app slider. The tapped audio is re-rendered to your output device with the gain you set and never leaves the audio pipeline. Device switching and system volume need no permissions.
Development
| 1 | brew install xcodegen swiftlint swiftformat |
| 2 | make run |
make drives local work: gen, build, test, lint, format, run. The Xcode project is generated by XcodeGen from project.yml and is not committed — edit project.yml, never the .xcodeproj. CI lints and tests every push; pushing a v* tag builds, signs, notarizes, and publishes the dmg as a GitHub release; the site redeploys on every push to main that touches site/.
Contributing
Bug reports and pull requests are welcome; for anything bigger than a fix, open an issue first. make test and make lint must pass. Commit messages follow Conventional Commits, imperative mood, English. The real-time audio callback (ProcessTap.render) runs on the HAL IO thread — no allocation, locks, Objective-C, or logging inside it; changes there get extra scrutiny. Contributions adding telemetry, analytics, or anything that phones home will be declined.
Report security issues privately via GitHub security advisories, not public issues.