A minimal, fast Sonos controller for macOS — lives in the menu bar, opens instantly, plays/pauses your zone in a single click.
Built to replace the official Sonos desktop app for the 99% case (play, pause, volume, pick a station) without the slow startup or requiring Rosetta.
There are many Sonos apps out there. This is mine.
Download the latest release from
GitHub Releases,
unzip, and drag Sonos Control.app to /Applications. macOS will prompt for
Local Network access the first time you launch — grant it so the app can
discover your Sonos speakers.
Auto-updates are handled via Sparkle.
- Menu bar app, no dock icon. Opens in ~50ms, gets out of your way.
- Play/pause, transport, volume. Single tap. Volume slider is live as you drag.
- Zone control. Pick a primary zone; toggle any other zones to join or leave its group with a switch.
- Now playing. Song / artist / album-or-station. Click the album art for full-resolution view + "Open in Apple Music."
- Recently played. Last 10 songs the system played, even when the menu was closed. Click any to find it in Apple Music.
- Favorites. Pick from your Sonos favorites (radio stations, playlists, albums).
- Global hotkey. Default
F8for play/pause from anywhere. Fully customizable. - In-menu shortcuts.
⌘Pplay/pause,⌘=/⌘−volume. All customizable. - Offline-aware. Icon greys out when off the home network.
- Auto-updates via Sparkle.
Talks directly to your Sonos players over the local LAN using their built-in UPnP/SOAP API on port 1400. No Sonos account login required, no cloud round-trip — every command is a single HTTP request to the speaker, typically 20–50ms.
Players are discovered via SSDP (M-SEARCH to 239.255.255.250:1900) on
launch. After discovery the app caches IPs and polls now-playing every 10s in
the background, 3s while the menu is open.
SSDP multicast requires unsandboxed networking, so ENABLE_APP_SANDBOX = NO.
The Sparkle framework is signed with hardened runtime. The app has no
filesystem access beyond ~/Library/Application Support/SonosControl/ (logs).
- No multi-room source switching (each group plays one source — the primary).
- No queue management UI (favorites/streams replace the queue when picked).
- No search.
- No iOS/iPad version.
By design — this is a 99%-case controller, not a full Sonos app.
Requirements: Xcode 16.2+ (macOS 14+).
Open SonosControl.xcodeproj in Xcode and ⌘R to run a Debug build, or:
# Build in Release, sign with your Developer ID, install to /Applications.
./Scripts/local-install-app.shRequires a Developer ID Application certificate in your login keychain.
If you want to publish your own builds (with your own update feed), replace these before building:
| File | Setting | What to change |
|---|---|---|
SonosControl.xcodeproj/project.pbxproj |
PRODUCT_BUNDLE_IDENTIFIER |
com.yourname.SonosControl |
SonosControl.xcodeproj/project.pbxproj |
DEVELOPMENT_TEAM |
your Apple Developer team ID |
SonosControl/Info.plist |
SUFeedURL |
URL of your appcast.xml |
SonosControl/Info.plist |
SUPublicEDKey |
public key from generate_keys (Sparkle) |
Scripts/sparkle-config.sh |
various | your GitHub repo & Pages URLs |
If you don't plan to publish updates, blank out SUPublicEDKey and Sparkle
will just sit quietly.
# Build, sign, notarize, staple → dist/SonosControl-<version>-macos.zip
./Scripts/local-release-build.sh 1.0.1
# Or do the whole release flow: build → GH release → appcast → push
./Scripts/publish-release.sh 1.0.1Requires:
- Developer ID Application certificate
xcrun notarytool store-credentials sonoscontrol-notary(one-time setup)ghCLI authenticated- Sparkle key pair generated via
generate_keysand stored in your keychain under theSPARKLE_KEY_ACCOUNTfromsparkle-config.sh - GitHub Pages enabled on your fork, serving from
main/docs
MIT. See LICENSE.