# CineRoulette — Stop Searching. Start Watching.

> Category: Full-Stack · AI | Period: July 2026 → Building | Metric: 9-signal scoring engine
> Canonical URL: https://www.arman-portfolio.online/projects/cineroulette/
> Live Demo: https://cineroulette-web-nu.vercel.app/
> Source Repository: https://github.com/arman080325/cineroulette.git

## Overview
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.

## Architecture & Tech Stack
Next.js, NestJS, TypeScript, PostgreSQL, Redis, TMDB API, Prisma

## Case Study

### 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.

---
Author: Arman Ahemad Khan (https://www.arman-portfolio.online/)
Role: Application Security & Full-Stack Developer
Education: Final-year B.Tech CSE at Silicon University, Bhubaneswar (CGPA 9.15, graduating May 2027)
