Releases: hammad-iftikhar/budsctl
Release list
v2.0
v2.0 — 2026-09-08
Added
- Samsung Galaxy Buds support (fixes #2). Buds FE, Buds Pro, Buds2 / 2 Pro,
Buds3 / 3 Pro / 3 FE, Buds Core, Buds4 / 4 Pro speak Samsung's SPP protocol over
Bluetooth Classic RFCOMM, so BudsCtl now runs a second backend through
IOBluetooth alongside the existing Qualcomm GAIA one over BLE. - Galaxy Buds report their state the moment the link opens and announce every mode
change — including ones you make by touch or from your phone — so there's no
"Reading mode…" wait on that side, and the menu bar follows changes you didn't
make in the app. budsctl-cli samsung <mac>verifies the SPP protocol against real hardware.
Changed
- Settings lists every earbud in one list instead of separate per-vendor sections;
a saved device now remembers which backend it belongs to, so switching between a
SoundPEATS and a Galaxy Buds device just works. - Discovery runs both backends at once and merges the results.
- A dead RFCOMM link is reported instead of silently sitting there.
v1.2
v1.2 — 2026-09-02
Fixed
- The Control Center button never appeared. v1.0 and v1.1 both claimed to
have it and it was never there to add. It works now — Control Center → Edit
Controls → "Earbuds Noise Mode". - Shortcuts actions did nothing. Searching Spotlight for "Cycle Noise Mode"
found the action, and running it had no effect at all. - "Cycle Noise Mode" showed an "Unsupported" error. The mode changed, then a
panel appeared saying it had failed. - Tapping the Control Center button looked like it did nothing for about a
second and a half before the button caught up. - "Earbuds not connected" stayed on screen after they reconnected, sitting
next to a green Connected dot until you changed the mode yourself.
Changed
- The Control Center button is greyed out when the earbuds aren't connected.
- Shortcuts actions no longer try to launch BudsCtl. If it isn't running they
tell you so, and your change is applied as soon as you open it. - "Cycle Noise Mode" answers straight away instead of pausing first.
Other
- BudsCtl is now MIT licensed.
v1.1
v1.1 — 2026-09-01
Fixed
The mode shown after connecting could be wrong, and stayed wrong.
If your earbuds connected while BudsCtl was already running — the usual case,
taking them out of the case with the app in your menu bar — the panel could show
Off while the buds were actually in noise cancellation. It never corrected
itself. The only way out was to set a mode yourself, which made BudsCtl agree
with the buds again by changing them.
The cause turned out to be in the earbuds, not the app. They don't reliably
answer control reads in the first moments after the Bluetooth link comes up: a
read taken there either times out or answers "Off" regardless of the real
setting. Worse, when the buds later settle into their saved mode they say
nothing about it — measured at 33 seconds of complete silence after a
case-exit connect, while a read taken afterwards reported the correct mode.
BudsCtl read the mode exactly once, in precisely that window, and had nothing
that would ever ask again.
BudsCtl now re-reads the mode at 2, 5, 10, 20 and 45 seconds after connecting,
and stops the moment you set a mode yourself. It is still not polling: five
reads at most, once per connection.
This also explains why the battery percentages looked right while the mode did
not — those reads are issued a moment later, by which point the earbuds are
answering properly.
Changed
The panel now admits when it doesn't know the mode yet. For the first couple
of seconds after connecting, it shows a "Reading mode…" spinner, the menu bar
icon pulses, and the mode buttons are disabled — rather than presenting the
untrustworthy first reading as a confident selection.
The hotkey, Control Center and Shortcuts still work during that window. Using
any of them cancels the re-reads, so a mode you pick is never overwritten by a
stale reading arriving late.
v1.0
v1.0 — 2026-09-01
First release. A macOS menu bar agent that controls the three noise modes on
SoundPEATS Air4 Pro earbuds — Off, Noise Cancellation, Transparency — over
GAIA-over-BLE.
What it does
- Menu bar panel. A segmented Off / ANC / Transparency picker, per-bud
battery, and connection status. Click a mode and the picker moves
immediately rather than waiting on the device — the buds take about 1.4 s to
confirm, and a UI that waited would feel broken. - Follows the buds. Change mode by tapping a bud or from your phone and the
menu bar follows within about 2 s. Nothing polls; the device volunteers the
change and the app listens. - Control Center. One control, "Earbuds Noise Mode", which cycles through
the three modes and shows the current one as its label. - Shortcuts. Four actions: Set Noise Mode, Cycle Noise Mode, Get Noise
Mode, Get Earbud Battery. The getters read cached state and never touch the
radio. - Global hotkey. ⌥⌘N cycles the mode from anywhere, rebindable in the panel.
- Launch at login, via
SMAppService, with an in-panel toggle. - Auto-reconnect. Put the buds away and take them out; the connection
re-establishes itself. The app never scans after you first pick your device.