August 2026
My Movies
A personal streaming catalogue pulling from TMDB, presented as a Netflix-style browsing UI with linkable search and a watchlist behind sign-in.

- Role
- Solo build — frontend, backend, infrastructure
- Stack
- Next.js, TypeScript, Tailwind, Postgres, Drizzle, Auth.js, Vercel, Docker
What it brings
- Nine browse rows on the home page — trending, now playing, upcoming, top rated, airing today, and four genre rows — each streamed in with Suspense.
- Search is URL-driven: the query lives in the URL, so results are linkable and the back button works.
- An on-demand /api/revalidate endpoint purges TMDB response caches by tag rather than waiting out a TTL.
- GitHub and Google OAuth sign-in for a personal watchlist; every browse, detail, and search route works without an account.
Technical design
fetch, cached by tag
Client
Next.js 16 App Router
Server
server/tmdb
Typed client, cache tags per endpoint.
server/auth
Auth.js with the Drizzle adapter.
server/watchlist
Server Actions.
/api/revalidate
Data
Postgres (Neon)
Drizzle ORM
External
TMDB API
Server Components
Drizzle
- TMDB responses are cached by tag, through Next's own data cache. Windows run from a day for configuration down to five minutes for search, so a browse page costs nothing upstream.
- Sessions live in the same Postgres as the watchlist. One database and one migration history, through the Auth.js Drizzle adapter.