finished for now · dec 2025 - jan 2026
Movie Recommender
I wanted better movie recommendations. I also wanted to turn the model into an app instead of leaving it in a notebook. Python does the learning, Go keeps it fast, and the site lets anyone try it.
The recommendations beat my baseline by 11.8%, and the app returns them in about 17 milliseconds.
I like recommendation systems, but I did not want this project to end as another model trapped in a notebook. I wanted to search for a movie, get picks that actually made sense, and understand why each title showed up.
That meant building the whole path from raw data to a site someone could use. Features are built and checked in an offline machine learning pipeline, a ranking model is trained there, and a low-latency Go service returns ranked recommendations with lightweight explanations to a Next.js interface.
what it does
- recommends movies for a MovieLens
user_idbased on historical ratings - searches movies by title and returns similar recommendations from a selected movie
- enriches MovieLens data with TMDB metadata, including genres, popularity, release year, runtime, and poster URLs
- returns ranked movie cards through a Next.js frontend backed by a Go API


how it works
The system is split into three pieces:
- offline ML pipeline: Python scripts ingest MovieLens CSVs, enrich metadata from TMDB, build feature tables, create a training set, train a LightGBM ranking model, and export service data
- online ranking service: a Go API handles candidate generation, feature
lookup, ranking, and response formatting for
/search,/rank, and movie detail endpoints - demo UI: a Next.js frontend lets someone search by movie title or enter a user id, then renders ranked results as movie cards
how a recommendation gets made
For user-based recommendations, the service accepts a request like:
{
"user_id": 123,
"k": 25
}
For movie-based recommendations, it can rank similar titles from a selected movie:
{
"movie_id": 550,
"k": 25
}
The response includes the ranked movies, score, poster URL, and simple reason strings such as genre matches or popularity signals. The current Go service uses a heuristic score over exported feature tables, while the LightGBM model is trained and saved offline. Wiring the model into online inference is the next step.
what I used
- Python for data ingestion, feature engineering, evaluation, and LightGBM training
- Go for the online ranking service
- Next.js and Tailwind for the demo UI
- MovieLens for ratings data
- TMDB for movie metadata and posters
what surprised me
This project made me think beyond whether the model worked. I also had to decide how the training work, exported data, ranking endpoints, and interface should fit together so a recommendation could arrive quickly and still make sense.
It also made the tradeoff between model quality and serving complexity more concrete. The offline LightGBM pipeline gives a stronger ranking path, while the Go heuristic keeps the demo simple and fast until full model inference is wired into the service.
