A self-hosted, fully local movie & TV tracker built from your IMDb data export. Import your ratings and watchlist once, enrich everything with posters and metadata from TMDB, and browse a fast, dark, poster-first library in your browser — no accounts, no cloud, no ongoing IMDb dependency.
- Your library, offline — ratings and watchlist imported from IMDb CSV exports into a local SQLite database.
- Rich metadata & posters — every title enriched via the TMDB API; posters cached locally.
- Rate & curate in-app — set ratings (marks a title watched), add/remove watchlist entries, add notes and tags.
- Discovery — New Releases, Upcoming, personalized For You recommendations, and search-and-add any TMDB title.
- Insights — a stats dashboard: hours watched, rating distribution, genre/decade/director affinity, and "you vs. the crowd".
- Fast search — full-text search across titles, directors, genres and plots, plus a ⌘K command palette.
- Where to watch & trailers — streaming-provider availability and trailers inside each title's detail view.
- Data tools — multi-format export (Excel, CSV, JSON, Letterboxd), backups, a library health report, and one-click re-enrichment.
| Layer | Choice |
|---|---|
| Runtime | Node.js (built-in node:sqlite) |
| Backend | Express |
| Database | SQLite (file-based, local) |
| Frontend | React + Vite |
| Styling | Tailwind CSS |
| Metadata | TMDB API |
- Node.js 24+ (the app uses the built-in
node:sqlitemodule). - A free TMDB API key — optional but recommended; without it the app still runs from CSV metadata, but posters, overviews, and discovery are disabled. Get one at https://www.themoviedb.org/settings/api.
# 1. Install
npm install
# 2. Configure (optional but recommended)
cp .env.example .env # then add your TMDB key
# 3. Add your IMDb exports
# Drop ratings.csv and watchlist.csv into ./exported (or ./data)
# 4. Import + enrich
npm run import # load CSVs into the local database
npm run enrich # backfill posters & metadata from TMDB
# 5. Run
npm run dev # client at http://localhost:5173 (API on :3001)The database is created automatically on first run, and CSVs in ./exported are
imported on boot if the library is empty — so npm run dev works on its own too.
| Command | Description |
|---|---|
npm run dev |
API server + Vite dev client with hot reload |
npm run import |
Import IMDb CSV exports into the database |
npm run enrich |
Fetch TMDB metadata + posters (resumable) |
npm run build |
Build the client for production |
npm run serve |
Build, then serve client + API on one port |
npm start |
Serve the API (and built client if present) |
Concise guides live in docs/:
- Getting started
- Configuration
- Importing & exporting
- Features
- API reference
- Architecture
- Troubleshooting
Everything runs on your machine. Your data lives in a local SQLite file, posters are cached locally, and the only external service is the TMDB API (used for metadata and discovery). No analytics, no accounts, no cloud sync.