Skip to content
Grace Esteban
← Back to the Lab
Open sourceUpdated 2026-07-03

CCSF Board RAG Chatbot

Ask questions about twenty years of City College of San Francisco Board of Trustees meetings — 196 agendas and 190 sets of minutes, scraped, chunked, and answered conversationally by Claude.

Repository ↗

Public boards publish everything — agendas, minutes, resolutions — and then nobody can find any of it. The CCSF Board of Trustees archive goes back to 2006 on Granicus: hundreds of PDFs and HTML pages that answer almost any question about how the college is governed, if you're willing to read them all. I wasn't. So I built the assistant I wished existed.

What it covers

  • 196 board meetings, February 2006 through December 2025
  • 196 meeting agendas and 190 sets of minutes

How it works

  1. Scrape — Playwright and BeautifulSoup walk the public Granicus archive, collecting agenda pages (HTML) and minutes (PDF).
  2. Extract — PyMuPDF pulls text out of the minutes PDFs.
  3. Index — documents are chunked and embedded (all-MiniLM-L6-v2) into ChromaDB for semantic search.
  4. Answer — a Streamlit chat interface retrieves the relevant chunks and has Claude answer the question with the sources in hand.

Why it matters

This is the build that taught me RAG end-to-end — and it's the proof-of-shape for something bigger: every public agency in California has an archive exactly like this one, and almost none of them are queryable. The repo is open source; point the scraper at your own board's archive.