Dating App for Movies
After another night of endlessly scrolling through Netflix without watching anything, I had an idea: create a movie suggestion app with the user experience of a dating app. Just swipe through each movie until you find one you like! This concept has great potential, but the first challenge is finding a reliable movie database and user review database. To address this, I discovered TMDB, which provides an API for movies and TV shows, and noticed it includes a recommendation endpoint. If you visit any TMDB page, you’ll see a list of recommended movies or shows at the bottom.
For simplicity, I'll refer only to movies, but this applies to TV shows as well. The idea is straightforward: for each movie shown, there are 20 suggestions. If you like a movie, I add one point to each related movie; if you dislike it, I subtract a point. Then, I randomly choose the highest-scoring movie in the list and repeat this process for each subsequent movie.
Additionally, if a movie appears in multiple recommendation lists, it accumulates more points, meaning movies frequently linked to movies you like will rise to the top.
Problems with Popularity
This approach mostly worked, but when I started sharing the app, I immediately received negative feedback on the recommendations. For example, when someone searched for *Spider-Man: No Way Home*, they were recommended Marvel movies they had already seen. I was initially confused — after all, what else would you expect when searching for this movie? However, another user searched for *Pulp Fiction* and got recommendations for *Star Wars* and *Indiana Jones*. I realized that TMDB had a bias toward popularity; popular movies often generated odd results.
The worst example was *Parasite*
where not a single recommended movie was Korean; instead, the recommendations were just other popular films from around the same time.
To counter this, I added a popularity-based bonus: if a related movie has a lower popularity score than the one currently being viewed, it gets an extra point. This adjustment helps diversify recommendations beyond just mainstream hits.
Local Maxima
Another piece of feedback I received was that the app could get stuck recommending movies from a single genre, especially horror. If a user liked too many horror movies, the scores for horror titles would become so high that no other genre could catch up, resulting in a stream of horror-only recommendations. To address this, I modified the scoring system.
Now, every movie starts with a score of 1. Each time you like a movie, I multiply its score by 2; each time you dislike it, I multiply by 0.25. This way, dislikes have a stronger impact than likes. This change also fixed another issue: some users mentioned they disliked too many movies, which would eventually lead to a search error. This happened because I previously ignored movies with a score below 0.
Unknown Movies
Adding the popularity bonus introduced a new issue: users began receiving recommendations for movies that were either barely related or simply bad. To address this, I implemented two additional bonuses. The first is a genre bonus—if a movie shares a genre with the main one, it receives a boost. The second is a user rating bonus.
I also added a rule to immediately filter out any movie with a popularity score below 20. This prevents recommendations of obscure movies that often lack descriptions, media, or relevant related movies.
Pleasing Everyone
As you can see, balancing abstract concepts to please everyone is challenging. Cinephiles want to discover obscure movies, while casual viewers prefer something that feels familiar. I admit the tool can be somewhat unpredictable—it provides great recommendations for certain movies and less accurate ones for others. To help with this, I added a "Staff Picks" carousel featuring movies I personally like. This addition offers a starting point for users who aren't sure what to search for.
Local Exploration
After a while, I found the lack of user control limiting. Having only two choices could sometimes feel monotonous, so I came up with the idea for an "Explorer Mode." This mode uses the same scoring system as "Swiper Mode" to select five movies from the 20 related options, but it doesn't retain previous results. This allows users to perform more localized explorations without being influenced by past choices.