A multi-module, offline-first Android app for discovering, rating, and tracking movies & TV shows — built with Jetpack Compose, Clean Architecture, and Firebase.
MyCinemaTracker is an open-source Android app for browsing movies and TV shows, rating them across multiple dimensions, recommendations, advanced search system and building a personal watchlist — backed by TMDB and my custom DB for catalog data and Firebase for auth, storage, and sync.
It's also a deliberate architecture showcase: a production-shaped multi-module app rather than a toy demo, covering the patterns — Clean Architecture with a strictly enforced dependency direction, MVI/UDF, Gradle convention plugins over copy-pasted build scripts, cache-aside offline support, RBAC-gated content moderation, and a statistically sound multi-dimensional rating system.
Catalog & discovery
- Movies & TV shows with full metadata: poster, backdrops, genres, an extensible custom sub-genre taxonomy, cast, seasons (TV), release date, country
- Paginated, prefetching browse screens backed by TMDB, with delta sync so the local cache stays current without full re-fetches
- IMDb rating enrichment via OMDb, kept honestly distinct from the app's own community rating rather than mislabeling one as the other
Rating system
- Quick 10-point rating, or a 6-dimension breakdown (Performance & Character, Graphics & VFX, Production & Costume Design, Cinematography & Scenery, Spirit & Atmosphere, Soundscape)
- A Bayesian-weighted aggregate, so a handful of extreme votes can't outrank a title with thousands of ratings — see docs/FEATURES.md
Accounts & moderation
- Firebase Authentication (email/password + Google via Credential Manager)
- Four-tier RBAC —
GUEST/USER/MODERATOR/ADMIN— enforced through Firebase custom claims and Firestore security rules, never trusted client-side alone - User-submitted titles enter a
PENDING_MODERATIONqueue for moderator/admin review, with dedup checking before they land there
Personal tracking
- Watchlist with Watch Later / Watched / Favorite states, usable offline
- Paginated reviews per title
- Push notifications (FCM) — personal (your submission was approved) and role-targeted (new item awaiting moderation)
Offline & resilience
- Cache-aside against TMDB and custom MoviesDB via Room; Firestore's own offline persistence for social data
- WorkManager-driven delta sync, resumable poster uploads, retry with exponential backoff + jitter, a hand-rolled circuit breaker
Planned
- 🚧 "Ask AI what to watch" via Firebase AI Logic (Gemini)
- 🚧 Real-time chat over a self-hosted gRPC service
Clean Architecture, one-way dependencies, feature modules that never depend on each other directly:
graph TD
APP["app"] --> FEATURE["feature:*<br/>UI + ViewModel, MVI"]
FEATURE --> DOMAIN["domain<br/>UseCases + Repository interfaces"]
DATA["data:*<br/>Repository implementations"] -. implements .-> DOMAIN
FEATURE --> CORE["core:*<br/>network, database, firebase, ui..."]
DATA --> CORE
DOMAIN --> CORE
Full breakdown — every layer, the Coordinator navigation pattern, why the build is structured this way — in docs/ARCHITECTURE.md.
| Layer | What lives there |
|---|---|
app |
Composition root — DI graph, NavDisplay, app-level wiring |
core:* |
Shared building blocks: network, database, design system, security, navigation contracts |
domain |
Pure Kotlin — UseCases and Repository interfaces, zero Android dependencies |
data:* |
Repository implementations — TMDB, Firestore, Room, cache-aside |
feature:* |
One module per screen group — Compose UI + MVI ViewModels |
Full module-by-module table with responsibilities and build status → docs/MODULES.md.
| UI | Jetpack Compose, Material 3 |
| Architecture | Clean Architecture, MVI / Unidirectional Data Flow |
| Navigation | Navigation 3, Coordinator pattern |
| DI | Hilt |
| Async | Kotlin Coroutines & Flow |
| Local storage | Room (cache-aside), Proto DataStore + Tink (encrypted) |
| Networking | Retrofit, OkHttp, kotlinx.serialization |
| Backend | Firebase — Auth, Firestore, Storage, Cloud Functions, Cloud Messaging, AI Logic |
| Catalog data | TMDB + OMDb |
| Pagination | Paging 3 — RemoteMediator + a custom Firestore PagingSource |
| Background work | WorkManager |
| Build | Gradle version catalogs + a composite build-logic build of precompiled convention plugins |
| Testing | JUnit, MockK, Turbine, Firestore Rules Unit Testing |
Core functionality — catalog, auth/RBAC, rating, moderation, watchlist, reviews, notifications — is built end-to-end. The AI assistant and real-time chat are architected (module scaffolding compiles) but their feature work is intentionally paused until the rest of the app is solid — see docs/MODULES.md for exact status per module.
- Architecture — layers, module graph, navigation, build system
- Modules — every module, its responsibility, and its status
- Features — the rating system, moderation workflow, RBAC, sub-genres
- Setup — Firebase project, API keys, running locally
MIT — see LICENSE.