Skip to content

flight-william/Halo

 
 

Repository files navigation

Halo app icon

Halo

Volume control for macOS Multi-Output Devices.
F11 / F12 keys, scroll-wheel, and a custom HUD — works when macOS's native volume refuses to.


What this is

macOS deliberately disables the keyboard volume keys and the menu-bar slider when a Multi-Output Device is selected as system output. If you drive two Apple Studio Displays, monitors + headphones, or any aggregate output, you've hit the grey-slider problem.

Halo is a menu-bar app that fixes this. It intercepts F11 / F12 / mute and writes volume to each sub-device of the aggregate directly, so your speakers change together.

This is a fork of rlxone/MultiSoundChanger by Dmitry Medyuho (Apache 2.0), modernised for macOS Sequoia / macOS 15+ and with additional quality-of-life features. The original project did the hard part — figuring out the CoreAudio incantations for writing to aggregate sub-devices. Without it, Halo wouldn't exist.

Features on top of upstream

  • Custom volume HUD that replaces Apple's broken private OSDManager (no chiclets bar on macOS Sequoia+).
  • 32 finer volume steps (~3% each) instead of the OS default 16.
  • Scroll-wheel on the menu-bar icon to adjust volume without reaching for keys.
  • One-click "Create Halo Speakers" — auto-builds a Multi-Output aggregate from connected Apple Studio Displays, skipping Audio MIDI Setup.
  • Volume persistence — each sub-device's level is saved to UserDefaults on change and restored at launch, avoiding the cold-boot "slammed to 100%" surprise.
  • Launch at Login toggle via SMAppService.
  • Universal binary — native on Apple Silicon and Intel.
  • Stable self-signed code-signing identity so macOS's TCC keeps Accessibility grants across rebuilds during development.
  • Modern macOS compat fixes — storyboard module resolution after PRODUCT_NAME rename, aggregate-device drift handling, bundled OSD.framework binary replaced with the current SDK stub so arm64 linking works.

Halo vs native macOS

Native macOS Halo
Volume keys on Multi-Output Device
Scroll-wheel volume on menu bar
Custom volume HUD (macOS 15+) ❌ broken
Auto-create aggregate for Studio Displays
Volume persistence across reboots ⚠️ unreliable
Launch at Login
Free
Signed by Apple ❌ self-signed (see Limitations)

Screenshot

Halo menu-bar dropdown on macOS showing Volume slider, Output Device list with Halo Speakers selected and both Studio Display XDR Speakers listed, and action items including Create Halo Speakers, Launch at Login, Sound Preferences and Audio Devices

The Halo menu: output-device picker with the one-click Create Halo Speakers aggregate, Launch at Login toggle, and shortcuts to Sound Preferences and Audio Devices.

Halo's custom volume HUD shown on a macOS desktop — a dark rounded panel with a speaker icon and progress bar

The custom HUD that fires on F11/F12 or scroll-wheel. Replaces Apple's private OSDManager, which no longer renders reliably on macOS Sequoia.

Install

Requires macOS 13 (Ventura) or later.

Option 1 — Build from source

git clone https://github.com/flight-william/MultiSoundChanger.git -b rebrand/halo
cd MultiSoundChanger
pod install                          # CocoaPods is required
./scripts/setup-codesign-cert.sh     # one-time: creates a self-signed cert
./scripts/build-and-install.sh       # build Release, sign, copy to /Applications

On first launch, grant Accessibility permission when prompted (Privacy & Security → Accessibility).

Option 2 — Use a pre-built binary

No public release binary yet. Build from source, or ask the author.

Set up a Multi-Output Device

If you don't already have one in Audio MIDI Setup, you have two paths:

  • Apple Studio Displays (two or more) — click Halo's menu-bar icon → Create Halo Speakers. One click.
  • Any other combination — open Audio MIDI Setup, +Create Multi-Output Device, tick the devices you want, right-click → Use This Device for Sound Output. Halo will pick it up.

Usage

  • Click Halo's menu icon, pick your Multi-Output Device from the list.
  • Press F11 / F12 to adjust volume, F10 to mute.
  • Or scroll on your trackpad while hovering near Halo's icon.
  • Optional: toggle Launch at Login in the menu.

Limitations

This fork is a personal project. Please read before using:

  • Not signed by Apple — Halo is signed with a self-signed certificate, not an Apple Developer ID. Gatekeeper will warn on first launch. If you build from source yourself, you control the signing identity; if you trust a pre-built binary, you're trusting whoever built it.
  • Not notarized — Apple's malware-scan warrant isn't applied, because that requires a paid Developer Program membership.
  • Uses Apple's private OSD.framework for the bridging header. Private APIs can change between macOS versions; a rebuild against the new SDK usually fixes breaks, but no guarantees.
  • "Create Halo Speakers" only auto-matches Apple Studio Displays by device name. Other combinations require manual aggregate creation in Audio MIDI Setup (Halo still controls volume on them fine).
  • Hobby scale — single maintainer, no auto-update, no bug tracker, no guarantee of future macOS compatibility.

If you need a supported commercial alternative, SoundSource by Rogue Amoeba is signed, notarized, and supported.

Credits

  • rlxone/MultiSoundChanger by Dmitry Medyuho — Apache License 2.0. The upstream project, still the canonical implementation.
  • MediaKeyTap by Nicholas Hurden — MIT. Used for global media-key interception.

License

Apache License 2.0 (inherited from upstream MultiSoundChanger). See LICENCE.

Original copyright © 2017 Dmitry Medyuho. Fork modifications © 2026 flight-william.

About

Volume control for macOS Multi-Output Devices. F11/F12, scroll-wheel, custom HUD. Fork of rlxone/MultiSoundChanger.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Swift 88.1%
  • Shell 6.7%
  • Objective-C 4.5%
  • Ruby 0.7%