Your library, as it actually is
Tracks, albums, artists and playlists read from MediaStore. Files the scanner could not parse are listed rather than quietly dropped, and a track that will not play tells you what stopped it.
The music on your device, and nothing else.
Choir plays the music you own. No accounts, no streaming, no recommendations, no telemetry, and no record of what you listen to. It is monochrome on purpose — hierarchy comes from type, never colour — and it holds exactly one optional network feature, which is off until you turn it on.
Choir holds the internet permission for one optional feature — fetching lyrics for tracks whose files have none — and while it is off nothing in the app opens a connection. Switch it on and what leaves the device is a track's title, artist and length, sent to the service you picked.
Free software, and any modified version has to stay that way — source included.
Choir is GPL because a local music player is precisely the thing that gets forked, wrapped in a feed and an ad slot, and sold back to you as the same app with a subscription. MIT would let that happen quietly. GPL means whoever does it has to hand you the source, which is usually enough to make it not worth doing.
In 0.3.0 · August 2026
Lyric lookup is the one thing that opens a connection
Choir holds the internet permission for it and nothing else, and while it is off nothing in the app touches the network. Switch it on and what leaves the device is a track's title, artist and length, sent to the service you picked — nothing about you, and nothing about the rest of your library.
Screens
Real screens from a real phone. Tap any of them to see it full size.
The library
Albums
Inside an album
Now playing
Search, instantly
Features
Tracks, albums, artists and playlists read from MediaStore. Files the scanner could not parse are listed rather than quietly dropped, and a track that will not play tells you what stopped it.
Read from .lrc sidecars and from the tags inside the file — ID3v2, Vorbis, MP4, WAV — and scrolled line by line, or word by word where the file carries that. Fetching them online is opt-in and off by default.
Playing from an album, an artist or a search result queues that list, and it is still there when you come back. Gapless-capable ExoPlayer underneath, with audio focus, becoming-noisy handling, a media notification, lock-screen and Bluetooth controls.
Create, rename, reorder by dragging, import and export .m3u. Liked songs are a manual list kept in Room — no algorithm decided any of it. Both are re-linked if Android renumbers your library underneath them.
Everything Android guarantees, plus ALAC and Dolby where the FFmpeg decoder is built in. The format table was written after pushing files in each format to a real phone and reading back what the scanner made of them, not copied out of documentation.
Ink on paper throughout, EB Garamond for content and Inter for chrome. Nothing is colour-coded, because nothing needs to be — the hierarchy is in the type.
Limits
Said here rather than discovered later. Everything below is known, deliberate, and on the list.
Files
.m3u playlists, in and out — the format every other player already reads
.lrc timed lyrics, read from a sidecar next to the audio file
Both are plain text, written by half the software on your computer and readable by the other half. Nothing here is a format only Choir can open.