A comprehensive solution for controlling and preserving Bose SoundTouch devices, including a Go library, CLI tool, and a local service for cloud emulation.
Note: This is an independent project based on the official Bose SoundTouch Web API documentation. Not affiliated with or endorsed by Bose Corporation.
- ✅ Complete API Coverage: All available SoundTouch Web API endpoints implemented
- 🎵 Media Control: Play, pause, stop, volume, bass, balance, source selection
- 🔔 Smart Notifications: TTS messages, URL audio content, notification beeps (ST-10)
- 🏠 Multiroom Support: Create and manage zones across multiple speakers
- ⚡ Real-time Events: WebSocket connection for live device state monitoring
- 🔍 Device Discovery: Automatic discovery via UPnP/SSDP and mDNS
- 📻 Content Navigation: Browse and search TuneIn, Pandora, Spotify, local music
- 📻 RadioBrowser: Access thousands of internet radio stations via radio-browser.info
- 🎙️ Station Management: Add and play radio stations without presets
- 🖥️ CLI Tool: Comprehensive command-line interface
- 🌐 SoundTouch Service: Emulate Bose cloud services for offline device operation
- 🔧 Service Migration: Migrate devices to use local services instead of Bose cloud (XML, Hosts, or DNS redirection)
- 🔍 DNS Discovery & Interception: Dynamic DNS server for intercepting and logging Bose service queries (requires port 53)
- 📊 DNS Discovery Analysis: Track and deduplicate all device DNS queries to discover hidden hostnames
- 📊 Traffic Analysis: Proxy and log device communications
- 📝 HTTP Recording: Persist interactions as re-playable
.httpfiles - 🔄 Endpoint Mirroring: Asynchronously mirror local requests to Bose cloud for parity testing
- ⚖️ Parity Logging: Detect and record discrepancies between local and official Bose responses
- 🧹 Session Management: Manage and cleanup recorded interaction sessions
- 🔒 Production Ready: Extensive testing with real SoundTouch hardware
- 🌐 Cross-Platform: Windows, macOS, Linux support
go install github.com/gesellix/bose-soundtouch/cmd/soundtouch-cli@latest
go install github.com/gesellix/bose-soundtouch/cmd/soundtouch-service@latestgo get github.com/gesellix/bose-soundtouchFind SoundTouch devices on your network:
soundtouch-cli discover devicesControl a device (replace 192.168.1.100 with your speaker's IP):
# Basic information
soundtouch-cli --host 192.168.1.100 info
# Media controls
soundtouch-cli --host 192.168.1.100 play start
soundtouch-cli --host 192.168.1.100 volume set --level 50
# Preset management
soundtouch-cli --host 192.168.1.100 preset listFor full CLI documentation, see the CLI Reference.
The soundtouch-service is a local server that emulates Bose's cloud services. This is critical for keeping your speakers functional after the Bose Cloud Shutdown in May 2026.
- 🏠 Local Emulation: BMX and Marge service implementation
- 🔌 Easy Setup: Activate SSH via USB stick (
remote_servicesfile) - 🔧 Device Migration: Seamlessly transition devices to local control
- 🌐 Web Management UI: Easy browser-based setup and management
- 💾 Persistent Data: Store presets, recents, and sources locally
- 🔄 Endpoint Mirroring: Asynchronously mirror local requests to Bose cloud for parity testing
- ⚖️ Parity Logging: Detect and record discrepancies between local and official Bose responses
- 📝 HTTP Recording: Persist all interactions as re-playable
.httpfiles - 🧹 Session Management: Manage and cleanup recorded interaction sessions
# Start the service
soundtouch-serviceOpen http://localhost:8000 in your browser to manage your devices. Documentation is also available directly through the web interface.
For a comprehensive guide on transitioning your system, see the Bose Cloud Shutdown: Survival Guide.
Detailed service configuration and Docker instructions can be found in SoundTouch Service Guide.
For professional migration tips and safety measures, see the Migration & Safety Guide.
package main
import (
"fmt"
"log"
"github.com/gesellix/bose-soundtouch/pkg/client"
)
func main() {
// Connect to your SoundTouch device
c := client.NewClient(&client.Config{
Host: "192.168.1.100",
Port: 8090,
})
// Get device information
info, err := c.GetDeviceInfo()
if err != nil {
log.Fatal(err)
}
fmt.Printf("Device: %s\n", info.Name)
// Control playback
err = c.Play()
if err != nil {
log.Fatal(err)
}
// Set volume
err = c.SetVolume(50)
if err != nil {
log.Fatal(err)
}
}package main
import (
"context"
"fmt"
"log"
"time"
"github.com/gesellix/bose-soundtouch/pkg/discovery"
)
func main() {
// Discover SoundTouch devices
service := discovery.NewService(5 * time.Second)
devices, err := service.DiscoverDevices(context.Background())
if err != nil {
log.Fatal(err)
}
for _, device := range devices {
fmt.Printf("Found: %s at %s:%d\n",
device.Name, device.Host, device.Port)
}
}package main
import (
"context"
"fmt"
"log"
"github.com/gesellix/bose-soundtouch/pkg/client"
"github.com/gesellix/bose-soundtouch/pkg/models"
)
func main() {
c := client.NewClient(&client.Config{
Host: "192.168.1.100",
Port: 8090,
})
// Subscribe to device events
events, err := c.SubscribeToEvents(context.Background())
if err != nil {
log.Fatal(err)
}
for event := range events {
switch e := event.(type) {
case *models.NowPlayingUpdated:
fmt.Printf("Now playing: %s by %s\n", e.Track, e.Artist)
case *models.VolumeUpdated:
fmt.Printf("Volume changed to: %d\n", e.ActualVolume)
case *models.ConnectionStateUpdated:
fmt.Printf("Connection state: %s\n", e.State)
}
}
}package main
import (
"fmt"
"log"
"github.com/gesellix/bose-soundtouch/pkg/client"
"github.com/gesellix/bose-soundtouch/pkg/models"
)
func main() {
c := client.NewClient(&client.Config{
Host: "192.168.1.100",
Port: 8090,
})
// Get current presets
presets, err := c.GetPresets()
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found %d presets\n", len(presets.Preset))
// Store currently playing content as preset 1
err = c.StoreCurrentAsPreset(1)
if err != nil {
log.Fatal(err)
}
// Store Spotify playlist as preset 2
spotifyContent := &models.ContentItem{
Source: "SPOTIFY",
Type: "uri",
Location: "spotify:playlist:37i9dQZF1DXcBWIGoYBM5M",
SourceAccount: "your_username",
IsPresetable: true,
ItemName: "Today's Top Hits",
}
err = c.StorePreset(2, spotifyContent)
if err != nil {
log.Fatal(err)
}
// Store radio station as preset 3
radioContent := &models.ContentItem{
Source: "TUNEIN",
Type: "stationurl",
Location: "/v1/playbook/station/s33828",
IsPresetable: true,
ItemName: "K-LOVE Radio",
}
err = c.StorePreset(3, radioContent)
if err != nil {
log.Fatal(err)
}
// Select preset 1
err = c.SelectPreset(1)
if err != nil {
log.Fatal(err)
}
fmt.Println("Preset management complete!")
}package main
import (
"log"
"github.com/gesellix/bose-soundtouch/pkg/client"
"github.com/gesellix/bose-soundtouch/pkg/models"
)
func main() {
master := client.NewClient(&client.Config{
Host: "192.168.1.100", // Master speaker
Port: 8090,
})
// Create a multiroom zone
zone := &models.Zone{
Master: "192.168.1.100",
Members: []models.ZoneMember{
{IPAddress: "192.168.1.101"}, // Living room
{IPAddress: "192.168.1.102"}, // Kitchen
},
}
err := master.SetZone(zone)
if err != nil {
log.Fatal(err)
}
fmt.Println("Multiroom zone created!")
}package main
import (
"log"
"github.com/gesellix/bose-soundtouch/pkg/client"
)
func main() {
c := client.NewClient(&client.Config{
Host: "192.168.1.100",
Port: 8090,
})
// Play Text-to-Speech message (language code "EN", "DE", etc.)
err := c.PlayTTS("Welcome home!", "your-app-key", "EN", 70)
if err != nil {
log.Fatal(err)
}
// Play audio content from URL
err = c.PlayURL(
"https://example.com/doorbell.mp3",
"your-app-key",
"Doorbell",
"Front Door",
"Visitor Alert",
80,
)
if err != nil {
log.Fatal(err)
}
// Play notification beep
err = c.PlayNotificationBeep()
if err != nil {
log.Fatal(err)
}
fmt.Println("Notifications sent!")
}This library supports all Bose SoundTouch-compatible devices, including:
- SoundTouch 10, 20, 30 series
- SoundTouch Portable
- Wave SoundTouch music system
- SoundTouch-enabled Bose speakers
Tested Hardware:
- ✅ SoundTouch 10
- ✅ SoundTouch 20
| Feature | Status | Description |
|---|---|---|
| Device Info | ✅ Complete | Device details, name, capabilities |
| Media Control | ✅ Complete | Play/pause/stop, track navigation |
| Volume & Audio | ✅ Complete | Volume, bass, balance control |
| Source Selection | ✅ Complete | Spotify, Bluetooth, AUX, etc. |
| Content Navigation | ✅ Complete | Browse music libraries, radio stations |
| Station Management | ✅ Complete | Search, add, remove stations |
| Preset Management | ✅ Complete | Store, select, remove presets |
| Real-time Events | ✅ Complete | WebSocket event streaming |
| Multiroom Zones | ✅ Complete | Zone creation and management |
| Speaker Notifications | ✅ Complete | TTS, URL audio, beep alerts (ST-10) |
| System Settings | ✅ Complete | Clock, display, network info |
| Advanced Audio | ✅ Complete | DSP controls, tone controls |
API Limitations: None - all documented SoundTouch Web API functionality is implemented, including endpoints discovered via the comprehensive SoundTouch Plus Wiki.
- 📖 Contributing Guide - How to contribute to the project
- 📚 API Reference - Complete endpoint documentation
- 🔧 CLI Reference - Command-line tool guide
- 🌐 SoundTouch Service Guide - Local service setup and migration
- 🎯 Getting Started - Detailed setup and usage
- 📻 Preset Quick Start - Favorite content management
- 🧭 Navigation Guide - Content browsing and station management
- 📋 Navigation API Reference - Navigation API documentation
- ⚙️ Advanced Features - Advanced functionality
- 🏠 Multiroom Setup - Zone configuration guide
- ⚡ WebSocket Events - Real-time event handling
- 🔔 Speaker Notifications - TTS and audio notifications guide
- 🔍 Device Discovery - Discovery configuration
- 🛠️ Troubleshooting - Common issues and solutions
- Go 1.25.6 or later
- Optional: SoundTouch device for testing
# Clone the repository
git clone https://github.com/gesellix/bose-soundtouch.git
cd Bose-SoundTouch
# Install dependencies
go mod download
# Build CLI tool
make build
# Run tests
make test
# Install CLI locally
go install ./cmd/soundtouch-cliWe welcome contributions! Please see our Contributing Guide for details on:
- Setting up your development environment
- Coding guidelines and best practices
- Testing with real devices
- Submitting pull requests
Check out the examples/ directory for more usage patterns:
- Basic HTTP Client: Simple device control
- Preset Management: Store and manage favorite content
- Navigation & Stations: Browse content and manage radio stations
- WebSocket Events: Real-time monitoring
- Device Discovery: Finding devices on your network
- Multiroom Management: Zone operations
- Advanced Audio: DSP and tone controls
This project is licensed under the MIT License - see the LICENSE file for details.
This is an independent project based on the official Bose SoundTouch Web API documentation provided by Bose Corporation. It is not affiliated with, endorsed by, or supported by Bose Corporation. Use at your own risk.
SoundTouch is a trademark of Bose Corporation.
Important: Bose has announced that SoundTouch cloud support will end on May 6, 2026.
What will continue to work:
- ✅ Local API control (this library's primary functionality)
- ✅ Bluetooth, AirPlay, Spotify Connect, and AUX streaming
- ✅ Remote control features (Play, Pause, Skip, Volume)
- ✅ Multiroom grouping
What will stop working:
- ❌ Cloud-based preset sync between devices and SoundTouch app
- ❌ Browsing music services directly from the SoundTouch app
- ❌ Cloud-based features and updates
What continues to work:
- ✅ Local preset management via this API client (store, select, remove)
- ✅ Direct content playback (stations, playlists, etc.)
This Go library will continue to work as it uses the local Web API for direct device control, which is unaffected by the cloud service discontinuation. The local preset management functionality implemented in this library (discovered through the SoundTouch Plus Wiki) provides an alternative to the cloud-based preset features that will be discontinued.
Community Alternatives: See the Related Projects section below for additional tools like SoundCork that provide cloud service alternatives and the SoundTouch Plus project that offers comprehensive Home Assistant integration.
This project builds upon the excellent work of several community projects:
- Project: SoundCork - SoundTouch API Intercept
- Authors: Deborah Kaplan and contributors
- Our Implementation: The
soundtouch-servicein this project is heavily inspired by SoundCork's Python implementation. SoundCork pioneered the approach of intercepting and emulating Bose's cloud services, providing the foundation for offline SoundTouch operation. - Key Contributions: Service emulation architecture, BMX/Marge endpoint discovery, device migration strategies
- License: MIT License
- Project: ÜberBöse API
- Author: Julius
- Our Implementation: This project provided valuable insights into advanced SoundTouch API endpoints and helped make our implementation more complete, particularly for content navigation and advanced device features.
- Key Contributions: Extended API endpoint documentation, advanced feature discovery
- License: MIT License
- Project: SoundTouch Plus Home Assistant Component
- Wiki: SoundTouch WebServices API Documentation
- Author: Todd Lucas
- Our Implementation: The comprehensive API documentation in the SoundTouch Plus Wiki provided invaluable insights into undocumented endpoints beyond the official API, enabling our preset management and content navigation features.
- Key Contributions: Extensive API endpoint documentation, real-world usage patterns
- License: MIT License
- Project: Bose SoundTouch Hook
- Author: Adrian Böckenkamp
- Our Implementation: This project provides a powerful framework for intercepting and hooking into internal device processes using
LD_PRELOAD. It was instrumental in verifying internal function calls and understanding how the device validates cloud domains. - Key Contributions: Reverse engineering framework, process hooking, cross-compilation toolchain
- License: GPL-3.0 License
These projects together form a comprehensive ecosystem for SoundTouch device management:
- This Project: Go library + CLI + service for programmatic control and offline operation
- SoundCork: Python-based service interception and cloud replacement
- SoundTouch Plus: Home Assistant integration with extensive device support
- ÜberBöse: API research and advanced endpoint discovery
- SoundTouch Hook: Advanced reverse engineering and process instrumentation
We are grateful to these projects and their maintainers for paving the way and providing the foundation that made this comprehensive Go implementation possible. The SoundTouch community's collaborative approach to reverse engineering and documentation has been invaluable.
If you discover new endpoints, features, or improvements through this library, please consider contributing back to these projects as well. The stronger our community ecosystem becomes, the better we can support SoundTouch devices beyond Bose's official support timeline.
- 🐛 Bug Reports: Create an issue
- 💡 Feature Requests: Start a discussion
- ❓ Questions: Check existing discussions
- 📖 Documentation: Online Documentation
- 🔍 New Discoveries: Undocumented Community Features
- 🌐 Upstream Analysis: Upstream URLs & Domains
- 🔧 Redirection Guide: Device Redirect Methods
- 🐣 Initial Setup: Device Initial Setup Variants
- 📜 Logging & Debugging: Device Logging Guide
- 🔒 HTTPS & CA Setup: HTTPS & Custom CA Guide
Star this project ⭐ if you find it useful!