Cloud-free revival for Bose SoundTouch speakers: internet radio, Spotify Connect, hardware preset buttons, multiroom. The desktop app (Windows, macOS, Linux) installs it onto the speaker over your home network; no Bose cloud, no account. Independent open source project, donation funded, MIT license.
82
stars
1,538
commits
Go
primary language
Sep 10, 2026
updated
Cloud free firmware project for Bose SoundTouch speakers.
Bose discontinued their SoundTouch cloud service in February 2026 and switched the servers off for good on 6 May 2026. STR keeps the speakers usable: a small Go agent is installed onto the speaker itself, stands in for the discontinued cloud locally, and brings back internet radio, Spotify, your own media library, multiroom, and the hardware preset buttons. The install runs over your home network from the desktop app, so no USB stick and no second device are needed. The agent persists on the speaker and starts with it on every boot.
The desktop app finds the speaker on the network, reaches it on its setup port and copies the agent into the speaker's persistent storage. From then on it starts automatically every time the speaker powers on. A USB stick is still supported as a fallback and recovery path, but it is no longer the normal way to install. It hosts a stand-in for the Bose cloud on the loopback interface and redirects the relevant DNS names so the speaker treats it as the real cloud. Playback then happens over UPnP AVTransport on the speaker, which is supported natively, whether the source is an internet radio station, a Spotify playlist, or a track from a media server on your own network. The hardware preset buttons are wired through the speaker's local WebSocket, so a button press recalls the saved source; the same bus lets a remote key fire a webhook to control your smart home. Several speakers can be grouped into a multiroom zone or a stereo pair.
The desktop app: browse and assign presets, search internet radio, control Spotify, browse your local media library, manage speaker settings, and install STR onto a speaker over the network.
![]() | ![]() | ![]() |
| Presets and playback | Internet radio search | Speaker settings |
![]() | ![]() | ![]() |
| DLNA music library | Install and setup | Wi-Fi, name, region |
The interface is available in thirteen languages (English, German, French, Spanish, Japanese, Ukrainian, Dutch, Polish, Lithuanian, Latvian, Turkish, Arabic, Traditional Chinese). The full per-language screenshot set lives in docs/screenshots/ and is regenerated automatically with npm run shoot in desktop-app/frontend/screenshots/, a headless Playwright harness that mocks the backend with demo data, so no speaker is needed.
STR is pre-1.0. This section is the honest snapshot. No marketing.
/etc/wpa_supplicant.conf in full because appending breaks Wi-Fi.docs/ROADMAP.md).| Model | Status |
|---|---|
| SoundTouch 10 | ✅ Verified on hardware |
| SoundTouch 20 | ✅ Works (contributor-confirmed) |
| SoundTouch 30 | ✅ Works (confirmed on hardware) |
| SoundTouch Portable | ✅ Verified on hardware |
| Wave SoundTouch series III and IV | ✅ Works (network install) |
| SoundTouch 300 | ✅ Works (network install) |
| Bose SA-4 amplifier | ✅ Works (network install) |
| Bose SA-5 amplifier | ✅ Works (network install) |
| CineMate 520 and 130 | ✅ Works (network install) |
Per-model detail and the variant fingerprints are in docs/MODELS.md. The SoundTouch 300, the SA-4 and SA-5 amplifiers, the Wave systems and the CineMate soundbars never read a USB stick at boot, so the network install is what made these models possible in the first place. If you own a model that is not listed here, I would like to hear from you so we can work out how close it is.
streaming.bose.com, bmx-cloud.*, TuneIn partner subdomain) to 127.0.0.1 via an /etc/hosts bind-mount. The speaker no longer makes outbound queries for these names. This closes the residual domain-squat risk if Bose lets the DNS lapse and someone re-registers it./mnt/nv/streborn/ca/, installed in the speaker's own trust store. Only valid for the loopback-redirected hostnames; the CA private key never leaves the speaker's NAND. The stand-in listeners themselves are LAN-reachable like the rest of the agent surface.:8888). Any device on the LAN that can reach the speaker can edit presets and trigger playback.:8090 and UPnP on :8091 accept any LAN client without authentication. Standard SoundTouch behaviour, not added by me.root having no password set, and SSH (port 22) is enabled by Bose's own init script when a remote_services file is present on a mounted USB stick. STR does not hold that port open. On a normal, stickless boot the speaker ends up with SSH closed; STR only force-starts sshd when you deliberately ask for it, by placing the marker file /mnt/nv/streborn/enable-ssh on the speaker. That keeps the repair channel available when an install or update leaves the agent down, without leaving a passwordless root shell on your LAN the rest of the time. While a setup stick is inserted, Bose's own gate opens SSH, which is why the app reminds you to pull the stick after setup. If you switched the marker on, the app's speaker settings show it and tell you how to switch it off again.A Bose factory reset clears only what Bose itself knows about: the Bose preset database, account, friendly name, Wi-Fi. It does not touch /mnt/nv/streborn/, which is where my agent binary, CA, preset store, region, name, and the run-override.sh hook live. After a factory reset, STR is still installed and boots automatically.
Implication: a speaker being passed on or sold needs a separate "Uninstall STR" step. That ships in the desktop app: Speaker Settings offers Remove STR (removes /mnt/nv/streborn/ and the boot override, returns the speaker to stock Bose firmware) and a separate True Factory Reset. See docs/ROADMAP.md, "Factory reset wizard", for the remaining level (reset STR data only).
Per my own criteria in CLAUDE.md:
docs/MODELS.md).docs/THREAT-MODEL.md. It does not yet cover the persistence-across-factory-reset point above, which I owe.Additional models beyond the 1.0 threshold, sandboxing the Wails app, and the hardening steps (token auth on :8888, iptables egress lockdown, automatic passwd root on install) I see as post-1.0. Code signing ships on both desktop platforms already: Windows binaries are Authenticode-signed with a Certum open-source certificate, and the macOS app and disk image are Developer ID signed and notarized by Apple.
git clone https://github.com/JRpersonal/streborn.git
cd streborn
# Build the stick agent for the speaker hardware (ARMv7l)
make build-arm
# Build the desktop app with embedded helpers and version stamp
# (requires Wails v2 CLI; raw `wails build` leaves the embeds empty)
make wails-build
Requirements: Go 1.25 or newer, Node 20 or newer, Wails CLI v2 for the desktop app. Note: on Windows/macOS hosts the agent itself only cross-compiles (make build-arm); plain go build ./... fails on its Linux-only syscalls.
The website (st-reborn.de) is built from a separate, private repository. A release here triggers a build there via repository_dispatch.
If you want to understand how the agent, the desktop app, and the speaker's stock firmware fit together (components, ports, data flows for discovery, playback, marge emulation, install, OTA), read docs/ARCHITECTURE.md. It is short, has diagrams, and is the right starting point for contributors.
| Path | Description |
|---|---|
cmd/ | Stick agent entry point, plus winformat, relnotes, mdns-probe helpers |
internal/ | Agent-only packages: marge cloud stub, BMX, UPnP, WebSocket hook, preset store, stream proxy, Spotify manager, zones, webhooks |
discovery/ | mDNS discovery (top level so the desktop app can import it) |
dlna/ | DLNA MediaServer client for the Library tab (top level) |
radiobrowser/ | radio-browser.info client for the app-side radio search (top level) |
sticksetup/ / wifiprofiles/ | Embedded stick provisioning + saved-Wi-Fi reader (top level) |
usb-stick/ | Bootstrap and runtime scripts on the speaker |
setup/ | Legacy PowerShell wizard (superseded by the in-app stick setup) |
desktop-app/ | Cross-platform Wails app (own Go module) |
.github/ | CI and release workflows |
docs/ | Public documentation (architecture, threat model, models, roadmap) |
See st-reborn.de.
Every release on GitHub Releases is built by the official workflow and ships with build provenance attestations via Sigstore. You can verify any binary with:
gh attestation verify STR-Windows-vX.Y.Z.exe --owner JRpersonal
Windows builds are additionally Authenticode-signed with a Certum open-source code-signing certificate; check the signature in the file's Properties > Digital Signatures tab or with signtool verify /pa.
For the threat model and the vulnerability reporting process see SECURITY.md and docs/THREAT-MODEL.md.
Every change is checked automatically and the results are public, so you do not have to take my word for any of it. The badges at the top of this page are live: green means the latest run passed, click one to open the run.
golangci-lint, govulncheck (Go vulnerability scan), and the test suite on every push and pull request.Findings from Dependabot, CodeQL, and Scorecard surface in the repository's Security tab. The full policy is in SECURITY.md, and hard-won notes about the stock firmware STR runs on top of are in docs/FIRMWARE-NOTES.md.
STR has no accounts, no ads, and no third-party trackers in the app. The speaker never contacts the Bose cloud: STR answers it locally; with Spotify Connect enabled it talks to Spotify's servers. The desktop app talks to st-reborn.de (optional version check, disablable with STR_NO_UPDATE_CHECK=1; sends only the app version, build, OS, architecture, and language), to radio-browser.info for the station search, and to public favicon endpoints for station logos. The website uses cookieless GoatCounter analytics. Full breakdown: docs/ARCHITECTURE.md.
Issues and pull requests welcome. By submitting a contribution you agree to license it under MIT. Significant changes please open an issue first to discuss the approach.
If STR helped bring your speaker back to life, please consider a donation.
More payment options on st-reborn.de.
STR is an independent open source project. The abbreviation ST references compatibility with Bose SoundTouch family speakers. STR is not affiliated with, endorsed by, sponsored by, or otherwise connected to Bose Corporation. Bose and SoundTouch are registered trademarks of Bose Corporation in the United States and other countries.
STR exists solely to restore functionality of these speakers after the official Bose cloud service shutdown in February 2026. Reverse engineering for interoperability is permitted under EU Directive 2009/24/EC, Article 6, and comparable provisions in other jurisdictions.
The software is provided AS IS, without warranty. Use at your own risk.
STR stands on other people's open source. Thank you.
sourceproviderid catalogue, the <devices> block the firmware requires before it accepts an account at all, and the finding that device-local slots such as UPNP and STORED_MUSIC_MEDIA_RENDERER must never be served to a speaker as account sources. Sponsor: github.com/sponsors/gesellix.network prefix the Bose service manual leaves out.Bundled components keep their own licenses; STR's own code is MIT.
MIT. See LICENSE. The bundled go-librespot binary is GPL-3.0; see the Acknowledgements above.
Hacker News (1)
Go
69.2%
JavaScript
17.9%
Shell
4.9%
HTML
3.8%
CSS
2.0%
PowerShell
1.5%
Cloud-free revival for Bose SoundTouch speakers: internet radio, Spotify Connect, hardware preset buttons, multiroom. The desktop app (Windows, macOS, Linux) installs it onto the speaker over your home network; no Bose cloud, no account. Independent open source project, donation funded, MIT license.
82
stars
1,538
commits
Go
primary language
Sep 10, 2026
updated
Cloud free firmware project for Bose SoundTouch speakers.
Bose discontinued their SoundTouch cloud service in February 2026 and switched the servers off for good on 6 May 2026. STR keeps the speakers usable: a small Go agent is installed onto the speaker itself, stands in for the discontinued cloud locally, and brings back internet radio, Spotify, your own media library, multiroom, and the hardware preset buttons. The install runs over your home network from the desktop app, so no USB stick and no second device are needed. The agent persists on the speaker and starts with it on every boot.
The desktop app finds the speaker on the network, reaches it on its setup port and copies the agent into the speaker's persistent storage. From then on it starts automatically every time the speaker powers on. A USB stick is still supported as a fallback and recovery path, but it is no longer the normal way to install. It hosts a stand-in for the Bose cloud on the loopback interface and redirects the relevant DNS names so the speaker treats it as the real cloud. Playback then happens over UPnP AVTransport on the speaker, which is supported natively, whether the source is an internet radio station, a Spotify playlist, or a track from a media server on your own network. The hardware preset buttons are wired through the speaker's local WebSocket, so a button press recalls the saved source; the same bus lets a remote key fire a webhook to control your smart home. Several speakers can be grouped into a multiroom zone or a stereo pair.
The desktop app: browse and assign presets, search internet radio, control Spotify, browse your local media library, manage speaker settings, and install STR onto a speaker over the network.
![]() | ![]() | ![]() |
| Presets and playback | Internet radio search | Speaker settings |
![]() | ![]() | ![]() |
| DLNA music library | Install and setup | Wi-Fi, name, region |
The interface is available in thirteen languages (English, German, French, Spanish, Japanese, Ukrainian, Dutch, Polish, Lithuanian, Latvian, Turkish, Arabic, Traditional Chinese). The full per-language screenshot set lives in docs/screenshots/ and is regenerated automatically with npm run shoot in desktop-app/frontend/screenshots/, a headless Playwright harness that mocks the backend with demo data, so no speaker is needed.
STR is pre-1.0. This section is the honest snapshot. No marketing.
/etc/wpa_supplicant.conf in full because appending breaks Wi-Fi.docs/ROADMAP.md).| Model | Status |
|---|---|
| SoundTouch 10 | ✅ Verified on hardware |
| SoundTouch 20 | ✅ Works (contributor-confirmed) |
| SoundTouch 30 | ✅ Works (confirmed on hardware) |
| SoundTouch Portable | ✅ Verified on hardware |
| Wave SoundTouch series III and IV | ✅ Works (network install) |
| SoundTouch 300 | ✅ Works (network install) |
| Bose SA-4 amplifier | ✅ Works (network install) |
| Bose SA-5 amplifier | ✅ Works (network install) |
| CineMate 520 and 130 | ✅ Works (network install) |
Per-model detail and the variant fingerprints are in docs/MODELS.md. The SoundTouch 300, the SA-4 and SA-5 amplifiers, the Wave systems and the CineMate soundbars never read a USB stick at boot, so the network install is what made these models possible in the first place. If you own a model that is not listed here, I would like to hear from you so we can work out how close it is.
streaming.bose.com, bmx-cloud.*, TuneIn partner subdomain) to 127.0.0.1 via an /etc/hosts bind-mount. The speaker no longer makes outbound queries for these names. This closes the residual domain-squat risk if Bose lets the DNS lapse and someone re-registers it./mnt/nv/streborn/ca/, installed in the speaker's own trust store. Only valid for the loopback-redirected hostnames; the CA private key never leaves the speaker's NAND. The stand-in listeners themselves are LAN-reachable like the rest of the agent surface.:8888). Any device on the LAN that can reach the speaker can edit presets and trigger playback.:8090 and UPnP on :8091 accept any LAN client without authentication. Standard SoundTouch behaviour, not added by me.root having no password set, and SSH (port 22) is enabled by Bose's own init script when a remote_services file is present on a mounted USB stick. STR does not hold that port open. On a normal, stickless boot the speaker ends up with SSH closed; STR only force-starts sshd when you deliberately ask for it, by placing the marker file /mnt/nv/streborn/enable-ssh on the speaker. That keeps the repair channel available when an install or update leaves the agent down, without leaving a passwordless root shell on your LAN the rest of the time. While a setup stick is inserted, Bose's own gate opens SSH, which is why the app reminds you to pull the stick after setup. If you switched the marker on, the app's speaker settings show it and tell you how to switch it off again.A Bose factory reset clears only what Bose itself knows about: the Bose preset database, account, friendly name, Wi-Fi. It does not touch /mnt/nv/streborn/, which is where my agent binary, CA, preset store, region, name, and the run-override.sh hook live. After a factory reset, STR is still installed and boots automatically.
Implication: a speaker being passed on or sold needs a separate "Uninstall STR" step. That ships in the desktop app: Speaker Settings offers Remove STR (removes /mnt/nv/streborn/ and the boot override, returns the speaker to stock Bose firmware) and a separate True Factory Reset. See docs/ROADMAP.md, "Factory reset wizard", for the remaining level (reset STR data only).
Per my own criteria in CLAUDE.md:
docs/MODELS.md).docs/THREAT-MODEL.md. It does not yet cover the persistence-across-factory-reset point above, which I owe.Additional models beyond the 1.0 threshold, sandboxing the Wails app, and the hardening steps (token auth on :8888, iptables egress lockdown, automatic passwd root on install) I see as post-1.0. Code signing ships on both desktop platforms already: Windows binaries are Authenticode-signed with a Certum open-source certificate, and the macOS app and disk image are Developer ID signed and notarized by Apple.
git clone https://github.com/JRpersonal/streborn.git
cd streborn
# Build the stick agent for the speaker hardware (ARMv7l)
make build-arm
# Build the desktop app with embedded helpers and version stamp
# (requires Wails v2 CLI; raw `wails build` leaves the embeds empty)
make wails-build
Requirements: Go 1.25 or newer, Node 20 or newer, Wails CLI v2 for the desktop app. Note: on Windows/macOS hosts the agent itself only cross-compiles (make build-arm); plain go build ./... fails on its Linux-only syscalls.
The website (st-reborn.de) is built from a separate, private repository. A release here triggers a build there via repository_dispatch.
If you want to understand how the agent, the desktop app, and the speaker's stock firmware fit together (components, ports, data flows for discovery, playback, marge emulation, install, OTA), read docs/ARCHITECTURE.md. It is short, has diagrams, and is the right starting point for contributors.
| Path | Description |
|---|---|
cmd/ | Stick agent entry point, plus winformat, relnotes, mdns-probe helpers |
internal/ | Agent-only packages: marge cloud stub, BMX, UPnP, WebSocket hook, preset store, stream proxy, Spotify manager, zones, webhooks |
discovery/ | mDNS discovery (top level so the desktop app can import it) |
dlna/ | DLNA MediaServer client for the Library tab (top level) |
radiobrowser/ | radio-browser.info client for the app-side radio search (top level) |
sticksetup/ / wifiprofiles/ | Embedded stick provisioning + saved-Wi-Fi reader (top level) |
usb-stick/ | Bootstrap and runtime scripts on the speaker |
setup/ | Legacy PowerShell wizard (superseded by the in-app stick setup) |
desktop-app/ | Cross-platform Wails app (own Go module) |
.github/ | CI and release workflows |
docs/ | Public documentation (architecture, threat model, models, roadmap) |
See st-reborn.de.
Every release on GitHub Releases is built by the official workflow and ships with build provenance attestations via Sigstore. You can verify any binary with:
gh attestation verify STR-Windows-vX.Y.Z.exe --owner JRpersonal
Windows builds are additionally Authenticode-signed with a Certum open-source code-signing certificate; check the signature in the file's Properties > Digital Signatures tab or with signtool verify /pa.
For the threat model and the vulnerability reporting process see SECURITY.md and docs/THREAT-MODEL.md.
Every change is checked automatically and the results are public, so you do not have to take my word for any of it. The badges at the top of this page are live: green means the latest run passed, click one to open the run.
golangci-lint, govulncheck (Go vulnerability scan), and the test suite on every push and pull request.Findings from Dependabot, CodeQL, and Scorecard surface in the repository's Security tab. The full policy is in SECURITY.md, and hard-won notes about the stock firmware STR runs on top of are in docs/FIRMWARE-NOTES.md.
STR has no accounts, no ads, and no third-party trackers in the app. The speaker never contacts the Bose cloud: STR answers it locally; with Spotify Connect enabled it talks to Spotify's servers. The desktop app talks to st-reborn.de (optional version check, disablable with STR_NO_UPDATE_CHECK=1; sends only the app version, build, OS, architecture, and language), to radio-browser.info for the station search, and to public favicon endpoints for station logos. The website uses cookieless GoatCounter analytics. Full breakdown: docs/ARCHITECTURE.md.
Issues and pull requests welcome. By submitting a contribution you agree to license it under MIT. Significant changes please open an issue first to discuss the approach.
If STR helped bring your speaker back to life, please consider a donation.
More payment options on st-reborn.de.
STR is an independent open source project. The abbreviation ST references compatibility with Bose SoundTouch family speakers. STR is not affiliated with, endorsed by, sponsored by, or otherwise connected to Bose Corporation. Bose and SoundTouch are registered trademarks of Bose Corporation in the United States and other countries.
STR exists solely to restore functionality of these speakers after the official Bose cloud service shutdown in February 2026. Reverse engineering for interoperability is permitted under EU Directive 2009/24/EC, Article 6, and comparable provisions in other jurisdictions.
The software is provided AS IS, without warranty. Use at your own risk.
STR stands on other people's open source. Thank you.
sourceproviderid catalogue, the <devices> block the firmware requires before it accepts an account at all, and the finding that device-local slots such as UPNP and STORED_MUSIC_MEDIA_RENDERER must never be served to a speaker as account sources. Sponsor: github.com/sponsors/gesellix.network prefix the Bose service manual leaves out.Bundled components keep their own licenses; STR's own code is MIT.
MIT. See LICENSE. The bundled go-librespot binary is GPL-3.0; see the Acknowledgements above.
Hacker News (1)
Go
69.2%
JavaScript
17.9%
Shell
4.9%
HTML
3.8%
CSS
2.0%
PowerShell
1.5%