🌸Spring 2026 Pebble App Contest — View the entries!

Changelog

Version 1.2.12026-06-22T18:08:03.867

### Fixed

- **Pausing playback no longer snaps the watch to the alphabetically-first paused player.** When the active player transitioned from playing to paused, the auto-pick fell back to "first paused player alphabetically" — which is rarely the same one you just paused. The phone-side resolver now remembers whichever queue it last rendered and prefers to keep it across polls, as long as it's still available. Defeated only by another player actually starting to play, or by the user explicitly picking a different player.

Version 1.2.02026-06-22T18:04:51.548

### Added

- **Marquee scrolling for the title and album lines.** When either text overflows the visible band, the line pauses 3 s at the start, sweeps right-to-left at 50 px/s, snaps back, and loops. Static when the text fits. Driven by a dedicated 25 fps timer that is gated by `app_focus_service` and the now-playing window's appear/disappear handlers, so it sleeps with the watch and pauses while a sub-window is on top.
- **Optimistic feedback on transport toggles.** Tapping play/pause, shuffle, or repeat now flips the on-screen icon the instant the touch is registered — no more 300 ms wait for the next phone poll to confirm. The next snapshot from the server overwrites if it disagrees, which is rare.

### Changed

- The second line of the now-playing screen now shows just the **album**. The artist still lives on line 1 (Music Assistant typically formats `current_item.name` as `Artist - Title`), so duplicating it on line 2 was wasted space.

Version 1.1.02026-06-22T17:32:16.04

- **Two-row volume window for groups.** When the active control player is part of a sync-group, the volume window now shows two rows — group overall on top, this-player only underneath. Tap a row to focus it; the focused row gets a cerulean accent strip and brighter title. Hardware buttons always change the focused row's volume (`UP` / `DOWN` step ±5, `SELECT` toggles mute). Solo players keep the single-row volume window unchanged.
  - Group writes go via `players/cmd/group_volume` + `players/cmd/group_volume_mute` on the master.
  - Individual writes go via `players/cmd/volume_set` + `players/cmd/volume_mute` on the chosen player.

- **Home Assistant authentication.** The settings page now offers a radio between **Music Assistant** (today's username + password) and **Home Assistant** (OAuth via Music Assistant's `homeassistant` provider — only works when MA is running as the HA add-on). Both options are always visible; pick the one that fits your setup.
  - HA flow: clicking **Sign in with Home Assistant** calls `auth/authorization_url` on MA, redirects the browser to HA, lets MA's server-side `/auth/callback` exchange the code, then bounces back to the settings page with the bearer token ready to use.
  - Signed-in badge with display name + role + "Sign out" button after either auth path succeeds. Sign out revokes the token server-side (`auth/logout`) and clears the local state.
  - Token validation on app start via `auth/me`. Builtin mode silently re-auths on 401 using stored credentials. HA mode surfaces "Sign in expired — open Settings" and waits for the user.

### Fixed

- **Selecting a non-master member in the player list now actually controls that member.** Previously, picking Den (synced to Office) snapped the now-playing screen back to Office and you couldn't tweak Den's volume. The phone-side bridge now tracks two separate ids: `activeQueueId` (the master's queue, where playback state lives) and `controlPlayerId` (the user's literal pick, where volume / mute commands go). The now-playing header now shows the chosen member's name.

Version 1.0.12026-06-22T15:49:46.054

* First Version
* Supports "Now Playing"
* Supports Volume Control
* Supports "Quick Play" of defined Items( via Settings), 
* Supports Selecting and Switching Players
* Supports Grouping and Ungrouping Players
* Supports Shuffle and Repeat Controls