Walkthrough

Asset map, service-request intake, AI-assisted triage (experimental), and the KPI dashboard.

The question

What does a municipal asset team actually need?

Before writing a single line of code, the question worth sitting with: what is the simplest shape of a system that actually helps a small municipal operations team? Not a full Cityworks replacement, not an enterprise suite — the minimum viable surface that lets someone log a pothole, route it to the right person, and close the loop.

Four primitives kept coming back: assets (the things the city maintains), work orders (planned and reactive work against those assets), service requests (citizen intake — the raw, often-unstructured signal that becomes work), and staff (who does the work and who supervises). Everything else — the map, the dashboard, the AI triage — sits on top of those four.

Key decisions

The choices worth naming

What I built

Architecture and data flow

Four layers, plain and load-bearing. The frontend renders maps and lists; the API does business logic and validation; the database is the source of truth; the Anthropic API is consulted only for the AI triage suggestion, and only as a separate code path.

React frontend Leaflet · Recharts · React Router · Tailwind The user sees this. Renders maps, lists, dashboards. HTTPS · JSON Express API REST endpoints · validation · business logic Translates HTTP requests into safe DB operations. pg pool · SQL PostgreSQL assets · work_orders · service_requests · staff Source of truth. Audit columns on every row. Anthropic API Claude · triage prompt Experimental. FIPPA-flagged. prompt suggestion browser server React 18 (Vite) · Node 20 + Express 4 · PostgreSQL 14+ · @anthropic-ai/sdk 0.30

Four boxes, one direction. The AI integration is intentionally drawn as a side branch off the API rather than between the user and the database — it's a feature you can disable without breaking the rest of the system.

Service request lifecycle

1 Citizen submits "There's a pothole" 2 API receives validates input 3 DB writes (status: pending) audited row 4 AI suggests (experimental) category · priority 5 Human confirms / overrides required, not optional 6 Work order created assigned · scheduled /experimental human-in-the-loop

The AI step is bracketed: it never writes to the database directly, and it never advances state on its own. A human reviewer at step 5 is mandatory before a work order is created.

What I'd change

Roadmap