New29 UI experiments now live in the lab

Software for cities,
transit, and developer tools.

I'm Charlie, a software engineer in Philadelphia. I build civic and urban tools: housing maps, transit data, and the open-data infrastructure cities run on.

Open for workPhiladelphia, PAGo · TypeScript · Rust · Python

About

How I got
here.

Currently looking for software engineering work in civic tech, urban systems, or developer tooling.

I build tools around cities, transit, and public data. Most of what I know about real systems came from working with messy government feeds: inconsistent APIs, undocumented edge cases, and data that has to be right because someone is going to act on it.

civic-philly joins 5,000+ Philadelphia housing and zoning records against ACS census tracts and council districts. septa-live maps every SEPTA line that publishes realtime data. groundwork stitches 6,500+ affordable-housing projects across six cities into one schema with rent-burden overlays. Underneath sit convene and soda, the libraries that pull municipal meeting and open-data feeds the rest of it runs on.

Work

Civic
tools.

Maps, data pipelines, and APIs for cities, transit, and public records. Click anything for code; live demos are marked.

FeaturedCivic data · Philadelphia2026

civic-philly

A real-asset civic tool. 5,000+ housing developments, zoning permits, transit projects, and capital infrastructure investments in Philadelphia, joined against 408 ACS census tracts, 10 council district polygons, 239 RCOs, every council member's contact, 4,212 OPA owners, and 6,400+ L&I displacement signals. Full-text search, public API, RSS, OG, equity overlay, mobile bottom-sheet for organizers at meetings.

5,000+ projects

Public JSON API

Per-district RSS

Stack

TypeScript · Next.js 16 · MapLibre GL · PostGIS · Census ACS

septa-live

Transit · Realtime · 2026

Live map of every SEPTA mode that publishes realtime data: Regional Rail, BSL, MFL, NHSL, five subway-surface trolleys, Girard, and the suburban trolleys. Hits five SEPTA endpoints through Next.js routes that proxy through Vercel's edge cache. Trains and trolleys reused across polls so they slide instead of flicker.

TypeScriptNext.js 16LeafletSEPTA APIs

groundwork

Housing · Six cities · 2026

Interactive map of 6,500+ affordable-housing projects across NYC, SF, LA, DC, Chicago, and Philly, unified into one Postgres + PostGIS schema. Census-tract rent-burden choropleth, supply-demand gap analysis (PostGIS spatial join), and a stakeholders panel that surfaces the elected representative for any clicked development.

TypeScriptNext.jsPostgresPostGISLeaflet

civic-rag

RAG · Legistar · 2026

Ask plain-English questions about city council legislation, get cited answers. Hybrid retrieval (BM25 + dense embeddings, fused with RRF) over Legistar matters and events, indexed in a single SQLite file via sqlite-vec and FTS5 with no vector DB to run. Local sentence-transformers by default, Voyage AI behind a flag. Claude generates the answer and the CLI parses the citation markers back out and prints the source URLs alongside.

PythonAnthropic Claudesqlite-vecsentence-transformers

convene

Python · Municipal data · 2026

Two-platform municipal-data tool: hits Legistar's REST API and HTML-scrapes Granicus's ViewPublisher pages, with 24 US cities preconfigured. Streams events, agenda items, votes, legislation, sponsors, and action history as OCD-shaped JSON, ndjson for jq, or into a 9-table SQLite database.

Python 3.11+Pydantic 2httpxSQLite

soda

Go · Open-data CLI · 2026

A Go CLI for Socrata-based open data portals. 49 government portals preconfigured. Nine commands including watch for new rows and diff between snapshots. Outputs JSON, NDJSON, CSV, or directly into SQLite — pull --all auto-paginates million-row datasets, upserts on :id.

Go 1.25+cobramodernc.org/sqlite

datamade-challenge

Civic · DataMade work sample · 2026

Django + React-Leaflet choropleth of Chicago restaurant-permit issuance by community area and year, a completion of DataMade's public code challenge. A single aggregate GROUP BY in the view feeds the serializer, AbortController-cancelled fetches keep year changes from racing, the color legend is keyed to each year's max, hover popups show raw counts, and a top-5 sidebar gives the page a takeaway beyond the map.

DjangoDRFreact-leafletPostGISDocker

bandstand

Philly · Jazz tonight · 2026

Philadelphia jazz, tonight. Twenty-one rooms across the city: live clubs, jam sessions, listening rooms, vinyl bars, DJ nights, and the bistros that play real jazz on the system. Per-venue scrapers pull Chris' Jazz Cafe and South Jazz Kitchen nightly, the rest hand-curated with confidence tags. Repertory-style editorial layout, Source Serif italic mastheads, paper-grain texture. City map at /map with tag-colored markers and filter chips.

TypeScriptNext.js 16Tailwind v4MapLibre GLcheerio

Get in touch

Looking for a role.
Open to whatever you're building.

Civic, transit, and developer tooling are where I've been spending time, but I'd love to hear about anything you're working on. Eager to learn, and to find a team where I can ship the kind of work I'd be proud of.