Releases: TheZupZup/Linthra
Release list
Linthra v0.2.3
Linthra v0.2.3
Linthra 0.2.3 is a community-driven stability and Linux desktop release, with stronger playback recovery, safer session restoration, better self-hosted server handling, and the first Audiobookshelf integration foundation.
What's new
- Linux playback recovers instead of getting stuck. Mid-stream server and network failures now use bounded recovery, a buffering watchdog, sibling-source fallback when available, and a clear Retry path instead of looping forever.
- Temporary network drops have a real reconnect state. Now Playing can show Reconnecting… while Linthra re-resolves a fresh authenticated stream URL and resumes near the preserved position.
- Suspend/resume is much safer on Linux. A track that was actively playing before system sleep can be re-resolved and reloaded after wake on the same player, while a track the user paused stays paused.
- Crash-safe Linux playback restoration. After an unexpected restart, Linthra can restore the logical queue, current item, repeat/shuffle state, and position as a paused session. It never persists authenticated stream URLs or provider tokens, and remote tracks re-resolve normally when playback resumes.
- Audiobookshelf support has started. This release adds the connection, authentication, server validation, session model, and library-listing foundation. Audiobook playback, chapters, progress sync, bookmarks, and offline audiobook support remain follow-up milestones.
- Self-hosted server URLs are more robust. Jellyfin, Plex, and Subsonic/Navidrome now share one URL-normalization path, including correct handling for IPv6 literal hosts.
- Large source re-syncs are cheaper. The local database now indexes
tracks.source_id, avoiding a full catalog scan when one source is refreshed. Existing databases migrate automatically. - Linux library defaults fit the desktop better. The folder chooser can start from the user's XDG Music directory instead of assuming
~/Music, including localized or relocated Music folders. - System theme behavior is documented and guarded across desktop/mobile. Linthra keeps one shared Flutter
ThemeMode.systempath rather than adding GNOME/KDE-specific theme code. - Player accessibility improved. The custom play/pause control now exposes the proper button role and enabled state to assistive technologies.
Linux reliability
The recent Linux playback work intentionally reuses Linthra's existing playback controller rather than creating provider-specific retry systems or extra players. Recovery is bounded, concurrent recovery triggers are coalesced, and failure still ends in a normal user-visible error/Retry state.
Real hardware timing can vary after suspend — especially with Bluetooth, PipeWire/PulseAudio, or networking that returns after the Flutter lifecycle signal — so docs/linux-desktop.md includes the manual matrix used for milestone testing.
Audiobookshelf status
Audiobookshelf in v0.2.3 is the first integration milestone, not the complete audiobook player. The foundation validates the server before credentials are sent, uses the server's supported login/token flow, and keeps session parsing defensive against corrupt persisted data.
The next milestones can build browsing/domain models, chapters/playback, progress sync, bookmarks, and offline behavior on top of this base without mixing audiobook behavior into the existing music providers.
Android and F-Droid
Android remains a first-class target. The Linux-specific recovery/restore paths are gated so Android screen-on and normal mobile lifecycle behavior do not begin auto-restarting playback.
The canonical Android version for this release is:
- versionName:
0.2.3 - base versionCode:
203999
F-Droid's split-ABI scheme remains:
- armeabi-v7a:
2039991 - arm64-v8a:
2039992 - x86_64:
2039993
GitHub APKs and F-Droid packages remain signed by different keys, so users should keep updating from the same install source they originally chose.
Linux download
The GitHub Release workflow can attach:
Linthra-v0.2.3-linux-x64.tar.gz
This is the native Flutter Linux bundle, not the future Flatpak. Runtime requirements and the current Linux support matrix are documented in docs/linux-desktop.md.
Upgrade notes
No manual migration is required. The SQLite schema upgrade that adds the source index is handled automatically, and crash-safe playback state uses defensive versioned persistence. Existing Android library/settings data remain in place during a normal same-source update.
Community
A big part of v0.2.3 came from community contributions across self-hosted server support, Audiobookshelf, accessibility, database performance, Linux desktop integration, and playback reliability.
Special thanks to @jpdexter101-lang and @Borhan2004 for their contributions to this release. These acknowledgements are release-level thanks, not a one-to-one mapping between each nearby feature bullet and a specific commit author.
Thank you to everyone testing Linthra, reporting edge cases, reviewing changes, and helping the project grow.
Linthra v0.2.2
Linthra v0.2.2
Linthra 0.2.2 is a feature and stability release for Android, with the first official native Linux release path alongside it.
What's new
- Now Playing feels smoother. The playback progress control now uses Linthra's wavy seek bar, with a stable seek handoff so the marker does not snap back while the player catches up.
- Synced lyrics got a full presentation pass. The active line follows cleanly in-place on Now Playing, surrounding lines use progressive emphasis, and the layout stays stable while the active line changes.
- Artwork survives restarts. Remote artwork can be kept in Linthra's managed disk cache instead of being downloaded again every time the app opens.
- Automatic song precaching is optional. It can be disabled independently; normal streaming and explicit/manual downloads keep working.
- Linux now has real native playback. Linthra can build and run as a native Flutter Linux app using the Linux media backend, and official releases can publish an x64 Linux bundle from GitHub Actions.
Stability and accessibility
This release also includes fixes around seek acknowledgement, short lyrics layouts, timed-lyrics geometry, reduced-motion behavior, keyboard/screen-reader semantics in the updated player controls, and stronger Linux lifecycle/build validation.
Android and F-Droid
Android remains a first-class target and the normal F-Droid source-build path stays separate from GitHub release signing.
The canonical Android version for this release is:
- versionName:
0.2.2 - base versionCode:
202999
F-Droid's split-ABI build keeps Linthra's established base * 10 + ABI rank scheme:
- armeabi-v7a:
2029991 - arm64-v8a:
2029992 - x86_64:
2029993
The release tooling now preserves that transformed F-Droid CurrentVersionCode instead of accidentally writing the untransformed base code. The committed pubspec.lock, Rust Cargo.lock, per-ABI Gradle override, and canonical GitHub per-ABI asset names remain part of the reproducible-build guardrails.
F-Droid builds from source and can appear later than the GitHub Release while its own update/build/review pipeline runs.
Linux download
The GitHub Release workflow can attach:
Linthra-v0.2.2-linux-x64.tar.gz
This is the native Flutter Linux bundle, not the future Flatpak. It may still require the Linux runtime libraries documented in docs/linux-desktop.md. Flatpak/Flathub packaging and deeper desktop integration such as MPRIS remain separate roadmap work.
Upgrade notes
No migration step is required. Existing Android installs keep their library/settings data during a normal same-source update. As always, GitHub APKs and F-Droid packages are signed by different keys, so do not switch install sources on top of an existing installation.
Linthra v0.2.1
Linthra v0.2.1 — release notes
Linthra v0.2.1 is a maintenance release focused on reproducible source builds and F-Droid compatibility. It keeps the v0.2.0 player behavior intact while fixing the Rust dependency-locking issue that blocked F-Droid's source build pipeline.
- Version:
0.2.1(versionName),versionCode201999 - Platform: Android
- Application ID:
io.github.thezupzup.linthra - License: MPL-2.0
What's new
F-Droid source-build fix
- Commits
native/linthra_core/Cargo.lockso the Rust dependency manifest has a matching lockfile in the tagged source tree. - This resolves the dependency-scanner failure introduced when the standalone Rust core was added in v0.2.0.
- Rust Clippy, unit tests, and the 200k-track benchmark now run with
--locked, preventing CI from silently changing dependency resolution.
No player behavior changes
- Playback, local library behavior, Jellyfin, Navidrome / Subsonic, Plex, offline cache, casting, Android Auto, playlists, favorites, and onboarding remain functionally unchanged from v0.2.0.
- This patch exists so the next immutable release tag contains the complete dependency-locking state F-Droid expects.
Upgrade and distribution notes
- Normal in-place updates preserve accounts, settings, playlists, catalog, favorites, and cache.
- Do not mix GitHub and F-Droid installations because the APKs use different signing keys and cannot update one another.
- F-Droid builds and signs its own APKs from the source tag; GitHub Release APKs are signed by the upstream project.
- The existing
v0.2.0tag remains untouched and immutable; v0.2.1 carries the source-build correction forward.
No ads, no tracking, no analytics, no telemetry. Linthra plays music you already own or that your own server provides.
Linthra v0.2.0
Linthra v0.2.0 release notes
Linthra is an Android music player for local files and self-hosted music servers. v0.2.0 introduces a proper first-run experience for new installs and expands the project foundations for future performance work and broader open-source contributions.
- Version:
0.2.0(versionName),versionCode200999 - Platform: Android
- Application ID:
io.github.thezupzup.linthra - License: MPL-2.0
What's new
A real first-run welcome
- New installs now open a guided welcome instead of dropping directly into an empty library.
- The source chooser helps users start with local music, Jellyfin, Navidrome / Subsonic, or Plex.
- Notification permission is deferred until the welcome has completed so first launch stays focused on setup.
- The welcome can be replayed later from Settings.
Existing installs stay out of the way
- Linthra now records onboarding completion and detects Android install history during startup.
- Existing users upgrading from an earlier version continue into the normal app instead of being treated like a fresh install.
- The startup state is resolved before the router is built, preventing a temporary jump into the wrong screen.
More resilient onboarding UI
- The welcome layout now uses the actual SafeArea constraints and handles very short viewports without producing invalid layout constraints.
- Regression coverage protects first-run routing, upgrade classification, onboarding persistence, and short-screen layout behavior.
Project foundations for v0.2.x
This release also opens more of Linthra to contributors working outside Dart while keeping these components deliberately separate from the shipped playback path until they are ready to be integrated.
- A Rust
linthra_coreprototype provides a deterministic large-library search index and a 200k-track benchmark. - A native C++ audio DSP project defines an allocation-free processing chain, stable C ABI, EQ/preamp/limiter tests, and a realtime-safety benchmark.
- Python and SQL tooling can generate and benchmark a deterministic 200k-track SQLite library.
- CI now validates the Rust core, C++ DSP work, and large-library SQL benchmark independently.
- Contributor documentation maps real areas where Dart, Kotlin, Rust, C++, Python, and SQL can be used in Linthra.
These native and tooling projects are foundations for future work; v0.2.0 does not claim that Rust search or the C++ DSP chain has replaced the current Flutter playback/search implementation yet.
Upgrade and distribution notes
- Normal in-place updates preserve accounts, settings, playlists, catalog, favorites, and cache.
- Existing installs should bypass the new first-run welcome automatically.
- Do not mix GitHub and F-Droid installations because the APKs use different signing keys and cannot update one another.
- F-Droid builds and signs its own APKs from the source tag; GitHub Release APKs are signed by the upstream project.
No ads, no tracking, no analytics, no telemetry. Linthra plays music you already own or that your own server provides.
Linthra v0.1.15
Linthra v0.1.15 — release notes
Linthra is an Android music player for local files and self-hosted music servers. v0.1.15 is a focused player-interface stability release for Navidrome, Jellyfin, Plex, local music, offline cache, and casting.
- Version:
0.1.15(versionName),versionCode115999 - Platform: Android
- Application ID:
io.github.thezupzup.linthra - License: MPL-2.0
What's new
A steadier Now Playing screen
- The Now Playing screen no longer jumps when playback moves between source, buffering, cache, casting, and error indicators.
- The fix applies to Navidrome/Subsonic, Jellyfin, Plex, local music, offline cache, and casting because they share the same player status area.
- The status area now reserves one stable height, keeping track metadata, the progress bar, and transport controls in place.
- Long playback errors stay on one line with an ellipsis instead of expanding the layout.
Better large-text support
- The stable status area grows with the system text scale.
- Larger accessibility text remains readable without overlapping or moving the controls.
- A widget regression test verifies the transition from
Playing from NavidrometoBuffering…toPlaying from Cachewithout vertical movement.
Upgrade and distribution notes
- Normal in-place updates preserve accounts, settings, playlists, catalog, favorites, and cache.
- No playback routing, seeking, provider, cache, or streaming behavior changed in this release.
- Do not mix GitHub and F-Droid installations because the APKs use different signing keys and cannot update one another.
- F-Droid builds and signs its own APKs from the source tag; GitHub Release APKs are signed by the upstream project.
No ads, no tracking, no analytics, no telemetry. Linthra plays music you already own or that your own server provides.
Linthra v0.1.14
Linthra v0.1.14 release notes
Linthra is an Android music player for local files and self-hosted music servers. v0.1.14 improves album browsing, fixes compilation and collaboration grouping, adds full light/dark appearance support, and makes first-time server synchronization clearer.
- Version:
0.1.14(versionName),versionCode114999 - Platform: Android
- Application ID:
io.github.thezupzup.linthra - License: MPL-2.0
What's new
Compilation and collaboration albums stay together
- Linthra now prefers a provider-namespaced album ID when grouping tracks.
- Tracks from the same album remain grouped even when each track credits a different artist or collaborator.
- Jellyfin and Plex also use their album-artist metadata when available; local files use an embedded album-artist tag when present.
- Navidrome/Subsonic albums use the server-provided album ID without guessing an album artist.
- Existing catalogs and settings are preserved by an additive database migration.
- Allow or start a library sync after updating so existing tracks receive the new album metadata.
A responsive album grid
- The Albums tab now shows two cover-focused columns on phones instead of one full-width row per album.
- Wider screens gain additional columns only when enough space is available.
- Album artwork remains square, while long titles and artist names are safely truncated.
- Tap and long-press behavior remains unchanged, including album navigation and bulk playlist actions.
- Layout and semantics adapt to larger text sizes and accessibility tools.
System, Light, and Dark appearance modes
- Linthra now follows the phone's light or dark setting by default.
- Settings → Appearance includes explicit System, Light, and Dark choices.
- The selected mode is restored before the first frame, avoiding a theme flash at startup.
- Light palettes were retuned and tested for readable contrast while preserving Linthra's visual identity.
Clearer first synchronization
- Empty-library screens now recognize active Jellyfin, Navidrome/Subsonic, and Plex synchronization.
- Linthra names the source being synchronized when one source is active, and uses a general message when several are active.
- Plex users are no longer shown the unrelated local-folder prompt while their server library is scanning.
- Navidrome/Subsonic users no longer see a misleading empty-catalog message while the first sync is still filling the library.
Release and F-Droid reliability
- The release version remains fully defined in
pubspec.yaml, with the matching in-app version enforced by tests. - F-Droid can detect the
v0.1.14tag automatically and derive the three per-ABI version codes:1149991,1149992, and1149993. - Dependency resolution remains locked through the committed
pubspec.lockandflutter pub get --enforce-lockfile. - Pull-request CI validates the Android release lint path before the immutable stable tag is created.
- The stable publisher verifies the universal APK, AAB, and all three signed per-ABI APKs on the GitHub Release.
Upgrade and distribution notes
- Normal in-place updates preserve accounts, settings, playlists, catalog, favorites, and cache.
- Run or allow one server-library sync after updating to populate the new album identifiers for existing tracks.
- Do not mix GitHub and F-Droid installations because the APKs use different signing keys and cannot update one another.
- F-Droid builds and signs its own APKs from the source tag; GitHub Release APKs are signed by the upstream project.
No ads, no tracking, no analytics, no telemetry. Linthra plays music you already own or that your own server provides.
Linthra v0.1.13
F-Droid release reliability fix
Linthra v0.1.13 carries forward the clean-reinstall protection intended for v0.1.12 while fixing the Android release-only lint failure that prevented v0.1.12 from producing APK and AAB artifacts.
What’s new
- Fixed the
lintVitalReleasefailure that blocked Android and F-Droid release builds. - Updated Android backup rules to use only storage domains supported by the pinned Android lint schema.
- Added
lintVitalReleaseto pull-request CI so release-only Android resource errors are caught before a stable tag is created. - Preserved clean reinstall behavior: uninstalling and reinstalling Linthra no longer restores obsolete songs, settings, server state, or inaccessible folder references.
- Normal in-place updates continue to preserve accounts, playlists, settings, catalog, and cache.
- No database migration, UI feature, or playback behavior change is included in this release.
Technical details
- Removed unsupported
device_root,device_file,device_database, anddevice_sharedprefbackup domains. - Retained the supported
root,file,database,sharedpref, andexternalexclusions. - Retained
android:allowBackup="false"for debug, profile, and release builds. - Strengthened regression tests to prevent unsupported
device_*domains from being reintroduced. - Implemented in PR #304.
Upgrade notes
Existing users can update normally without losing their data.
Users who uninstall Linthra before reinstalling will receive a clean library rather than stale state restored by Android.
GitHub and F-Droid builds use different signing keys and cannot update one another. Continue using the same installation source you currently use.
No ads, no tracking, no analytics, no telemetry.
Linthra v0.1.12
Linthra v0.1.12 release notes
Linthra is an Android music player for local files and self-hosted music
servers. v0.1.12 is a focused clean-reinstall and Android data-safety
release. It prevents Android from restoring an obsolete Linthra catalog and
settings after the app has been uninstalled, while leaving normal in-place
updates completely unchanged.
- Version:
0.1.12(versionName),versionCode112999 - Platform: Android
- Application ID:
io.github.thezupzup.linthra - License: MPL-2.0
What's new
Clean reinstalls
- No more restored ghost tracks. After uninstalling and reinstalling Linthra,
Android no longer restores an old SQLite catalog containing songs that may no
longer be reachable. - No stale folder references. Removed local-folder URIs and expired Android
Storage Access Framework grants are not resurrected on a fresh installation. - Clean debug-to-stable switching. Uninstalling a debug APK and then
installing the stable build now starts with a clean Linthra library instead
of silently importing the previous test state. - No stale server or preference state. Linthra's private databases,
SharedPreferences, files, and device-protected storage are excluded from
Android backup restore.
Updates still preserve everything
- Normal app updates are unaffected. Installing v0.1.12 over an existing
Linthra installation keeps accounts, settings, playlists, catalog, cache, and
other private app data. - No database migration. The existing Drift schema and stored catalog remain
unchanged during an update. - No user action required. Existing users can update normally from their
current installation source.
Technical summary
- Android Backup is disabled explicitly for debug, profile, and release builds.
- Android 11-and-lower full-backup rules exclude every private storage domain.
- Android 12+ data-extraction rules exclude the same state from both cloud backup
and device-to-device transfer. - Regression tests require every Android build type to retain the no-restore
policy and verify all private storage domains remain excluded. - Implemented in PR #300.
Verification completed
- Dart formatting passed.
- Flutter analysis and the complete test suite passed.
- Android debug APK compilation passed with the merged manifests and backup
rules. - The privacy scan and GitHub Sponsor simulation passed.
Upgrade and distribution notes
- Updating in place preserves the current Linthra installation and its data.
- Uninstalling the app still removes its private data as expected; a subsequent
installation now starts clean instead of receiving an Android-restored copy. - Do not mix GitHub and F-Droid install sources because their APKs use different
signing keys and cannot update one another. - F-Droid will detect the stable
v0.1.12tag and build from source using its own
signing key.
No ads, no tracking, no analytics, no telemetry. Linthra plays music you already
own or that your own server provides.
Linthra v0.1.11
Linthra v0.1.11 — release notes
Linthra is an Android music player for local files and self-hosted music
servers. v0.1.11 is a folder-browsing and Android navigation release. It
adds a real server-folder view for Jellyfin and Navidrome/Subsonic and makes the
Android system Back button follow Linthra's navigation before exiting the app.
- Version:
0.1.11(versionName),versionCode111999 - Platform: Android
- Application ID:
io.github.thezupzup.linthra - License: MPL-2.0
- Get it: Available from the
GitHub Releases page first
(signed APKs); Obtainium can track
this repository for updates. The
F-Droid build
follows after F-Droid detects the tag and completes its build process.
What's new
Browse by folder hierarchy
- New Folders tab. Library now includes a Folders tab when a compatible
Jellyfin or Navidrome/Subsonic server is connected. - Real server structure. Browse the hierarchy exposed by the server instead
of relying only on Linthra's flat Songs, Albums, and Artists views. - Direct playback. Songs found inside a folder can be started immediately
using Linthra's existing playback queue and track actions. - Separate connected sources. Jellyfin and Navidrome/Subsonic roots are
shown independently when both are connected. - Lightweight navigation. Linthra requests one folder level at a time rather
than recursively downloading the complete directory tree. - Friendly states. Loading, empty-folder, error, and retry states are handled
inside the folder browser.
Android Back navigation
- Nested folders return correctly. Android Back moves to the previous folder
before leaving the Folders tab. - Detail screens return normally. Album, artist, playlist, player, support,
and settings-detail screens return to their parent screen. - Main tabs return to Library. Back from the root of Playlists, Downloads,
or Settings returns to Library instead of closing Linthra immediately. - Exit only from the true root. Linthra closes normally only when Back is
pressed from the root of Library with no internal state left to dismiss. - Existing tab history is preserved. The independent navigation stack and
scroll position of each bottom-navigation tab remain intact.
Technical summary
- Provider-neutral folder capability
(PR #289, closes
#282): a small optional
folder-browsing contract lets supported providers expose root folders and one
immediate child level without changing the normal music-source interface. - Jellyfin folder browser: reads music roots from
/Library/MediaFolders
and direct child folders/tracks from/Itemswith non-recursive requests. - Navidrome/Subsonic folder browser: reads music roots through
getMusicFolders, indexes throughgetIndexes, and nested directories through
getMusicDirectory. - Credential-safe identifiers: folder IDs stay opaque and never include an
authenticated URL, password, token, or other secret. - Central Android Back handling
(PR #289, closes
#285): root and branch
navigators now cooperate so internal state is handled before the app exits.
No dependency, Drift schema, account, playlist, download, cache, or media-library
data migration is included in this release.
Manual QA completed
- Browse a real Jellyfin folder hierarchy.
- Open nested folders and start a song directly from Folders.
- Use Android Back to return through nested folders.
- Use Android Back across Linthra detail screens and main tabs.
- Exit normally from the Library root.
- Dart formatting, Flutter analysis, full tests, privacy scan, Android debug
build, and GitHub Sponsor simulation passed on the feature PR.
Upgrade and distribution notes
- No settings reset or database migration is required.
- Don't mix install sources. A GitHub-release APK is signed with Linthra's
key, while the F-Droid build is signed with F-Droid's key; the two cannot
update each other. Stay with one source. - F-Droid detects stable tags automatically and builds from source. The local
metadata mirror can be updated after tagging with the final tag commit SHA and
per-ABI version codes.
No ads, no tracking, no analytics, no telemetry. Linthra plays music you already
own or that your own server provides.
Linthra v0.1.10
This release adds better mobile data controls and easier playlist management.
New Wi-Fi only, Save data, and Unlimited profiles
Real Android metered-network detection
Add full albums, artists, or multiple selected songs to playlists
Optional custom color palette in the GitHub Sponsor edition
Linthra remains free, open source, and privacy-focused. The new network permission is only used to detect whether a connection is metered.
Thank you for testing Linthra. Feedback is always welcome!