Case studySeattle Neighborhood Pulse
A live civic dashboard that shows what Seattle residents report to the City, where, how it is changing, how fast the City responds, and whether it responds equally across the city.
Next.js, TypeScript, MapLibre GL, Recharts, Tailwind CSS, Vitest, GitHub Actions, Vercel
What I built
A single Next.js application with three server endpoints: the dashboard, response times and the equity analysis. The server asks the City’s API to aggregate, so the browser receives about 76 KB of results, never the raw dataset.
City of Seattle open data (SoQL API)
→↓
Next.js server endpoints
→↓
15-minute cache
→↓
Map, charts and filters in the browser
- Each filter change runs ten aggregate queries in parallel. Results are cached for 15 minutes, identical requests share one upstream call, and failures are never cached.
- Filters live in the page address, so any view can be bookmarked or shared, and every filter updates the map, metrics, charts and lists together.
- A map with neighborhood shading by count or per 1,000 residents, a density heatmap, and clustered markers for the newest 2,000 requests.
- Response times for the five request types the City tracks, and an equity panel that compares closure speed across the City’s Racial and Social Equity Index quintiles.
- Neighborhood boundaries, population and census tracts ship as static files generated by scripts from the City’s GIS services.