A Kotlin Multiplatform app built with Compose Multiplatform that lets you browse, search, and discover movies using The Movie Database (TMDB) API. Runs on Android and iOS from a single shared codebase.
| Feature | Description |
|---|---|
| Browse Movies | Paginated grid of popular, top-rated, upcoming, and now-playing movies |
| Movie Details | Backdrop image, rating, release date, genres, overview, and trailers |
| Search | Debounced search with inline results as you type |
| Wishlist | Add/remove favorites persisted locally with swipe-to-delete |
| Deep Links | Open movies, search, and favorites from external links (Rinku) |
| Theming | Dynamic Material 3 with dark/light mode support |
| Cross-Platform | Shared UI and business logic for Android & iOS |
Android
iOS
| Category | Libraries |
|---|---|
| UI | Compose Multiplatform, Material 3, Navigation Compose |
| Networking | Ktor (OkHttp / Darwin engines), kotlinx-serialization |
| Image Loading | Coil (ktor3 network engine) |
| Database | Room with sqlite-bundled |
| Dependency Injection | Koin (annotations + KSP + Koin Compiler) |
| State Management | Coroutines, StateFlow, MVI pattern (BaseViewModel) |
| Architecture | Clean Architecture (data/domain/feature layers) |
| Logging | Kermit |
| Deep Links | Rinku |
| Build Config | BuildKonfig |
| CI | Bitrise + GitHub Actions |
| Crash Reporting | Firebase Crashlytics |
| Analytics / Performance | Kotzilla |
| Linting | Detekt |
| Coverage | Kover |
| Dependency Audit | Popcorn Guineapig |
The app follows Clean Architecture with strict module dependency rules enforced by Popcorn Guineapig:
composeApp (UI orchestrator)
│
├── feature:* → depends on domain, designsystem, platform
├── domain → LEAF — pure business logic, no project dependencies
├── data → depends ONLY on domain (implements repository interfaces)
├── designsystem → LEAF — no project dependencies
└── platform → LEAF — no project dependencies
Data flow:
UI (Screen composable)
→ ViewModel (intent → state via StateFlow)
→ UseCase (business logic)
→ Repository interface (domain layer)
→ MoviesDataRepository (data layer)
→ ApiService (Ktor → TMDB API)
→ FavoriteMoviesDAO (Room → SQLite)
- Android Studio (latest stable)
- Xcode (latest stable) — for iOS
- JDK 21
- A TMDB API key (see below)
-
Clone the repository
git clone https://github.com/gabrielbmoro/MovieDB-App.git
-
Open in Android Studio
- File → Open → select the
src/directory
- File → Open → select the
-
Get a TMDB API token
- Create an account at themoviedb.org
- Copy your Bearer token
- Add it to
src/local.properties:MOVIE_DB_API_TOKEN=your_bearer_token_here
-
Run the app
Platform Instructions Android Select the androidApprun configuration in Android Studio and hit RuniOS Open iosApp/iosApp.xcodeprojin Xcode, build, and run on a simulator
Contributions are welcome! Please check the Contributor Covenant Code of Conduct and our contribution guidelines.
- Report issues: GitHub Issues
- Submit PRs: Open a pull request with a clear description of your changes
- Wiki: See the project Wiki for more documentation
This project is licensed under the MIT License — see the license file for details.