Who Reps Me?
Every official who represents you, one address at a time.
In April 2025, Google shut down the Civic Information API — the only free, nationwide way to look up a city council member or school board rep. Who Reps Me? rebuilds that lookup from federal to city hall, on exactly $0 a month of infrastructure.
Data Pipeline
83 jurisdictions
GitHub Actions
The Problem
Google walked away.
The paid vendors didn't blink.
For over a decade, Google's Civic Information API was the quiet backbone behind most "find your representative" tools on the web — free, nationwide, and the only source that reached down to city council and school board level. In April 2025, Google shut it down.
Every provider left standing charges for it. Cicero and BallotReady both sell commercial civic data licenses — reasonable products, but not something a free public lookup tool can build on. Federal data is still easy (Congress publishes it). State data is workable (most legislatures publish open data). Local data — the level that actually governs zoning, trash pickup, and school boards — had no free nationwide source left at all.
"Nobody chases city council rosters for a living. Every 'free' civic-data product either quietly depended on Google's API, or was never free to begin with — it was federal and state, with a paid upsell to unlock local."
the gap this project rebuilds
How It Works
Type an address.
Get everyone who represents you.
One search box, three levels of government. Federal senators and representatives, state legislators and executives, and the city council members and school board reps most "find your rep" tools don't even attempt to cover.
Live demo — search by address, then browse results grouped by LOCAL / STATE / FEDERAL.
Data Sources
Four sources.
Zero paid APIs.
No single free source covers all three levels of government, so the pipeline stitches together four of them — one per layer, plus geocoding to route the address to the right district.
US House & Senate
Via 5calls' free public API — no key required, generous limits, built for exactly this use case.
Legislators & Executives
Via Open States v3 — state house, state senate, governor, and other statewide offices.
City & County Officials
No API exists for this layer. Built an LLM-extraction scraper that reads municipal websites and pulls structured official data out of them.
Address → Coordinates
US Census Geocoder first, Nominatim (OpenStreetMap) as fallback whenever Census can't resolve the query.
Architecture
Search data flow.
One address in, three lookups run in parallel, one merged response rendered by level of government. Geocoding is the fork in the road — get it wrong and everything downstream degrades.
Field Notes
The bare-ZIP bug nobody warns you about.
The Census Geocoder's onelineaddress
endpoint is an address-range matcher, not a general-purpose geocoder — it needs an actual
street number and street name to match against. Feed it a bare city name or a ZIP code alone and
it returns zero matches, even though the search box invites "address or zip code." Without a
fallback, that silently degrades a bare-city/zip search down to federal-only results: two senators
and a representative, no error message explaining why the state legislator and city council
never showed up.
Detect the shape of the query
Before ever calling the Census Geocoder, the query is classified: a full street address, a bare 5-digit ZIP, or a "City, State" pair. Only a full address goes straight to the address-range matcher.
Bare ZIP → zippopotam.us
A 5-digit ZIP with nothing else routes to zippopotam.us, a free lookup that returns a ZIP's centroid lat/lng directly — no street address required, no matching against a range.
Bare "City, State" → Nominatim, then Census coordinates
A city-only query resolves through Nominatim (OpenStreetMap's free geocoder) to a lat/lng, which is then passed to the Census Bureau's coordinates endpoint — a different endpoint than onelineaddress, one built to accept raw coordinates instead of a street-range match — to recover the district and jurisdiction data the address endpoint would have provided.
Autocomplete nudges users toward a full street address before they ever hit the bare-ZIP edge case.
Crowdsourcing
The database that fixes itself.
Local officials data goes stale fast — elections, resignations, redistricting, a city council seat that flips mid-term. Instead of an admin dashboard nobody but me would ever open, corrections route through GitHub, where they're triaged automatically before a human ever has to look.
user-reported issue?"] D -->|"Yes"| E["Comment on existing GitHub issue"] D -->|"No"| F["Open new GitHub issue"] E --> G["Appended to tracking file"] F --> G G --> H["Human review"]
The crowdsource submit modal — a link and a note is all it takes.
Infrastructure Philosophy
A JSON file is the database.
There's no database server. There's no always-on worker process. A per-state JSON shard, committed to the git repo, is the database — versioned, diffable in a pull request, and free to host. A GitHub Actions cron job is the worker, waking up on a schedule to re-scrape and re-validate a shard. Netlify's static hosting is the server, serving those JSON files at the edge with zero origin compute sitting behind them.
"Every piece of 'infrastructure' this project needed already existed as a free tier of something else. The discipline wasn't finding clever workarounds — it was refusing to provision anything that a file, a cron job, and a CDN could already do."
the $0/month thesis
Coverage
24 states and counting.
Federal and state coverage is nationwide from day one — Open States and 5calls both cover all 50 states. Local coverage is what's still expanding: each state's local-officials shard has to be built, scraped, and verified one jurisdiction at a time.
24 of 51 states and territories currently have live coverage: Washington, Oregon, California, Nevada, Utah, Arizona, Colorado, Oklahoma, Texas, Illinois, Tennessee, Michigan, Indiana, Virginia, North Carolina, Ohio, Pennsylvania, Maryland, Georgia, New York, New Jersey, Florida, Massachusetts, Hawaii.
Screens
What it looks like.
Outcome
What it produced.
450 officials indexed
Federal, state, and local officials, unified into one searchable dataset.
24 states covered
Live local-officials coverage, with federal and state coverage nationwide.
83 jurisdictions
Cities and counties with a scraped, human-reviewed local officials shard.
$0/month recurring cost
No database bill, no server bill, no API bill — every dependency runs on a free tier.
0 databases provisioned
JSON shards in git, a cron job, and static hosting replaced the entire backend.
Tech Stack