Demand the four-step model
Trip generation by purpose. Pivot-point gravity distribution seeded on
observed commute flows rather than on a fitted curve. Nested-logit mode
choice across auto, transit, walk and bike, with car ownership in the nest.
Frequency-based hyperpath assignment that reasons about headways and mean waits.
Solved to equilibrium over crowding and road congestion by successive
averages.
demand.ts · distribution.ts · modechoice.ts · skim.ts · assignment.ts · sim.ts
Fares five instruments, all live
Base fare and distance charge. Free-transfer windows modelled the way ticket
validity actually works. Time-of-day pricing per period, which genuinely
flattens the peak rather than only suppressing it. Concessions that reach
behaviour and revenue through separate factors. Monthly passes priced as a
ceiling, where the holder's next trip is free to them and still earns the agency
money. Every one of them is a fare rise the board has to vote on.
economy.ts · skim.ts · riders.ts — measured elasticity −0.52, held in a band by a test
Operations three dials and a workforce
Service level, wage ratio and maintenance funding, the last split across
guideway, rolling stock, facilities and systems. Staffing targets, missed runs,
grievance that accumulates, and a strike hazard convex in the shortfall. Per-period
headways across six periods including evening, night and weekend. Consist lengths.
Express and skip-stop patterns.
policy.ts · economy.ts — labour content from CRS R47900 and APTA
Building and what it really costs
Five alignments from tunnel to mixed traffic, each with its own capital cost,
speed ceiling and reliability. Cost and schedule risk drawn once at commit from
the run's own seeded stream, so reloading cannot escape a bad draw. Named
setbacks that fire at most once per project. Track that splits automatically at
any station it crosses, because track may not run past a stop without serving it.
construction.ts · network.ts · land.ts
Stations upgrades that move the model
Second entrances that widen the walk catchment by a platform length —
about eighteen per cent more reachable ground, and the reason agencies spend nine
figures on a doorway. Retail concessions for non-fare revenue. Longer platforms,
step-free access, park-and-ride. Each one changes a number the demand model reads.
upgrades.ts — accessRadiusKm()
Fleet procurement and ageing
Vehicles ordered with real delivery lead times, ageing on condition and mean
distance between failures, overhauls that reset part of that, and a spare ratio
that decides how much of the fleet is actually available on any given morning.
Reliability feeds unpunctuality, which feeds perceived wait, which feeds
ridership.
fleet.ts · transitgraph.ts
Money the books, the way agencies keep them
Operating cost split the four ways the National Transit Database splits it.
Farebox recovery. Federal, state and local subsidy with era-correct shares, including
the withdrawal of federal operating assistance from large urbanised areas in 1998.
Debt with a credit rating and a spread. A state-of-good-repair backlog that grows
when you defer maintenance and bites when you do not.
economy.ts — NTD four-function split
Politics and what it will let you do
Public approval and council support as separate things that move differently.
A board that votes on fare rises and borrowing, and refuses both when it will not
carry them. Election cycles. Institutional trust that changes your borrowing
spread, your funding, and how much scrutiny an overrun attracts. Local opposition
that is specific to a place rather than a global difficulty slider.
politics.ts · trust.ts
Events 112 of them, six families
17 fiscal, 25 political, 19 operational, 9 social, 27 exogenous and 15
opportunity. Some are decisions with real branches; some simply happen to you.
Every one that is in force is shown, named, with what it is currently doing to
the model — because an invisible demand multiplier is indistinguishable
from a broken simulation.
events.ts · effects.ts · ripple.ts
The living city land use that answers
Population and jobs move over a run in response to accessibility. Districts
derive their own character annually from their own live census and employment
numbers, so a residential neighbourhood can become a secondary centre while you
are playing. The counterfactual is tracked too, so the game can say how much of
the growth was yours.
landuse.ts · districts.ts
Explanation the panel that shows its residual
When ridership moves, the attribution panel says what moved it — service,
fares, shocks, the city itself — and prints the part it could not
explain rather than folding it into whichever term was largest. There is also a
per-station answer to “why does nobody board here?”, decomposed into
the terms of the utility function.
explain.ts — attribution, not decomposition
Progression twelve ranks and six endings
A career ladder from Draughtsman upward, a blended score with the arithmetic
shown, six victory conditions each computed from the city you inherited, and rider
sentiment broken out by segment so you can see which group you have been failing.
Runs are recorded across cities.
ranks.ts · score.ts · victory.ts · career.ts · riders.ts
The interface and getting out of your way
A six-step walkthrough and Field Notes, each note verified against the code
that produces it. Undo and redo. Standing policies that answer routine decisions
the way you would. Keyboard shortcuts and an escape ladder that closes exactly
one thing at a time. Saves, and a seed you can share so somebody else can play
your city.
Coach.tsx · dismiss.ts · autopilot.ts · save.ts
The data federal, and cited
54 metros from Census 2020 PL94-171, ACS 2018–2022, LEHD LODES8 2022,
FHWA HPMS and TIGER/Line — 127.8 million residents across 31,521 census
tracts. Real transit from each agency's own published GTFS feed where one exists:
480 real routes and 19,033 real stops. One script, no API key, reproducible.
tools/ — every source a US federal dataset or an agency feed