TypeScriptPythonReactDjangoPostgreSQLDockerChakra UI

A movie discovery platform built on Django Ninja and React TypeScript, integrating with the TMDB API for browsing, filtering, and managing personal watchlists. The core engineering challenge is data quality: TMDB's catalog contains millions of entries with inconsistent metadata, mislabeled content, and unreliable ratings. A multi-stage backend pipeline filters and validates API responses before they reach the frontend. The backend follows a layered service architecture with dependency injection and repository patterns, running in Docker with reverse proxy and Redis caching. Type safety spans the full stack, from API boundaries to auto-generated frontend types.

[key features]

Users discover movies via robust category and filtering options, manage personal watchlists, build shareable curated collections, log watches with ratings and reviews to a personal timeline, and receive personalized recommendations.

  • Type safety from API to frontend: Pydantic, Pyright strict mode, and auto-generated TypeScript
  • Dual-pattern authentication: JWT for email/password, OAuth 2.0 for social login (Google, GitHub)
  • Multi-stage data quality pipeline with hybrid API and client-side filtering
  • Five-container Docker architecture with Caddy reverse proxy, Redis caching, and CI/CD pipeline
  • Built with ARC Framework — a spec-driven development methodology emphasizing focused human-agent collaboration

[implementation details]

Data Quality

  • Pipeline filters at five stages: language-script mismatch detection, blacklisting of mislabeled content, completeness validation for required metadata, release date verification, and tiered vote-count thresholds calibrated by sort context for rating reliability
  • Buffer system pre-fetches up to 5 additional TMDB pages when filtering reduces results below target page size, with Redis-backed session deduplication preventing repeated entries across paginated requests

Type Safety

  • Custom .pyi stubs for django-allauth, ninja-jwt, and django-environ — libraries without official typing — enabling Pyright strict mode with a zero-Any policy enforced via Ruff ANN401
  • DRF-to-Django Ninja migration replaced serializers with Pydantic schemas, unlocking auto-generated TypeScript types and 100% accurate type inference across 23 API endpoints

Service Architecture

  • Constructor-based dependency injection across 7 services with repository pattern and factory functions, enabling isolated unit testing without mock patching
  • Service composition: MovieEnrichmentService bulk-enriches movie lists with user data in a single query, avoiding N+1 through repository abstraction

Theme System

  • Unified semantic token system spanning elevation, interaction states, and component patterns — runtime theme switching across four design systems (GitHub Primer, IBM Carbon, GitLab Pajamas, Material Design 3) at ~19ms per switch

Photo Credits: Denise Jans, Kumiko Shimizu, Noom Peerapong, Jeremy Yap, Adrien Olichon