Sync your Letterboxd film diary to a Notion database.
Inspired by @kach0w.
- RSS sync: Incremental updates from your Letterboxd RSS feed (~50 recent entries)
- Full sync: Complete history via HTML scraping
- TMDB enrichment: Fetches backdrop images from TheMovieDB
- Deduplication: Uses Letterboxd ID to prevent duplicates
- Go to notion.so/my-integrations
- Create a new integration and copy the token
- Create a new database in Notion
- Share it with your integration (click "..." → "Connections" → select your integration)
- Copy the database ID from the URL:
notion.so/<DATABASE_ID>?v=...
- Create an account at themoviedb.org
- Go to Settings → API and request an API key
cp .env.example .envFill in your .env:
TOKEN_V3=your_notion_integration_token
DATABASE_ID=your_database_id
TMDB_API_KEY=your_tmdb_api_key
LETTERBOXD_USERNAME=your_letterboxd_username
Requires uv.
# Install dependencies
uv sync
# Initialize database schema
make init-schema
# Sync recent entries (RSS)
make sync
# Full sync (HTML scraping)
make sync-full
# Dry run (preview without syncing)
make sync-dryTo run the sync automatically every 6 hours:
Go to your fork's Settings → Secrets and variables → Actions → New repository secret and add:
| Secret | Value |
|---|---|
TOKEN_V3 |
Your Notion integration token |
DATABASE_ID |
Your Notion database ID |
TMDB_API_KEY |
Your TMDB API key |
LETTERBOXD_USERNAME |
Your Letterboxd username |
The workflow at .github/workflows/sync.yml runs automatically every 6 hours. You can also trigger it manually from the Actions tab.
The sync will create these properties:
| Property | Type | Description |
|---|---|---|
| Title | title | Film title |
| Rating | number | 0.5-5.0 |
| Film Year | number | Release year |
| Watched Date | date | When watched |
| Review | rich_text | Your review |
| Movie URL | url | Letterboxd link |
| Backdrop | files | TMDB backdrop image |
| Letterboxd ID | rich_text | Unique ID for dedup |
| TMDB ID | number | TMDB movie ID |
| Rewatch | checkbox | Is rewatch? |
MIT