Skip to content
@clusterflick

Clusterflick

Every film, every cinema, one place

Clusterflick

Clusterflick is a free, open-source site listing every film showing in London, from 450+ venues in one search: chains, independents, film clubs, festivals and pop-ups. Each film shows its screenings across every venue, with ratings from IMDb, Letterboxd, Rotten Tomatoes and Metacritic, and filters for subtitled, audio-described, relaxed and baby-friendly showings.

🎬 Looking for something to watch? Head to https://clusterflick.com 🍿

This organisation holds the code behind it. Listings are pulled from each venue's own website several times a day, put into one format, matched to The Movie Database, and built into a static site. The pipeline runs in the open as a chain of GitHub Actions, one repository per stage (see Pipeline).

Venue health LLM usage

Using the Data

📄 For data you can use, see clusterflick.com/data-licence.

Most of the repositories below are internal build artifacts, published because the pipeline runs in the open rather than offered for reuse. Each one carries a LICENSE-DATA file saying which it is.

The code in every repository is separately available under the MIT licence.

Repositories

The site

The data pipeline

  • scripts — the code behind every stage, with a module for each venue and ticketing source
  • data-retrieved — pulls raw listings from venue websites and ticketing platforms
  • data-transformed — puts each venue's listings into one format and matches films to TMDB
  • data-diffed — records what changed between runs
  • data-backedup — keeps a copy of every transformed release off GitHub, one archive per week
  • data-cached — caches TMDB metadata for every film
  • data-combined — merges every venue into the single dataset the site is built from
  • data-matched — adds ratings from IMDb, Letterboxd, Rotten Tomatoes and Metacritic
  • data-calendar — calendar feeds, one per venue
  • host-non-web-sources — hand-transcribed listings for venues with nothing on the web to read

Tooling and operations

Build Status

  1. Data Retrieved status Retrieve unassisted runs Retrieve average duration
  2. Data Transformed status Transform unassisted runs Transform average duration
    • Data Diffed status Diff average duration (only releases when something changed)
      • Data Cached status (runs whether or not the diff released)
    • Data Backed Up status (archives each finished week to Cloudflare R2; also daily)
    • also triggers scripts PR and data-analysed analysis scripts
  3. Data Combined status Combine average duration
    • Data Matched status Match unassisted runs Match average duration
      • (only releases once per day)
    • Data Calendar status Calendar average duration
      • clusterflick.com Website status Website average duration
        • manage.clusterflick.com Management site status (also after each venue health cycle, and nightly)
    • analysis.clusterflick.com Analysis site status Analysis site average duration

Pipeline

flowchart LR
    retrieved["data-retrieved"]
    transformed["data-transformed"]
    calendar["data-calendar"]
    cached["data-cached"]
    diffed["data-diffed"]
    backedup["data-backedup"]
    nonweb["host-non-web-sources"]
    combined["data-combined"]
    matched["data-matched"]
    scripts["scripts"]
    analysed["data-analysed<br>(comparisons)"]
    runstats["data-analysed<br>(run stats)"]
    llmusage["data-analysed<br>(LLM usage log)"]
    releaselog["data-analysed<br>(release log)"]
    venuehealth["data-analysed<br>(venue health, hourly)"]

    subgraph retrival[" "]
        direction TB
        retrieved --> retrival-release>Release]
    end

    subgraph transformation[" "]
        direction TB
        transformed --> transformation-release>Release]
    end

    subgraph calendars[" "]
        direction TB
        calendar --> calendar-release>Release]
    end

    subgraph caching[" "]
        direction TB
        cached --> cached-release>Release]
    end

    subgraph diffing[" "]
        direction TB
        diffed --"if changed"--> diffed-release>Release]
    end

    subgraph backup[" "]
        direction TB
        backedup --"each finished week"--> backup-archive[("R2 archive")]
    end

    subgraph combination[" "]
        direction TB
        combined --> combined-release>Release]
    end

    subgraph matching[" "]
        direction TB
        matched --> matched-release>Release]
    end

    subgraph website[" "]
        direction TB
        clusterflick.com --> id1[[Generate website]]
        analysis["analysis.clusterflick.com"] --> id2[[Generate analysis site]]
        manage["manage.clusterflick.com"] --> id3[[Generate management site]]
    end

    nonweb -.->|read by| retrival
    retrival --triggers--> transformation
    transformation --triggers--> backup
    transformation --triggers--> diffing
    transformation --triggers--> scripts
    transformation --triggers--> analysed
    transformation --triggers--> runstats
    transformation --triggers--> llmusage
    transformation --triggers--> releaselog
    diffing --triggers--> caching
    caching --triggers--> combination
    combination --triggers--> calendars
    combination --triggers--> matching
    combination --triggers--> analysis
    calendars --triggers--> clusterflick.com
    calendars --triggers--> releaselog
    matching --"triggers (if new data)"--> clusterflick.com
    clusterflick.com --triggers--> manage
    venuehealth --triggers--> manage

Loading

Tooling Status

Development

  • scripts Scripts CI
  • clusterflick.com Website CI
  • api-tmdb-search Search API test and deploy
  • data-retrieved Experiment (manual — one venue on a chosen runner)

Social Media / Spotlights

  • Generate Last Chance
  • Generate New Films
  • Generate Single Movie

Data Maintenance

  • Update TMDB Data (daily at 11am UTC)
  • Check Venue Statuses (manual)
  • Compare Releases (after each transform)
  • Compare Accessible Screenings (after each transform)
  • Compare CinemaGuide Screenings (after each transform)
  • Update Test Titles (after each transform)
  • Pipeline Run Stats (after each transform — feeds the stability badges above)

Automatic Re-runs

Failed runs of these stages are re-run automatically, up to 3 attempts.

  • Rerun Data Diffed
  • Rerun Data Cached
  • Rerun Data Combined
  • Rerun Data Calendar

Logs

  • LLM Usage Log (after each transform)
  • LLM Usage Sweep (every 3 hours — catches runs the log missed)
  • Release Log (after each transform and calendar release)
  • Venue Health (hourly)
  • Bandwidth Log (hourly)
  • Find Data Reusers (weekly)

Self-hosted Runner Maintenance

  • Runner Stats
  • Reset Dependencies
  • Check SSD Health
  • Check SD Card Health (manual)
  • Restart Router (manual — new public IP for every self-hosted runner)

Security Audit (zizmor)

Each repo audits its GitHub Actions workflows with zizmor via the shared .github reusable workflow.

Pipeline

  • data-retrieved data-retrieved zizmor
  • data-transformed data-transformed zizmor
  • data-backedup data-backedup zizmor
  • data-calendar data-calendar zizmor
  • data-cached data-cached zizmor
  • data-diffed data-diffed zizmor
  • data-combined data-combined zizmor
  • data-matched data-matched zizmor
  • data-analysed data-analysed zizmor

Websites

  • clusterflick.com clusterflick.com zizmor
  • analysis.clusterflick.com analysis.clusterflick.com zizmor
  • api-tmdb-search api-tmdb-search zizmor

Tooling

  • github .github zizmor
  • scripts scripts zizmor
  • generate-spotlights generate-spotlights zizmor
  • self-hosted-workflows self-hosted-workflows zizmor
  • release-downloader release-downloader zizmor

Pinned Loading

  1. clusterflick.com clusterflick.com Public

    Clusterflick: every film showing in London, from 450+ venues in one search

    TypeScript 5

  2. scripts scripts Public

    Clusterflick's data pipeline code: a module for every London cinema and ticketing source

    JavaScript 3

Repositories

Showing 10 of 21 repositories
  • scripts Public

    Clusterflick's data pipeline code: a module for every London cinema and ticketing source

    clusterflick/scripts's past year of commit activity
    JavaScript 3 MIT 0 53 4 Updated Nov 11, 2026
  • data-calendar Public

    Clusterflick pipeline: calendar feeds for every London cinema

    clusterflick/data-calendar's past year of commit activity
    JavaScript 0 MIT 0 0 0 Updated Nov 11, 2026
  • data-combined Public

    Clusterflick pipeline: merges every London venue's listings into one dataset

    clusterflick/data-combined's past year of commit activity
    0 MIT 0 1 0 Updated Nov 11, 2026
  • data-diffed Public

    Clusterflick pipeline: records what changed in London cinema listings between runs

    clusterflick/data-diffed's past year of commit activity
    0 MIT 0 0 0 Updated Nov 11, 2026
  • data-transformed Public

    Clusterflick pipeline: puts London cinema listings into one format and matches films to TMDB

    clusterflick/data-transformed's past year of commit activity
    Shell 0 MIT 0 0 0 Updated Nov 11, 2026
  • clusterflick.com Public

    Clusterflick: every film showing in London, from 450+ venues in one search

    clusterflick/clusterflick.com's past year of commit activity
    TypeScript 5 MIT 0 8 2 Updated Nov 11, 2026
  • themoviedb-data Public

    Clusterflick: tooling to download the TMDB catalogue for experimentation

    clusterflick/themoviedb-data's past year of commit activity
    0 MIT 0 0 0 Updated Nov 11, 2026
  • data-retrieved Public

    Clusterflick pipeline: pulls raw listings from London cinema websites and ticketing platforms

    clusterflick/data-retrieved's past year of commit activity
    0 MIT 0 0 0 Updated Nov 11, 2026
  • manage.clusterflick.com Public

    Clusterflick: internal review site for the data pipeline

    clusterflick/manage.clusterflick.com's past year of commit activity
    TypeScript 0 0 0 0 Updated Nov 11, 2026
  • data-matched Public

    Clusterflick pipeline: adds IMDb, Letterboxd, Rotten Tomatoes and Metacritic ratings

    clusterflick/data-matched's past year of commit activity
    0 MIT 0 0 0 Updated Nov 11, 2026

Top languages

Loading…

Most used topics

Loading…