A full-stack media tracking platform for discovering, organizing, rating, and reviewing movies, TV shows, and anime. One centralized library for what you're watching, what you've finished, and what's next. Combines TMDb (movies/TV) and AniList (anime) into a single normalized data model, with season-level progress tracking and custom watchlists.
Movies and TV shows are retrieved through TMDb, anime through AniList, and search results are normalized into a shared data structure so users interact with every media type through one consistent interface. TV results are enriched with season-count information to track viewing progress accurately.
Users add titles to a personal library and classify them as Watching, Watched, or Plan to Watch, with a numerical rating, seasons completed, and a written review per title. For series with a known season count, the backend validates progress and auto-marks all seasons complete once a title is marked watched.
One search fans out to two very different APIs in parallel, then everything lands in a single normalized schema.
JWT-based sessions layered with a 6-digit email one-time-code flow for registration and password reset. HMAC-hashed codes, resend cooldowns, capped attempts, and enumeration-safe responses.
Unified search across the TMDB REST API and the AniList GraphQL API, normalized into one schema with automatic season-count enrichment for TV results.
Per-user watched/watching/plan-to-watch status with season-count clamping and auto-status transitions.
Multiple named, user-owned watchlists with live membership toggling and per-item removal.
Fastify backend with request rate limiting, origin-restricted CORS, and Zod schema validation on every route.
Prisma with the PostgreSQL driver adapter, versioned migrations, and a normalized schema linking users, media, tracking records, and watchlists.
The backend is built with Node.js, TypeScript, and Fastify, exposing REST routes for auth, media
search, library management, tracking updates, and watchlists, plus a dedicated health endpoint for
deployment monitoring. It's packaged as an npm-workspaces monorepo with a multi-stage Docker build:
dependencies install from the root lockfile, the API compiles and Prisma-generates in a build stage,
and only production dependencies plus compiled output ship in the final image. The container runs
prisma migrate deploy automatically on startup before the server boots.
The frontend is built with React, TypeScript, Vite, and Tailwind CSS, with Dexie/IndexedDB on the client for structured local media and watchlist data.