PocastCloni is a modern Android podcast player built with Kotlin, Jetpack Compose, Media3/ExoPlayer, Room, DataStore, WorkManager, and RSS feed synchronisation.
- Podcast Library - Add podcasts by RSS URL or iTunes search, reorder subscriptions, inspect podcast details, and mark all new episodes as seen.
- Playback - Mini player and full player with play/pause, seek, skip, progress tracking, background playback, and notification support.
- Downloads & Sync - Stream episodes, download episodes locally, optionally save files to Android's Downloads folder, run background feed checks, and use smart or full RSS refresh modes.
- Auto Download & Cleanup - Per-podcast auto-download, global download limits, retry handling for transient failures, and automatic cleanup of played downloaded episodes.
- History & Favorites - Playback history and favorites with date grouping, publication dates, manual favorite ordering, and added-date sorting.
- Customisation - Light, Dark, and System themes; custom accent colour; optional gradient background; transparent cards and episode rows; one-handed layout; bottom bar clean mode with swipe reveal and auto-hide delay.
- Settings - Tabbed Settings screen for Design, Playback, Sync, and Data.
- Backup & Restore - Export and import podcasts, favorites, history, and user settings.
- Statistics - Listening and download statistics with reset actions.
| Home | Home with Bottom Bar | Settings |
|---|---|---|
![]() |
![]() |
![]() |
| Downloads | Search | History |
|---|---|---|
![]() |
![]() |
![]() |
| Favorites | Podcast Detail | Player |
|---|---|---|
![]() |
![]() |
![]() |
Latest release:
| Item | Version |
|---|---|
| Android | 8.0 (API 26) and higher |
| Target SDK | 34 |
| Compile SDK | 34 |
| JDK | 17 |
| Layer | Libraries |
|---|---|
| UI | Jetpack Compose, Material 3, Navigation Compose |
| Architecture | Domain / Data / UI layers, ViewModel, StateFlow |
| Media | Media3 ExoPlayer, MediaSession, foreground playback service |
| Database | Room with exported migration schemas |
| Preferences | DataStore Preferences |
| Networking | Retrofit, OkHttp, Jackson XML |
| Images | Coil Compose, Coil SVG |
| Background Work | WorkManager with Hilt workers |
| Dependency Injection | Hilt |
| Logging | Timber |
| Quality | Detekt, ktlint, JUnit 4, MockK, Turbine, AndroidX tests |
- Android Studio
- JDK 17
- Android SDK 34
git clone https://github.com/mm92ff/pocastcloni-githubfolder.git
cd pocastcloni-githubfolderOpen the project in Android Studio and run it on a device or emulator with API 26 or newer.
./gradlew assembleDebug
./gradlew assembleReleaseWindows:
.\gradlew.bat assembleDebug
.\gradlew.bat assembleRelease./gradlew testDebugUnitTest
./gradlew detektWindows:
.\gradlew.bat testDebugUnitTest
.\gradlew.bat detektapp/src/main/java/com/example/pocastcloni/
├── data/ # Room entities, DAO, repositories, RSS/search APIs, workers
├── domain/ # Models, repository interfaces, player contracts, use cases
├── di/ # Hilt modules
├── service/ # PodcastPlaybackService
├── ui/ # Compose screens, player UI, settings, theme, navigation
└── util/ # Constants, formatting, HTML, network and time helpers
| Permission | Purpose |
|---|---|
INTERNET |
Load RSS feeds, podcast artwork, search results, and episode streams |
ACCESS_NETWORK_STATE |
Detect network state for downloads, sync, and statistics |
WRITE_EXTERNAL_STORAGE |
Legacy public Downloads support on Android 9 and older |
FOREGROUND_SERVICE |
Keep playback and long-running work stable |
FOREGROUND_SERVICE_MEDIA_PLAYBACK |
Media playback foreground service on newer Android versions |
FOREGROUND_SERVICE_DATA_SYNC |
Feed sync foreground service type on newer Android versions |
POST_NOTIFICATIONS |
Show playback and foreground-service notifications |
- RSS feed parsing supports smart stream updates and full refresh mode.
- On Android 10 and newer, saving to the public Downloads folder uses MediaStore.
- Downloaded episodes fall back to streaming when the local file is missing.
- The bottom navigation can be hidden in Clean Mode and revealed with an upward swipe.
- Backups are JSON-based and include restorable library and settings data.
- Fork the repository.
- Create a feature branch (
git checkout -b feature/my-feature). - Commit your changes (
git commit -m "feat: add my feature"). - Push to the branch (
git push origin feature/my-feature). - Open a Pull Request.
This project is licensed under the Mozilla Public License 2.0.








