A cinematic dark-themed movie and TV show watchlist tracker built with Next.js, MongoDB, and TMDB API. Track what you're watching, what you've watched, and discover new titles — all in a retro cinema dashboard aesthetic.
- Dark Retro Cinema Dashboard — Cinematic UI with gold accents, film grain, smooth animations
- Search — Find any movie or TV show via TMDB API
- Watchlist Management — Add, remove, and update status (Watching / Watched / Plan to Watch)
- Dashboard Overview — 4 category rows: Movies, TV Shows, Watching, Watched
- Stats Widget — Total counts for each category
- Authentication — Secure email/password auth via NextAuth.js
- Persistent Storage — MongoDB stores your entire watchlist
- Responsive — Works on desktop and mobile
- Toast Notifications — Real-time feedback on all actions
- Skeleton Loaders — Smooth loading states
| Layer | Tech |
|---|---|
| Frontend | Next.js 14 (App Router), React, Tailwind CSS |
| Backend | Next.js API Routes (serverless) |
| Database | MongoDB + Mongoose |
| Auth | NextAuth.js (credentials) |
| API | TMDB (The Movie Database) |
| Deployment | Vercel |
git clone <repo-url>
cd cinematica
npm installcp .env.example .env.localEdit .env.local with your values (see below).
npm run devVisit http://localhost:3000
Create .env.local with these values:
# MongoDB Atlas connection string
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/cinematica
# TMDB API Read Access Token (Bearer token, not API key)
TMDB_API_KEY=your_tmdb_read_access_token
# NextAuth secret (generate: openssl rand -base64 32)
NEXTAUTH_SECRET=your_secret_here
# Your app URL
NEXTAUTH_URL=http://localhost:3000- Go to https://www.themoviedb.org/ and create an account
- Navigate to Settings → API
- Request an API key (choose "Developer")
- Copy the API Read Access Token (the long JWT, not the short API key)
- Paste it as
TMDB_API_KEYin your.env.local
Note: Cinematica uses the Bearer token auth method, so use the "API Read Access Token", not the v3 API key.
- Go to https://www.mongodb.com/atlas and create a free account
- Create a new Free Tier Cluster
- Create a database user with username/password
- Under Network Access, add
0.0.0.0/0(allow all IPs — required for Vercel) - Get your connection string from Connect → Drivers
- Replace
<username>,<password>, and set database name tocinematica
- Push your project to GitHub
- Go to https://vercel.com and import your repo
- Add all environment variables from
.env.localin the Vercel dashboard:MONGODB_URITMDB_API_KEYNEXTAUTH_SECRETNEXTAUTH_URL→ set to your Vercel deployment URL (e.g.,https://cinematica.vercel.app)
- Deploy!
Tip: After first deploy, update
NEXTAUTH_URLto your actual Vercel URL and redeploy.
cinematica/
├── src/
│ ├── app/
│ │ ├── api/
│ │ │ ├── auth/
│ │ │ │ ├── [...nextauth]/route.ts
│ │ │ │ └── register/route.ts
│ │ │ ├── watchlist/
│ │ │ │ ├── route.ts (GET, POST)
│ │ │ │ └── [id]/route.ts (PATCH, DELETE)
│ │ │ └── search/route.ts
│ │ ├── auth/
│ │ │ ├── login/page.tsx
│ │ │ └── register/page.tsx
│ │ ├── movies/page.tsx
│ │ ├── tv/page.tsx
│ │ ├── watching/page.tsx
│ │ ├── watched/page.tsx
│ │ ├── search/page.tsx
│ │ ├── page.tsx (Dashboard)
│ │ ├── layout.tsx
│ │ └── globals.css
│ ├── components/
│ │ ├── layout/
│ │ │ ├── Navbar.tsx
│ │ │ └── PageLayout.tsx
│ │ ├── ui/
│ │ │ ├── PosterCard.tsx
│ │ │ ├── SearchResultCard.tsx
│ │ │ └── Skeletons.tsx
│ │ ├── dashboard/
│ │ │ ├── StatsWidget.tsx
│ │ │ └── DashboardRow.tsx
│ │ ├── WatchlistPage.tsx
│ │ └── Providers.tsx
│ ├── lib/
│ │ ├── mongodb.ts
│ │ ├── tmdb.ts
│ │ └── auth.ts
│ ├── models/
│ │ └── User.ts
│ └── types/
│ └── index.ts
├── public/
│ └── placeholder-poster.svg
├── .env.example
├── next.config.js
├── tailwind.config.ts
├── tsconfig.json
└── package.json
| Token | Value |
|---|---|
| Background | #0a0a0a (cinema black) |
| Surface | #1a1a1a (charcoal) |
| Gold accent | #c9a84c |
| Gold light | #e8c96d |
| Text | #e5e5e5 |
| Muted | #6b6b6b |
MIT — use freely, watch endlessly.