Sonora

Swipe your headset to jump between every browser tab that's playing. No keyboard, no hunting for the tab.

Installation help Source on GitHub

Free and open source · a 500 KB app · macOS 13 or newer, Apple silicon

Swipe to the next thing that's playing

Three tabs are making noise: a video, a podcast you paused, a radio stream from Tuesday. Swipe forward on the earcup and you are on the next one — it starts, the one you left pauses. No alt-tab, no hunting for the little speaker icon, no keyboard at all. Nothing else does this: media keys reach one app, and a "next track" inside a tab just plays that site's next video.

⏭️

Swipe — the next tab that's playing

Forward and back step through every audible tab in order, starting the next and pausing the one you left. Your open tabs become a queue you move through from your ear.

Swipe and hold — jump 10s

Ad break, waffle, a bit you want again: hold forward to skip ahead, hold back to go back, ten seconds a go — on the tab you're actually hearing.

⏯️

Tap — and it lands on the right one

Every headset can pause something. This one pauses what you're listening to, instead of whichever app macOS last called "now playing".

And when you do want the screen, the popup is there: every audible tab in one list, transport and volume for each, your headset's battery on the same card.

The gestures need the Mac app — it's what takes the media keys from whatever grabbed them. The extension's tab controls work on their own. It isn't on the Chrome Web Store yet: download the zip from the latest release and load it unpacked — three steps, on GitHub, no toolchain needed.

The other half: the number macOS keeps to itself

Your Mac knows how much charge is left in your headset. To see it you open the Bluetooth menu, hover the device, and read a submenu — and the figure waiting there is often hours old. HeadsetCompanion puts a fresh one where you're already looking.

🔋

Five dots, or a number

The battery sits under a headphones glyph in one menu-bar slot, narrower than the clock. Five green dots by default, or a small percentage if you'd rather have the digits.

🎧

Any headset, no model list

Sony, Bose, AirPods, Jabra, Anker, the cheap pair from the airport. Nothing in the app names a device: it reads what the system Bluetooth stack reports, and falls back to the standard BLE battery service.

🔊

It replaces the Sound menu

One click gives you the volume slider and every output device, each headset carrying its own battery on its row. No more Control Centre, then Sound, then hover.

🖥️

The right glyph for the right output

A Mac for the built-in speakers, the AirPods shape for AirPods, headphones for everything else over Bluetooth. Switch output and the menu bar follows within the same second.

⬆️

It updates itself

A once-a-day look at this repository's Releases page, then a new version installed in place. No prompts, no installer, no admin password — and an off switch in Settings if you'd rather do it yourself.

A look at it

One item in the menu bar, one menu under it, and a Settings panel you'll open once.

Two styles for the same slot: five dots, or the percentage.
Volume and every output device, batteries included.
The Settings panel: menu bar battery style, start at login, daily update check, media-key routing, and the version number
Settings: the style, the update check, the media keys.

Installing it

A minute, and one warning from macOS that you get past with a right-click.

  1. Download the app

    The Download for Mac button gives you a file ending in .dmg, in your Downloads folder.

  2. Drag it into Applications

    Double-click the downloaded file. A window opens with the HeadsetCompanion icon and an Applications folder. Drag one onto the other, then close the window.

  3. Open it with a right-click, once

    In your Applications folder, right-click HeadsetCompanion and choose Open, then Open again in the dialog that appears. Double-clicking it the normal way will only be refused. After this first time, it opens like anything else.

  4. Pick your headset's sound

    Click the new menu-bar icon: volume, your output devices, and the battery for whichever headset is connected. If the number looks wrong for a second, give it ten — that's one poll.

  5. Optional — start it at login

    In Settings…, turn on Start at login. macOS may ask you to approve the item once under System Settings → General → Login Items.

Why the right-click? The app is not signed or notarised — an Apple Developer ID costs $99 a year and this is free — so Gatekeeper treats it as unknown rather than unsafe, and asks once. Every line of it is public in the repository if you or someone you trust would like to read it first.
Removing it

Turn Start at login off in Settings, then drag the app to the Trash. Its preferences go with these two lines:

rm -rf /Applications/HeadsetCompanion.app
defaults delete io.sonora.headsetcompanion
Building it yourself

Xcode 15 or newer, Swift 5.10, macOS 13+. The test suite runs offline.

git clone https://github.com/YamineRL/sonora.git
cd sonora
swift test
./build-app.sh

What it does with your data

Short version: nothing. There is nowhere for it to send anything.

No account, no telemetry

Nothing to sign up for, no analytics, no crash reporting, no identifiers. Nothing about your devices, your listening or your Mac leaves the machine.

One network call, and it's optional

The only request the app can make is an unauthenticated read of this repository's public releases page, once a day, to see whether a newer version exists. Untick Check for updates daily and even that stops.

The battery server is local only

The little HTTP server the extension reads from binds to 127.0.0.1. Nothing outside your Mac can reach it — not another machine on your network, not a website.

Small enough to read

About 3,000 lines of Swift, all of it in the open. If you'd rather not trust a stranger's binary, build the app from source and run that instead.

At a glance

The details people usually ask for before downloading anything.

DetailAnswer
PriceFree, both halves, with the source in the open
RequiresmacOS 13 or newer, Apple silicon
SizeAbout 500 KB, delivered as a .dmg
SignedNo — first launch needs right-click → Open
HeadsetsAny that reports a level to macOS, plus BLE battery service
RefreshEvery 10 seconds, from a fresh read
UpdatesDaily check, installed in place; switchable off
NetworkThat update check only; battery server on 127.0.0.1