Inspiration
Atlanta usually finds out who a transit plan hurts after it is built. A news story repeats "10,000 riders a day" and residents have no way to check it. The costs, like lost car lanes, longer commutes and rising rent near new stops, are not in the headline. MARTA rail still stops where a 1971 vote drew the line, and the tools that could test a new idea are built for specialists.
We wanted a flight simulator for transit plans that anyone can use.
What it does
Type a plan in plain English, for example "bus lane from Georgia State to Georgia Tech". WhatIf ATL:
- Reads it. Claude works out what you meant, including nicknames like "GSU" and "GT".
- Builds it on the real Atlanta road network and MARTA lines.
- Tests it by sending 272,994 real commuters through the changed network for one weekday morning, 6 to 10 AM.
- Judges it with one verdict and five tests: time saved, new transit riders, cost per new trip, how much of the benefit reaches formerly redlined neighborhoods, and how many renters near new stops may face rising rent.
Claude then explains the result in two plain sentences and suggests one-click follow-ups such as "Keep all car lanes". You can also paste a news article and have its claims checked against the simulation.
How we built it
- Frontend: Next.js, React and TypeScript, with a deck.gl map over Google 2D and photorealistic 3D tiles.
- Plan reader: Claude turns free text into a structured plan. Every stop must come from a list of 61 real places and every street from the OpenStreetMap network, so the model cannot invent a station or a coordinate.
- Simulation: a Python service (FastAPI) that routes commuters on the OpenStreetMap road graph, runs transit on MARTA's published schedules, and lets each commuter choose between driving and transit.
- Data: Census LODES commuter flows, OpenStreetMap, MARTA GTFS, ACS rent and income, and the 1938 HOLC redlining maps.
- Hosting: both the web app and the simulation run on Vercel.
The headline test is total commuter time. For each home-to-work flow \( i \) with \( n_i \) commuters:
$$ H = \frac{1}{60} \sum_i n_i \left( t_i^{\text{before}} - t_i^{\text{after}} \right) $$
where \( t_i \) is the expected door-to-door commute in minutes. A plan with \( H < 0 \) makes commuters worse off overall and cannot score better than Poor.
Challenges we ran into
- Real routes, not straight lines. Our first bus lane was refused because no street was named, and a new streetcar was drawn as a straight line across the city. We added street routing between any two places, with freeways excluded.
- Keeping the AI honest. Claude reads the plan and explains the result, but every number comes from the simulation. Claude never supplies a figure.
- Fitting a city model in a serverless function. Responses are capped at 4.5 MB and the function at 500 MB, so we cache the network and precompute the baseline.
- An answer we did not want. Our own demo plan, extending the streetcar to Ponce City Market, came back Poor: 41 hours of commuting added per day for 100 new riders. We kept that result.
What we learned
- A tool that only says yes is a brochure. The honest verdict is the product.
- The plan that moves the most people is not always the one that reaches the neighborhoods that were left out.
- Constraining a language model to real places and real streets matters more than making it clever.
What's next
- Real traffic counts across the road network.
- Transit use fitted neighborhood by neighborhood.
- A larger study area, east to Clarkston.
Built With
- anthropic
- census-api
- claude
- deck.gl
- fastapi
- geopandas
- google-maps
- gtfs
- next.js
- openstreetmap
- osmnx
- pandas
- python
- react
- scipy
- tailwindcss
- typescript
- vercel
- zod
- zustand