From 74420a4d02db5c69e895efe12766a6fa4930e016 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Fri, 15 May 2026 19:36:43 +0200 Subject: [PATCH] docs(web): add stereo-pair rendering to soundtouch-web roadmap Section 4 captures the presentation-only follow-up to #252: collapse the two halves of a stereo pair into a single device-list entry using each speaker's GET /getGroup metadata. Pair lifecycle (add/rename/remove) already works end-to-end via pkg/client + soundtouch-cli, so this is purely a soundtouch-web UI concern. Drafted after BirdyBA's stereo-pair confirmation on the closed #252: https://github.com/gesellix/Bose-SoundTouch/issues/252#issuecomment-4458140305 Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/soundtouch-web-roadmap.md | 44 +++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/docs/soundtouch-web-roadmap.md b/docs/soundtouch-web-roadmap.md index da2abbc..07effad 100644 --- a/docs/soundtouch-web-roadmap.md +++ b/docs/soundtouch-web-roadmap.md @@ -1,6 +1,6 @@ # soundtouch-web: remaining features -Three features complete the parity gap between soundtouch-web and the Stockholm +Four features complete the parity gap between soundtouch-web and the Stockholm app's local-control functionality. Everything else in Stockholm (OAuth flows, setup wizard, service account linking, onboarding, analytics) is cloud infrastructure that is either shut down or already handled by soundtouch-service. @@ -86,6 +86,48 @@ rename and network/firmware info. --- +## 4. Render stereo pairs as a single device + +Today soundtouch-web shows the two halves of a stereo pair (formed via +`/addGroup` — see issue #252) as independent entries in the device list. The +Bose app collapsed a paired ST10 set into one "L+R" entry; restoring that +presentation closes the perception gap BirdyBA flagged at +. + +**Device API:** +- `GET /getGroup` on each speaker — returns the current `` with + `` + `` (each `` carries the speaker's + deviceId, role `LEFT|RIGHT`, and ipAddress) +- Empty `` means the speaker is standalone +- Querying the master and slave returns the same `` payload, so either + side is sufficient to detect the pair + +**Backend:** +- During device-list assembly, call `GET /getGroup` for each discovered device + in parallel (matches the propagation pattern already used by + `soundtouch-cli group create` in `cmd/soundtouch-cli/cmd_group.go`) +- Bucket devices by `` — each bucket emits one entry in the + list response. Standalone devices stay as their own bucket-of-one +- Expose pair metadata on the list entry so the UI can render role chips + (`L`/`R`) and resolve role → physical device for actions + +**Frontend:** +- Device list collapses paired devices into one card titled with both names + (e.g. `"Wohnzimmer L+R"`) and role chips +- Clicking the card opens a device-detail page that exposes both per-role + status and a "Dissolve pair" action (DELETE flow, already wired in + `soundtouch-cli group remove` and in fakespeaker's `/removeGroup` GET) +- Standalone speakers continue to render as today + +**Note:** Pair lifecycle (create / rename / remove) already works +end-to-end — `pkg/client` group endpoints + `cmd/soundtouch-cli/cmd_group.go`, +covered by tests in `cmd/soundtouch-cli/cmd_group_test.go` and exercisable +against the fake speaker's group routes +(`pkg/service/testing/fakespeaker/fakespeaker.go`). This task is purely about +presentation in soundtouch-web's device list — no protocol work required. + +--- + ## Decide later | Feature | Reason |