Personal TV show and movie tracker. Nuxt 4 + Nuxt UI + SQLite, TMDB metadata localized from the selected display language, mobile-first, and self-hosted with Docker. Single-user app, no auth.
- Up next home: next episode to watch per show, sorted by recent activity
- Upcoming: release calendar for followed shows and watchlist movies
- Library: shows with progress and filters, watched movies, watchlist
- Show/movie details: mark watched with the date, rewatches, whole seasons, archive/favorite
- Discover: TMDB search and trending, follow shows or add movies to the watchlist
- TV Time import: drop the TV Time GDPR export ZIP to import your full history
- Stats: total watch time, episodes/movies by month, top shows, genres
- PWA: installable on a phone home screen
- Display language: English by default, configurable in Settings and saved in SQLite
Import your full TV Time history from the GDPR export, matched against TMDB:
A free TMDB API token: create an account on themoviedb.org, then open Settings -> API -> Read Access Token (v4 auth).
# .env at the repository root
NUXT_TMDB_API_KEY=eyJhbGciOi...git clone https://github.com/kodelio/opentv-time.git
cd opentv-time
pnpm install
pnpm dev # http://localhost:3000
pnpm test # Vitest test suite
pnpm typecheckThe SQLite database is created and migrated automatically on startup
(./data/opentvtime.sqlite).
- Request your TV Time data export (GDPR): you will receive a ZIP archive by email.
- Open Settings in the app and drop the ZIP archive.
- The app extracts the CSV files, matches titles through TMDB, and imports shows, watched episodes, and movies.
- Titles that cannot be matched automatically appear in Items to resolve on the same page for manual reconciliation.
On your server (NAS, VPS, Raspberry Pi...), next to docker-compose.yml:
# create .env with the TMDB v4 read token
echo "NUXT_TMDB_API_KEY=eyJhbGciOi..." > .env
docker compose up -d --buildThe app is exposed on port 3002 by default (3002:3000, editable in
docker-compose.yml). Followed show metadata is refreshed every night at 5:00
to fetch new episode dates; Settings also includes a Refresh now button.
The container runs as a non-root user: make sure
./datais writable. AdjustPUID/PGIDindocker-compose.ymlfor your host (for example99:100on Unraid, often1000:1000on a standard Linux host).
| Variable | Default | Purpose |
|---|---|---|
NUXT_TMDB_API_KEY |
- (required) | TMDB v4 read token |
NUXT_DATABASE_PATH |
./data/opentvtime.sqlite (/data/... in Docker) |
SQLite file |
TZ |
- | Time zone, for example Europe/Paris |
MIT © 2026 Kodelio SASU — free to use, modify, and redistribute.




