Native Android port (Jetpack Compose) for 1:1 feature parity against the Forever Jukebox web UI.
- FJ Local on Google Play — the official Play Store app. Local mode only: fully on-device analysis and playback, no backend needed.
- Full release on GitHub — APK with everything in FJ Local plus Server mode (Top Songs, Search, favorites sync) for use with a self-hosted backend.
The two builds use different application IDs, so both can be installed side by side.
Verify downloaded APKs against this signing certificate fingerprint (applies to GitHub releases; the Play Store app is signed via Play App Signing):
B5:30:EB:FD:C1:7E:C2:D0:1A:2E:9A:9D:D9:DD:02:CA:5D:2F:E0:7A:E2:C6:E5:F8:45:E7:FF:41:FD:78:B4:4D
- Native engine + visualization (ported from the TypeScript web engine).
- Local mode: on-device analysis from audio files, with local caching for faster reloads.
- Server mode: Music discovery plus Top/Trending/Recent/Favorites flows from API.
- Visualization layouts, fullscreen, and tuning controls.
- Autocanonizer playback mode.
- Chromecast support (both modes) via the relay receiver.
- Theme toggle (system/light/dark).
- Low-latency native PCM playback (Oboe) for beat-accurate jumping.
- No backend is required.
- Use the Input tab to pick an audio file from the device.
- Analysis runs fully on-device, then playback uses the native engine/visualization.
- Results are cached in app cache storage and can be cleared from Settings.
- Very long tracks that exceed the app's memory budget are rejected with a clear error before analysis starts (the limit scales with the device's per-app heap).
- Requires a running backend API + worker.
- Requires a valid base URL (
http://orhttps://with a host). - Server mode unlocks the Top Songs and Search tabs, plus server-backed favorites sync.
- You can switch modes later from Settings.
-
Open this repository root in Android Studio.
-
Build and install a debug APK of the
fullflavor (theplayflavor is the local-only Play Store build):./gradlew installFullDebug
-
On first launch, choose Local or Server mode.
-
If you choose Server mode, ensure your API/worker are running and set the API base URL (for example
http://10.0.2.2:8000on the emulator).
Local mode feature extraction requires native analysis libraries:
madmom_beats_port_ffiis fetched automatically during GradlepreBuild.- Essentia must be available for
local_analysis_jni.
If you see an error about Essentia not being linked into local_analysis_jni,
fetch prebuilt Android artifacts:
./third_party/essentia/fetch_prebuilt_from_rn_essentia_static.shThis populates:
third_party/essentia/prebuilt/active/<abi>/libessentia.athird_party/essentia/prebuilt/active/include/essentia/...
Optional advanced path: build Essentia from upstream source using
./third_party/essentia/build_android_from_upstream.sh (requires
pkg-config + eigen3 development headers).
Forever Jukebox Android is free, open-source software licensed under the
GNU Affero General Public License v3.0 — see LICENSE.
The whole app is AGPLv3 because it statically links Essentia (AGPLv3) for on-device audio analysis, which makes the combined work a derivative covered by AGPLv3. The complete corresponding source is this repository: https://github.com/creightonlinza/forever-jukebox-android.
Copyright © Creighton Linza and contributors.
Third-party components and their licenses (Essentia, madmom-beats-port/madmom
models, SpeexDSP, Oboe, and others) are documented in
THIRD_PARTY_LICENSES.md. The
madmom-beats-port runtime code is BSD 2-Clause; the app is non-commercial
(no ads, no purchases), which matters because the bundled madmom beat-detection
models are licensed CC BY-NC-SA 4.0 (non-commercial) — see that file for
details.