← All work 01 — Zoning Watch The Statler →

Case study — civic technology

I kept missing zoning cases. So I built something that wouldn't.

Zoning Watch turns Richardson's zoning filings into something a resident can actually follow: searchable, archived, and delivered by email while the decision is still being made.

Zoning Watch's Current Cases view: Richardson zoning case cards with case numbers, status chips, hearing dates, CPC and Council status, plain-language summaries, and links to official documents
The card, not the map, is the unit of the product.

Role

Product strategy, IA, UX, automation

Timeline

Personal project · Launched July 22, 2026

Built with

ArcGIS REST API, Python, GitHub Actions, JSON

Outcome

Zoning Case e-mail alert and a searchable archive of closed cases.

The information was public. It just wasn't usable.

I kept reading about a Richardson zoning case in the news, or hearing about one from a friend, only after it was well underway.

The information wasn't secret. The City published it. So I tried to become more proactive and check the zoning site every week, which was not sustainable.

Manual Checks

Sometimes I forgot. Sometimes nothing had changed. Neither outcome was worth the habit.

A map-first interface

The ArcGIS map is difficult to use on a phone and slow to load data.

Cases that disappear

Once a case closed it would disappear from the website, the only records buried in archived PDFs of Agenda Packets.

Version one had exactly one user: me.

My first thought wasn't a public website. It was much smaller: could I make something check the site for me and send an email when a new case appeared?

I am not a high-level programmer. Rather than let the technical implementation become the reason the project never happened, I wrote a detailed creative brief and product plan, and used AI-assisted development tools to build the system.

Almost immediately the idea got bigger. Richardson's forward thinking on open-data and infrastructure made the case information available through its ArcGIS REST API. Once I could work with the data directly, I could rethink how I actually wanted to use the information.

A card catalog instead of a map

Maps are useful for understanding where a zoning case is, but I felt a map isn't the best place to start when looking at proposed changes. exists.

A map answers one question

Where is it?

  • Useful once you already know a case exists
  • Slow to scan for what changed this week
  • Awkward on the device most people check from

A card answers four

  • What's being proposed?
  • Where is it?
  • What stage is it in?
  • When is the hearing?

Browsing became closer to a card catalog than a map tool.

From notification tool to civic archive

Once a case is finished, it can disappear from the active interface. That makes sense operationally — the City's immediate task is processing current applications. But residents arrive with different questions.

  • What happened to the apartment project down the street?
  • What was approved on that property three years ago?
  • Has this parcel come before the City before?

So Zoning Watch doesn't remove a case when the process ends. It keeps it. I imported years of City Plan Commission and City Council records and made the archive searchable — turning a notification tool into a growing record of local land-use decisions.

Designed to keep up with changes

The system checks authoritative City data on a schedule. There's no conventional application server running behind it, and that simplicity is intentional: the point is to make public information easier to use, not to build unnecessary technical complexity.

  1. 01City data ArcGIS REST API, plus hearing notices
  2. 02Scheduled checks Actions on a cron
  3. 03Processing Python normalizes and diffs
  4. 04Case archive Lightweight JSON, versioned
  5. 05Site and digest Static pages, email to subscribers

AI as a capability multiplier

A working proof of concept came together surprisingly quickly. The real work happened over the following months. Testing against real cases revealed missing cases, so I kept adapting the system.

I didn't become a software engineer. What I had was a clear understanding of the problem, the experience I wanted, the data I needed, and how the system should behave.

I didn't know how to build every part of the system. I knew what the system needed to do.
That was enough to get started

Information without an editorial agenda

Zoning can get contentious. Zoning Watch intentionally doesn't tell residents whether a proposal is good or bad. Its purpose is accessiblity: make it easier to know that something is happening, make the source material easier to find, make the history easier to search, and make it easier for someone who cares to participate in the process.

Public information isn't necessarily accessible simply because it's technically available.