SonosController
native macOS Sonos controller for Apple Silicon
Install / Use
/learn @scottwaters/SonosControllerREADME
SonosController
A native macOS controller for Sonos speakers, built entirely in Swift and SwiftUI for Apple Silicon.

Why This Exists
Sonos shipped a macOS desktop controller for years, but it was an Intel-only (x86_64) binary that relied on Apple's Rosetta 2 translation layer. Apple is discontinuing Rosetta, which means the official Sonos desktop app will stop working on modern Macs — and Sonos appears to have no plans to release a native replacement.
This project was built from scratch by a Sonos fan from the beginning who wanted to keep controlling their speakers from their Mac. I usually use the phone app but I sit in front of my workstation most days and use the desktop app many times during those days for my office speakers. I also added a few tweaks/features that always bugged me or I thought were missing (but I added settings options to revert to original behaviour if you have problems :) ).
It is not affiliated with, endorsed by, or derived from Sonos, Inc. in any way. No proprietary Sonos code, assets, or intellectual property were used. The app communicates with Sonos speakers using the same open UPnP/SOAP protocols that any device on your local network can see and use (the same the other fan built implementations also use).
Development
Built interactively with Claude Code and tested against a live Sonos system with 16 speakers. v2 was a few more hours of refinement — fixing rough edges and adding network and usability features based on daily use.
Testing has been done with a large local music library and a limited set of streaming services (Apple Music, Spotify, TuneIn, Calm Radio). Your experience may vary depending on which services you use — if something doesn't work as expected, please open an issue.
What's New in v2
- 13 languages — full localization in English, German, French, Dutch, Spanish, Italian, Swedish, Norwegian, Danish, Japanese, Portuguese, Polish, and Chinese (Simplified)
- Dark mode — System, Light, or Dark theme selection
- Appearance customization — accent color picker, zone icon colors for playing/inactive states
- Playback transition feedback — clicking a favorite shows cached artwork and station/track name immediately with a loading spinner until the speaker confirms playback. No more wondering if you clicked.
- Persistent artwork caching — album art for favorites is remembered across app restarts. No more blank thumbnails every time you relaunch.
- Service identification — favorites show colored source badges (Apple Music, Spotify, TuneIn, Calm Radio, etc.) with a filterable service bar
- Copy track info — clipboard output with labelled Source/Artist/Album/Track lines in the active language
- Album art context menu — right-click to refresh from iTunes or clear cached art
- Streaming service error handling — clear error messages when playback fails (e.g. "Spotify may require sign-in")
- Dynamic album art discovery — multi-strategy art resolution for library items: embedded art, folder images, iTunes Search API, container browsing
- UPnP event subscriptions (GENA) — real-time push notifications from speakers replace polling as the default, with automatic subscription renewal and polling fallback
- Many bug fixes and performance improvements — faster browse loading, reduced unnecessary network requests, smoother UI transitions, fixed edge cases with grouped speaker volume, and general stability improvements throughout
Features
Playback Control
- Play, pause, stop, skip forward/back
- Seek within tracks
- Shuffle and repeat (off / all / one)
- Keyboard shortcut: spacebar for play/pause
- Optimistic UI — controls respond instantly with a grace period system that prevents polling from reverting your action while the speaker processes it
- Playback transition feedback — when starting a new stream, cached artwork and track info display immediately with a loading spinner until the speaker confirms playback
Now Playing
- Album art display with two-tier disk and memory caching
- Album art fallback: embedded file art → folder art → iTunes Search API → generic placeholder
- Right-click album art to refresh from iTunes or clear
- Copy track info to clipboard — source, artist, album, track on separate labelled lines (localized)
- Track title, artist, album — clears when nothing is playing
- Radio station name displayed above current track info for streaming sources
- TV and Line-In source detection with room name display
- Streaming service identification (shows "Playing from Apple Music" etc.)
- Draggable seek slider with smooth interpolation (no 2-second jumps)
- Freeze period after play/seek prevents slider bounce while speaker buffers
- Live indicator for streaming content without fixed duration
Volume
- Single speaker — direct volume slider and mute
- Grouped speakers — master slider adjusts all speakers proportionally, preserving relative balance. Master mute controls all speakers.
- Individual per-speaker volume sliders and mute buttons below the master
- Animated slider transitions when volumes change
- Delayed spinner indicators — only appear if a volume change takes more than 300ms
- Bass, treble, and loudness controls (EQ panel per speaker)
- Mute/Unmute all speakers globally (toolbar menu)
Speaker Management
- Automatic SSDP discovery of all Sonos speakers on your network
- Zone grouping — add or remove speakers from groups with optimistic UI
- Group All / Ungroup All buttons for quick whole-house control
- Speakers already in another group are labelled in the group editor
- Coordinator speaker always listed first, others alphabetically
- Bonded speakers (soundbar + sub + surrounds) shown as a single room
- Invisible/satellite speakers filtered from the UI
- Custom sidebar with configurable zone icon colors (playing/inactive)
- Sound wave indicators show which rooms are currently playing
- Accent-colored selection highlight in the room list
Browse & Library
- Sonos Favorites — play any saved favorite including radio stations, Spotify playlists, Apple Music content
- Service identification — each favorite shows a colored badge identifying its source (Apple Music, Spotify, TuneIn, Calm Radio, Music Library, etc.)
- Service filter — filter favorites and playlists by source service (All / Apple Music / Radio / Spotify / etc.)
- Music Library — browse your local network music shares (NAS/server) by folder, all the way down to individual tracks
- Dynamic album art — library folders load art from embedded files, folder images, or iTunes Search API
- Artists, Albums, Genres, Composers, Tracks — full indexed library browsing with drill-down navigation
- Sonos Playlists and imported playlists
- Search across artists, albums, and tracks
- All browse sections dynamically discovered from your Sonos system (nothing hardcoded)
- Play now, play next, or add to queue from any browse result via right-click context menu
- Home and back navigation buttons in the browse header
- Pagination for large libraries (tested with 45,000+ tracks, 6,500+ albums)
Queue
- View the current play queue with album art
- Tap to jump to any track
- Remove individual tracks or clear the entire queue
- Drag to reorder
Alarms
- View all configured Sonos alarms
- Enable/disable individual alarms
- Delete alarms
Sleep Timer
- Set from preset durations (15m, 30m, 45m, 1h, 2h)
- View remaining time
- Cancel active timer
Caching & Performance
- Quick Start mode — caches your speaker layout and browse menu locally. On subsequent launches, the UI appears instantly from cache while speakers are verified in the background. If anything changed, the UI updates automatically. Stale data is detected gracefully with user-visible notifications.
- Classic mode — waits for live network discovery before showing speakers (always current, slightly slower startup).
- Album art cache — two-tier caching (memory + disk) for album artwork. Images load instantly on repeat views. JPEG compressed with configurable max size (100 MB–5 GB) and max age (7 days–never). LRU eviction.
- Art URL persistence — art URLs discovered during playback are persisted to disk and restored on restart, so favorites show artwork immediately without re-discovering from the speaker.
- Grace period system — after pressing play/pause or changing volume, the UI holds your intended state for 10 seconds so polling doesn't snap it back while the speaker processes the command.
- Smooth progress interpolation — the seek bar advances locally every 0.5s between 2-second server polls, with drift correction. Never jumps backward on small drift.
- Configurable via Settings (gear icon in toolbar).
Communications
- Event-Driven mode (default) — UPnP event subscriptions for real-time state updates with automatic subscription renewal. Falls back to reconciliation polling every 10 seconds as a safety net. Position polled every 2 seconds for smooth progress bar.
- Legacy Polling mode — original 2-second polling for all state. More predictable on networks where event callbacks are unreliable.
- Switchable in Settings without restart.
Music Services
- Streaming services (Spotify, Apple Music, TuneIn, Calm Radio, etc.) identified by colored badges in the browse list
- Content from these services is playable through Sonos Favorites — add favorites via the Sonos mobile app, then play them from the Favorites section in Browse
- Streaming service albums/playlists (x-rincon-cpcontainer URIs) are handled automatically via queue
- Service-specific error messages when playback fails (e.g. "Spotify may require sign-in or an active subscription")
Appearance & Localization
- Dark mode — System / Light / Dark theme selection
- Accent color — customizable tint for sliders, selections, toggles. Preset colors + custom color pic
