A small native macOS menu-bar app for controlling Sony headphones and earbuds (WH-1000XM4, XM5, XM6, WF-1000XM4/XM5, LinkBuds S and more): switch between Noise Cancelling, Ambient Sound and Off, adjust the ambient level, toggle Focus on Voice and Speak-to-Chat, and check the battery. You no longer need to reach for your phone.
Sony doesn't publish a Mac version of its Sound Connect / Headphones Connect app. sbtfix talks to the headphones directly over Bluetooth using the same protocol the phone app uses.

- One click to switch between Noise Cancelling, Ambient Sound and Off, plus Wind Noise Reduction on models that have it
- Ambient level slider (1–20) and Focus on Voice
- Speak-to-Chat on/off
- Battery level with a charging indicator; left, right and case for earbuds
- Detects the model and protocol generation automatically, and only shows what your model supports
- The menu-bar icon shows the current mode
- Stays in sync when you use the buttons on the headphones
- Reconnects automatically when the headphones connect
- No Dock icon, no background daemons, no network access, no dependencies
![]() Noise Cancelling |
![]() Ambient Sound: level slider and Focus on Voice |
![]() Off |
![]() Wind Reduction: added on models that support it (here a WH-1000XM4) |
![]() Earbuds: left, right and case battery (WF-1000XM5) |
![]() Waiting: headphones not connected to the Mac yet |
![]() Connecting |
![]() Bluetooth off: reconnects by itself when it's back on |
Sony uses two protocol generations. sbtfix detects which one your device uses when it connects.
| Model | Protocol | Modes | Status |
|---|---|---|---|
| WH-1000XM5 | v2 | NC · Ambient · Off | ✅ Tested (fw 2.4.1) |
| WH-1000XM6 | v2 | NC · Ambient · Off | 🟡 Expected to work |
| WH-1000XM4 | v1 | NC · Wind · Ambient · Off | 🟡 Expected to work |
| WH-1000XM3, WH-1000XM2 | v1 | NC · Wind · Ambient · Off | 🟡 Expected to work |
| WF-1000XM5, WF-1000XM4 | v2 | NC (· Wind on XM4) · Ambient · Off | 🟡 Expected to work |
| WF-1000XM3 | v1 | NC · Wind · Ambient · Off | 🟡 Expected to work |
| WF-SP800N | v1 | NC · Ambient · Off | 🟡 Expected to work |
| LinkBuds S, WF-C700N, WF-C710N, WH-CH720N, ULT WEAR | v2 | NC · Ambient · Off | 🟡 Expected to work |
| WF-C510 | v2 | Ambient · Off | 🟡 Expected to work |
| WI-SP600N | v1 | NC · Wind · Ambient · Off | 🟡 Expected to work |
| WF-C500, WI-C100, LinkBuds | auto | No ambient control; battery only | 🟡 Expected to work |
🟡 means the protocol support is built in, based on Gadgetbridge's research, but nobody has confirmed it on a Mac yet. If you own one of these, please send a device report, even if it just says "works". Other Sony models aren't listed but will probably partly work.
Requires macOS 14 Sonoma or later.
- Download
sbtfix.zipfrom the latest release and unzip it. - Move
sbtfix.appto/Applications. - The app isn't notarized, so macOS will block it the first time. Right-click the app, choose
Open, then click Open again. Or run:
xattr -dr com.apple.quarantine /Applications/sbtfix.app
- Click Allow when macOS asks for Bluetooth access.
You need Xcode 15 or later, or the Swift 5.9+ command-line tools.
git clone https://github.com/htsecurity/sbtfix.git
cd sbtfix
./build.sh # builds build/sbtfix.app
./build.sh --install # also copies it to /ApplicationsTo start sbtfix at login, add it under System Settings → General → Login Items.
- Pair and connect your headphones in macOS Bluetooth settings as usual.
- Click the headphones icon in the menu bar.
If the app says Waiting for headphones to connect…, check that the headphones are connected in macOS, not just paired. It connects on its own when they appear.
- "No paired Sony headphones found": the app finds devices by name (
WH-…,WF-…,WI-…,LinkBuds…,ULT WEAR). If you renamed your headphones, rename them back. - A mode or feature you expect is missing: the app shows only what your model supports, and hides Speak-to-Chat if the device doesn't respond to it. If that's wrong for your model, please open a device report with a debug log.
- Stuck on "Connecting…": turn the headphones off and on, or click Retry. If the Sony phone app is connected at the same moment, it can hold the control channel.
- Nothing happens after granting Bluetooth permission: quit and relaunch the app once.
- Changing Speak-to-Chat from the app doesn't play a voice prompt. That's normal. The headphones only announce it when you use the two-finger gesture on the earcup.
- Debug logs: the app logs all Bluetooth traffic at debug level:
Including this output makes bug reports much easier to act on.
/usr/bin/log stream --level debug --predicate 'subsystem == "io.github.htsecurity.sbtfix"'
The headphones expose a Bluetooth RFCOMM (serial) service. Over it, they speak a simple framed
binary protocol. sbtfix opens that channel with IOBluetooth, sends small commands, and
listens for notifications. docs/PROTOCOL.md documents the framing and every
command the app uses.
Sources/
SonyProtocol/ Pure Swift: framing, escaping, command builders, event parser (unit-tested)
DeviceProfile.swift Per-model features (wind reduction, earbuds, …)
sbtfix/
HeadphoneController.swift IOBluetooth RFCOMM connection, command queue, state
SbtfixApp.swift SwiftUI MenuBarExtra UI
Tests/SonyProtocolTests/ Protocol tests (swift test)
Contributions are welcome, especially reports from other Sony models and support for more features (EQ, DSEE, multipoint, and so on). See CONTRIBUTING.md.
The protocol knowledge comes from the reverse-engineering work in Gadgetbridge and SonyHeadphonesClient. Thank you to everyone who worked on them.
This is an unofficial project. It is not affiliated with, endorsed by, or sponsored by Sony Group Corporation. "Sony", "WH-1000XM5" and related names are trademarks of their respective owners and are used here only to describe compatibility. The software is provided as-is, with no warranty. See LICENSE.






