When I lived in Belfast, I had one problem: I wanted to know what was showing at the Strand Cinema without having to remember to check their website. I wanted to look at next Friday in my calendar and see if there was anything worth going to.
So I built a scraper. Pull the listings, transform them into something structured, generate an ICS file. Done.
That was June 2023. That workflow—retrieve, transform, output—is still the foundation of everything Clusterflick does today.
What It Looks Like Now
I currently have 14 cinema calendar feeds in my Google Calendar. When I want to see what’s on, I toggle a few of them on—maybe the BFI, Castle Cinema, Genesis Cinema, and the Prince Charles Cinema if I’m planning for the weekend. When I book tickets, I just copy that event over to my personal calendar.
Adding a feed is as simple as pasting a URL into Google Calendar. If you want to try it yourself, the 📅 data-calendar repo has instructions and feed URLs for every venue.
Rich Events, Not Just “7pm — Cinema”
Each calendar event includes:
- The venue name and location (so Google Maps knows where you’re going)
- A link back to the original listing page
- The movie title as the cinema lists it
- Whatever metadata we managed to extract: directors, actors, a plot summary
Below all of that, we include our match with The Movie Database: so you also have the canonical title, the year, an overview, and a link back to TMDB if you want to look up more—but the event title itself stays as the cinema’s original listing.

👆 Prince Charles Cinema schedule for next week 📆
This is different from the website, where everything gets unified under one canonical movie title. Calendar feeds are venue-specific—they’re replicating what’s on that cinema’s website, so using their original title makes sense. If the Prince Charles Cinema is showing “Troll 2 (aka Best Worst Movie)” and we’ve matched it to Troll 2 in TMDB, that’s fine. The feed is telling you what’s on at that venue, not trying to reconcile it with every other cinema’s listing.
The Duration Problem
Here’s the annoying thing about cinema listings: they tell you when the film starts, but rarely how long it is. And if you’re putting something in a calendar, you need an end time.
Early on, I just defaulted everything to 90 minutes. If the listing happens to include a runtime, we use it. And since we match more than 96% of films against TMDB, we can pull the actual runtime from there. So if it’s a 2h20m film, you get a 2h20m calendar event.
It’s not perfect—it doesn’t account for the 20 minutes of trailers most cinemas front-load. But it’s close enough to be useful. A two-hour film showing up as a two-hour block in your calendar is good enough for planning your evening.
It Branches Early
One of the nice architectural wins here: calendar feeds come straight off the transform step. They don’t need the combining logic, the caching layer, or the TMDB enrichment that the website requires.
The website has to:
- Combine showings from multiple venues into canonical movies
- Cache TMDB lookups to avoid rate limits
- Fetch rich metadata (full cast, crew, posters, trailers)
- Generate static pages for every film
The calendar feeds skip all of that. They’re just: here’s what this venue says is showing, in a format your calendar app understands. We branch off right after transform and generate the ICS file. Simple.
Why This Matters
This is still the simplest, most personally useful output of the whole project. Everything else—the website, the movie matching, the LLM-assisted disambiguation—grew from this.
I just wanted to see what was on at the cinema without having to check their website. Two years later, I still use these feeds every week. The rest of Clusterflick exists because this one thing was useful enough to keep building on.
Next post: Scaling From 3 Cinemas to 240 Venues: What Broke and What Evolved
