This is my Mergetober hackathon entry for the Letterboxd connector (proposed in cognee#6487).
Letterboxd is where I've logged every film I've watched for years — with ratings, diary entries, rewatch notes and the occasional review I'm proud of. It's a rich, personal dataset sitting behind a social UI that can't do anything except show it back to me chronologically.
This connector pipes the official Letterboxd export into cognee, so an agent can actually answer questions over my film history: "what did I think of Denis Villeneuve's filmography?", "which noirs did I log while studying noir?", "how many times have I rewatched Parasite?"
One ZIP, zero credentials
Letterboxd has no public API, but every member can export everything (Settings → Import & Export → Export). The connector takes the ZIP — or an extracted folder — and that's the entire setup:
import cognee from cognee_community_connector_letterboxd import letterboxd_source await cognee.remember( letterboxd_source("letterboxd_export.zip"), dataset_name="letterboxd", primary_key="id", write_disposition="merge", max_rows_per_table=0, ) answers = await cognee.recall( "Which films did I rate highest, and what did I think of them?", datasets=["letterboxd"], ) What gets remembered
- One document per film, merged across
watched.csv,ratings.csv,reviews.csvanddiary.csv— my rating rendered as stars (the 10-point scale becomes half-star precision, so 7.5 → ★★★½), my full review text, and a date-ordered watch timeline with rewatch markers and tags. - One document per list, with the ordered roster — so "my favourite slow cinema" list is itself a memorable object.
- Graph links for free: every film row carries node-set keys for the lists it belongs to and its decade, so films connect across lists and eras without any LLM extraction.
Incremental + forget-on-delete
Rows are keyed by the stable public film URI and rendered deterministically, so re-exporting and re-running upserts only what changed (an edited review touches exactly one row). And it works in both directions: films or lists present last time but gone from the new export are emitted as hard-delete markers, and cognee's orphan cleanup physically removes them from the graph and vector stores. The memory tracks the library, not a stale snapshot of it.
The parser matches columns by name and ignores unknown ones, so Letterboxd adding columns to future exports won't break it. The only fatal error is a missing watched.csv.
Verified so far
The connector runs end-to-end today: the full suite passes against fixtures mirroring the real CSV shapes (rewatches, tags, list rosters), and the delivery tests drive a real dlt pipeline where an edited review updates its row in place and a deleted film or list physically disappears after the _deleted tombstone.
$ uv run pytest tests/ -q 39 passed in 5.11s I'll add numbers from my own export here as the syncs run.
Honest limitations
- Exports are snapshots: edits/removals are detected on the next export + sync.
- Older exports don't include the watchlist.
- No half-star diary ratings before 10-point conversion existed — handled by the same conversion.
The connector lives at packages/connector/letterboxd/ in cognee-community PR #598 — 39 tests against the real CSV shapes (rewatches, tags, list rosters, tolerant parsing) plus delivery tests proving edits upsert and deletions physically disappear.