macOS gives you one volume for everything, so turning a video down takes your music with it. This gives you one per app — a bar in the menu bar for anything making noise. Free, open source, two minutes to install.
$ curl -fsSL https://raw.githubusercontent.com/clement880101/audio-adjuster-mac/main/install.sh | sh
Drag a bar. This is the real balancing algorithm.
curl -fsSL https://raw.githubusercontent.com\ /clement880101/audio-adjuster-mac/main/install.sh | sh
git clone https://github.com/clement880101/audio-adjuster-mac cd audio-adjuster-mac make app && make run
It asks for audio-recording permission. Process taps are gated behind it. The app reads each app's audio in order to play it back at your level, and records nothing — but without the grant a tap returns digital silence rather than an error, which is a confusing way to fail.
Ad-hoc signed, not notarized. There is no Apple Developer ID behind this,
so macOS cannot verify who built it. Installed with the command on the left it
opens normally — files fetched by curl are not quarantined.
Downloaded through a browser it is, and macOS will refuse a double-click: open it
the first time with right-click → Open. Building from source sidesteps
the question.
Menu bar only — no Dock icon, no window. A bar sets a gain applied to that app's audio, where 100% is exactly what macOS would otherwise have played. Values are keyed to the bundle identifier, so they survive the app quitting, relaunching under a new process, and your Mac restarting.
100% at the midpoint: linear below, so cuts are proportional and reach exact silence; logarithmic above, so equal drags are equal multiplications. Gain is ramped across each buffer rather than stepped, so moving a bar cannot click, and soft limited past full scale rather than wrapping.
By default the bars hold a constant sum: what one app gains, the others give up, shared equally, with anything that hits silence or the ceiling passing its residual to bars that still have room. Switch it off and each moves alone. Mute is never linked either way.
Core Audio reports around thirty processes; the list shows the ones that have actually produced output, and keeps them once they fall quiet so a level is still reachable between tracks. An app's several audio processes — a FaceTime call is two — collapse into one bar covering all of them.
macOS still has no per-app volume API. What it has, since 14.2, is Core Audio process taps — shipped in December 2023 for screen recording and system-audio capture. A tap can also mute the process it captures, and that is the half that makes a volume control possible.
A CATapDescription with muteBehavior set to
mutedWhenTapped, marked private so nothing else can latch onto it. The
app plays normally until our render loop starts reading, and returns to normal the
instant it stops — so releasing the tap is a complete restore, with no state left
behind to repair.
The tap is wrapped in a private aggregate device built on your current default output, so it never shows up in Sound settings or Audio MIDI Setup. An aggregate is bound to the device it was built on, so switching outputs — AirPods connecting — invalidates every one of them and they are rebuilt.
An IO proc copies tapped frames to the output with gain applied. It runs on the Core Audio IO thread, so it allocates nothing, takes no locks and touches no reference-counted object; the gain lives in preallocated memory that the UI writes and the audio thread reads.
A tap is created only for an app you actually adjust — everything else keeps its ordinary path, with no added latency and no tap at all. There is no kernel extension, no virtual audio driver to install and nothing patched: public API only, macOS 14.2 and later. Claims about audio here are measured rather than assumed, and the numbers are in the README.
No. It uses Core Audio process taps, a public API added in macOS 14.2. There is nothing to install alongside it and nothing is patched, which is also why it cannot work on anything earlier.
macOS gates process taps behind the audio-recording permission, and treats a tap as an audio input. The app reads each app's audio in order to play it back at your level and records nothing. Without the grant a tap returns digital silence rather than an error.
It is ad-hoc signed and not notarized, because the project has no Apple
Developer ID. Installed with the command above it opens normally, since files
fetched by curl are not quarantined. Downloaded through a browser it
is, so open it the first time with right-click → Open.
No. A tap is created only for an app whose volume you actually change. Everything else keeps its ordinary path, with no tap at all.
Nothing. It is free and open source under the Apache 2.0 licence, with no account, telemetry or paid tier.
Yes. Levels are keyed to the bundle identifier, so they survive the app quitting, relaunching under a new process, and your Mac restarting.