← Portfolio

FOMO

A cron-driven pipeline that scrapes events from 9+ sources, scores them with a local LLM, and writes the best ones to Google Calendar.

Date: March 2026 Tech: Python, Ollama, Playwright, Google Calendar API, Spotify API Topics: AI/ML, web scraping, automation

Details

I kept missing good events in SF because I never checked the right site at the right time. FOMO fixes that- it scrapes 9+ sources, has a local LLM score each event, and drops the best ones straight into my Google Calendar. Runs on cron, no server.

The pipeline

  1. Scrape 9+ event sources in parallel (DoTheBay, Fandango, FunCheap, Lectures on Tap, etc.)
  2. Filter out past events
  3. Auto-pass movies on my watchlist and artists from my Spotify top 200
  4. Score everything else 0-10 with a local LLM against my preference profile
  5. Drop anything below the FOMO threshold (e.g., 9.2)
  6. Write survivors to Google Calendar with score, reason, emoji, and source links

Events get fingerprinted so re-runs don’t create duplicates. If a scraper fails, it falls back to cached results- one broken source doesn’t kill the run.

Why a 3B model on my laptop

Because I’m cheap. But a 3B model on Apple Silicon handles this fine at ~19 tok/s- the task is just scoring an event against a user profile and spitting out a number and a sentence. No API costs, no rate limits.

The hard part was prompt calibration. My prompt includes specific cuisines I like, artists, genres, hard dislikes, and a blacklist. I had to add score anchors telling the model that 9+ means “would drop everything” and that fewer than 0.5% of events should qualify. Before that, everything scored 6-8 and the filter was useless. After calibration it started surfacing things I’d never have found on my own- Repair Cafe SF, Lectures on Tap- while still catching obvious fits like Lord of the Rings at Alamo Drafthouse. No fine-tuning needed.

Source on GitHub.

Google Calendar populated with FOMO-scored events Event detail showing FOMO score and reason Movie event with cinema passthrough scoring