Skip to content

Releases: TheZupZup/Linthra

Linthra v0.2.3

Choose a tag to compare

@github-actions github-actions released this 20 Aug 19:05
d7b7edc

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.system path 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

Choose a tag to compare

@github-actions github-actions released this 16 Aug 06:38
e758c2c

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

Choose a tag to compare

@github-actions github-actions released this 10 Aug 19:17
3a99eac

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), versionCode 201999
  • 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.lock so 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.0 tag 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

Choose a tag to compare

@github-actions github-actions released this 08 Aug 06:53
8436fdf

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), versionCode 200999
  • 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_core prototype 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

Choose a tag to compare

@github-actions github-actions released this 06 Aug 22:48
47e7e2b

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), versionCode 115999
  • 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 Navidrome to Buffering… to Playing from Cache without 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

Choose a tag to compare

@github-actions github-actions released this 05 Aug 19:40
75de789

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), versionCode 114999
  • 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.14 tag automatically and derive the three per-ABI version codes: 1149991, 1149992, and 1149993.
  • Dependency resolution remains locked through the committed pubspec.lock and flutter 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

Choose a tag to compare

@TheZupZup TheZupZup released this 04 Aug 13:07
d02c002

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 lintVitalRelease failure 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 lintVitalRelease to 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, and device_sharedpref backup domains.
  • Retained the supported root, file, database, sharedpref, and external exclusions.
  • 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

Choose a tag to compare

@github-actions github-actions released this 04 Aug 05:50
4acc011

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), versionCode 112999
  • 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.12 tag 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

Choose a tag to compare

@github-actions github-actions released this 03 Aug 18:22
379bcd2

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), versionCode 111999
  • 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 /Items with non-recursive requests.
  • Navidrome/Subsonic folder browser: reads music roots through
    getMusicFolders, indexes through getIndexes, 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

Choose a tag to compare

@TheZupZup TheZupZup released this 29 Jul 17:25
cf99651

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!