A native Android music player for JioSaavn content โ part of the JARVIS ecosystem.
Built by CodeWithLakxsh
Get the latest signed APK from the Releases page:
Prefer to build it yourself? Skip ahead to Installation โ Build from source.
JARVIS Music is an Android-first music streaming app that brings a Spotify-style experience to JioSaavn content. It searches and streams songs through a self-hostable JioSaavn API (a Flask + jiosaavn backend included in this repository), with support for offline downloads, liked-song libraries, and custom playlists.
The app is a flagship piece of the JARVIS ecosystem โ a family of projects by CodeWithLakxsh.
Note: this README is derived entirely from static source analysis. The project has not been runtime-tested for this publication.
All features below are verified directly from the source code:
- Spotify-style UI โ dark theme, gradient Home header, filter chips, 2-column "recently played" grid, carousels, round artist bubbles, colourful "Browse all" genre tiles and playlist-style pages with a big cover and green play button.
- Search & stream โ search-as-you-type against the bundled JioSaavn API, a "Top result" card, and recent searches you can remove one by one or clear.
- Home dashboard โ greeting, "Jump back in", "Your top mixes" (built from the artists you picked), trending/romantic/party/chill rows and language filters (Hindi, Punjabi, English, Haryanvi). Pull to refresh.
- Mini + full player โ floating mini player tinted with the album colour (with like button and progress line), full-screen player with album-colour gradient, seek bar with elapsed/remaining time, shuffle, repeat (off / all / one), like, download, share and queue.
- Change songs your way โ swipe the mini player or the album art left/right to skip, tap "previous" to restart the song (or go back within 3 seconds).
- Queue โ see what's playing and what's next, tap a song to jump to it, drag to reorder, swipe to remove. "Play next" and "Add to queue" from any song.
- Song menu (โฎ) on every song โ like, add to playlist, remove from playlist, play next, add to queue, download / remove download, go to artist, share.
- Background playback โ playback runs in a Media3
MediaSessionServicewith a media notification, lock-screen, Bluetooth and headset controls; pauses when headphones are unplugged. - Autoplay โ when the queue runs out, similar songs are added automatically.
- Liked songs, playlists, downloads โ liked songs (newest first) and playlists stored in Room; create, rename and delete playlists; offline downloads via
DownloadManagerthat keep title/artist/artwork and play from the local file. - Onboarding โ pick favourite artists on first launch; they power your Home mixes and Library.
| Layer | Technology |
|---|---|
| Language | Kotlin |
| UI | Android Jetpack (AppCompat, Material Components, ViewBinding, ConstraintLayout) |
| Media | Media3 / ExoPlayer + MediaSession |
| Networking | Retrofit 2 + Gson, OkHttp |
| Image loading | Glide |
| Local storage | Room |
| Concurrency | Kotlin Coroutines |
| Build | Gradle (Kotlin DSL) 8.13 ยท AGP 8.11.2 ยท Kotlin 2.0.21 |
| Backend API | Python Flask + jiosaavn library |
The Android app never talks to JioSaavn directly. It calls a JioSaavn API service that wraps the jiosaavn Python package and returns a normalized JSON list of songs. The app's RetrofitInstance points at a deployed instance of that API (configurable in app/src/main/java/com/laksh/jarvismusic/api/RetrofitInstance.kt).
flowchart LR
U[User on Android] --> A[JARVIS Music App]
A --> B[Retrofit / OkHttp]
B --> C[JioSaavn API<br/>Flask + jiosaavn]
C --> D[JioSaavn<br/>content]
A --> E[ExoPlayer / Media3]
A --> F[Room DB<br/>Liked songs ยท Playlists]
A --> G[DownloadManager<br/>Offline MP3s]
JarvisMusic/
โโโ app/ # Android application module
โ โโโ src/main/
โ โโโ java/com/laksh/jarvismusic/
โ โ โโโ MainActivity.kt # Tabs, mini/full player, queue & song menus
โ โ โโโ PlaybackService.kt # Media3 session service (background playback)
โ โ โโโ HomeFragment.kt # Home: greeting, grid, mixes, carousels
โ โ โโโ SearchFragment.kt # Browse all, recent searches, results
โ โ โโโ LibraryFragment.kt # Your Library (liked, downloads, playlists, artists)
โ โ โโโ CollectionFragment.kt # Playlist-style page (liked, downloads, playlists, artists, genres)
โ โ โโโ OnboardingActivity.kt
โ โ โโโ DownloadStore.kt # Offline downloads + metadata
โ โ โโโ LocalStore.kt # Recents, search history, shared player state
โ โ โโโ SongUtils.kt / UiUtils.kt
โ โ โโโ api/ # Retrofit, Room entities & DAOs
โ โ โโโ *Adapter*.kt # RecyclerView adapters
โ โโโ res/ # Layouts, drawables, themes, menus
โโโ api/ # Self-hostable JioSaavn API (Python/Flask)
โ โโโ index.py # Flask entry point (port 5100)
โ โโโ requirements.txt
โโโ gradle/ # Gradle wrapper & version catalog
โโโ build.gradle.kts
โโโ settings.gradle.kts
โโโ gradle.properties
Inferred from build configuration and dependency manifests โ not runtime-verified.
- Android Studio (Iguana or newer) with the Android SDK platform 35.
- JDK 17 (required by the Gradle configuration).
- Gradle 8.13 โ the wrapper is included (
gradlew). - For the backend API: Python 3.8+ and
pip.
You can either download a pre-built APK or build from source.
- Download the latest APK from the Releases page.
- Open the APK on your Android device (Android 7.0 / API 24+).
- If prompted, allow "Install unknown apps" for your browser or file manager, then tap Install.
Commands below are derived from the project's configuration and source.
# Clone the repository
git clone https://github.com/CodeWithLakxsh/jarvis-music.git
# Build a debug APK
./gradlew assembleDebugAlternatively, open the project in Android Studio, let Gradle sync, and press Run.
cd api
pip install -r requirements.txt
python index.py # serves on 0.0.0.0:5100The Android app expects an API instance at the BASE_URL defined in RetrofitInstance.kt. Point it at a local or deployed instance of api/.
| Variable | Where | Purpose |
|---|---|---|
SECRET |
api/ environment |
Flask session-signing key. If unset, a random key is generated per process. |
BASE_URL |
RetrofitInstance.kt |
Base URL of the JioSaavn API the app queries. |
See api/.env.example for the backend environment template.
- On first launch, choose at least 3 artists to personalise your library.
- Use Home to browse sections, Search to find any song or browse genres, and Your Library to open liked songs, downloads, playlists and artists.
- Tap a song to start playback. Swipe the mini player (or the album art in the full player) left/right to change songs; tap it or swipe up for the full player.
- Tap โฎ on any song for play next, add to queue, add to playlist, download, go to artist and share. Open the queue from the full player to jump to, reorder or remove songs.
- Tap the heart to like a song, the download icon to save it offline. Long-press a playlist in Your Library (or use โฏ on its page) to rename or delete it.
- Music keeps playing in the background โ control it from the notification or lock screen.
The release build type is configured in app/build.gradle.kts (minification disabled, ProGuard rules at app/proguard-rules.pro). Build an APK with:
./gradlew assembleRelease- The Flask backend reads its signing key from the
SECRETenvironment variable โ never commit a real.envfile (see.gitignore). - Reports for security issues: see SECURITY.md.
Contributions are welcome! Please read CONTRIBUTING.md and the issue templates before opening a pull request.
No open-source license has currently been granted for this repository.
CodeWithLakxsh
- GitHub: https://github.com/CodeWithLakxsh
- Portfolio: https://codewithlakxsh.github.io/