The project
The starting problem is one everyone knows: half an hour scrolling the catalogue and then watching nothing. The real difficulty shows up with more than one person, because tastes conflict and whoever decides usually pleases themselves.
WatchWise builds a taste profile from ratings and watch history, crosses it with a daily mood questionnaire and produces a daily selection. Every suggestion carries its reasoning: "you rated this film 8 or higher, here are other titles with a similar feel". Knowing why a film was suggested changes how you relate to the recommendation.
Groups work differently: you create a lobby, people join with an invite code, and the system looks for a compromise between the participants' profiles instead of summing them. That was the hardest part, because a naive compromise always lands on the blandest possible title.
Technically the backend is a Fastify service on PostgreSQL with Drizzle, authentication delegated to Supabase and tokens verified via JWKS. Film metadata comes from TMDB behind a dedicated cache, because the API rate limit is the first thing to break when a page loads thirty posters at once.
Within the team I worked mainly on the backend and the recommendation logic.