Android-first music player built with Kotlin Multiplatform and Compose Multiplatform.
Relay plays local libraries and remote sources through signed extensions, scrobbles to Last.fm, repairs metadata with MusicBrainz, renders timed lyrics, syncs between your own devices, and stays a local-first listening utility.
Start with the project guide for the module map, runtime flow, and safe places to make changes. The ordered implementation work is in IMPLEMENTATION_PLAN.md. AI agents should read AGENTS.md first.
Releases are published on the GitHub Releases page as a signed APK with SHA-256 checksums. Install with:
adb install -r androidApp/build/outputs/apk/debug/androidApp-debug.apkor transfer the release APK to your device and open it.
A desktop build for macOS exists (./gradlew :desktopApp:packageDmg) but is
not yet part of a stable release.
Contributions are welcome. Read CONTRIBUTING.md for setup, test commands, and review expectations. Forking guidance lives in FORKING.md.
Relay is free software for noncommercial use. If you want to support development, donations are accepted and appreciated — they never unlock features. Everything in Relay is available to everyone on equal terms. Donation link: https://github.com/Livio21 (Sponsors page).
Split licensing:
- Source code — PolyForm Noncommercial 1.0.0. Free to use, study, modify, and share for any noncommercial purpose, including accepting donations for your own work. Commercial use requires explicit permission.
- Documentation, theme packs, artwork — CC BY-NC-SA 4.0 (credit required, noncommercial, share-alike).
- Third-party dependencies keep their own licenses; see THIRD_PARTY_NOTICES.md.
Forks must keep the license notices intact. Paywalling features of Relay or of a fork violates the license; donations-based support does not.
- JDK 17
- Android SDK Platform 36 and Android SDK Build-Tools
./gradlew tasks
./gradlew :composeApp:allTests
./gradlew :androidApp:assembleDebug
./gradlew :desktopApp:packageDmgInstall the debug APK with:
adb install -r androidApp/build/outputs/apk/debug/androidApp-debug.apkCreate a Last.fm API application, then add its credentials to the untracked local.properties file:
LASTFM_API_KEY=your_api_key
LASTFM_SHARED_SECRET=your_shared_secretUse CONNECT LAST.FM in Relay, approve access in the browser, then select FINISH CONNECTION in the app. The session key is encrypted with Android Keystore; pending scrobbles stay in the local database until Last.fm accepts them.
Relay has no telemetry and no accounts. See PRIVACY.md for exactly what leaves the device and when.