Toby Champion

CityGraph: a knowledge graph of Bainbridge Island

Designed and built as sole engineer, 2025–present, for Let’s Map Bainbridge.

Street map of Winslow on Bainbridge Island, with buildings in gray and those with a historic designation highlighted in orange

The problem

Bainbridge Island’s history is scattered. Buildings are in the City’s GIS and the state’s historic-property inventory; people and photographs are in the Bainbridge History Museum’s catalog; roads and footpaths are in OpenStreetMap; and much of the rest is in old books, maps and the heads of long-time residents. None of these sources knows about the others, and none of them handles change over time: a building that was a store, then a church, then a house; a ferry with three names; a landing that no longer exists.

I wanted one place where all of that could be linked, checked and explored: a map that knows its own history.

What I built

CityGraph is the platform underneath Let’s Map Bainbridge. I designed and built it as sole engineer over ten months, working with Claude Code.

The CityGraph search box with the query “nakata”, showing the first 5 of 23 results: four people named Nakata and the Don Nakata Recreational Pool, each with a type icon, a short description and an ID
Mockup of the CityGraph page for the Wallace Building, a 1910 commercial building in Winslow: a photo of the building, a small map, its dates and type, a short history, historic photos and a list of past tenants
Design mockup
The SPARQL explorer: on the left, a query for every place with an entry in the Local Register of Historic Places, and its geometry; on the right, the results plotted as labeled points on a street map of Winslow, among them the Island Schoolhouse and Eagle Harbor Church

How I built it

I work with an AI coding agent as a collaborator, not an autopilot. Every area of the system has a written design document that the agent reads before changing it; repeatable procedures, such as adding a person or merging duplicates, are written down as 60 codified skills; and custom MCP servers give the agent safe, read-only access to the graph, the pipelines, QGIS and my research library. The agent’s database access is read-only, enforced by the database itself; writes go through confirmation. Documentation is updated in the same session as the code.

It runs on my own infrastructure: Proxmox and Docker at home, a PostgreSQL streaming replica at Hetzner, a three-node Garage object store, self-hosted CI, and Prometheus and Grafana for monitoring.

Results so far

What’s next

A data-quality suite (seven layers of checks, with findings shaped like SHACL validation results), a new read API and front end, and opening more of the graph to the public.

More on the project at letsmapbainbridge.org and in my blog posts Getting fonts onto the map and the tech that runs Let’s Map Bainbridge.