This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Auxio is a simple, rational music player for Android built on Media3 ExoPlayer. It features gapless playback, ReplayGain support, Android Auto integration, and advanced music indexing capabilities.
- Unix-based system (cannot build on Windows)
- Install
cmakeandninja-build - Clone with submodules:
git clone --recurse-submodules
# Build debug APK
./gradlew assembleDebug
# Build release APK
./gradlew assembleRelease
# Clean build
./gradlew clean build
# Install debug build on device
./gradlew installDebug# Check code formatting (MUST pass before committing)
./gradlew spotlessCheck
# Apply code formatting fixes
./gradlew spotlessApply
# Run Android lint
./gradlew lint
# Run lint with automatic fixes
./gradlew lintFix# Run unit tests
./gradlew test
# Run debug unit tests
./gradlew testDebugUnitTest
# Run musikr module tests specifically
./gradlew musikr:testDebug
# Run instrumentation tests (requires device/emulator)
./gradlew connectedAndroidTest# Before committing: format code and run checks
./gradlew spotlessApply
./gradlew check
# Run a single test class
./gradlew test --tests "org.oxycblt.auxio.YourTestClass"
# Run a single test method
./gradlew test --tests "org.oxycblt.auxio.YourTestClass.yourTestMethod"- Pattern: MVVM (Model-View-ViewModel) with Dagger Hilt dependency injection
- Navigation: Single Activity architecture with Navigation Component
- UI: Material Design 3 with edge-to-edge display
- Data: Repository pattern with Room database and custom Musikr library
- Playback: MediaBrowserServiceCompat with vendored Media3/ExoPlayer
AuxioService- Main MediaBrowserService for background playbackPlaybackServiceFragment- Handles all playback operationsMusicServiceFragment- Manages music browsing and library
MusicRepository- Primary interface for music data accessPersistenceRepository- Handles playback state and playlistsMusikr- Custom music indexing library (separate module)- Bypasses MediaStore limitations
- Supports advanced metadata and tags
- Background indexing with progress
app/src/main/java/org/oxycblt/auxio/
├── MainActivity.kt # Single activity host
├── MainFragment.kt # Main container with bottom sheets
├── home/ # Home screen tabs (songs, albums, artists, etc.)
├── detail/ # Detail screens for albums/artists
├── playback/ # Playback UI and controls
├── search/ # Search functionality
├── settings/ # Preferences screens
├── list/ # Reusable list components
└── music/ # Music data models and repository
- StateFlow/MutableStateFlow for reactive state
- Shared ViewModels between fragments
- Event wrapper pattern for one-time UI events
- Lifecycle-aware observers
MainActivityhosts all navigation- Two navigation graphs:
inner.xml(main) andouter.xml(onboarding) - Bottom sheet for playback UI
- Dialog destinations for popups
@HiltAndroidAppon Auxio application class@AndroidEntryPointon activities/fragments- Modules:
MusicModule,PlaybackModule,UIModule - Scoped with
@Singletonfor app-wide instances
- Kotlin code formatted with ktfmt (Dropbox style)
- C++ code uses Eclipse CDT formatting
- Spotless enforces formatting automatically
- License headers required (enforced by Spotless)
- Default branch:
dev(development) - PRs should target
devbranch mastercontains stable releases only
- Stick to F-Droid inclusion guidelines
- No proprietary dependencies
- Feature additions unlikely to be accepted
- Major UI changes discouraged
- Test all changes thoroughly
- Unit tests for business logic
- Consider edge cases for music metadata
- Test on different Android versions (min SDK 24)
- AndroidX Navigation, Room, Media3
- Dagger Hilt for DI
- Kotlin Coroutines for async
- Coil for image loading
- Material Design Components 3
- Vendored/patched Media3 in
media/directory - Custom patches for ExoPlayer features
- Modified libraries shouldn't be updated directly