Watchlist is a progressive web application (PWA) designed for tracking, streaming, and reading media content. It unifies movies, TV shows, anime, and manga into a single interface with robust offline capabilities, social features, and content aggregation from various third-party providers.
| Streaming Interface | Watchlist UI |
|---|---|
![]() |
![]() |
| Readlist UI | Download Manager | Reader Interface |
|---|---|---|
![]() |
![]() |
![]() |
- Unified Tracking: Manage watchlists and readlists for movies, TV series, anime, and manga in one location.
- Content Aggregation: Resolves content against multiple third-party providers (e.g., TMDB, AniList, MangaDex) to find streaming sources and chapter pages.
- Offline Capability:
- Video: Downloads HLS streams and MP4s using chunked storage in IndexedDB to bypass browser storage limits.
- Manga: Downloads chapters and covers for offline reading.
- PWA: Service Worker integration for offline application access.
- Media Player: Custom-built video player supporting HLS playback, subtitles, quality selection, and playback speed control.
- Manga Reader: Integrated reader with support for single page, double page, and long-strip reading modes.
- Social Interaction:
- Public user profiles.
- Friend system with activity feeds.
- Media suggestion system.
- Background Synchronization: Syncs watch progress and list status between local storage and the backend database.
The project follows a client-server architecture with a shared module for common types and utilities.
- Framework: React 19 with TypeScript.
- Build Tool: Vite.
- State Management: React Context API (Auth, Offline, Toast).
- Storage: IndexedDB (via extensive custom wrappers) for large binary media storage; LocalStorage for user preferences.
- Styling: Tailwind CSS.
- Routing: React Router DOM.
- Runtime: Node.js.
- Framework: Express.
- Database: PostgreSQL with Prisma ORM.
- Authentication: JWT (JSON Web Tokens) with refresh token rotation.
- Proxy: Handles CORS and referrer manipulation for third-party media sources.
- Node.js 20+
- Docker and Docker Compose
- PostgreSQL (if running without Docker)
- Clone the repository.
- Create a
.envfile based on the environment variables section below. - Build and run the containers:
docker-compose up -d --buildThe application will be available at:
- Frontend:
http://localhost:80 - Backend API:
http://localhost:3201
Backend:
- Navigate to the backend directory.
- Install dependencies:
npm install. - Set up the database:
npx prisma generate && npx prisma migrate deploy. - Start the server:
npm run start.
Frontend:
- Navigate to the frontend directory.
- Install dependencies:
npm install. - Start the development server:
npm run dev.
Create a .env file in the root directory.
| Variable | Description |
|---|---|
PORT |
API server port (default: 3201) |
DATABASE_URL |
PostgreSQL connection string |
JWT_SECRET |
Secret key for access token generation |
JWT_REFRESH_SECRET |
Secret key for refresh token generation |
TMDB_API_KEY |
API key for The Movie Database |
| Variable | Description |
|---|---|
VITE_API_URL |
URL of the backend API |
VITE_TMDB_API_KEY |
API key for TMDB (client-side operations) |
VITE_FRONTEND_URL |
URL where the frontend is hosted |
The project includes a multi-stage Dockerfile capable of building both the frontend (served via Nginx or Node SSR) and the backend.
The docker-compose.yml configures:
- Backend: Node.js application.
- Frontend: Nginx serving the Vite build.
- Traefik: Reverse proxy for routing and load balancing.
- Health Checks: Configured for both services to ensure uptime.
To deploy updates:
docker-compose pull
docker-compose up -d --remove-orphans



