v0.9.0
This release is about making the flaky parts reliable: YouTube Music playback moves to a native botguard, ListenBrainz scrobbling gets retries and accuracy work, and the UI stops stuttering on large libraries now that data queries run off the UI thread.
Highlights
Native botguard. The webview pot minter and wry stream decryption are replaced with an embedded Deno runtime. Botguard now runs the same way on every OS, which resolves a whole class of YouTube Music playback issues (#386, #477, #489).
More reliable scrobbling. ListenBrainz submissions retry on 429/5xx/timeout with backoff, stale playing_now updates are no longer retried, MusicBrainz matching is more accurate, and scrobble tasks survive page navigation instead of getting dropped. Detailed logging makes scrobble outcomes traceable.
Smoother UI on big libraries. sqlx row decoding, InnerTube JSON parsing, and other data-query work moved off the UI thread, the playlist query was de-N+1'd, and the showcase memoizes track clone/sort out of the scroll path. Large queries no longer stall scrolling.
Features
- Settings sections are grouped into bordered section cards with labeled headers; Connectivity moved out of General.
- Flatpak browser support for cookie sign-in, with
KOPUZ_BROWSER_FLATPAK_IDandKOPUZ_BROWSER_COMMANDoverrides for other browsers and install methods. - Clear image cache and force rescan buttons for local covers, so you don't have to dig through the file manager.
- Opt-in UI render profiler via
KOPUZ_UI_PROFILE. - Dropped the wasm32/web build target.
- Contributor onboarding: pull request template, commit message guidelines enforced in CI, and an agent development guide.
Fixes
- server: don't split the Windows browser path on spaces during cookie import.
- scrobble: keep scrobble tasks alive across page navigation.
- scrobble: stop retrying stale ListenBrainz
playing_nowsubmissions. - images: prevent overlapping cover re-extraction jobs.
- kopuz: drop launcher self-registration on launch.
What's Changed
- feat: add clear cache and force rescan images(local) by @temidaradev in #479
- meta: improve contributor onboarding and contribution QA by @NotAShelf in #485
- feat: flatpak browser support by @yofukashino in #480
- treewide: drop the wasm32/web build target by @temidaradev in #488
- kopuz: add opt-in UI render profiler via
KOPUZ_UI_PROFILEby @NotAShelf in #490 - components/showcase: memoize track clone/sort off the scroll path by @NotAShelf in #491
- scrobble/musicbrainz: retry ListenBrainz submits on 429/5xx/timeout by @temidaradev in #492
- various: detailed scrobble logging and accuracy for MusicBrainz by @temidaradev in #493
- Add AGENTS.md agent dev guide by @UMCEKO in #465
- treewide: move data-query CPU off the UI thread by @UMCEKO in #494
- various: group settings sections into bordered section cards by @temidaradev in #497
- Implement native botguard by @UMCEKO in #501
- server/cookies: don't split the Windows browser path on spaces by @UMCEKO in #502
New Contributors
- @yofukashino made their first contribution in #480
Full Changelog: v0.8.2...v0.9.0