A complete local server implementation that replaces Bose cloud services for SoundTouch devices after the May 2026 shutdown.
This server acts as a replacement for Bose's cloud infrastructure (marge.bose.com, bmx.bose.com), allowing your SoundTouch devices to continue functioning with full features after Bose discontinues cloud support.
Status: Production Ready - Fully implements the cloud replacement functionality needed after May 6, 2026.
- ✅ Web Radio Configuration on Presets - Full support for internet radio stations with TuneIn integration
- ✅ Spotify Integration - Play Spotify playlists, albums, tracks, and artists
- ✅ Multiroom (Zones) - Create and manage synchronized playback across multiple speakers
- ✅ TuneIn/BMX Integration - Search, browse, and play TuneIn radio stations
- ✅ Device information and management
- ✅ Playback control (play, pause, stop, next, previous)
- ✅ Volume control with mute support
- ✅ Bass control (-9 to 0)
- ✅ Balance control (-10 to 10)
- ✅ Preset management (6 presets)
- ✅ Recent items tracking (last 20)
- ✅ Source selection (Spotify, Internet Radio, Bluetooth, AUX, etc.)
- ✅ Track information with metadata
- ✅ Network information
- ✅ Device capabilities
- ✅ Group management
- ✅ Media server listing
- ✅ WebSocket notifications for real-time updates
- ✅ Persistent storage (survives restarts)
- ✅ Auto-registration (devices register themselves)
- ✅ Account-based organization
Bose is shutting down SoundTouch cloud services on May 6, 2026.
After this date, without a replacement server:
- ❌ Presets will stop working
- ❌ Spotify integration will fail
- ❌ Internet radio will be unavailable
- ❌ Multiroom zones won't function
- ❌ Device configuration will be lost
With this server:
- ✅ All features continue working
- ✅ Complete local control
- ✅ No internet dependency
- ✅ Privacy - all data stays local
- ✅ Future-proof solution
npm installnpm startServer runs on port 8090 by default.
Open your browser and navigate to:
http://localhost:8090
The web UI provides a complete interface for:
- Device management
- Preset configuration (TuneIn, Spotify, Direct URLs)
- Playback control
- Multiroom zone management
- TuneIn search and browse
- Settings and authentication
Follow the Device Configuration Guide to configure your SoundTouch devices to use your server instead of Bose cloud.
Quick steps:
- Enable remote access on device (USB with
remote_servicesfile) - Extract device data and upload to server
- Edit device config to point to your server
- Reboot device
Automated setup:
./scripts/configure-device-for-server.sh <device_ip> <server_url>1. Device boots → reads config (points to your server)
2. Device registers with server (POST /device/register)
3. Device downloads presets, sources, recents
4. Device operates normally using your server
5. All state stored persistently on your server
data/
└── accounts/
└── default/
└── devices/
└── {deviceId}/
├── DeviceInfo.xml
├── Presets.xml
├── Recents.xml
└── Sources.xml
Run the test script to verify all endpoints:
./test-api.sh- API_REFERENCE.md - Complete API endpoint documentation
- USAGE.md - Usage guide with examples
- WEB_UI_GUIDE.md - Complete Web UI guide
- DEVICE_CONFIGURATION_GUIDE.md - Device setup guide
- TUNEIN_INTEGRATION.md - TuneIn/BMX integration
- PRESET_TYPES_GUIDE.md - All preset types explained
- TROUBLESHOOTING.md - Common issues and solutions
- examples/ - XML request examples for all operations
Devices call these when configured to use your server:
POST /device/register- Device self-registrationGET /device/:id/config- Device configurationGET/POST /device/:id/presets- Preset synchronizationGET/POST /device/:id/recents- Recent items syncGET/POST /device/:id/sources- Source configurationGET /account/:id/devices- List devices per account
TuneIn integration for web radio presets:
GET /tunein/search?query=...- Search TuneIn stationsGET /tunein/station/:stationId- Get station details and stream URLGET /tunein/browse?c=...- Browse TuneIn categoriesPOST /bmx/resolve- Resolve preset to stream URL (called by device)GET /bmx/presets/:deviceId- Get TuneIn presets for devicePOST /bmx/auth- Authenticate with TuneIn (optional)
You can also control devices directly via API:
GET /info?deviceId=x- Device informationGET /presets?deviceId=x- Get presetsPOST /select?deviceId=x- Select contentGET /volume?deviceId=x,POST /volume?deviceId=x- Volume controlGET /now_playing?deviceId=x- Current playbackPOST /key?deviceId=x- Send key pressGET /getZone?deviceId=x,POST /setZone?deviceId=x- Multiroom zones
Total: 46 endpoints - See API_REFERENCE.md for complete documentation.
The server includes TuneIn integration for internet radio presets. When a device presses a preset button configured with a TuneIn station, the server resolves the stream URL automatically.
For premium TuneIn features, set environment variables:
export TUNEIN_USERNAME="your_username"
export TUNEIN_PASSWORD="your_password"
npm start- Device presses preset button (e.g., Preset 1)
- Device queries:
GET /device/{deviceId}/presets?presetId=1 - Server returns preset with TuneIn station ID
- Device calls:
POST /bmx/resolvewith station ID - Server resolves to actual stream URL
- Device plays the stream
See WEBRADIO_PRESET_GUIDE.md for detailed configuration.
For information on how different preset types (TuneIn, Spotify, Direct URLs) are handled, see PRESET_TYPES_GUIDE.md.
Use as a test server for developing Bose SoundTouch integrations without real hardware.
Replace Bose cloud services for local-only operation after cloud EOL (May 2026).
Extend controllers to forward requests to real Bose devices while adding custom logic.
Integrate with Home Assistant, Node-RED, or other automation platforms.
The server currently maintains state locally. To connect to real Bose devices:
- Forward API calls: Update controllers to proxy requests to device IPs
- WebSocket connections: Connect to device WebSocket for real-time updates
- Device discovery: Implement UPnP/SSDP discovery
- Authentication: Add auth handling if required
Example controller modification:
// In controller, forward to real device
const response = await axios.post(
`http://${device.host}:${device.port}/volume`,
xmlBody,
{ headers: { 'Content-Type': 'application/xml' } }
);src/
├── server.js # Main Express server
├── deviceManager.js # Device & zone management
├── storage/
│ └── fileStorage.js # Persistent storage
├── models/
│ └── device.js # Device model
├── controllers/ # API endpoint controllers
│ ├── cloudReplacementController.js # Cloud replacement endpoints
│ ├── bmxController.js # TuneIn/BMX integration
│ ├── presetController.js
│ ├── presetStorageController.js
│ ├── zoneController.js
│ ├── playbackController.js
│ └── ...
└── utils/
└── presetInitializer.js # Default presets
public/ # Web UI (NEW!)
├── index.html # Main UI
├── styles.css # Styling
└── app.js # Frontend logic
A complete web-based management interface is included:
Features:
- 📱 Device management and monitoring
- 🎵 Preset configuration (TuneIn, Spotify, Direct URLs)
▶️ Playback control with now playing display- 🔊 Volume, bass, and balance adjustment
- 🔗 Multiroom zone creation and management
- 🔍 TuneIn search and browse
- ⚙️ Settings and authentication
- 📱 Responsive design (works on desktop, tablet, mobile)
Access: Open http://localhost:8090 in your browser
Documentation: See WEB_UI_GUIDE.md for complete usage guide
Connect to ws://localhost:8090/notifications for real-time updates:
const ws = new WebSocket('ws://localhost:8090/notifications');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Update:', data.type, data);
};Event types: zoneUpdated, deviceRegistered, presetsUpdated, etc.
- Node.js - Runtime environment
- Express - Web framework
- ws - WebSocket server
- xml2js - XML parsing/building
- File-based storage - Persistent device state
MIT
(C) 2026 Benjamin Schaja