Live · Full-Stack Media Tracker

BingeCheck

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.

December 2025 โ€“ February 2026 ReactTypeScriptFastifyPrismaPostgreSQL
01

overview

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.

02

search_flow

One search fans out to two very different APIs in parallel, then everything lands in a single normalized schema.

Client Search
TMDb REST API
AniList GraphQL
Normalize Schema
Unified Library
๐ŸŽฌ Movie ๐Ÿ“บ TV ๐ŸŽŒ Anime
03

features

Secure Email OTP Auth

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.

Multi-Source Search

Unified search across the TMDB REST API and the AniList GraphQL API, normalized into one schema with automatic season-count enrichment for TV results.

Season-Level Progress

Per-user watched/watching/plan-to-watch status with season-count clamping and auto-status transitions.

Custom Watchlists

Multiple named, user-owned watchlists with live membership toggling and per-item removal.

Rate-Limited, Validated API

Fastify backend with request rate limiting, origin-restricted CORS, and Zod schema validation on every route.

Type-Safe Data Layer

Prisma with the PostgreSQL driver adapter, versioned migrations, and a normalized schema linking users, media, tracking records, and watchlists.

04

architecture

React 19 + TypeScript Frontend (Vite, React Router, Tailwind CSS) โ†“ REST (fetch) Fastify API: JWT auth ยท rate limiting ยท CORS ยท Zod validation โ†“ Prisma ORM (PostgreSQL driver adapter) โ†“ PostgreSQL 16 (containerized) External integrations: TMDB REST API (movies/TV) ยท AniList GraphQL API (anime)

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.

05

schema

06

stack

Frontend
React 19, TypeScript, Vite, Tailwind CSS, Dexie/IndexedDB
Backend
Node.js, Fastify, TypeScript, Zod, REST APIs
Database
PostgreSQL, Prisma ORM, versioned migrations
Authentication
JWT, bcrypt, email OTP verification, Nodemailer
Media APIs
TMDb (movies/TV), AniList (anime)
Infrastructure
Docker, Docker Compose, TrueNAS SCALE, Cloudflare Tunnel