Product · Service alerts
A text about their block, not a blast about the city.
Street sweeping, trash and recycling, leaf collection, snow. Matched to the resident's own address and their own license plate, then sent by text, email, or push. Residents stop calling to ask when the truck comes.
Written in 2017 and in production ever since for a city public works department, where residents know it as MyDPW.
01
The problem it solves
A citywide alert is nobody's alert.
Most notification tools broadcast. A resident gets a message about street sweeping on eleven wards, decides it probably does not apply to them, and gets a ticket on Thursday. Then they call the department, which is the cost you were trying to avoid.
The difference here is that the alert is resolved against the department's actual route data before it is sent. The resident's address sits on a specific sweeping segment, in a specific collection zone, in a specific season. So the message is about their side of their street on their day, and there is nothing in it to disregard.
02
What it does
- Campaigns per service
- Each service is its own campaign with its own schedule, message set, and audience: trash and recycling, street sweeping, leaf collection, snow. Reminders, cancellations, and service disruptions are separate messages inside a campaign, so a canceled day does not reuse the reminder template.
- Matching that is spatial, not a mailing list
- Subscribers are matched by address against the department's own route geometry, by license plate for anything parking-related, and by ad-hoc attributes when a one-off needs a slice. PostGIS does the lookup, so precision is whatever precision the department's data has.
- Seasons, holidays, and exceptions
- Leaf collection runs in the fall and sweeping in the spring, and the switch is a season window rather than a code change. Recurrence follows calendar rules, with holiday and exception overlays for the weeks that do not follow the pattern.
- Three channels, one subscription
- Text, email, and mobile push. The resident picks per channel and the department does not manage three lists. Delivery runs on per-department provider configuration, with test modes and recipient allowlists so a new campaign can be rehearsed against real data without reaching real people.
- Where residents manage it
- A resident-facing web app plus iOS and Android apps. Add an address, pick which services matter, choose channels, see the next collection date for each. Signing in is a code sent to the phone or the inbox, because a public works alert is not worth a password nobody remembers.
- One tenant per department
- Multi-tenant from the first migration in 2017. A department gets its own subdomain, branding, templates, provider credentials, and message queues, on the same codebase. There is no per-customer fork to maintain, which is why a second city does not cost what the first one did.
03
Why it holds up
Nine years in production, through four administrations.
Written in 2017 for a city public works department and running ever since. Every fall the leaf campaign comes on and every spring it flips to sweeping. That cadence, not a launch, is the real uptime record.
One person wrote it, and he still answers the phone.
Every line of the original 2017 system was written by Kaizen's founder, who is still the person you would talk to. It has been through two runtime generations, a job-queue replacement, and a move to ARM since, and it has never been handed to a team that inherited it without context.
04
In build
Next: residents ask, instead of subscribing.
Subscribing to a campaign still asks the resident to know what to subscribe to. The work in progress is the other direction: a resident texts the city number and asks anything about their block, and the answer comes back from the same route and schedule data the alerts run on.
We are saying this plainly because the rest of this site attacks AI that never ships. This part has not shipped. The alerting platform above is in production today; the conversational layer is in build and will be named on this page when a city is using it. Municipal chatbots that answer from a list of documents already exist, and they are not what this is.
Which service generates your most calls?
Start with that one. Thirty minutes on a live system, including the parts that are unfinished, and what it takes to stand up your routes.