TurnThatDown is a free, open-source macOS menu bar app for per-app volume control. Built entirely with Claude Code in a couple of sessions. Download the DMG here.
What You Get
- Per-app volume sliders — independent control for every app playing audio
- 5-band parametric EQ per app — Bass, Low, Mid, High, Air with ±24dB range
- Per-app stereo balance — L/R panning for each app
- System volume & device switching — output/input device picker
- Global hotkeys —
⌥⇧↑/↓for per-app volume,⌃⌥↑/↓for system - Typeable volume — click the percentage to type an exact value
- Hide apps — right-click to hide apps you don't want cluttering the list
- Scroll wheel on menu bar icon to adjust system volume
- Launch at Login via right-click context menu
How It Works
TurnThatDown uses Apple's CATapDescription API (macOS 14.2+) to create process-specific audio taps. Each tapped app's audio is routed through an aggregate device where an IOBlock callback applies volume scaling, balance panning, and biquad EQ filters before sending it to the output device.
The EQ uses transposed direct form II biquad filters — low and high shelf bands at the extremes, peaking bands in the middle, with a wide Q of 0.5 so each band has a dramatic, musical effect.
The Debugging Story
The hardest part wasn't building the app — it was getting audio data to flow at all. On macOS 26, Apple silently requires NSAudioCaptureUsageDescription in your Info.plist for process taps to deliver non-zero audio buffers. Without it, everything looks correct: the tap creates, the aggregate device has streams, the IOBlock fires, buffer sizes are right. But every sample is zero. No error, no warning.
The breakthrough came from cloning FineTune (another open-source volume control app), building it on the same machine, and confirming it worked. That proved the API wasn't broken. Claude Code then diffed every file between the two projects and found the single missing Info.plist key.
How Claude Built It
The entire app was built with Claude Code from the terminal. No Xcode UI — just xcodebuild, codesign, and open. Claude wrote the Swift files, managed the Xcode project.pbxproj manually (including adding new source files to all four required sections), handled code signing with a stable identity to preserve TCC permission grants across rebuilds, and iterated on bugs by reading system logs.
Some of the trickier problems Claude solved autonomously:
- Detecting that the aggregate device outputs interleaved stereo (one buffer, samples as L,R,L,R) rather than separate mono buffers, and rewriting the balance/EQ code accordingly
- Switching from Carbon
RegisterEventHotKeytoCGEvent.tapCreatefor global hotkeys, after discovering that Carbon hotkeys don't fire for LSUIElement menu bar apps - Diagnosing that soft clipping was flattening EQ boosts by clipping every sample above 1.0 when EQ was enabled, making the EQ "just make it louder" instead of changing frequency balance
Source & Download
Full project on GitHub: chomey/turnthatdown. MIT licensed.
Download the latest release: TurnThatDown.dmg