26 commits since v2026.05.18.0. Mobile client 2026.5.19+10. CI green on dev.
Headline: the Flutter media/playback experience now behaves like a real media app, and the whole app is on the Lucide icon set.
MediaSession / playback (Flutter):
Fixed the mini-player / watch ~30s stale-track race (logical-index base; the audio_service stream the watch mirrors).
Audio focus / interruptions / becoming-noisy via audio_session (pause for calls, duck for nav, pause on earbud unplug).
MediaSession terminal-state teardown: watch tile / notification close when idle 5 min or dismissed-while-paused.
Resume-last-session on relaunch, plus resume on a media-button press when the session was fully torn down.
Periodic PlaybackState refresh so the lock-screen / Wear / Auto scrubber advances smoothly (+ notification progress bar).
Notification favorite via MediaControl.custom + customAction (NOT the broken setRating path — audio_service #376).
AudioServiceConfig: art downscale + preload for external surfaces.
Playback errors surfaced via a debounced/coalesced SnackBar instead of a silent skip.
Lidarr (backend):
Durable approve: a Lidarr-down approve no longer 503s/stays-pending — the reconciler idempotently retries the add until it sticks (migration 0031).
Idempotent Create() — a non-terminal request for the same MBID returns the existing row.
Design system:
Full Lucide migration: 30 files swept Material Icons.* → LucideIcons.* (signed-off map); LikeButton + notification heart re-derived from the verbatim Lucide heart path (outline vs filled).
Deferred / tracked (not in this release): #399 (flutter-ci libsqlite3 → re-enable skipped drift tests; needs operator runner-image rebuild).
⚠️ Operator note: per the explicit "full send" decision, this batch shipped CI-green but with zero on-device verification. After deploying the release APK, smoke-check: icons render correctly app-wide; mini-player/playlist-marker update instantly; call/earbud interruptions; watch tile teardown + media-button resume; the notification favorite. Hotfix-release anything that looks wrong.
26 commits since v2026.05.18.0. Mobile client `2026.5.19+10`. CI green on dev.
**Headline: the Flutter media/playback experience now behaves like a real media app, and the whole app is on the Lucide icon set.**
MediaSession / playback (Flutter):
- Fixed the mini-player / watch ~30s stale-track race (logical-index base; the audio_service stream the watch mirrors).
- Audio focus / interruptions / becoming-noisy via `audio_session` (pause for calls, duck for nav, pause on earbud unplug).
- MediaSession terminal-state teardown: watch tile / notification close when idle 5 min or dismissed-while-paused.
- Resume-last-session on relaunch, plus resume on a media-button press when the session was fully torn down.
- Periodic PlaybackState refresh so the lock-screen / Wear / Auto scrubber advances smoothly (+ notification progress bar).
- Notification favorite via `MediaControl.custom` + `customAction` (NOT the broken `setRating` path — audio_service #376).
- AudioServiceConfig: art downscale + preload for external surfaces.
- Playback errors surfaced via a debounced/coalesced SnackBar instead of a silent skip.
Lidarr (backend):
- Durable approve: a Lidarr-down approve no longer 503s/stays-pending — the reconciler idempotently retries the add until it sticks (migration `0031`).
- Idempotent `Create()` — a non-terminal request for the same MBID returns the existing row.
Design system:
- Full Lucide migration: 30 files swept Material `Icons.*` → `LucideIcons.*` (signed-off map); `LikeButton` + notification heart re-derived from the verbatim Lucide heart path (outline vs filled).
Deferred / tracked (not in this release): #399 (flutter-ci libsqlite3 → re-enable skipped drift tests; needs operator runner-image rebuild).
⚠️ Operator note: per the explicit "full send" decision, this batch shipped CI-green but with **zero on-device verification**. After deploying the release APK, smoke-check: icons render correctly app-wide; mini-player/playlist-marker update instantly; call/earbud interruptions; watch tile teardown + media-button resume; the notification favorite. Hotfix-release anything that looks wrong.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
26 commits since v2026.05.18.0. Mobile client
2026.5.19+10. CI green on dev.Headline: the Flutter media/playback experience now behaves like a real media app, and the whole app is on the Lucide icon set.
MediaSession / playback (Flutter):
audio_session(pause for calls, duck for nav, pause on earbud unplug).MediaControl.custom+customAction(NOT the brokensetRatingpath — audio_service #376).Lidarr (backend):
0031).Create()— a non-terminal request for the same MBID returns the existing row.Design system:
Icons.*→LucideIcons.*(signed-off map);LikeButton+ notification heart re-derived from the verbatim Lucide heart path (outline vs filled).Deferred / tracked (not in this release): #399 (flutter-ci libsqlite3 → re-enable skipped drift tests; needs operator runner-image rebuild).
⚠️ Operator note: per the explicit "full send" decision, this batch shipped CI-green but with zero on-device verification. After deploying the release APK, smoke-check: icons render correctly app-wide; mini-player/playlist-marker update instantly; call/earbud interruptions; watch tile teardown + media-button resume; the notification favorite. Hotfix-release anything that looks wrong.