A complete, production-style Android TV app demo โ built with Jetpack Compose for TV, Hilt, Room, Paging 3, Ktor & Retrofit โ showcasing real-world architecture patterns for TV app development.
๐ฅ Download APK โข ๐ฅ Watch Demo โข โจ Features โข ๐๏ธ Tech Stack โข ๐ Setup
Compose Lab - Compose TV is an open-source Android TV application built from scratch using Jetpack Compose for TV (Compose TV) โ Google's modern declarative UI toolkit for building television experiences. This project demonstrates how to build a fully functional, streaming-style TV app with a clean MVVM + Clean Architecture approach, D-pad friendly navigation, lazy-loaded content rows, video playback, and offline-first data handling.
It's designed as both a learning resource for developers exploring Compose for TV and a starter template / boilerplate for building your own Android TV apps.
โญ If you find this project useful, please consider giving it a star โ it helps others discover it too!
- ๐ฌ Splash screen with onboarding flow for first-time users
- ๐ TV-optimized Home dashboard with lazy content rows & carousels
- ๐ Dedicated Search screen with D-pad friendly focus handling
- ๐ Home/Content details screen with rich metadata
โถ๏ธ Built-in Media Player screen for video playback- โค๏ธ Wishlist / Favorites to save content for later
- โ๏ธ Settings screen for app preferences
- ๐ Privacy Policy & Terms and Conditions screens
- ๐ฎ Full remote-control (D-pad) navigation support
- ๐ Modern Material 3 for TV design system
- ๐งฉ Modular, scalable Clean Architecture (MVVM + Repository pattern)
- ๐ Dependency Injection with Hilt
- ๐พ Offline caching using Room + DataStore
- ๐ก Network layer built with Ktor & Retrofit
- ๐ผ๏ธ Image loading & caching with Coil
| Splash Screen | Home | Home Details |
|---|---|---|
![]() |
![]() |
![]() |
| Search | Search Result | Wishlist |
|---|---|---|
![]() |
![]() |
![]() |
| Privacy Policy / Terms | Settings | Media |
|---|---|---|
![]() |
![]() |
![]() |
| Category | Library | Version |
|---|---|---|
| Language | Kotlin | 2.3.20 |
| UI Toolkit | Jetpack Compose BOM | 2026.06.01 |
| TV UI | Compose TV Foundation | 1.0.0 |
| TV UI | Compose TV Material | 1.1.0 |
| Icons | Material Icons Extended | 1.7.8 |
| Core | AndroidX Core KTX | 1.18.0 |
| Compat | AndroidX AppCompat | 1.7.1 |
| Activity | Activity Compose | 1.13.0 |
| Category | Library | Version |
|---|---|---|
| Lifecycle | Lifecycle Runtime Compose | 2.11.0 |
| Lifecycle | Lifecycle Runtime KTX | 2.11.0 |
| Navigation | Navigation Compose | 2.9.8 |
| DI | Hilt | 2.59.2 |
| DI | Hilt Navigation Compose | 1.3.0 |
| Category | Library | Version |
|---|---|---|
| Database | Room | 2.8.4 |
| Paging | Paging 3 | 3.5.0 |
| Preferences | DataStore | 1.2.1 |
| Category | Library | Version |
|---|---|---|
| HTTP Client | Ktor | 3.5.1 |
| HTTP Client | Retrofit | 3.0.0 |
| Logging | OkHttp Logging Interceptor | 5.4.0 |
| Serialization | Kotlinx Serialization | 1.11.0 |
| Category | Library | Version |
|---|---|---|
| Image Loading | Coil | 2.7.0 |
| Build Plugin | Android Gradle Plugin (AGP) | 9.0.1 |
| Annotation Processing | KSP | 2.0.21-1.0.28 |
This app fetches sample TV/video content from Google's public Android TV sample content feed:
https://storage.googleapis.com/androiddevelopers/samples_assets/android-tv/android_tv_videos_new.json
This is a publicly hosted sample JSON feed (used in Google's own Android TV sample apps) containing categorized video metadata โ titles, descriptions, thumbnails, and playable media URLs โ which this app parses and renders as content rows.
โ ๏ธ This content is provided by Google for demo/sample purposes only. This project does not own, host, or claim rights to any of the media referenced by this feed โ it is used strictly for educational and demonstration purposes.
The app uses a single-activity architecture with Navigation Compose, structured as:
object Splash : Screen("splash")
object Onboarding : Screen("onboarding")
// Main Wrapper
object Dashboard : Screen("dashboard")
object HomeDetails : Screen("homedetails")
object MediaPlayerScreen : Screen("media_player")
// Drawer Items
object Search : Screen("search", "Search", Icons.Default.Search)
object Home : Screen("home", "Home", Icons.Default.Home)
object Favorite : Screen("wishlist", "Wishlist", Icons.Default.Bookmark)
object PrivacyPolicy : Screen("pvpc", "Privacy Policy", Icons.Default.Security)
object Terms : Screen("tnc", "Terms & Condition", Icons.Default.Description)
object Settings : Screen("settings", "Settings", Icons.Default.Settings)This project follows MVVM (Model-View-ViewModel) combined with Clean Architecture principles:
app/
โโโ data/
โ โโโ local/ โ Room database, DataStore
โ โโโ remote/ โ Ktor / Retrofit API services, DTOs
โ โโโ repository/ โ Repository implementations
โโโ domain/
โ โโโ model/ โ Domain models
โ โโโ repository/ โ Repository interfaces
โ โโโ usecase/ โ Business logic / use cases
โโโ di/ โ Hilt modules
โโโ ui/
โ โโโ screens/ โ Splash, Onboarding, Dashboard, Home, Search, etc.
โ โโโ components/ โ Reusable Compose TV components
โ โโโ navigation/ โ NavHost & Screen routes
โ โโโ theme/ โ TV Material theme
โโโ MainActivity.kt
- Android Studio (latest stable version, Ladybug or newer)
- JDK 17+
- Android TV device or Android TV Emulator
# Clone the repository
git clone https://github.com/Dinesh2510/compose-lab-tv.git
# Open in Android Studio
cd compose-lab-tv
# Sync Gradle and Run on an Android TV emulator/deviceYou can download the latest APK from the Releases section.
Contributions, issues, and feature requests are welcome!
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Feel free to check the issues page.
This project is licensed under the MIT License โ see the LICENSE file for details.
This project is created strictly for educational and portfolio purposes to demonstrate Jetpack Compose for TV development. It does not host, store, or own any media content. All content is fetched from third-party public sample APIs and belongs to their respective owners.
Your Name
- GitHub: @Dinesh2510
- LinkedIn: in/dineshchavan2510
- YouTube: @pixeldesigndeveloper










