•
3 min read
Cinescan

Building Cinescan: Finding My Watchlist in Dutch Cinemas

I’m a film enthusiast living in the Netherlands. Between Pathé multiplexes, Filmhuis Den Haag, and Eye Filmmuseum, there are dozens of films playing any given week. I had a Letterboxd watchlist with hundreds of films I wanted to see, but I kept missing screenings because I didn’t know when and where they were playing.

My Sunday Night Struggle

Every week I’d open eight different cinema websites, each with its own interface and list of showtimes. I’d try to remember which films caught my interest months ago, maybe because a friend recommended one or I read a good review somewhere. After scrolling through scattered calendars, I’d give up. It took too long, and half the time I’d miss something I wanted to see.

A Marvel sequel gets the same prominence as the recently restored black-and-white Russian art-house film I’ve been waiting to see for months. I’d already picked out what I wanted to watch on Letterboxd. I needed a way to find those films in the schedules.

Building the Solution

So I built Cinescan. You enter your Letterboxd username and pick your cities. Cinescan scrapes your watchlist and matches it against cinema schedules to give you a calendar of films you want to watch nearby.

The first import takes about a minute. A progress indicator shows whether Cinescan is importing your watchlist, finding films, or preparing your dashboard.

The Technical Approach

I’m a big fan of Go for its simplicity, compilation speed, and developer experience, so I reached for it for this project!

Since Dutch cinema chains don’t offer public APIs, I use Go’s Colly framework to scrape schedules from dozens of cinema websites. A cron job runs once a day to update the schedules and check for new matches, so users don’t have to refresh them manually.

The stack is Go, SQLite, and vanilla JavaScript. Go’s embed package lets me bundle the HTML templates, CSS, and JavaScript with the backend in a single binary. I run that executable declaratively on a NixOS VPS, without external services or container orchestration.

Using It and What’s Next

This started as a weekend project to scratch my own itch. Getting the user experience right took more work than the technical challenges. Now I check my calendar instead of going through eight cinema websites on Sunday evening. I hope it helps others too. Cinescan is free to use, and you don’t need a password to create an account.

While working on this project, I’ve gotten excited about Elixir, especially the Ash framework. Having a declarative backend framework handle much of the backend work sounds great, and combining that with the BEAM VM and Phoenix sounds even better. For my next project I think I’ll give this stack a try.


Cinescan currently supports all major Dutch cinema chains and independent theaters across 50+ cities, processing thousands of film schedules daily.