Skip to content

Releases: gesellix/Bose-SoundTouch

v0.129.0

Choose a tag to compare

@gesellix gesellix released this 23 Aug 12:54

Noteworthy

  • Fixed a race that could silently drop a preset or recent when several
    were stored back-to-back (#614).
    Storing a preset or recent used to
    read the full list, change one entry, and write the whole list back as
    three separate, unguarded steps. Two overlapping stores (for example, a
    script or app writing several presets in quick succession) could each
    read the same starting list and then clobber each other's write,
    silently losing whichever one saved second. All read-modify-write paths
    for presets, recents, and configured sources now go through a single
    atomic update instead.
  • Data Sync no longer silently overwrites presets or recents with an
    incomplete live snapshot (#614).
    Clicking Sync used to copy whatever
    the speaker's own local API reported at that instant straight into
    AfterTouch's datastore, with no check against what was already stored:
    if the speaker's own cache was momentarily stale or incomplete (right
    after a burst of writes, or shortly after a reboot), Sync would happily
    persist that bad snapshot over good data. Sync now compares a fresh
    live fetch against what's stored first; if applying it would remove
    anything, it asks for confirmation instead of silently applying it, and
    the Admin UI shows exactly what would be removed. The original
    plain-reboot report, where AfterTouch's own stored data stayed correct
    the whole time, is a separate issue and is still open.

Smaller changes

  • Bumped the Go toolchain to 1.27.0 across the main module, both example
    modules, and the Docker build image.
  • Dependency updates: github.com/go-chi/chi/v5 5.3.1 → 5.3.2,
    github.com/miekg/dns 1.1.72 → 1.1.73.
  • Fixed a stale golangci-lint install hint pointing at the v1 module
    path (silently installs the latest v1.x instead of v2.x, which this
    project's config requires) and refreshed an internal route-naming test
    snapshot after the Go 1.27 bump. No behavior change.

What's Changed

  • deps(deps): bump github.com/miekg/dns from 1.1.72 to 1.1.73 by @dependabot[bot] in #638
  • deps(deps): bump github.com/go-chi/chi/v5 from 5.3.1 to 5.3.2 by @dependabot[bot] in #639
  • ci(deps): bump docker/setup-buildx-action from 4.2.0 to 4.3.0 in the setup-actions group by @dependabot[bot] in #640
  • docker(deps): bump golang from 1.26.6-alpine to 1.27.0-alpine by @dependabot[bot] in #637
  • fix(datastore): close preset/recent/source lost-update race (#614) by @gesellix in #641
  • fix(setup): require confirmation before Sync would shrink stored data (#614) by @gesellix in #642
  • Bump Golang to 1.27.0 by @gesellix in #643

Full Changelog: v0.128.0...v0.129.0

Quick downloads

Most people only need one of these two:

soundtouch-service — the local server that replaces the Bose cloud. Point your speaker at it and you keep full control; the built-in web UI on port 8000 handles setup.

Platform Download Checksum
Raspberry Pi (64-bit) / ARM64 Linux soundtouch-service-v0.129.0-linux-arm64 sha256
Raspberry Pi (32-bit) / ARMv7 soundtouch-service-v0.129.0-linux-armv7 sha256
Linux (64-bit PC) soundtouch-service-v0.129.0-linux-amd64 sha256
macOS (Apple Silicon) soundtouch-service-v0.129.0-darwin-arm64 sha256
macOS (Intel) soundtouch-service-v0.129.0-darwin-amd64 sha256
Windows (64-bit) soundtouch-service-v0.129.0-windows-amd64.exe sha256
FreeBSD (64-bit) soundtouch-service-v0.129.0-freebsd-amd64 sha256

soundtouch-cli — command-line control of any device: playback, presets, sources, multiroom zones, discovery, and migration. Good for scripting and home automation.

Platform Download Checksum
Raspberry Pi (64-bit) / ARM64 Linux soundtouch-cli-v0.129.0-linux-arm64 sha256
Raspberry Pi (32-bit) / ARMv7 soundtouch-cli-v0.129.0-linux-armv7 sha256
Linux (64-bit PC) soundtouch-cli-v0.129.0-linux-amd64 sha256
macOS (Apple Silicon) soundtouch-cli-v0.129.0-darwin-arm64 sha256
macOS (Intel) soundtouch-cli-v0.129.0-darwin-amd64 sha256
Windows (64-bit) soundtouch-cli-v0.129.0-windows-amd64.exe sha256
FreeBSD (64-bit) soundtouch-cli-v0.129.0-freebsd-amd64 sha256

Everything else (soundtouch-player, soundtouch-backup, other platforms, Docker, install scripts): Downloads page.

v0.128.0

Choose a tag to compare

@gesellix gesellix released this 22 Aug 09:34

Noteworthy

  • Speakers paired outside AfterTouch (e.g. via the USB-stick SSH-enable
    method) are no longer silently dropped during discovery (#634).
    Some
    third-party or manual pairing tools assign a margeAccountUUID that
    isn't Bose's usual 7-digit numeric ID (one reporter's speaker came back
    with stick@local). AfterTouch rejected anything outside that numeric
    format as an "invalid account ID" and never saved the device, with no
    error visible anywhere in the UI. Account IDs are now accepted as long
    as they're safe to store and use internally, so the device saves under
    its real reported account instead of disappearing.

Smaller changes

  • Hardened account/device ID handling in the admin web UI, the diagnostic
    export, and health-check logging (input validation and output escaping)
    as part of the #634 fix above.
  • Added logging for two previously-silent cases where a speaker's
    Presets.xml or Recents.xml read back empty despite an intact on-disk
    file, to help track down a reported preset-wipe issue (#614). No
    behavior change; the underlying trigger is still open.

What's Changed

  • fix(datastore): log previously-silent empty-preset/recent reads (#614) by @gesellix in #633
  • fix(setup): accept non-numeric account IDs reported by third-party pairing tools by @gesellix in #636

Full Changelog: v0.127.0...v0.128.0

Quick downloads

Most people only need one of these two:

soundtouch-service — the local server that replaces the Bose cloud. Point your speaker at it and you keep full control; the built-in web UI on port 8000 handles setup.

Platform Download Checksum
Raspberry Pi (64-bit) / ARM64 Linux soundtouch-service-v0.128.0-linux-arm64 sha256
Raspberry Pi (32-bit) / ARMv7 soundtouch-service-v0.128.0-linux-armv7 sha256
Linux (64-bit PC) soundtouch-service-v0.128.0-linux-amd64 sha256
macOS (Apple Silicon) soundtouch-service-v0.128.0-darwin-arm64 sha256
macOS (Intel) soundtouch-service-v0.128.0-darwin-amd64 sha256
Windows (64-bit) soundtouch-service-v0.128.0-windows-amd64.exe sha256
FreeBSD (64-bit) soundtouch-service-v0.128.0-freebsd-amd64 sha256

soundtouch-cli — command-line control of any device: playback, presets, sources, multiroom zones, discovery, and migration. Good for scripting and home automation.

Platform Download Checksum
Raspberry Pi (64-bit) / ARM64 Linux soundtouch-cli-v0.128.0-linux-arm64 sha256
Raspberry Pi (32-bit) / ARMv7 soundtouch-cli-v0.128.0-linux-armv7 sha256
Linux (64-bit PC) soundtouch-cli-v0.128.0-linux-amd64 sha256
macOS (Apple Silicon) soundtouch-cli-v0.128.0-darwin-arm64 sha256
macOS (Intel) soundtouch-cli-v0.128.0-darwin-amd64 sha256
Windows (64-bit) soundtouch-cli-v0.128.0-windows-amd64.exe sha256
FreeBSD (64-bit) soundtouch-cli-v0.128.0-freebsd-amd64 sha256

Everything else (soundtouch-player, soundtouch-backup, other platforms, Docker, install scripts): Downloads page.

v0.127.0

Choose a tag to compare

@gesellix gesellix released this 18 Aug 19:56

Noteworthy

  • Fixed speakers stuck on "install the Bose app" after a full
    migration, even when already reachable, named, and account-paired
    (#615).
    Only a full pass through the WebSocket setup state machine
    clears SOUNDTOUCH_NOT_CONFIGURED, but running that unconditionally
    risked re-running the setup bracket on speakers that don't need or
    support it. setup pair --mode=full now checks /supportedURLs and
    /soundTouchConfigurationStatus first: an already-configured device
    is a no-op, and an unsupported route or an unrecognised status value
    aborts instead of guessing.
  • Release notes now link straight to each platform's download and
    checksum
    , one row per OS/arch for soundtouch-service and
    soundtouch-cli, instead of sending you through the flat,
    alphabetical Assets list below. Everything else (soundtouch-player,
    soundtouch-backup, other platforms, Docker, install scripts) is
    still on the Downloads page.

What's Changed

  • fix(setup): gate setup pair --mode=full on configuration status (#615) by @gesellix in #629
  • ci(deps): bump the codeql-action group with 3 updates by @dependabot[bot] in #630
  • feat(release): add real per-platform download links to release notes by @gesellix in #631

Full Changelog: v0.126.0...v0.127.0

Quick downloads

Most people only need one of these two:

soundtouch-service — the local server that replaces the Bose cloud. Point your speaker at it and you keep full control; the built-in web UI on port 8000 handles setup.

Platform Download Checksum
Raspberry Pi (64-bit) / ARM64 Linux soundtouch-service-v0.127.0-linux-arm64 sha256
Raspberry Pi (32-bit) / ARMv7 soundtouch-service-v0.127.0-linux-armv7 sha256
Linux (64-bit PC) soundtouch-service-v0.127.0-linux-amd64 sha256
macOS (Apple Silicon) soundtouch-service-v0.127.0-darwin-arm64 sha256
macOS (Intel) soundtouch-service-v0.127.0-darwin-amd64 sha256
Windows (64-bit) soundtouch-service-v0.127.0-windows-amd64.exe sha256
FreeBSD (64-bit) soundtouch-service-v0.127.0-freebsd-amd64 sha256

soundtouch-cli — command-line control of any device: playback, presets, sources, multiroom zones, discovery, and migration. Good for scripting and home automation.

Platform Download Checksum
Raspberry Pi (64-bit) / ARM64 Linux soundtouch-cli-v0.127.0-linux-arm64 sha256
Raspberry Pi (32-bit) / ARMv7 soundtouch-cli-v0.127.0-linux-armv7 sha256
Linux (64-bit PC) soundtouch-cli-v0.127.0-linux-amd64 sha256
macOS (Apple Silicon) soundtouch-cli-v0.127.0-darwin-arm64 sha256
macOS (Intel) soundtouch-cli-v0.127.0-darwin-amd64 sha256
Windows (64-bit) soundtouch-cli-v0.127.0-windows-amd64.exe sha256
FreeBSD (64-bit) soundtouch-cli-v0.127.0-freebsd-amd64 sha256

Everything else (soundtouch-player, soundtouch-backup, other platforms, Docker, install scripts): Downloads page.

v0.126.0

Choose a tag to compare

@gesellix gesellix released this 17 Aug 19:05

Noteworthy

  • Fixed statsServerUrl/bmxRegistryUrl permanently sticking to stale
    values after an SSH-XML migration, surviving even a reboot (#621).
    The
    post-migration telnet resync only re-applied margeServerUrl/swUpdateUrl
    before committing, but that commit persists whatever is currently in
    the runtime layer for all four URL fields, not just the two it was given.
    With stats/bmx left stale in the runtime layer at that moment, the commit
    froze them there permanently; nothing short of a factory reset previously
    cleared it. All four fields are now resynced before the commit.
  • Fixed "No space left on device" during on-device updates (#621). The
    installer only pruned old binary backups after a fully successful update.
    If a previous attempt died partway (e.g. from running low on space in the
    first place), its backup was never cleaned up, and low space is exactly
    what makes the next attempt likely to fail the same way. Pruning now also
    runs before the download, so a stuck device can recover on its own instead
    of needing a manual rm.
  • Migrate tab: changing Target Domain now updates the four service URL
    fields automatically (#621).
    Previously, setting Target Domain to a new
    value (e.g. localhost for an on-device install) correctly flagged a URL
    mismatch but left margeServerUrl/statsServerUrl/swUpdateUrl/
    bmxRegistryUrl unchanged, forcing a manual edit of all four. Hand-edited
    fields are still left alone.
  • Migration tab actions are now reachable without expanding anything
    (#621).
    Reboot, Revert to Defaults, and Enable/Disable SSH used to live
    behind a collapsed "Customize this migration" section, requiring an
    expand and a scroll past several fieldsets to reach. They're now always
    visible: Reboot/Revert in a "Speaker controls" row, and Enable/Disable SSH
    inline with the SSH status row. The CA/TLS status and HTTPS Connection
    Test panel also now say whether they're actually relevant to your current
    plan: the default Suggested Plan runs over plain HTTP and never needs
    either, but previously always showed a red "not installed" warning
    regardless.

Smaller changes

  • Documented that the SoundTouch 30 Series III uses the same factory-reset
    button combo as the original ST30, and that checking a newly-installed
    version right after an on-device update can still show stale info until
    the speaker (or an open Admin UI tab) is rebooted.
  • Removed the Go Report Card badge from the README; the linked report was
    no longer meaningful for this project.

What's Changed

  • deps(deps): bump the golang group with 3 updates by @dependabot[bot] in #625
  • fix(setup,admin-ui,install): three bugs from #621 follow-up feedback by @gesellix in #626
  • docs(readme): remove obsolete Go Report Card badge by @gesellix in #627
  • fix(admin-ui): make Migration tab actions consistently reachable by @gesellix in #628

Full Changelog: v0.125.1...v0.126.0


📦 Downloads / installation: https://gesellix.github.io/Bose-SoundTouch/docs/downloads/

v0.125.1

Choose a tag to compare

@gesellix gesellix released this 16 Aug 18:53

Noteworthy

  • Migrate tab: "Apply Suggested Plan" no longer blocks itself on a correct on-device localhost setup. Its four URL fields unconditionally rejected the hostname localhost with no awareness of on-device vs. multi-device installs, so a fresh on-device install (whose Server URL now correctly defaults to http://localhost:8000, since #546/v0.125.0) loaded the Migrate tab with Apply/Pre-flight disabled by default, before doing anything. A loopback value is now accepted when it matches the plan's own Target URL; a stray localhost typed in while Target URL is a real LAN address (the actual mistake this check exists to catch) is still flagged.

Smaller changes

Full Changelog: v0.125.0...v0.125.1


📦 Downloads / installation: https://gesellix.github.io/Bose-SoundTouch/docs/downloads/

v0.125.0

Choose a tag to compare

@gesellix gesellix released this 16 Aug 18:18

Noteworthy

  • On-device installs no longer leak the speaker's own hostname into
    BMX/TLS URLs (#546).
    soundtouch-service used to default its own
    Server URL to the machine's hostname when none was set. On an on-device
    install that machine is the speaker, so the "hostname" is its internal
    variant codename (e.g. spotty, mojo) — never resolvable, not even by
    the speaker itself, breaking TuneIn/BMX playback with a CURL ErrorCode 6. A new --deployment-mode/DEPLOYMENT_MODE setting
    (on-device/private-network/public-network) makes the fallback
    deliberate instead of guessed: on-device now defaults to localhost,
    and the on-device installer sets this automatically — no manual Settings
    step needed on a fresh or freshly-updated install. Existing installs
    that already have a Server URL saved still need a one-time manual fix
    (Settings tab, then re-run Migrate); this only prevents the bad default
    from being written going forward.
  • Reach on-device AfterTouch from the LAN without an SSH tunnel (#196).
    Some SoundTouch chassis only relay a fixed set of Bose's own ports to
    the main Linux SoC from outside the device — AfterTouch's :8000 was
    never on that list, so LAN clients silently couldn't reach it, and the
    only documented workaround was an SSH tunnel. The installer now
    auto-detects affected speakers and redirects a spare Bose port
    (:17008, the now-dead software-update listener) to AfterTouch, so
    http://<speaker-ip>:17008 just works. Configurable via
    AFTERTOUCH_LAN_PORT in aftertouch.conf if you'd rather disable it or
    pick a different port. See the new
    Model Support Matrix
    for which chassis need this.
  • aftertouch.conf now configures the on-device daemon generally, not
    just the LAN port.
    Every line in it is exported into the daemon's own
    environment, so any env var soundtouch-service reads (MGMT_USERNAME,
    MGMT_PASSWORD, etc.) can be set there and picked up on
    /etc/init.d/aftertouch restart — no more editing the init script by
    hand for on-device configuration.
  • New soundtouch-cli setup sync / setup revert commands — the same
    operations as the Admin UI's Devices → Sync Data and Migrate → Revert to
    Defaults buttons, now scriptable. setup migrate also gained
    --marge-url/--stats-url/--sw-update-url/--bmx-url overrides, for
    pointing a speaker's individual URLs anywhere (including back to the
    genuine Bose cloud) via a single telnet call.
  • Fixed a real-hardware dial storm in "Revert to Defaults." Reverting
    a migration made up to 17 separate SSH connections to the speaker in
    rapid succession, which could overwhelm it. SSH connections are now
    reused across the whole revert operation.
  • Fixed on-device upgrades/downgrades not actually replacing the running
    service.
    Three stacked init-script bugs meant a new binary could land
    on disk correctly while the old process kept running (and answering
    requests) indefinitely afterward. Re-running the installer now reliably
    restarts into the new binary.

Smaller changes

  • Fixed VERSION=X curl ... | sh silently failing to pin an install
    version — the env var never reached the right process in a pipe;
    install docs and install.sh now set it correctly (curl ... | VERSION=X sh).
  • Fixed two broken links to the Model Support Matrix in the docs.

What's Changed

  • feat(on-device): LAN access without SSH tunnel, install/restart fixes, setup sync/revert by @gesellix in #619
  • docs: fix two broken links to the model support matrix by @gesellix in #623
  • fix(on-device): stop leaking the speaker's own hostname into BMX/TLS URLs by @gesellix in #624

Full Changelog: v0.124.0...v0.125.0


📦 Downloads / installation: https://gesellix.github.io/Bose-SoundTouch/docs/downloads/

v0.124.0

Choose a tag to compare

@gesellix gesellix released this 15 Aug 13:23

Noteworthy

  • New update-check command for soundtouch-cli and soundtouch-backup
    (#591).
    soundtouch-service has had a periodic background update check
    for a while, but that's no help if you only ever run the CLI or backup
    tool standalone. Both binaries now have an on-demand
    soundtouch-cli update-check / soundtouch-backup update-check command:
    a single GitHub Releases lookup, no --host or device needed. Running the
    command is itself the opt-in, so there's no config flag or persisted
    state to manage.

  • Preset-loss recovery on the Health tab, plus corrected guidance
    (#614).
    A reporter found that on an on-device install, a speaker's
    preset slots can get wiped to empty after a reboot or clicking "Sync",
    while AfterTouch's own stored copy stays correct. The speaker_presets_count
    health check's own advice used to suggest a power-cycle as the fix — that
    turned out to be backwards, since a power-cycle is one of the reported
    triggers; the wording is corrected. The warning now also offers two
    one-click recovery options instead of re-entering presets by hand: a free
    "try a sourcesUpdated nudge first" (asks the speaker to re-fetch its full
    account data, which does include presets, though whether firmware
    re-applies them locally isn't confirmed) and a "restore presets to
    speaker" push (replays AfterTouch's stored presets onto the speaker's own
    preset slots directly, no reboot needed). Root cause of the original wipe
    is still under investigation.

Smaller changes

  • Bumped the Go toolchain to 1.26.6 across the main module, both example
    modules, the Docker build image, and the CI mock-service images.
  • Dependency updates: golang.org/x/crypto 0.54.0 → 0.55.0,
    golang.org/x/mod 0.38.0 → 0.39.0, golang.org/x/image 0.44.0 → 0.45.0,
    golang.org/x/text 0.40.0 → 0.41.0.

What's Changed

  • feat(cli): add on-demand update-check command to soundtouch-cli and soundtouch-backup by @gesellix in #611
  • docs(cli): document the update-check command in CLI-REFERENCE.md by @gesellix in #612
  • ci(deps): bump the codeql-action group with 3 updates by @dependabot[bot] in #613
  • chore: bump Go to 1.26.6, refresh example go.mod pins by @gesellix in #617
  • fix(health): preset-count guidance + restore/nudge QuickFixes for #614 by @gesellix in #616
  • deps(deps): bump the golang group with 4 updates by @dependabot[bot] in #618

Full Changelog: v0.123.0...v0.124.0


📦 Downloads / installation: https://gesellix.github.io/Bose-SoundTouch/docs/downloads/

v0.123.0

Choose a tag to compare

@gesellix gesellix released this 10 Aug 21:24

Noteworthy

  • DLNA library discovery now also asks each paired speaker for the media
    servers it can see
    , not just the SSDP sweep from the service host's own
    network segment. A speaker's LAN can include DLNA/UPnP servers the service
    host never sees (different VLAN, Wi-Fi segment, etc.). Results from every
    paired speaker's /listMediaServers are merged into the sweep, deduped by
    UDN, with unreachable speakers skipped silently.

  • The opt-in GitHub update check (#591) can now be turned on/off and
    retuned from the admin Settings page, without a restart.
    The background
    check now polls its settings live, so a Settings-page change takes effect
    within about a minute. UPDATE_CHECK_ENABLED / UPDATE_CHECK_INTERVAL
    (env var or CLI flag) remain the seed value for a fresh install that has no
    settings.json yet.

  • Duration fields in the admin Settings page (Discovery Interval, and the
    new Update Check interval) now have an inline (ⓘ) syntax help toggle
    ,
    explaining Go's 24h / 90m / 1h30m-style duration format instead of
    leaving it to guesswork.

  • Fixed the Player UI's announcement dismiss button showing the literal
    text &times;
    instead of a ×. The admin UI builds that button from an
    HTML string, where the browser decodes the entity; the Player UI's
    Preact/htm templates insert it as a text node instead, which never
    decodes entities, so the literal characters showed up on screen.

What's Changed

  • test(marge): source XML shape guard; feat(library): speaker-side media server discovery by @gesellix in #607
  • fix(player): render literal x instead of HTML entity for dismiss button by @gesellix in #608
  • feat(admin): live Settings-page toggle for the opt-in update check by @gesellix in #609

Full Changelog: v0.122.1...v0.123.0


📦 Downloads / installation: https://gesellix.github.io/Bose-SoundTouch/docs/downloads/

v0.122.1

Choose a tag to compare

@gesellix gesellix released this 09 Aug 19:07

Noteworthy

  • Speaker error messages now include the actual error name, not just a bare number. Some firmware error responses (e.g. SOURCE_ALREADY_REMOVED) restate the numeric value as the message text, so callers previously only ever saw something like "1047". DeviceError.Error() now surfaces the name attribute whenever it carries more information than the message, e.g. SOURCE_ALREADY_REMOVED (1047).

  • TuneIn requests with whitespace-only IDs are now rejected instead of silently accepted. stationID, podcastID, encoded_name, the search q, and cursor are trimmed before the existing empty-string checks run, closing a gap where a value of just spaces slipped past validation.

  • Follow-up corrections to the enable-ssh telnet-unlock work from v0.122.0 (#471, #515): further community hardware testing retracted the earlier claim that the inter-command delay itself was necessary — the real gate turned out to be whether the device is already paired (already handled automatically since v0.122.0). --command-delay's default is lowered from 5s to 3s accordingly. The getpdo verification output printed during enable-ssh and telnet migration is now labeled as reflecting the pre-reboot runtime layer only, so a clean-looking readout is no longer mistaken for proof the configuration will survive a reboot.

What's Changed

  • fix: TuneIn param trimming + surface DeviceError name attribute by @gesellix in #605
  • docs(telnet): correct envswitch/getpdo claims from #515/#471 measurements by @gesellix in #606

Full Changelog: v0.122.0...v0.122.1


📦 Downloads / installation: https://gesellix.github.io/Bose-SoundTouch/docs/downloads/

v0.122.0

Choose a tag to compare

@gesellix gesellix released this 09 Aug 10:12

Noteworthy

  • Optional update check for new releases. AfterTouch can now periodically
    check GitHub Releases for a newer version and show a dismissible notice in
    the admin UI and Player when one is found, linking straight to the release
    notes. It's off by default — this is the only network call AfterTouch
    makes beyond speaker/provider traffic, so it stays opt-in. Enable with
    UPDATE_CHECK_ENABLED=true / --update-check-enabled; interval defaults to
    24h via UPDATE_CHECK_INTERVAL / --update-check-interval. One
    unauthenticated GET per interval to api.github.com, nothing else leaves
    the box. (#591)

  • Announcement banners can now carry a real link, not just a raw URL
    pasted into the message text — used by both the update-check notice above
    and the existing admin-area-login notice (#419).

  • enable-ssh --full-config gained a configurable pause between its
    commands
    (--command-delay, default 5s), and now prints an upfront
    estimate of the total injection time so the command doesn't look hung. A
    real device left sshd down after reboot when the same 6 commands were sent
    back-to-back, but succeeded when sent one at a time with a few seconds
    between each — same device, same order, minutes apart. (#515)

  • enable-ssh now pairs an unpaired (factory-reset) device before running
    the injection.
    On a device with no margeAccountUUID set yet, the
    speaker reportedly never polls margeServerUrl at all, so the injection
    would have no read cycle to fire on. Pairing an unpaired device is
    harmless, so this runs by default; skip it with --no-auto-pair, or pin a
    specific account with --account instead of getting a random generated
    one. (#515)

  • setup ssh-check's failure message no longer tells you SSH-enable is
    impossible on your firmware.
    It previously claimed the telnet commands
    needed to enable SSH were removed on FW 27.x — flatly contradicted by
    setup enable-ssh, which exists specifically to bootstrap SSH on those
    firmwares. The message now points at enable-ssh first, with a USB stick
    as the fallback for stubborn devices. (#598)

  • New troubleshooting guidance for Lifestyle/CineMate console systems.
    These consoles have inputs (Blu-ray, HDMI, etc.) that live outside
    SoundTouch entirely, and a POWER key press between test attempts puts
    them into standby and back to their own input on waking — unlike a plain
    speaker, where it's a harmless stop. A test loop that powers the console
    between trials can silently drop off SoundTouch after the first attempt,
    making every later source report INVALID_SOURCE regardless of whether it
    would actually have played. (#597)

What's Changed

  • feat(update-check): opt-in periodic check against GitHub Releases (#591) by @gesellix in #599
  • feat(announcements): support a proper link in announcement banners by @gesellix in #600
  • docs/fix: Lifestyle console guidance, ssh-check message, configurable enable-ssh delay by @gesellix in #601
  • ci(docs): treat non-404 4xx link-check failures as warnings by @gesellix in #602
  • feat(cli): auto-pair unpaired devices before enable-ssh; bump default delay to 5s by @gesellix in #603

Full Changelog: v0.121.0...v0.122.0


📦 Downloads / installation: https://gesellix.github.io/Bose-SoundTouch/docs/downloads/