Persistent release signing key. Earlier releases were silently falling back to the per-machine debug keystore, so each CI run signed with a different key and Android refused in-app upgrades at the scanner step. build.gradle.kts now reads ANDROID_KEYSTORE_PATH (decoded from a base64 CI secret) and signs with the operator's persistent keystore; falls back to debug for local builds. CI hard-errors on a tagged build if the secret is missing. Operator action: existing installs need a one-time uninstall before this APK can install.
Library tabs: infinite scroll. _libraryArtistsProvider and _libraryAlbumsProvider were single-page FutureProviders so once the user scrolled past 50 items the list ended. Replaced with AsyncNotifier + loadMore() that appends the next page using items.length as offset. NotificationListener fires loadMore at maxScrollExtent - 800px so the next page lands before the user reaches the visible bottom.
Two changes since v2026.05.11.1.
Persistent release signing key. Earlier releases were silently falling back to the per-machine debug keystore, so each CI run signed with a different key and Android refused in-app upgrades at the scanner step. build.gradle.kts now reads ANDROID_KEYSTORE_PATH (decoded from a base64 CI secret) and signs with the operator's persistent keystore; falls back to debug for local builds. CI hard-errors on a tagged build if the secret is missing. Operator action: existing installs need a one-time uninstall before this APK can install.
Library tabs: infinite scroll. _libraryArtistsProvider and _libraryAlbumsProvider were single-page FutureProviders so once the user scrolled past 50 items the list ended. Replaced with AsyncNotifier + loadMore() that appends the next page using items.length as offset. NotificationListener fires loadMore at maxScrollExtent - 800px so the next page lands before the user reaches the visible bottom.
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.
Two changes since v2026.05.11.1.
Persistent release signing key. Earlier releases were silently falling back to the per-machine debug keystore, so each CI run signed with a different key and Android refused in-app upgrades at the scanner step. build.gradle.kts now reads ANDROID_KEYSTORE_PATH (decoded from a base64 CI secret) and signs with the operator's persistent keystore; falls back to debug for local builds. CI hard-errors on a tagged build if the secret is missing. Operator action: existing installs need a one-time uninstall before this APK can install.
Library tabs: infinite scroll. _libraryArtistsProvider and _libraryAlbumsProvider were single-page FutureProviders so once the user scrolled past 50 items the list ended. Replaced with AsyncNotifier + loadMore() that appends the next page using items.length as offset. NotificationListener fires loadMore at maxScrollExtent - 800px so the next page lands before the user reaches the visible bottom.