Version 2.16.0
TestFlight build 137 · Play version code 158
Your wallpaper stays yours
- A background image is no longer painted over on album and artist pages. The artist header drew a blurred photograph across the top of the screen and album pages washed it in the cover's colour — two backdrops competing, and the one you chose lost. Both step aside now; the artist is still named by the round photo and the album by its cover
- The artist header also stops holding room for art it no longer draws, so four tracks sit above the fold where one did
When something can't be reached
- Home says when it can't reach your server, not just when you're offline. Every discovery shelf is a request, so they would all quietly disappear — the one case worth announcing was the one it stayed silent for
- Radio says when your server doesn't offer it. It used to report "Couldn't load. Check your connection." and offer a Try again that could never work
- Shelves that fail to load say so instead of vanishing, and say it in your language — four of them had their error and empty text written in English only
- A shelf no longer claims to be empty while it is still loading
- Shared links can be pulled to refresh, like podcasts and radio already could
Playback
- Opus, where your server offers it. Navidrome ships an Opus profile and downsamples to Opus by default; Yuzic asked for MP3 regardless, so the bitrate you picked bought less than it could. Held to what your device can decode — iOS has no Opus decoder and still gets MP3
Appearance
- Profiles: keep more than one look and switch between them. The Yuzic look always stays as it was
- Drag and zoom a background photo to choose the part that shows, with a live preview
- Text size and spacing are separated into Text and Layout. They answer different questions, and the combination that makes them look alike — large text with tight rows — is the one that has to stay reachable
Under the hood
- Six Home shelves had each written out the same carousel and drifted apart in the ways copies do: four spelled their state text in English, two never checked for failure at all, one announced it was empty while still filling. One
ShelfCarouselowns the four states now, and roughly 300 lines went with the duplication - Radio, Podcasts and Shares each wrote the same five-state ladder. It is one pure function and one component now, which is how Radio's missing "not supported here" state became visible
- Two
withAlphaexports had the same signature and disagreed about failure: one threw, the other returned the colour fully opaque for anything it could not parse — includingtransparent. Eight call sites imported the quiet one - Ten hand-rolled destructive confirms now share the one that already existed, which had been filed somewhere only entity actions could find it
- A lint rule tells a glyph that sits beside text from one that holds a fixed-height strip — the same split the corner preset already had, one scale over. It found ten exemptions and no misses, so the exemptions were removed rather than annotated: the appearance pickers now hand their icons a size instead of baking one in
- A
themekey an earlier migration removed was reading itself back in on every launch, through the code meant to delete it