Native macOS companion app for Motorola Moto Buds (XT2443-1 "guitar" and related models). Switches ANC modes, reads battery, monitors in-ear / in-case state, and runs find-buds — all the things the official Android app does, on your Mac.
Built because Motorola never shipped an iOS or macOS app. If you went from Android to iPhone and your buds feel half-functional, this is for you.
- ANC modes — Off, Transparency, ANC (high), Adaptive (light ANC). Sent via the same wire format as the bud's own touch button.
- Battery — left, right, case, all live with notifications.
- In-ear / in-case detection — visible in the UI in real time.
- Find buds — chime left or right.
- Dual connection toggle — let the buds keep two hosts at once.
- Hi-res mode, Game mode, Volume Boost toggles — all reading and writing.
- Menu-bar quick controls — battery + ANC selector without opening the window.
brew tap juanipis/tap
brew install --cask motobudsDownload the latest MotoBuds-x.y.z.zip from the
Releases page, unzip, drag
MotoBuds.app into /Applications. First launch will ask for Bluetooth
permission — accept and you're done.
- macOS 14+ (Sonoma).
- Apple Silicon or Intel.
- A pair of Moto Buds already paired to your Mac via the standard Bluetooth pairing flow (Settings → Bluetooth → Pair).
The buds expose three transports over their moto buds Bluetooth Classic
connection:
- Audio (A2DP / HFP) — handled by macOS itself.
- RFCOMM SPP
fc9d9fe0-…channel 16 — the same vendor SPP path the official Moto Buds Android app uses. MotoBuds opens this channel and speaks the BES (Bestechnic) toggle-config protocol over it. - OTA channels (
BESOTA,TOTA) — left strictly alone.
Wire format and full opcode table are in
docs/protocol.md. Reverse-engineered from the
official APK; cross-references are in Tools/DiscoverBuds.
git clone https://github.com/Juanipis/motobuds.git
cd motobuds
swift test # unit tests
bash Bundle/build-app.sh debug # assemble MotoBuds.app
bash Bundle/install.sh debug # copy to /Applications + launch
# Watch the live log
tail -f ~/Library/Logs/MotoBudsMac.logRun with the real RFCOMM transport:
MOTOBUDS_REAL=1 open -a /Applications/MotoBuds.appWithout MOTOBUDS_REAL the app runs against a mock transport with
simulated state — useful for UI work without hardware.
.
├── Sources/MotoBudsApp/ # the SwiftUI app
│ ├── App/ # @main + ContentView
│ ├── BudsCore/ # transport, protocol, manager
│ ├── Features/ # ANC, battery, find buds, … views
│ └── UI/ # design system, menubar, hero
├── Tools/DiscoverBuds/ # SPM CLI for SDP/GATT discovery + SPP probe
├── Tests/MotoBudsAppTests/ # wire-format unit tests
├── Bundle/ # AppInfo.plist, build/package/install scripts, icon
├── scripts/ # bump-cask, update-appcast (release-time)
├── .github/workflows/ # CI + semantic-release
└── docs/protocol.md # reverse-engineered wire spec
Releases are driven by semantic-release:
- Push to
mainwith a conventional commit message (feat:,fix:, …). - CI builds the
.app, zips it, computes a SHA-256, attaches both to a GitHub release, updatesCHANGELOG.md, bumps the Homebrew cask, and appends a Sparkle appcast entry so installed apps auto-update.
See CONTRIBUTING.md for the full commit-message
convention.
| Feature | Status |
|---|---|
| ANC modes (off/transparency/ANC/adaptive) | ✅ verified audibly |
| Battery (L/R/case) live | ✅ |
| In-ear and in-case detection | ✅ |
| Find buds | ✅ |
| Dual connection toggle | ✅ |
| Hi-res, game mode, volume boost | ✅ |
| Bass enhancement | |
| Custom EQ | ❌ not supported by the guitar firmware |
| OTA firmware updates | ❌ won't ship — risky without docs |
Inspired by the Android Moto Buds app v01.0.129.12 — wire format extracted from its decompilation. Not affiliated with Motorola Mobility LLC. "Moto Buds" and "Motorola" are trademarks of their respective owners.
MIT © 2026 Juan Pablo Díaz Correa.
