Project case study

MovieWatch

A personal movie-tracking app — log what you've watched, rate and review it, and pull up recommendations for friends based on their favourite genres in seconds.

MovieWatch app screenshot
JavaScriptPrimary language
Express + PostgreSQLBackend
TMDB APIMovie data
VercelDeployed on
Overview

What is MovieWatch?

MovieWatch is a passion project that came out of a very real problem: friends constantly asking me for movie recommendations, and me blanking on everything I'd ever watched. I've been watching films and series since I was 5 — but in the moment, I couldn't remember a single one, and I couldn't even identify the genres clearly enough to match them to someone's taste.

MovieWatch fixes that. Log what you've watched, rate and review it, and when a friend asks for something to watch, just open the app and filter by genre. It's a small tool that brings me real everyday joy — and that's exactly the kind of project I love building.

Features

What it does

Movie logging
Log every movie and series you've watched, keeping a permanent personal record.
Ratings & reviews
Rate what you've watched and write a short review to remind yourself later.
Search by title
Search movies and series using the TMDB API to find and log new titles quickly.
Genre filtering
Filter your watchlist by genre — perfect when a friend asks for a recommendation.
Shareable recommendations
Instantly pull up curated suggestions for friends based on genre preferences.
Persistent storage
Everything saved to PostgreSQL — your list is always there when you need it.
Tech stack

Built with

Languages
JavaScriptHTML5CSS3
Frameworks
Express.jsEJSBootstrap
Database
PostgreSQL
API
TMDB API
Tools
GitFigmaPostmanLighthouse
Deployment
Vercel
Test credentials

Try it yourself

Screenshots

App walkthrough

MovieWatch homepage
Homepage / watchlist
MovieWatch search
Movie search
MovieWatch watchlist view
Watchlist view
Challenges

What I worked through

Navigating the TMDB API Solved
The TMDB API was less straightforward than Spoonacular. Finding the right endpoints for each feature required a lot of Googling rather than relying on the docs alone — the documentation sometimes led to dead ends. Eventually I built up a map of which endpoints matched which features.
Rendering genre names (not IDs) Solved
The API returned genre IDs, not human-readable names. Displaying genres was a core feature, so this was a real problem. The solution came from discovering a dedicated genres endpoint — I could loop through and map each ID to its name, then display the result cleanly.
Improvements

Since deployment

Image compression — Compressed all static images to reduce load times after noticing slowdown post-deployment.
Removed unused CSS — Lighthouse audit revealed dead CSS rules; removing them reduced the stylesheet payload.
Deferred JavaScript — Added defer to script tags to ensure HTML/EJS is fully parsed before JS runs.
GreenBite Hospital system