The problem
Council decisions change streets every week, but the record is spread across agendas, 30-page staff reports and votes, in planning language. Most residents only hear about a decision once it's made, and renters, newcomers, seniors and shift workers are the least likely to take part.
Who it's for
Residents who never read a council agenda, on any phone, with no app or account. The clerk's or communications office runs it; councillors' offices share it.
What it does
Text a street address, a building name ("CN Tower") or a ward number. The reply lists the ward's recent council decisions; reply with a number for how each body voted and the link to the official record. Text WATCH to get a text whenever council votes on something in your ward.
How it stays accurate
Everything comes from City of Toronto open data (council voting record, address points) and agenda pages. No AI writes the replies. It never guesses: an address near a ward boundary is asked for its ward, and no comment deadline is shown unless the official page confirms it. Tested on 2,000 real addresses: 1,989 correct, 11 asked for their ward, 0 wrong.
Simple for a city to set up
No server and no database. A nightly script refreshes the open data, the page is free static hosting, and a text-message number connects to the same reply code. A few cents per conversation. Any city that publishes council votes and addresses can adapt it by changing one data step.
How I built it
Python (standard library) pipeline over the city's CSVs and agenda PDFs; one dependency-free JavaScript module for the whole conversation, shared by the web simulator and the SMS channel; 10 automated tests on every push; GitHub Pages. Requirements, UML and architecture: docs/design.md in the repo.
What's next
A one-ward pilot on development applications, promoted on the statutory notice signs; then confirmed comment periods from the city's item pages, and French and other languages.
Council is between terms after the October 2026 election, so the demo replays real July 2026 records, clearly labelled.
Built With
- elevenlabs
- github
- javascript
- node.js
- poppler
- python
- remotion
- toronto-open-data