What do you want to watch next? This is why I built GoodWatch.
Tags: webdev, typescript, python, goodwatch
Published: 2024-05-06 03:19:13

Ever scrolled through Netflix, Disney+ or Hulu and wondered what to watch next?

You can:
* Curate your own watchlist
* Delve into recommendations from streaming services
* Use one of countless websites and apps

Like many, I tried all of the above. They worked, to some extend. But I wanted more.

## The Idea

What if you could find all scores and streaming information for movies and TV shows on one single page? This was the vision for [GoodWatch](https://goodwatch.app/):

![The Boys with scores and streaming info](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6thgazq1ki2hk5frg0z8.png)

Looks nice, I thought. So I built it.

## The Prototype

I quickly built a [Remix](https://remix.run) web app that fetched movie and TV data from [TMDB](https://tmdb.com) and grabbed scores from different sites in real-time. After only three weeks, I was proud to deliver a working prototype that brought immediate value.

I used it almost daily. Loading a movie page took a few seconds though, so I needed a better solution.

## The Need for Data

I compared many workflow engines and ended up choosing the excellent [Windmill](https://windmill.dev).

It allows me to define data pipelines like this:

![Data Pipeline for fetching movie and tv data](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s80j2ix2jsy7eaox84rf.png)

Baseline data is fetched from the wonderful [TMDB API](https://developer.themoviedb.org/docs/getting-started). Then it gets enriched with ratings from IMDb, Metacritic, and Rotten Tomatoes, plus metadata from TV Tropes.

## The Challenges
One of the biggest challenges is to map the correct URL's for each data source. Some (not so) clever techniques are needed to find the correct matches.

Another trade-off is how to deal with update frequencies. The database is around 15 GB big and data upgrades need to be carefully orchestrated.

It's self-explanatory that each service's rate limiting policies are respected.

## The Stack
* **Frontend**: Developed with [Remix](https://remix.run), hosted on [Vercel](https://vercel.com)
* **Data Handling**: Utilizes [Windmill](https://windmill.dev) for data pipelines, with a primary database powered by [PostgreSQL](https://www.postgresql.org/). Auxiliary data storage is handled by [MongoDB](https://www.mongodb.com/), with [Redis](https://redis.io/) for caching to optimize performance
* **Hosting and Deployment**: All services are deployed on [Hetzner Cloud](https://www.hetzner.com/cloud/) using Docker Compose

## The Obvious
Visit [GoodWatch](https://goodwatch.app/) and see how it makes movies and TV shows much easier to discover.

The project is open-source and available on GitHub: [goodwatch-monorepo](https://github.com/alp82/goodwatch-monorepo)

Join the community on Discord: [GoodWatch on Discord](https://discord.com/invite/TVAcrfQzcA)

## The Future
The ultimate goal is to create the best recommendation engine since [Jinni](https://en.wikipedia.org/wiki/Jinni_(search_engine)) shut down in 2015.

I'm aiming to build a tool that understands your unique taste to help you discover hidden gems.

Feel free to ask any questions in the comments or suggest features you’d love to see!