release / govulncheck (push) Successful in 16s
release / web (push) Successful in 1m30s
release / go (push) Successful in 1m46s
release / android (push) Successful in 5m2s
release / Build signed APK (releases and dev) (push) Successful in 5m13s
release / integration (push) Successful in 5m22s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 13s
release / Verify release artifacts (tag releases only) (push) Skipped
ci/version.sh --apk names the APK from android/ alone, and the APK lane calls it. The app offers an update when the server's APK name differs from its own, so a name derived from the whole repo offered every phone a rebuild of the app it already had on each server-only deploy. The image keeps the union set: it bundles the APK under client/. Casting (#6456): - setMediaItems with the tracks already queued (play the queued album from another track) cleared the cast and waited for a resync that the id-keyed collector never ran. It is now a move within the queue: Seek TRACK_NR on a Sonos, start that track on a one-track renderer; the play() goes through. - A queue replaced through setMediaItems could take the Sonos incremental diff, which cleared target without restoring active, so the app thought it was back on the phone while the speaker played on, and the chosen start track was ignored. The diff now runs only while the route is still active; a replaced queue reloads in full at its start index. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>