About

Making local government visible.

Most civic decisions that shape daily life — zoning approvals, budget cuts, school board votes, road projects — happen at the township, borough, and city level. Yet local government is the hardest tier to follow. Meeting agendas are buried on obscure municipal websites. Minutes are published as PDFs nobody reads. Most residents have no idea what their local representatives voted on last Tuesday.

Town Crier exists to close that gap. We automatically collect agendas, meeting minutes, budgets, and public proposals from municipal government websites across the United States, extract their content, and make them searchable and readable — with plain-language summaries and topic tags that turn dense bureaucratic documents into accessible civic intelligence.

The goal is simple: lower the barrier to civic participation by making local public data easy to find, understand, and act on. Informed residents ask better questions, attend more meetings, and hold their representatives to account. That starts with knowing what those representatives are actually deciding.

This is a solo project, built and maintained by Joseph Fehr. If your town isn't covered yet, submit a request and we'll add it.


How it works

Scraping & verification

How documents are collected

Every municipality in our index is scraped by an automated pipeline that runs nightly. For cities that use Legistar — the most common municipal records platform, used by Boston, Denver, Seattle, Nashville, and dozens of others — we query their public API directly to retrieve agendas and minutes. For municipalities with custom websites, we use hand-crafted scrapers built with Playwright, a full browser automation tool that can navigate JavaScript-heavy pages, follow pagination, and locate documents even when they're buried three clicks deep. For everything else, a generic discovery pipeline uses web search to find document URLs, then crawls and extracts content from whatever it finds.

Extracting content from PDFs

Most local government documents are PDFs. We extract their text using pdf-parse for digitally-created files, and fall back to Tesseract OCR for scanned documents. Extracted text is what powers full-text search and AI summaries. Documents where extraction fails (password-protected PDFs, image-only scans with no OCR fallback) are still indexed by title and date — they just won't appear in content searches.

Keeping data fresh

The scraper pipeline runs nightly. Each municipality uses an adaptive back-off queue: if several consecutive scrapes find no new documents, the township is scheduled less frequently to avoid unnecessary load on government servers. When new documents are found, the back-off resets. All document upserts are idempotent — running the same scraper twice never creates duplicates.

Document type verification

Scrapers initially classify documents by type — agenda, minutes, budget, proposal, or other — using heuristics: URL patterns, file names, page headings. After each scrape run, an AI verification pass reviews the classifications and corrects mismatches. For example, a document named “FY2025 Adopted Budget Resolution” mis-tagged as “other” will be reclassified as “budget”. Documents are only marked as verified once AI classification agrees with the heuristic.

Daily quality checks

Every morning an automated audit scans the database for stale townships (no documents in over a year), entity mismatches (documents from the wrong municipality indexed under the wrong township), documents with missing or unusually shallow content, and broken source links. The results are published as a quality report, and an auto-fix pass remediates issues it can handle automatically. Edge cases that require human judgment are flagged for manual review.


AI philosophy

AI as a reading aid, not a replacement.

What AI does here

We use Claude Haiku (by Anthropic) for three things: generating 2–3 sentence plain-language summaries of individual documents, extracting topic tags (zoning, infrastructure, public safety, finance, etc.), and synthesizing a brief overview of what each municipality has been actively discussing — what we call Area Insights. These features exist to lower the reading burden on a person who wants to quickly understand what’s in a 40-page budget document or what their city council has been focused on lately.

The source document is always primary

Every AI summary and insight is a navigational aid, not a substitute for the original record. Every document page links directly to its source URL and PDF. We never present an AI summary as the authoritative record — the authoritative record is the one your municipality published. If a summary is wrong or misleading, the original document will tell you. We label all AI-generated content clearly so you always know what you’re reading.

AI fails open

If AI summarization or classification fails — API unavailable, document too short, content not extractable — the document is still indexed, searchable, and displayed. AI features are enhancements, not prerequisites. A township with no AI summaries is no less useful than one with them; you can still find and read every document it has.

Relevance filtering

Scrapers sometimes pick up documents that belong to a different municipality — a regional authority, a neighboring county, or a state agency whose files happen to live on the same server. We run an AI relevance pass after each scrape to detect and remove cross-entity contamination before it reaches the index. This keeps each municipality’s document collection accurate to that municipality.

No AI-generated content presented as fact

We do not use AI to write news, generate analysis, or characterize how elected officials voted. Summaries describe what a document contains, not what it means. Topic tags describe subject matter, not editorial position. Area Insights describe what topics have appeared in recent documents, not whether the government is doing a good or bad job. Civic interpretation is yours to make.

Your town isn’t here yet?

Submit a request and we’ll add your municipality to the index.

Request a township