A free and open-source music player for Android
Bandcamp discovery, YouTube playback, and local music — all in one place.
Dustvalve Next is a multi-source music player that lets you browse Bandcamp, search YouTube, and play your local files from a single, cohesive interface. It's built entirely in Kotlin with Jetpack Compose and follows Material You 3 Expressive design — spring-based animations, dynamic color theming, and expressive shapes throughout.
Pre-alpha — under active development. Expect breaking changes and rough edges.
Multi-source playback
- Stream and download from Bandcamp — browse hot releases, search, manage favorites, purchase downloads
- Play and download from YouTube via NewPipe Extractor — no API key or Google account needed
- Scan and play local audio files (mp3, flac, m4a, ogg, wav, opus, aac, wma, alac) via folder picker or device-wide MediaStore scanning
- Multiple local music folder support with per-folder track association
Downloads & caching
- Progressive download: stream at preview quality, then seamlessly upgrade to full quality in the background
- Download quality presets: Best quality (preferred format always) or Economical (AAC on metered networks)
- Unified download behavior across YouTube and Bandcamp sources
- HQ format selection for purchased Bandcamp content (FLAC, MP3 320, MP3 V0, AAC, Ogg Vorbis)
- 512 MB LRU media cache with configurable storage limits and cache eviction
Player
- Queue management with shuffle and repeat (off / all / one)
- Volume control with inline slider and full-screen volume sheet
- Audio output device switching
- Media session notifications and lock screen controls
- Seamless hot-swap from stream to local file mid-playback
Library
- Favorites for tracks, albums, and artists
- Custom playlists with drag-to-reorder
- System playlists: Downloads, Recent, Collection, Favorites, Local
- Search history across all sources
Design
- Material You 3 Expressive theming with
MotionSchemespring animations - Dynamic color from your wallpaper (Android 12+)
- Album art color theming — theme the app using colors from the playing track
- Dark, light, and system theme modes
- OLED pure black option
- Wavy animated seek bar
- Responsive layout — bottom nav on phones, navigation rail on tablets
Privacy-respecting
- No telemetry or tracking
- YouTube access through NewPipe Extractor (no Google services dependency)
- Bandcamp rate limiting to be respectful to servers
| Language | Kotlin 2.3 |
| UI | Jetpack Compose 1.11 + Material 3 Expressive 1.5 |
| Architecture | MVVM · Hilt · Coroutines + StateFlow |
| Navigation | Jetpack Navigation 3 |
| Database | Room 2.8 |
| Playback | Media3 / ExoPlayer 1.10 |
| Networking | OkHttp 5.3 · Jsoup 1.22 |
| YouTube | NewPipe Extractor 0.26 |
| Images | Coil 3.4 |
| Build | Gradle (Kotlin DSL) · AGP 9.2 · KSP · Java 21 |
Requirements: Java 21, Android SDK 36
git clone https://github.com/Pingasmaster/dustvalve_next.git
cd dustvalve_next
./build.shThe build script runs lint, assembles debug and release APKs, copies the release APK to the project root as app-release.apk, and auto-increments the version.
To build manually:
JAVA_HOME=/usr/lib/jvm/java-21-openjdk ./gradlew assembleDebugapp/src/main/java/com/dustvalve/next/android/
├── cache/ Cache eviction policy & storage tracking
├── data/
│ ├── local/ Room database, DAOs, entities, DataStore
│ ├── remote/ Bandcamp scrapers, YouTube extractor, HTTP client
│ └── repository/ Repository implementations
├── di/ Hilt modules
├── domain/
│ ├── model/ Domain models (Track, Album, AudioFormat, etc.)
│ ├── repository/ Repository interfaces
│ └── usecase/ Use cases (download, cache management)
├── player/ ExoPlayer wrapper, queue, playback service
├── ui/
│ ├── components/ Shared composables
│ ├── navigation/ Route definitions
│ ├── screens/
│ │ ├── album/ Album detail
│ │ ├── artist/ Artist profile & discography
│ │ ├── bandcamp/ Browse & search
│ │ ├── library/ Favorites, playlists, downloads
│ │ ├── local/ Local music browser
│ │ ├── player/ Full & mini player
│ │ ├── playlist/ Playlist detail & reorder
│ │ ├── settings/ Settings & account login
│ │ └── youtube/ YouTube search & playback
│ └── theme/ Colors, typography, shapes, motion
└── util/ Network utils, file helpers, encryption
This repository includes a GitHub Actions workflow that builds a signed release APK and attaches it to GitHub Releases automatically. To set it up on your fork:
If you don't already have one:
keytool -genkey -v -keystore release-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias dustvalveGo to your fork on GitHub: Settings > Secrets and variables > Actions > New repository secret, and add:
| Secret | Value |
|---|---|
KEYSTORE_BASE64 |
Base64-encoded keystore. Generate with: base64 -w 0 release-keystore.jks |
KEYSTORE_PASSWORD |
The password you used when creating the keystore |
Go to Releases > Draft a new release, create a tag (e.g. v0.0.69), write release notes, and click Publish release. The workflow will build the release APK and attach it as a downloadable asset.
Note: The workflow only triggers on published releases — not on pushes or pull requests. You can monitor builds in the Actions tab.
Contributions are welcome. Please open an issue to discuss larger changes before submitting a PR.
Dustvalve Next is licensed under the GNU General Public License v3.0.
Copyright (C) 2026 Dustvalve Next contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
