Watchlist is a movie and TV series database application that helps users discover trending content, search for specific titles, and create a personalized watchlist.
Create your very own watchlist today.
Watchlist is an Android application that leverages the TMDB API to provide access to an ever-growing database of over 2 million movies and TV series.
Key highlights:
- Efficient paginated search
- Favourites management
- Visually pleasing UI built with Jetpack Compose
- Fully aligned with Material 3 Design principles
- Jetpack Compose
- TMDB API
- Retrofit
- Firebase
- Dagger-Hilt
- Material 3 Design
Firebase is excellent—but it comes with a few limitations:
-
Data Object Storage Firebase does not allow storing document values directly as data objects, so document values were stored as JSON instead.
-
Updating Documents Firebase does not support adding an entry directly to a document. The workaround involved:
- Fetching the document as a
HashMap - Updating the map
- Writing the updated map back
This resulted in two network calls instead of one, both when adding and removing favourites.
- Fetching the document as a
My first instinct was to over-engineer the entire solution 😅
I even shared my thought process in a Thread on X .
Feel free to check it out—and don’t forget to like and follow
-
Add navigation animations from the favourites screen to detail screens
-
Replace Firebase with a custom backend to reduce favourites updates to a single network call
-
Fetch additional data such as:
- Cast & credits
- Video trailers
- Ratings and reviews
-
Get an API key from TMDB’s Website
-
In the project root, create a file named:
apikey.properties -
Add your API key:
TMDB_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
You have two options:
-
In Android Studio, create a keystore via Build > Generate Signed Bundle / APK
-
In the project root, create:
keystore.properties -
Add the following:
KEY_ALIAS=xxxx KEY_PASSWORD=xxxxxxxx STORE_PASSWORD=xxxxxxxx STORE_FILE=../xxxx/xxxx.jks
If you prefer to skip signing:
-
In the module’s
build.gradle, comment out:val keystorePropertiesFile: File = rootProject.file("keystore.properties") val keystoreProperties = Properties() keystoreProperties.load(FileInputStream(keystorePropertiesFile))
-
Also comment out:
signingConfigs { create("release") { keyAlias = keystoreProperties.getProperty("KEY_ALIAS") keyPassword = keystoreProperties.getProperty("KEY_PASSWORD") storePassword = keystoreProperties.getProperty("STORE_PASSWORD") storeFile = file(keystoreProperties.getProperty("STORE_FILE")) } } -
And:
buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig = signingConfigs.getByName("release") } } -
Ensure the build variant is set to debug in Android Studio.
This project is licensed under the Apache License. See the LICENSE file for details.
If you want, I can also:
- Add badges (Android, Kotlin, Compose, TMDB)
- Reduce image sizes for faster GitHub loading
- Rewrite this as a portfolio-optimized project README for recruiters












