Thanks for your interest in contributing! WearAmp is an open-source Wear OS music player for Plex. All kinds of contributions are welcome β bug fixes, new features, tests, and documentation improvements.
Please open an issue before starting work on a significant change. This lets us discuss the approach and make sure effort isnβt duplicated.
For small fixes (typos, minor bugs) feel free to open a pull request directly.
git clone https://github.com/03c/WearAmp.git
cd WearAmp
./gradlew :app:assembleDebug
Open the project in Android Studio and run it on a Wear OS device or emulator.
# Unit tests
./gradlew :app:testDebugUnitTest
# Lint
./gradlew :app:lintDebug
app/src/main/java/com/wearamp/
βββ WearAmpApplication.kt Application class (Hilt entry point)
βββ MainActivity.kt Wear OS main activity
βββ di/
β βββ NetworkModule.kt Hilt network dependency providers
β βββ PlexServerUrlInterceptor.kt OkHttp interceptor that rewrites
β media API requests with the user's
β configured server URL
βββ data/
β βββ api/
β β βββ PlexAuthApi.kt Plex authentication REST API
β β βββ PlexMediaApi.kt Plex media/library REST API
β β βββ model/ Gson data models (PlexPin, PlexMediaβ¦)
β βββ local/
β β βββ UserPreferences.kt DataStore β auth token, server URL,
β β client ID, username
β βββ repository/
β βββ AuthRepository.kt PIN creation, polling & logout
β βββ MediaRepository.kt Library browsing & track rating
βββ domain/
β βββ model/ Domain models (Track, Album, Artistβ¦)
βββ service/
β βββ WearAmpMediaService.kt Media3 background playback service
βββ presentation/
βββ navigation/ Wear swipe-dismiss nav graph
βββ theme/ Compose theme (Plex orange palette)
βββ screens/
βββ login/ PIN login flow
βββ library/ Music library section list
βββ browse/ Artists β Albums β Tracks browser
βββ player/ Now Playing controls
βββ settings/ Server URL & sign-out
| Concern | Approach |
|---|---|
| UI | Jetpack Compose for Wear OS |
| Navigation | SwipeDismissableNavHost (Wear gesture support) |
| DI | Hilt (ViewModels via @HiltViewModel) |
| State | StateFlow + collectAsState() |
| Media playback | Media3 / ExoPlayer + Horologist |
| Networking | Retrofit + OkHttp; server URL injected via interceptor |
| Auth | Plex PIN-based OAuth (plex.tv) |
| Persistence | DataStore Preferences |
main and name your branch descriptively (e.g. feat/track-playback or fix/auth-timeout)../gradlew :app:testDebugUnitTest :app:lintDebug
The CI workflow will automatically build and lint your PR. A reviewer will take a look as soon as possible.
By contributing you agree that your code will be released under the same license as the rest of the project.