← All work
WovieLive demoFilm catalogue · personal project

Find a film, keep a watchlist

A film catalogue with genres, TMDB ratings, favourites and watchlists, built to stay fast on top of a large third-party catalogue.

Personal project by Mykhailo Plokhin. Work in progress.

Open the live appSource codewovienext.vercel.app

Next.js · TypeScript · Tailwind CSS · Prisma · TMDB API

Wovie film page for Project Hail Mary: poster, title, TMDB rating and genres over the film's backdrop
Wovie home page: a featured film with rating, genres and a Continue where you left off button
Wovie trailer player on a film page
Wovie sign-up: avatar, username, email and password, with Google and Apple sign-in

The problem

A film catalogue is mostly someone else's data. The work is keeping it fast and reliable when that source is slow or changes.

  • Fetching TMDB on every visit makes TMDB's bad day your bad day.
  • Rendering everything in the browser makes a slow phone wait for the first poster.
  • Watchlists belong to one person, so they cannot be cached like the catalogue.

How it is built

Catalogue pages render on the server and are cached for an hour. Only personal data — favourites and watchlists — reads the database.

cacheper personrefreshVisitorServer renderPage cache · 1 hPrismaPostgreSQL · listsTMDB API

Key decisions

Each choice, and the alternative it beat.

Cache catalogue pages for an hour

The catalogue is the same for everyone, so it is rendered once an hour instead of on every visit. If TMDB is down, visitors see slightly older data instead of an error.

Film pages rendered on the server

Film pages, Top Rated and New Releases arrive as HTML, so a slow phone is not left waiting for JavaScript. The main browse page is still rendered in the browser — next on the list.

The database only for personal data

Favourites and watchlists need real per-person reads; everything else stays out of the database.

Numbers

Wovie is a work in progress with a public demo, and its source is open.

FigureWhat it means
< 90msPage changeThe target for moving between pages — not measured yet.Target
1 hCatalogue refreshCatalogue pages are rendered once and refreshed every hour.Measured
Target
— What the build is designed for — not a measured result
Measured
— Checked in the code or on the live build

Need something similar?

Tell us what you need in a few lines. A person from the team replies.

Start a project