While the app is in the foreground a timer checks the auto-sync setting and syncs when due (default every 24h; the interval is selectable from 15 minutes to 24 hours). It stops when the app is backgrounded. "Sync automatically" is one setting: Off, Wi-Fi only (default) or Always. A running sync is shown by a silent, dismissible notification and a small spinner on the library tab bar's settings button. A manual pull-to-refresh still holds the pull spinner; only an automatic sync does not. The library and Home sync actions no-op while a sync is running, and SyncManager coalesces a request that arrives mid-run into a single follow-up, so repeated pull-to-refresh cannot pile up runs while adding a server still syncs it. The time of the last sync attempt is recorded, so a failing server is retried once per interval rather than every poll. The sync consumer and the auto-sync loop both survive an unexpected failure instead of silently disabling syncing for the rest of the process. The poll sleeps for the interval (capped at 15 minutes) instead of a fixed minute, the network mode is collected once rather than re-registering a connectivity callback each poll, and the decision is logged at DEBUG (visible with Verbose logging) rather than writing to the log file every poll.
subtracks
subtracks is an open source Android client for Subsonic-compatible servers (Navidrome, gonic, LMS, Nextcloud Music and more). It is written natively in Kotlin and Jetpack Compose and gives you clean, convenient access to your music in the style of a modern media player.
Screenshots
Download
See signing/README.md for the fingerprints and the commands to verify a download.
Features
- Large Libraries: Built for very large libraries, from syncing the whole collection to playing playlists with thousands of tracks.
- Downloads: Song and bulk downloads, with download quality (encoding, bitrate) and metered-connection settings.
- Offline Mode: Stars, scrobbles and play counts queue up while you're offline and sync back to the server when you're online again.
- Artwork-first: Album and artist art everywhere, shown full-resolution in the detail and now playing views.
- Adaptive Theming: Colours drawn from the current song's artwork.
- Search: Fast search across the whole library, with per-list sort and filter controls.
- Playback: Gapless playback, an editable queue you can reorder and jump through, plus loop and shuffle modes.
- Up Next: Add items into the currently playing queue without rewriting it.
- Multiple Servers: Connect several servers and switch between them quickly.
- Stream Quality: Bitrate and format settings for Wi-Fi and mobile, with automatic switching.
- System Controls: Media notification and headset/Bluetooth controls.
Building
The project's entire toolchain is provided by a Nix flake. The default devshell provides JDK, Gradle and the Android SDK, so there is nothing to install by hand.
Therefore, to get started, you'll need to install Nix. I prefer Lix.
nix develop
gradle :app:assembleDebug
Test, lint and screenshot commands, plus the integration harness, are documented in AGENTS.md. The architecture is described in docs/architecture.md.
Contributing
The GitHub repository austinried/subtracks is a mirror of the repo hosted on my personal (private) code forge that syncs whenever I commit to it.
Bug reports and feature requests are accepted on GitHub, as well as pull requests, but:
- A well-crafted issue with clear reproduction and logs for bugs or mock-ups and use case details for features is preferred over a pull request
- Pull requests will be pulled in as patches to my code forge and then synced back (you'll still be the author, I'll be shown as the committer)
Translations
Want to see subtracks in your language? Visit the project on Weblate to help!
AI usage disclosure
This project contains code and documentation generated by LLM, which is created via human prompting, iteration and review. The current native rewrite is based on two (and a half) other iterations of this project that I coded by hand, so the architecture and other decisions behind that are all still coming from me.
License
subtracks is free software, licensed under the GNU General Public License v3.0. It has no ads and no telemetry, and uses only free/libre dependencies.







