A modern offline music player built with Kotlin, Jetpack Compose, and Media3 that allows users to browse, play, and manage audio files stored locally on their Android devices.
LocalWave focuses on providing a beautiful, distraction-free music listening experience with dynamic album-based theming, light and dark themes, favorites management, playback controls, notification controls, and persistent playback state.
Download LocalWave on Google Play
Current Version: 1.0.1
- π± App Overview
- β¨ Features
- π Tech Stack
- π Architecture
- π App Flow
- πΈ Screenshots / Demo
- π± Android APIs & Permissions
- π Project Structure
- π― Use Cases
- π§ Future Improvements
- π Privacy
- π Project Status
- π€ Freelancing & Portfolio
- π License
LocalWave is an offline Android music player that automatically discovers audio files stored on a device and provides a smooth music playback experience.
The app eliminates the need for subscriptions, internet connectivity, or external services by focusing entirely on locally stored music.
Many modern music apps are heavily dependent on internet connectivity and streaming services.
LocalWave solves this by providing:
- Completely offline music playback
- Fast local song discovery
- Dynamic album artwork experience
- Persistent playback state
- Lightweight and privacy-friendly listening
- Play local audio files
- Pause and resume playback
- Next / Previous controls
- Seek through songs
- Volume controls
- Mark songs as favorites
- Dedicated Favorites screen
- Persistent favorites using Room Database
- Album artwork extraction
- Dynamic color palette generation
- Album-based theming
- Animated vinyl record player
- Dedicated light and dark themes
- Separate theme styling for each appearance
- Dynamic album-based colors within the player experience
- Shuffle Mode
- Repeat One
- Repeat All
- Repeat Off
- Mini player
- Bottom sheet music player
- Smooth Compose animations
- Scroll-aware mini-player visibility
- Playback position restoration
- Last played song restoration
- Favorite songs persistence
- Playback notification
- Play/Pause actions
- Next/Previous controls
- Background playback
- Media session integration
- Notification media controls
- Local storage scanning
- Efficient media loading
- Reactive UI updates
LocalWave is designed for users who already have their own music library and want a focused listening experience without relying on streaming services.
Play music stored on your device without requiring an internet connection or music streaming service.
Album artwork influences the player's color theme, creating a visual experience that adapts to the currently playing song.
Save songs you love and access them quickly from the dedicated Favorites experience.
Continue listening while using other apps with Android notification and media controls.
Choose the appearance that suits your environment with dedicated light and dark themes.
LocalWave does not require an account or external web APIs for core music playback.
- Kotlin
- Jetpack Compose
- Material 3
- Android Media3
- ExoPlayer
- MVVM Architecture
- Room Database
- DataStore Preferences
- ViewModel
- Coroutines
- Flow
- MediaSessionService
- BroadcastReceiver
Jetpack Compose
Material 3
Media3 ExoPlayer
Media3 Session
Room Database
Kotlin Coroutines
DataStore
Palette API
Navigation ComposeThe project follows the MVVM (Model-View-ViewModel) architecture.
- Separation of concerns
- Better maintainability
- Easier testing
- Scalable codebase
- Lifecycle-aware state management
flowchart LR
UI[Compose UI]
VM[ViewModel]
REPO[Repository]
DB[(Room Database)]
MEDIA[MediaStore]
PLAYER[Media3 ExoPlayer]
UI --> VM
VM --> REPO
REPO --> DB
REPO --> MEDIA
VM --> PLAYER
DB --> REPO
MEDIA --> REPO
REPO --> VM
VM --> UI
- User opens LocalWave
- Audio permissions are requested
- MediaStore scans local device storage
- Songs are loaded into Repository
- ViewModel updates UI state
- Song list is displayed
- User taps a song
- ExoPlayer playlist is created
- Playback begins
- Album art is extracted
- Palette API generates colors
- UI updates dynamically
- Playback position saved
- Last song saved
- Favorites stored in Room
- App relaunch restores:
- Song
- Position
- Playback state
Music_Player.mp4
Play_Pause_Skip_Previous_Shuffle.mp4
Light_Theme_and_Dark_Theme.mov
Repeat_Mode.mp4
Favourite_Playlist.mp4
Notification_Player.mov
YouTube- https://youtu.be/3Trru19tWdI
X - https://x.com/kushalreya/status/2061441387904786607?s=20
This application currently does not use any external web APIs.
Instead it relies on:
Used for:
- Discovering audio files
- Fetching local media content
Used for:
- Song metadata extraction
- Album artwork extraction
- Artist information
- Album information
Used for:
- Dynamic color generation from album artwork
Used for:
- Audio playback
- Media sessions
- Background playback
- Notification media controls
- Metadata extraction fallback
- Missing artwork fallback
- Missing title fallback
- Permission handling
- Safe playback restoration
READ_MEDIA_AUDIO
POST_NOTIFICATIONSREAD_EXTERNAL_STORAGENo API keys are required.
The application works entirely offline.
kr.android.musicplayer
β
βββ data
β βββ DatabaseProvider
β βββ MusicDatabase
β βββ FavoriteDao
β βββ MusicRepository
β
βββ model
β βββ SongData
β βββ FavoriteSong
β βββ MusicUiState
β
βββ navigation
β βββ AppNavigation
β βββ Routes
β
βββ player
β βββ MusicPlayerController
β βββ MusicPlaybackService
β βββ MusicNotificationManager
β βββ MusicActionReceiver
β βββ PlayerPreferences
β
βββ utils
β βββ DynamicColors
β βββ MetadataHelpers
β βββ Permissions
β βββ RepeatMode
β βββ TimeConversion
β
βββ view
β βββ SongListScreen
β βββ FavoriteSongsScreen
β βββ MusicPlayerScreen
β βββ PlayerBottomSheetScaffold
β
βββ view/components
β βββ AlbumArtSection
β βββ MiniPlayer
β βββ MusicSeekBar
β βββ PlaybackControls
β βββ SongInfoSection
β βββ MusicListItem
β βββ VolumeControl
β βββ TopBar
β
βββ viewmodel
β βββ MusicPlayerViewModel
β βββ MusicPlayerViewModelFactory
β
βββ AppDependencies
β
βββ MainActivity
Play local songs without internet connectivity.
Listen to downloaded music while traveling.
Avoid streaming and reduce data usage.
Offline music without interruptions.
Quick access to locally stored playlists.
Manage and play large local music libraries.
LocalWave is designed as an offline music player.
- No account required
- No external music streaming
- No external web APIs
- No advertising
- No API keys required
- Music playback is performed from files stored on the user's device
- No cloud service is required for core functionality
Read the full Privacy Policy:
https://sites.google.com/view/localwave-privacy/home
Planned enhancements include:
- Responsive UI improvements for smaller-screen devices
- Search functionality
- Playlist creation
- Playlist management
- Music sorting options
- Equalizer support
- Lyrics support
- Folder-based browsing
- Sleep timer
- Android Auto support
- Material You integration
- Theme customization
- Queue management
- Recently played songs
- Most played songs
- Home screen widgets
- Wear OS support
Current Version: 1.0.1
Status: π’ Published on Google Play
LocalWave is actively maintained and publicly available on Google Play.
The current release provides an offline music playback experience with dynamic album-based theming, favorites, light and dark themes, background playback, and notification controls.
The next development cycle will focus on improving responsiveness on smaller-screen devices, production bug fixes, playback reliability, and overall user experience.
Google Play:
https://play.google.com/store/apps/details?id=kr.android.musicplayer
LocalWave is part of my personal Android development portfolio and demonstrates the process of taking an Android application from development through testing and production deployment on Google Play.
It demonstrates:
- Modern Android Development
- Jetpack Compose
- MVVM Architecture
- Media3 Integration
- Room Database
- Reactive State Management
I am open to:
- Android App Development
- Jetpack Compose Projects
- UI/UX Implementation
- App Modernization
- Feature Development
- Freelance Opportunities
Feel free to connect regarding collaborations, freelance work, or Android development projects.
This project is intended for educational and portfolio purposes.
You may fork, learn from, and modify the code according to your needs.



