After building SlugMeter for Santa Cruz, the obvious next question was: does this work anywhere else?
Santa Cruz runs its parking system through a vendor called AIMS. The whole SlugMeter project was possible because AIMS exposes citation data through predictable, sequential IDs with no authentication. I figured there was no way Santa Cruz was the only city using this software.
So I started searching. Turns out AIMS is everywhere. Dozens of municipalities across the country use the exact same portal. Same UI. Same URL structure. Same sequential ticket IDs. I wrote a discovery script that probes known AIMS subdomains to find active deployments and estimate their ticket volume. That's how I found Spokane.
Spokane stood out for two reasons. First, volume. The city writes a lot of parking tickets. Over 109,000 in the dataset so far, going back to 2022. Second, the data is genuinely interesting. The enforcement patterns are completely different from Santa Cruz. Different streets, different hours, different violations. It's a real city with a real downtown, not a college town where 40% of tickets are expired meters near campus.
Ticket formats are weird
Santa Cruz tickets are straightforward. 26SC100001 means year 26, device SC1, sequence 00001. Clean. Predictable. Easy to enumerate.
Spokane is messier. The modern format looks like 220100583. The first two digits are the year (22). The next two are a booklet ID that corresponds to the month the booklet was issued (01). The last five are the sequence number within that booklet. Each physical booklet gets assigned to an officer, so the "device" here is really a pad of paper, not a handheld computer.
Then there's the legacy format. Before 2022, Spokane used plain 9-digit sequential numbers. No year prefix, no booklet ID. Just 000xxxxxx. Two completely different numbering schemes for the same city. I had to write separate parsing logic for each one and a function that detects which format a given citation uses based on whether it starts with 000.
Making it multi-tenant
SlugMeter was built as a single-city app. Every API route, every database query, every component assumed Santa Cruz. Adding Spokane meant either forking the entire codebase or making the whole thing city-aware. I went with option two.
The new architecture uses a city config registry. Each city gets a config object that defines everything: AIMS endpoint, ticket format, map center, device list, theme colors. The Spokane routes at /spk-meter/* mirror the SlugMeter ones but pull from the Spokane config. The API routes filter by city so the data stays isolated.
This sounds cleaner than it was. I had to go through 13 API routes and add city filters to every single one. The original queries had no .eq('city', ...) clause, which meant the dashboard was silently mixing Santa Cruz and Spokane data together. Didn't notice until the revenue chart showed a suspicious spike on a day that turned out to be entirely Spokane tickets.
The geocoding bug
This one was fun. I cache geocoding results so I don't hammer Nominatim with the same address twice. The cache key was just the raw address string. Sounds fine until you realize that "POST ST" exists in both Santa Cruz and Spokane.
The scraper ran Santa Cruz first. So when it got to Spokane's "POST ST," it found a cache hit and returned coordinates in California. 28,735 Spokane citations ended up with Santa Cruz coordinates. It took two passes to fix because Supabase's default query limit is 1,000 rows, and the first update silently stopped there. The cache key now includes the city suffix, so "POST ST, Spokane, WA" and "POST ST, Santa Cruz, CA" are different entries.
What's different about Spokane
A few things stand out compared to Santa Cruz:
- Higher fines. Spokane's average ticket is around $45, versus Santa Cruz's $63 average, but the volume is consistently high throughout the year rather than spiking around UCSC's academic calendar.
- Downtown concentration. Enforcement in Spokane is heavily concentrated in a tight grid around the downtown core, especially along Division Street and the blocks near Riverfront Park.
- Time limit violations dominate. The most common violation is
16A.05.310(D1), time limit no reparking. In Santa Cruz, expired meters are the top hit.
109,058 citations and counting
The scraper pulled 109,058 citations total from the YYMM-format booklets (2022 onward). About 80% of those are geocoded. The remaining 20% have addresses that Nominatim can't resolve, which usually means shorthand or unusual location descriptions that don't map to a real street address. They're still in the database, they just don't appear on the map.
The whole thing is live here. Same features as SlugMeter: real-time map, dashboard, citation explorer, insights. Different city, same idea. If your city uses AIMS, it's probably next.