Audio Adjuster
macOS 14.2+ · Apache 2.0

The macOS volume knob, per app.

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

or download the latest release

Try itlinked
Volume total 300%
Raising one app lowers the others

Drag a bar. This is the real balancing algorithm.

Install

Easy to download and install.

From a release

curl -fsSL https://raw.githubusercontent.com\
/clement880101/audio-adjuster-mac/main/install.sh | sh

From source

git clone https://github.com/clement880101/audio-adjuster-mac
cd audio-adjuster-mac
make app && make run

Worth knowing

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.

What it does

One bar per app, absolute gain.

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.

0 to 1000%

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.

Linked, or not

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.

Only what you hear

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.

How it works

A tap, an aggregate device, and an IO proc.

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.

The tap

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 device

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.

The render loop

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.

Questions

The things people ask.

Does it need a kernel extension or a virtual audio driver?

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.

Why does it ask for microphone permission?

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.

Why does macOS refuse to open it?

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.

Does it add latency to audio that is not being adjusted?

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.

What does it cost?

Nothing. It is free and open source under the Apache 2.0 licence, with no account, telemetry or paid tier.

Do the volumes survive a restart?

Yes. Levels are keyed to the bundle identifier, so they survive the app quitting, relaunching under a new process, and your Mac restarting.