austinried 05de10c912 clear the build warnings and fail on new ones
A clean build now emits no warnings of its own, and Kotlin
`allWarningsAsErrors` plus lint `warningsAsErrors` stop new ones from
sneaking back in.

- Kotlin: give SearchFilter's @StringRes parameter an explicit @param:
  target; use safe calls for File.parentFile in StringResourcesTest.
- Packaging: keep debug symbols for the prebuilt .so files that have no
  symbol table, which is what the "unable to strip" warning was about.
- Lint: move `modifier` to the first optional parameter across the Compose
  screens, use mutableIntStateOf for int state, read Resources via
  LocalResources, use the KTX Bitmap.get/String.toUri, drop the unused
  ic_action_name and ic_stat_name bitmaps and the dead -v24 qualifier on
  the notification vector, fix the pt-BR "album" accents and the unused
  Vietnamese/Thai plural quantities, and suppress the intentional
  cleartext/user-certificate, backup, exported-service and
  plural-candidate findings. Disable the version-update nags, which the
  dependency-update process owns.

The AboutLibraries plugin still resolves the variant classpaths during
configuration, so AGP keeps warning about that one; upstream in
mikepenz/AboutLibraries#1369.
2026-10-08 10:27:09 +00:00
2026-10-04 00:30:08 +00:00
2026-10-04 00:30:05 +00:00
2021-08-23 14:48:24 +09:00
2022-06-20 19:01:25 +09:00

subtracks logo subtracks

f-droid github downloads Translation status license

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

home now playing albums album artist

Download

Features

  • Home screen to browse your library over many categories, genres, and more
  • Album and artist artwork, shown full-resolution in the detail and now playing views
  • Downloads with album, artist and playlist bulk downloads, download quality and a metered-connection toggle
  • Search across albums, artists, playlists and songs, with per-list sort and filter controls
  • Gapless playback, an editable queue you can reorder and jump through, and loop and shuffle modes
  • Up next queue to add items into the currently playing queue without rewriting it
  • Multiple server support with quick switching
  • Stream quality (bitrate and format) settings for Wi-Fi and mobile and automatic switching
  • Scrobbling and starred items, cached while offline and sent back to the server when online
  • Media notification and headset/Bluetooth controls
  • Adaptive theming from the current song's artwork

The full library is mirrored at sync, so browsing, searching, sorting and filtering all work without waiting on the server. Only media and artwork are fetched on demand, and not even that when they're already downloaded.

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.

Translations

Want to see subtracks in your language? Visit the project on Weblate to help!

Translation status

AI usage disclosure

This project contains code and documentation generated by LLM, which is created via human prompting, iteration and review.

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.

S
Description
A music streaming app for Subsonic-compatible servers
Readme GPL-3.0
58 MiB
Languages
Kotlin 99.1%
Nushell 0.7%
Nix 0.1%