A rework of WatchRadar, a simple serie/movie tracker
  • Svelte 45.9%
  • JavaScript 43.6%
  • TypeScript 7%
  • CSS 3.2%
  • HTML 0.1%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-15 09:17:15 +02:00
client fix: lists modal and rewatch badge on new episodes 2026-10-15 09:17:15 +02:00
server fix: lists modal and rewatch badge on new episodes 2026-10-15 09:17:15 +02:00
.dockerignore Initial version 2026-09-15 16:24:54 +02:00
.env.example Initial version 2026-09-15 16:24:54 +02:00
.gitignore Initial version 2026-09-15 16:24:54 +02:00
docker-compose.yml chore: update docker compose 2026-09-20 02:46:05 +02:00
docker-entrypoint.sh Initial version 2026-09-15 16:24:54 +02:00
Dockerfile Initial version 2026-09-15 16:24:54 +02:00
package-lock.json Initial version 2026-09-15 16:24:54 +02:00
package.json Initial version 2026-09-15 16:24:54 +02:00
README.md chore: update readme 2026-09-20 02:43:25 +02:00
screenshot.png chore: bump screenshot 2026-09-28 11:15:24 +02:00
watchradar.sqlite3 Initial version 2026-09-15 16:24:54 +02:00

📡 WatchRadar

WatchRadar Showcase

Track the movies and series you watch, and keep an eye on what's next.

WatchRadar is a small self-hosted tracker built around one idea: your viewing history should never get in the way of what you want to do next. Rewatch a whole show, rewatch one episode, cut a two-cour season in half, mark twenty episodes at once, or forget a show for a year and get told when its next season lands. Nothing resets, nothing blocks.

Features

  • Library with five statuses (Watching, Plan to watch, Completed, On hold, Dropped), search, genre/type/rating/decade filters and every sort you'd expect.
  • Episode tracking with "mark up to here", "mark season", per-episode viewing counts and a full viewing history you can edit.
  • Play-throughs: rewatch a series without losing the record of your first watch. Movies count viewings. One-off episode rewatches are logged separately and never disturb your progress.
  • Season cuts: split any season into parts (Part 1 / Part 2 / …). Progress, "up next" and episode numbering follow the parts, and cuts survive TMDB refreshes.
  • The radar: a background scheduler resyncs tracked titles from TMDB, notifies you about new seasons and episodes, and (optionally) moves completed shows back to Watching when new episodes air. Home shows what aired today and what's coming in the next three weeks.
  • Ratings in half stars, private notes, per-title privacy, custom ordered lists.
  • Social: friends, activity feed, reviews visible to friends, public profiles with stats and achievements, shareable title/profile links with Open Graph + oEmbed previews.
  • Stats: hours watched, monthly activity, favourite days, rating spread, decades, genres, most rewatched, 50+ achievements.
  • Import from MyAnimeList (XML) and Watcharr (JSON); export everything as JSON.
  • Migration from WatchRadar v1 — see below.
  • Light/dark theme, works on phones, admin panel.

Stack

Node 22 · Express 4 · better-sqlite3 · Svelte 5 + Vite. One process serves the API and the built client. Data lives in a single SQLite file.

Run it

cp .env.example .env      # set TMDB_API_KEY
mkdir -p data
docker compose up --build -d

Open http://localhost:3000. The first account created becomes the admin.

Locally

npm install
cp .env.example .env      # set TMDB_API_KEY
npm run dev               # API on :3000, Vite dev server on :5181

npm run build && npm start runs the production build. npm test runs the server test suite, npm run check type-checks the client.

Configuration

All settings are environment variables; see .env.example. The only required one is TMDB_API_KEY. Set TRUST_PROXY=true behind a reverse proxy so secure cookies and client IPs work. ALLOW_REGISTRATION=false closes sign-ups (the very first account is always allowed).

License

MIT