Conceptual AI-generated artwork
Building
Intersection
Intelligence
A personal mapping experiment
built with Codex and Claude
Mo Khan
14 November 2026
Conceptual AI-generated artwork
02
A question about a place
What is here,
and how do we know?
A personal research question that led me into an unfamiliar geospatial stack.
Start with South Africa
03
Research app screenshot with sensitive UI redacted
Country scale
Geographic context
Evidence with limits
Research app, 14 Nov 2026. UI redacted.
© OpenStreetMap contributors / Protomaps.
The journey in the repository
04
30 AUG
Standalone fixture MVP
31 AUG–1 SEP
Real geography and vector atlas
2–17 SEP
Contributions and stable identities
19–25 SEP
Measured performance work
LATE SEP
Contextual AI and shared platform
OCT–NOV
Country expansion and hardening
Zoom into Gauteng
05
Research app screenshot with sensitive UI redacted
Province scale
Bounded evidence
Clusters and points
Research app, 14 Nov 2026. UI redacted.
© OpenStreetMap contributors / Protomaps.
Find the city-scale question
06
Research app screenshot with sensitive UI redacted
Johannesburg
Local context
Details on demand
Research app, 14 Nov 2026. UI redacted.
© OpenStreetMap contributors / Protomaps.
Follow a corridor
07
Research app screenshot with sensitive UI redacted
City to corridor
Published road topology
A connected place
Research app, 14 Nov 2026. UI redacted.
© OpenStreetMap contributors / Protomaps.
One place, several kinds of evidence
08
OpenStreetMap
Geography
and recorded tags
Authority sources
Reported assets
and source dates
Human evidence
Observations
and review history
Area summaries
Counts at their
stated scope
Resolved view with provenance
Map, dossier, count and export use consistent scope.
Unknown, absent, unavailable and zero keep their own meanings.
Every source needed a way in
09
1. Retain source
Original fields, IDs and dates
2. Custom importer
Source-specific parsing
3. Candidate matching
Fuzzy names, road pairs, geography
4. Assisted review
App + browser location checks
5. Explicit acceptance
Candidate and confirmed differ
6. Publish and reconcile
Keep unresolved rows and history
Google Maps supported review, not unrestricted copying. Every source retains its terms.
Refreshes had to preserve human knowledge
10
Source revision A
Mapped nodes and roads
Stable place identity
Aliases and explicit reconciliation
Source revision B
Changed geometry or grouping
Preserved human knowledge
Contributions, accepted decisions and complete history
Illustrative model. A refresh must not detach accepted evidence.
Codex and Claude worked through evidence
11
Owner
Intent, scope and acceptance
Codex
Implement and verify
Claude
Challenge assumptions and inspect evidence
Curated ledger + tests + live results
This describes recorded collaboration sessions, not independent review of every commit.
Independent review changed the work
12
Build location
Heavy geography processing moved off the serving host.
Application scope
A map area could not inherit financial assumptions.
Completion evidence
Source review, test results and live acceptance stayed distinct.
Software architecture
13
Atlas and dossiers
JavaScript / MapLibre / PMTiles
Shared chat client
React conversation interface
Product API
Node.js / Fastify + domain code
Shared Signal AI
Product-owned read tools
Prepared reads
Files + read-only SQLite
Human evidence
Events + conditional heads
Platform identity
Canonical entitlements
The technology stack
14
Browser
JavaScript / MapLibre GL JS
PMTiles / Protomaps / React chat
Application
Node.js 24 / Fastify
Shared geography and evidence code
Preparation
Python geospatial processing
Custom importers / matching
Data
Versioned files / SQLite
Blob events + conditional heads
Hosting
Azure App Service Linux B2
Entra ID / Blob Storage
Shared services
Signal AI / entitlements
GitHub CI / release verification
A concrete stack for a personal research application. Resource identifiers omitted.
Building and serving are different workloads
15
BUILD
SERVE
Pinned sources
Python geospatial processing
Identity and spatial validation
Versioned artifacts
Interactive map
Bounded API reads
Local analytical workers
Attributable contributions
Heavy extraction runs outside the serving worker and ordinary application CI.
Deployment architecture
16
Entra ID
Enterprise sign-in
User browser
Atlas + shared chat
Basemap Storage
Signed tile reads
Release workflow
Code / validated data
App Service
Authenticated product API
Shared services
Entitlements + AI
Application storage
Immutable files + local SQLite
Evidence Storage
Separate history / restricted network
Service endpoint with restricted public Storage access. Identifiers omitted.
A small Linux host shaped the design
17
Linux B2
2 cores · 3.5 GB RAM
One instance / Node.js 24 LTS / Always On
Prepare geography elsewhere. Serve bounded reads.
Recover local SQLite copies from verified persistent releases.
B2 lists 10 GB plan storage; temporary worker disk is separate. No sustained capacity claim.
A map release must preserve contribution history
18
IMMUTABLE RELEASE
HUMAN EVIDENCE
Prepared geography
Versioned sources
Read models and indexes
Create-only events
Conditional current heads
Committed ancestry
Stale edits conflict. Map refreshes preserve accepted history.
Rendering improved through repeated cycles
19
Draw the useful view
Bound visible objects, cluster points and reuse coordinates.
Stabilise the camera
Reserve layout space and query the final map bounds.
Reuse fresh evidence
Keep complete context keys, expiry and edit invalidation.
Measure the visible result, keep the caveats
20
30 cached revisits
Zero requests and aborts; same visible evidence.
90.5 ms median
116.5 ms p95 application completion; GPU paint excluded.
771 to 529 ms
Street API median improved; overview median regressed.
A measured improvement in repeated queries
21
855 ms
276 ms
Repeated count request
Median of three warm repeats
855 ms276 msBeforeResident worker
22 September production experiment. First request essentially unchanged. Not a whole-app or capacity claim.
Performance meant doing less repeated work
22
Select scope
Use the requested area before expensive enrichment.
Reuse evidence
Validate freshness and retain unchanged prepared work.
Preserve answers
Check counts, dossiers and exports against the same population.
AI in the product uses authorised evidence
23
Selected map context
Area, record and original turn scope
Authorised read tools
Bounded product evidence
Deterministic facts
Counts, calculations and provenance
Conversational answer
Explicit gaps, partial results and uncertainty
Development AI helps build the system. Product AI reads evidence through its own contracts.
The first usable release required an owner decision
24
Implementation
Code and regression evidence
Deployment
Exact running application and data
Acceptance
A usable experience with stated limits
The first native AI increment launched at the end of September under a bounded owner decision.
The accepted research slice
25
AVAILABLE
STILL OPEN
Atlas and site dossiers
Source-aware comparisons
Reviewed contributions
Contextual AI
Nine-country catalogue
Uneven source depth
Sustained capacity acceptance
Richer topology and calibration
Gated data-maintenance procedure
Discovery-and-capture alpha. No live traffic-control or validated traffic-benefit claim.
Original vision, accepted MVP
26
Explore a place
Accepted: country, city, junction and corridor navigation.
Trust the evidence
Accepted: source-aware dossiers, candidate links and reviewed edits.
Model the wider network
Open: complete coverage, calibration and sustained capacity.
What I would repeat
27
A narrow real-data slice
It reveals the work hidden by a convincing prototype.
Identity and provenance early
People need to trust what survives the next refresh.
Specific review questions
Findings need evidence and an implementation owner.
User-visible acceptance
A green build is one milestone on the way to a useful product.
Conceptual AI-generated artwork
Learning a new stack with AI
A useful research MVP, a clearer understanding,
and a longer list of questions worth exploring.
Mo Khan
Questions and discussion