feat(pwa): installable PWA, richer media session, theme-matched window, global scrobble graph in audio settings
PWA
- apps/web: add VitePWA (autoUpdate) — manifest, icons, service worker;
precache app shell + assets (5 MB ceiling for the rockbox core); navigate
fallback with an OAuth/login denylist so auth still reaches the app-proxy.
- Window / browser-chrome colour matches the active theme background: manifest
uses the default dark bg (#130825); __root keeps <meta name="theme-color"> in
sync with the light/dark toggle. web-mobile aligned to #130825 too.
Media Session (web + web-mobile)
- Mirror the mini-player: title, artist, album + multi-size artwork, live
play/pause state, a scrubbable position (setPositionState), and all transport
actions (play/pause/prev/next + seekto/seekforward/seekbackward). Handlers are
re-bound per active engine so the right backend is driven.
Audio settings
- Show the global scrobble stats graph on /settings/* (ScrobblesAreaChart fell
through to empty data there — now uses getScrobblesChart()).
feat(pwa): installable PWA, richer media session, theme-matched window, global scrobble graph in audio settings
PWA
- apps/web: add VitePWA (autoUpdate) — manifest, icons, service worker;
precache app shell + assets (5 MB ceiling for the rockbox core); navigate
fallback with an OAuth/login denylist so auth still reaches the app-proxy.
- Window / browser-chrome colour matches the active theme background: manifest
uses the default dark bg (#130825); __root keeps <meta name="theme-color"> in
sync with the light/dark toggle. web-mobile aligned to #130825 too.
Media Session (web + web-mobile)
- Mirror the mini-player: title, artist, album + multi-size artwork, live
play/pause state, a scrubbable position (setPositionState), and all transport
actions (play/pause/prev/next + seekto/seekforward/seekbackward). Handlers are
re-bound per active engine so the right backend is driven.
Audio settings
- Show the global scrobble stats graph on /settings/* (ScrobblesAreaChart fell
through to empty data there — now uses getScrobblesChart()).
feat(pwa): installable PWA, richer media session, theme-matched window, global scrobble graph in audio settings
PWA
- apps/web: add VitePWA (autoUpdate) — manifest, icons, service worker;
precache app shell + assets (5 MB ceiling for the rockbox core); navigate
fallback with an OAuth/login denylist so auth still reaches the app-proxy.
- Window / browser-chrome colour matches the active theme background: manifest
uses the default dark bg (#130825); __root keeps <meta name="theme-color"> in
sync with the light/dark toggle. web-mobile aligned to #130825 too.
Media Session (web + web-mobile)
- Mirror the mini-player: title, artist, album + multi-size artwork, live
play/pause state, a scrubbable position (setPositionState), and all transport
actions (play/pause/prev/next + seekto/seekforward/seekbackward). Handlers are
re-bound per active engine so the right backend is driven.
Audio settings
- Show the global scrobble stats graph on /settings/* (ScrobblesAreaChart fell
through to empty data there — now uses getScrobblesChart()).