The Rory Gilmore Film Club page had been frozen since March while the actual watchlist — a 1,150-film Google Doc — kept growing nightly. Tonight Jefebot learned to feed itself: it now pulls the doc, hydrates its own movie metadata, and serves the finished site data from a public endpoint. The site went from 1,025 stale films to 1,153 live ones, including a film watched today. Zero new credentials were created anywhere, which took three tries to get right.
The Lucky Break
The whole integration hinged on one discovery: Google Docs' markdown export produces byte-for-byte the same table format our watchlist parser has consumed all along — the old reference file was a doc export, we just didn't know it. That meant no Google API, no OAuth, no format conversion: curl the public export URL and the existing pipeline just works. The sync got guards (refuse to overwrite if the doc parses under 500 films or would delete more than 10) so a truncated fetch can never eat the watchlist.
Three Bugs Nobody Noticed
True-ups surface skeletons. First: the exporter's header-row check used line.includes('Order'), which silently dropped Harry Potter and the Order of the Phoenix from the site since the day it was watched. Second: films whose doc links point at Wikipedia instead of IMDB were hydrated by title search but stored under a key nobody ever looked up — so they refetched from OMDB every run and never showed posters. Fixed with dual-key aliasing, with a year-match guard so a 2026 film can't alias onto a cached 2022 wrong-match the curator had already corrected. Third: titles like Juror #2 rendered with literal backslashes because the exporter unescaped three markdown characters and the doc uses five.
Use the Bot That Already Has the Key
The first two architectures involved shuttling an API key to the build machine and inventing a new Jenkins credential — both rightly shot down. The final shape inverts it: the bot self-syncs on an internal 5:30 AM timer (it already holds the OMDB key via JefeVault), exposes the merged site JSON on a public endpoint (it's the same data the website publishes anyway), and the Jenkins filmclub-sync job just fetches-commits-pushes at 6 AM with no credentials beyond the git access it always had. A regression guard refuses to publish if the export shrinks against the live site, so a failed morning sync can't walk the page backwards.
The Test Run
First live sync: +117 films, 132 OMDB fetches, 1,015 cache hits, 6 misses (unreleased 2026 titles OMDB doesn't know yet — they'll self-heal on future syncs). One real bug shook out: the container couldn't overwrite the host-owned watchlist file (EACCES), fixed properly with temp-write + atomic rename instead of a chmod band-aid. The sync even caught Chompy & the Girls, logged by the curator hours earlier, and the site's request queue jumped from 16 stale entries to the bot's live 48 — the !filmqueue data is the source of truth now.
What's Next
- A
!streakcommand for Twitch viewers — scouting found EventSub now ships awatch_streakchat notice (share-gated, push-only), so the design is a hybrid: capture native shares, track chat-presence streaks for everyone else - Watch the first unattended 5:30 AM → 6 AM sync-and-publish cycle land
- The six metadata-less 2026 films should hydrate themselves as OMDB catches up