5 min read
Cinescan

Building Cinescan: When Your Watchlist Actually Becomes Useful

I’m a film enthusiast living in the Netherlands, and I had a problem that was driving me crazy. Dutch cities have incredible cinema options, everything from mainstream Pathé multiplexes to gems like Filmhuis Den Haag and Eye Filmmuseum. Any given week, there are dozens of films playing across multiple venues.

The problem? I never knew which ones I actually wanted to watch.

My Sunday Night Struggle

So, every week I’d go through the same exhausting routine:

Open eight different cinema websites, each with their own confusing interface and overwhelming 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, but after endlessly scrolling through scattered calendars, I’d inevitably give up. The process just took too long, and half the time I’d miss something I actually wanted to see.

Meanwhile, I had this carefully curated Letterboxd watchlist with hundreds of films I genuinely wanted to see, films that I know are displayed in the cinemas near me, I just had to know exactly when and where, reliably.

The Real Problem

Cinema websites treat every film equally. A Marvel sequel gets the same prominence as the recently restored black & wite Russian art-house film you’ve been waiting to see for months. You end up drowning in options while the films you care about remain invisible.

I’d already done the work of curating what I wanted to watch, that is what my Letterboxd watchlist represented. But there was this massive gap between my intentions and what was actually available to me.

Building the Solution

So I built Cinescan. The concept is simple: what if I could just get a reliable calendar overview showing when films from my Letterboxd watchlist were actually playing near me?

Here’s how it works:

You connect your Letterboxd username, pick your cities, and that’s it. The system monitors cinema schedules across the Netherlands with a background matching process that takes care of finding films from your watchlist that are actually playing near you. Instead of checking eight websites every week, you get a personalized digest of “stuff you actually want to watch that you can actually go see.”

How It Actually Works

When you sign up, there’s a progress indicator that shows what’s happening:

  • ✅ Account Created
  • 🔍 Analyzing Watchlist
  • ⏳ Finding Films
  • 🎬 Preparing Dashboard

In about one minute, it scrapes your entire Letterboxd watchlist, matches it against current cinema schedules across your selected Dutch cities, and prepares your personalized dashboard. That weekly chore of checking cinema websites? Gone.

Why I Built This

I kept missing films I’ve been dying to see in cinema. Not because they weren’t playing, they were. But because I didn’t know they were playing.

This flips cinema discovery from “what’s playing?” to “what am I excited about that’s playing?” It’s the difference between browsing randomly and getting exactly what you’re looking for.

The Technical Approach

I’m a big fan of Go for its simplicity, (compilation) speed and great DX. so I naturally reached for it for this project!

Since Dutch cinema chains don’t offer public APIs, I had to get creative with the data collection. Here’s what I built:

Web Scraping Pipeline: Using Go’s Colly framework to scrape cinema schedules across the Netherlands. The system monitors dozens of cinema websites continuously.

Background Processing: A cron job runs once a day, updating film schedules and checking for new matches. Users never have to manually refresh anything, It just works in the background.

Minimal Architecture: Everything compiles into a single Go binary using the embed package: the backend, HTML templates, CSS, JavaScript, everything. No external dependencies, no complex deployment. Just run the executable.

The entire stack is Go, SQLite, and vanilla JavaScript. I focused on a great experience for shipping the product.Deployment stays simple: no external services, no container orchestration, just one executable running declaratively on a NixOS VPS.

What I Learned

This started as a weekend project to scratch my own itch, but it ended up teaching me a lot about building something people actually use. The technical challenges weren’t necessarily the hard part, figuring out how to make the user experience simple was.

Now instead of my Sunday evening cinema website marathon, I just check my personalized calendar overview. My Letterboxd watchlist finally does what it was supposed to do: help me find films I want to watch. And I hope it will help others too! The tool is free to use and creating an account is so easy you don’t even need a password. You can visit the site here.

Meanwhile, during working on this project I’ve gotten most excited about Elixir, and especially the Ash framework. Having a declaritive backend framework do a lot of heavy lifting for you 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.