Linthra is an open-source Android music player for people who keep their music on their own devices or self-hosted servers. It plays local files and streams from your own Jellyfin, Navidrome / Subsonic, or Plex server. No ads, no tracking, no account.
- Plays music from a folder on your phone. Uses the Android folder picker, so it never asks for a broad storage permission.
- Streams from your own Jellyfin, Navidrome / Subsonic, or Plex server. Streaming is the default and nothing is downloaded automatically.
- Offline cache: download the tracks you want, Wi-Fi only by default, with a size limit and "Keep offline" pinning.
- Chromecast, implemented in pure Dart. No Google Play Services needed.
- Android Auto.
- Queue, playlists and favorites. Playlists and hearts sync both ways with Jellyfin and Navidrome, and also work without a server.
- Smart mixes (recently played, most played, never played). Built from listening data that stays on the device.
- Background playback with lock-screen, Bluetooth and headset controls, shuffle, repeat, and synced lyrics.
- Themes and launcher icon switching.
Each of these has its own page in the docs.
| Now Playing | Library | Smart mixes |
|---|---|---|
![]() |
![]() |
![]() |
More in phoneScreenshots/.
New versions land on GitHub Releases first, as signed APKs. The current stable is v0.1.8. Linthra is also on F-Droid; F-Droid builds may arrive a bit later while their build and review process runs. Not on Google Play yet.
Don't mix install sources. GitHub APKs and F-Droid builds are signed with different keys and can't update each other. Pick one and stick with it.
To install from GitHub Releases and get updates, use Obtainium:
- Install Obtainium.
- Tap Add App and paste the source URL:
https://github.com/thezupzup/linthra - Install the latest release. Obtainium handles updates from then on. (Enable "Include prereleases" only if you want to test pre-release builds.)
Or download the .apk from the
latest release and open
it on your phone.
Notes:
- Android Auto only shows sideloaded media apps after a one-time developer toggle. See docs/android-auto.md.
- To build from source, see docs/development.md.
| Source | Status |
|---|---|
| Local files | ✅ Scan a folder, play directly (SAF, no broad permission) (docs) |
| Jellyfin | ✅ Stream, cache, cast, playlists & favorites (docs) |
| Navidrome / Subsonic | ✅ Stream, cache, cast, lyrics, playlists & favorites, two-way sync (docs) |
| Plex | ✅ Browse, stream & cache from your own Plex Media Server (docs) |
| WebDAV / NAS | 🔜 Planned, behind the same MusicSource interface |
Linthra does not send telemetry or analytics.
- Bug reports are built locally and only sent if you open the prefilled issue yourself.
- Downloads only happen when you start them.
- Minimal permissions: playback and internet, no storage permission.
- The server password is used once to get a token, then discarded. The token is stored encrypted and never logged.
Details are in PRIVACY.md and the provider docs.
Testing against your own server, screenshots, and doc fixes are useful contributions, not just code. CONTRIBUTING.md covers setup. The contributor roadmap lists where help is needed. To support development, see docs/SUPPORT.md.
See docs/roadmap.md. In short: stabilize 0.1.x, then backup/restore, then the optional Linthra Connect and a desktop app. Linthra always works on its own: no Docker, no account, no required pairing.
Everything is indexed in docs/README.md: setup, architecture, and a page per feature.




