The useful part of building Netflix was not matching a dark background and a red logo. The project reproduces the application pattern: a trailer-led hero, category rows backed by live movie data, and hover previews that expand a poster into backdrop, rating, certification, runtime and genres. Preview details load lazily on hover and are cached, so the rows stay light until someone shows interest.
A login wall is faithful to Netflix and fatal for a demo, so browsing and AI search are open to everyone and Firebase sign-in is an optional button in the header. Auth state is synced once at the app root rather than driving navigation, which keeps routing simple and lets guests and signed-in users share the same screens.
Movie categories and application mode live in Redux Toolkit so the browse page and search experience share predictable state. The architecture is intentionally conventional: asynchronous movie data enters once, components consume stable slices, and route-level UI does not invent a second source of truth. Boring state is underrated, especially once five horizontal rows all want the same data.
Natural-language discovery lives in its own Ask AI mode. A Cloudflare Worker sends the request to gpt-oss-120b, chosen after comparing the free-tier Workers AI models on constraint-heavy and multilingual queries. The model returns ranked picks with a one-line reason in the user's language, and every pick is checked against TMDB by title and year. Invented titles are dropped instead of being matched to whatever movie happens to share a name.
The whole app runs as a single Cloudflare Worker. Static assets serve the React app, and a small API layer proxies an allowlisted set of TMDB endpoints with edge caching and handles AI requests with per-IP rate limiting. API keys never ship to the browser, and the client only ever talks to its own origin.
The live app combines an open demo experience, TMDB categories, hover previews, trailer embeds, a responsive mobile-first layout, and an AI search flow that is grounded in real data rather than trusted blindly. It demonstrates the less glamorous parts of a convincing frontend clone: data orchestration, state boundaries, keeping secrets off the client, and treating model output as a suggestion that has to be verified.
