CineRoulette — Stop Searching. Start Watching.
A decision-first movie/series recommender: set a mood and a few filters — as few as one, as many as thirty — hit Spin, and get one intelligently weighted, explainable pick pulled from a globally synced TMDB catalog, never a coin flip. Build starts today.
The Problem
The average streaming user spends 10–18 minutes browsing before choosing something to watch, and a meaningful share of sessions end with nothing chosen — the problem isn't a lack of content, it's decision fatigue from infinite, engagement-optimized scrolling across 30+ apps.
Architecture & Approach
Designed around one decisive action instead of another browse screen: a two-tier filter system (5–6 basic filters for a casual user, 25+ advanced ones behind a collapsed expander — never both at once by default), a Recommendation Score engine that runs a weighted random draw across nine signals — popularity, rating, critic score, recency trend, awards, mood match, region-relative quality, streaming availability, and per-user feedback — instead of a naive ORDER BY RANDOM(), and an optional AI natural-language box that maps plain text like 'I just broke up, something hopeful' onto that exact same filter schema rather than a separate recommendation path. TMDB is synced into a Postgres catalog by a scheduled worker instead of queried live, so the public /spin endpoint stays a single fast indexed read with scores precomputed at sync time.
Engineering Challenges & Solutions
- Keeping quality scoring fair across catalog sizes — a single global vote-count threshold would quietly bury Korean, Nigerian, or regional Indian cinema under Hollywood's volume, so the quality floor and popularity normalization are computed relative to each language/region's own rating distribution
- Keeping the AI natural-language layer a thin translator into the existing filter schema rather than a second, divergent selection path that could drift out of sync with the scoring engine
- Sequencing 24 build steps so a locked MVP — structured filters, weighted spin, reroll, permalinks, watch links — ships and earns real usage data before advanced filters, curated collections, AI input, or accounts get added
Outcome & Results
In Phase 1 of the build as of today — sync-worker skeleton and the initial TMDB import are the starting point, with the full system architecture, database schema, API design, and 24-step sprint sequence already locked in a living design document before the scoring engine's first line of code.
Lessons Learned
Documenting the recommendation-score formula, the region-relative quality floor, and the exact MVP boundary before writing any code is meant to head off the single most common mistake in this kind of product — quietly shipping ORDER BY RANDOM() and calling it a recommendation engine.