I built a 50-year NYC housing simulator. Here's what I learned (mostly not what the simulator said).
A weekend project that became an excuse to learn housing economics. Don't cite this in policy debates. But the things I learned by building it changed my position on a few things.
I spent a couple days vibin’ this NYC housing simulation: YIMBY NYC. 10,000 individual actors of varied incomes bid on NYC apartments, move to minimize commute, have kids and look for places with more space, lose jobs, double up with friends, sometimes leave the city when they can’t take it anymore.
Go to kaighn.com/yimby and hit play to advance month by month from 2020 to 2070. Toggle policies in the left nav — remove parking minimums, upzone the Bronx, levy a land value tax, mandate 100% affordable housing on every new project, abolish CEQR — and watch what happens.
How It Works
The simulator opens in January 2020 with 10,000 households scattered across 55 NYC neighborhoods. Each agent is a person with an income, household size, age, work location, savings, and a tolerance for commute. Each month — each “tick” — they ask the same question: am I in the right place?
Some shop around. Some renew. New arrivals come, retirees leave. Available units go up for auction: interested renters make bids, someone wins, and they move in! Developers run a “pro forma” each month and decide whether to break ground on making a new building - potentially financing it depending on the current interest rates.
Try the policy nav
This is the simulator running inline, minus the map. Toggle policies on the left, hit play in the top bar, watch the trend charts at the bottom. For the full thing with neighborhood maps and detail panels, open the standalone simulator.
NYC Housing History
The simulator’s in-game history tab walks through 180 years of NYC housing events, legislation, and history. Every policy in 2020 NYC is a reaction to the unintended consequences of the previous one — the simulator can’t pretend 2020 is a blank slate.
180 years of NYC housing policy
From the simulatorEvery reform created the conditions for the next crisis. Tenement overcrowding → zoning → Moses → ULURP → NIMBYs → housing shortage → COYHO.
The Tenement Era
1840s–1900sThe Birth of Zoning
1916–1961Crisis & Rent Stabilization
1963–1979Koch, Co-ops & Deregulation
1980s–1990sBloomberg Rezonings
2002–2013De Blasio & the Housing Crisis
2014–2021The YIMBY Era
2022–PresentEvery generation faces the same cycle: crisis → regulation → unintended consequences → new crisis. Tenement overcrowding led to zoning. Zoning enabled Robert Moses's clearance. Moses's destruction created community review (ULURP). ULURP empowered NIMBYs. NIMBY obstruction caused the housing shortage. The shortage drove COYHO. Can supply-side reform break the cycle?
What I Learned
FAR (Floor Area Ratio)
The hidden number that rules our life in NYC, and no one talks about it. Here’s how it works:
With a FAR of 1 — if you have a 1,000 sq ft lot, you can build one story. Or 2 stories on 500 sq ft, leaving the other half of the lot empty. Or 4 stories on 25% of the lot.
The number determines whether a neighborhood is a forest of towers (Midtown, FAR 10) or detached suburban homes (Staten Island R1, FAR 0.5). It’s the single biggest dial in housing policy, and the average New Yorker has never heard the term.
Two things that surprised me building this:
Most of NYC is zoned closer to Bayside than Midtown. Roughly three-quarters of residential land in the city is R1–R5: single- and two-family homes. The dense city you picture from movies is a small slice of the actual zoning map. Even Williamsburg required a 2005 upzone to get to its current ~FAR 2.4, and it’s still less than a quarter of Midtown’s allowance.
Residential is capped at FAR 12 by state law (the Multiple Dwelling Law). R10, the densest as-of-right residential district, sits at 10.0 — set in 1961 and barely moved since. Every residential supertall in Manhattan got there through air-rights transfers, special bonuses, or sliver-tower geometry tricks — not because zoning lets you build big. The Brooklyn Tower, Steinway Tower, 432 Park: all worked around the cap, not within it.
Commercial zoning is a different story. The 2017 Midtown East rezone pushed FAR to 18 on Lexington/Madison/Third, 21.6 on Park Avenue around Grand Central, and 24 in the blocks immediately adjacent to it. Hudson Yards was up-zoned to 18 base with peaks at 24. NYC happily lets offices reach FAR 24; it draws the line at apartments past 12.
In the simulator, the “upzone-all” scenario extends FAR 10 citywide — i.e. lets 50 neighborhoods do what 5 currently can. That’s already a much bigger move than New York has been willing to make.
The Pro Forma (The Developer’s Spreadsheet)
Every month, the simulation runs a “pro forma” — a math equation checking if a new building will be profitable.
It estimates rent revenue, subtracts running costs, and compares that potential profit against construction costs, land prices, and loan interest. It’s a harsh binary. When the Fed raises interest rates, loans get expensive, and projects die.
The most consequential real-world example: 421-a. Until it expired in June 2022, the tax abatement was the difference between rental construction penciling out or not in NYC. Without it, the pro forma turned negative for most rental projects even at 2022’s record-high rents. New multifamily rental starts dropped roughly 80% the following year. The math has to work or nobody builds — even in the middle of a housing crisis.
Same logic applies to interest rates. When the Fed went from ~0% to 5.5% in 2022–2023, projects that had been profitable on paper for years suddenly weren’t. The pipeline didn’t slowly empty — it snapped. This is real options theory: when the future gets volatile, the value of waiting goes up. Developers don’t have to choose to build; they can just wait, and they often do.
Moving Chains
Build more? How will building more luxury apartment buildings for yuppies do anything other than gentrify our historic neighborhoods?
In the simulation, when a new building opens, high-income tenants move in. But they leave their old apartments vacant. Middle-income tenants move into those, leaving theirs vacant. This creates a moving chain (economists call this “filtering”). One new luxury unit can shake loose 4–5 moves down the chain, ending in a unit that becomes affordable to someone who otherwise wouldn’t have had one.
But watch what happens when you don’t build that luxury tower. The chain breaks. The high-income newcomers still arrive — they’re not going away because you didn’t build — but now they compete for existing, older housing, outbidding lower-income residents. Noah Smith calls this the “Yuppie Fishbowl” effect: luxury towers act as fishtanks that safely absorb high-income demand. Without the fishbowl, the yuppies are loose in the ecosystem, eating everything.
I came in as YIMBY. I left as YIMBY+vouchers.
My priors before building: just build more. Upzone aggressively, eliminate parking and CEQR and prevailing wage requirements, let the market do its thing. Rent control bad, supply-side good.
The simulator agrees with this partially. The best-performing scenario in my dataset — every supply-side reform I could think of, all turned on — produces the lowest rents (about $1,700/mo real in 2070) and the most housing built. But it leaves roughly a million households unhoused, and the discrepancy is structural: 50 years isn’t long enough to undo 50 years of accumulated under-building.
What genuinely updated my view was running Section 8 vouchers. I expected modest individual benefit and significant market distortion. What I observed in the model was the opposite: voucher recipients exit homelessness, stay in the city, reach stable rent burdens — and the side-effect (a small demand-side rent inflation in voucher-accepting neighborhoods) is much smaller than I’d assumed. Roughly 0.5% rent inflation per placement, against a huge anti-homelessness benefit.
Then compare to rent control. Universal rent control in the simulator is catastrophic. It creates “golden handcuffs” locking tenants into apartments that no longer fit them (empty-nesters keep 3BRs, families squeeze into studios) because giving up a below-market deal feels like an irrational loss. Construction collapses because the cap rate inversion kills profitability. Most of the city flees. The remaining tenants are technically rent-protected but the city as a functioning entity is gone.
The contrast struck me: vouchers and RC are both demand-side interventions aimed at the same problem (low-income tenants can’t afford market rents). But vouchers route around the price signal while RC breaks it. Routing around is much better.
I then read more — Edward Glaeser, Rebecca Diamond, Joe Gyourko, the Moving to Opportunity studies — and the housing-econ consensus broadly says exactly this. Vouchers outperform rent control on basically every metric. The simulator was reproducing what the empirical literature already established. That was a reassuring outcome: a model built from first principles, recovering a result that working housing economists had derived empirically.
So my current position is something like: strong supply-side reform, with a land value tax to prevent landowner capture, with vouchers as the demand-side complement. Rent control narrow and means-tested if at all. This is more “left-YIMBY” or “abundance-with-redistribution” than my original pure-supply position.
The Illusion of “Low Rent” (Lost Human Potential)
When you toggle on 100% universal rent control, the “Average Rent” metric on the dashboard looks amazing. But the simulation forced me to code a new metric to capture reality: Waitlist Suffering.
This tracks the total months people spend desperately searching for housing. Under rent control, waitlist suffering skyrockets. The rent is legally “low,” but nobody can actually get an apartment because the vacancy rate drops to zero.
The economic term for this destroyed human potential is Deadweight Loss. It measures the value lost when people who want to live, work, and contribute to the city are locked out. In the code, it’s a brutal calculation: counting up all the people forced into shelters or out of the city, and multiplying that by the wages they would have earned. Low rents don’t matter if you’re stuck in a shelter or forced to leave your home entirely.
You can’t just upzone everywhere (Infrastructure Strain)
It’s tempting to play God and just upzone the entire city to solve the crisis instantly. But real infrastructure — subways, sewers, electrical grids — was sized for original neighborhood densities.
I had to code in an Infrastructure Strain penalty. If a neighborhood’s population doubles beyond its original capacity, the model applies compounding costs: terrible commutes from subway overcrowding, and a 15% added cost for developers who now have to upgrade water mains and dig deeper foundations. It proved to me that you can’t just dump infinite density on one single neighborhood; you have to spread the new housing citywide.
The supply side is real but partially captured
The thing the YIMBY discourse mostly skips: when zoning lets you build twice as much on a lot, the lot becomes worth roughly twice as much. In my model, landowners capture ~75% of the marginal value from upzoning. Developers absorb most of the rest as higher land acquisition costs. Renters see small reductions, slowly.
The fix isn’t to oppose upzoning — it’s to upzone and tax the windfall. A land value tax (LVT) shifts the distribution dramatically. Without LVT, YIMBY is partly a transfer to current landowners. With LVT, the surplus flows to renters and the public.
I think this is the biggest unforced error in the current YIMBY movement: fighting for upzoning without fighting for the tax that captures its gains.
Combinations beat single policies, by a wide margin
Here are the ten most informative scenarios from my run:
The pattern that holds across every run: individual reforms (parking elimination alone, ADUs alone, LVT alone, even FAR 20 upzoning alone) all underperform combinations. They only matter when stacked. This is unintuitive politically — it’s much easier to advocate for one named bill than for fifteen. But the structural finding is robust to most of the parameters I tweaked. Housing is a multi-equation problem.
The flip side: pure rent control and 100% mandatory affordable mandates are catastrophic in the model. Both shut down construction by inverting the developer’s pro forma, and the city hollows out.
Three takeaways that updated me
-
Time is the scarce input, not money or political will. Construction has hard physical limits — labor capacity, 36-month delivery, interest rate cycles that pause projects. Every year of delay compounds. The single most important thing about COYHO isn’t its policies, it’s that it passed in 2024 instead of 2034.
-
“Build more” understates the difficulty by ~10×. The full sentence is: build more and tax the land windfall and train construction labor and maintain political legitimacy through 30 years of cranes and sustain it across multiple recessions. Any one of those failing kills most of the gain.
-
Demand-side complements are not substitutes for supply. Vouchers, eviction protection, public housing — they extend the survival horizon while construction does its slow thing. None of them work as a primary policy. All of them help when stacked under a supply-side primary.
Defending the methodology, briefly
The mechanisms I treat as load-bearing are all well-established in housing/urban economics:
- Stone-Geary utility with subsistence floor — the “rent eats first” cliff
- Diamond-Mortensen-Pissarides search friction (2010 Nobel) — agents see ~5 units/month, not the full market
- Alonso-Muth-Mills bid-rent for the commute-vs-rent tradeoff
- Rosen-Roback spatial equilibrium for departure to other metros
- Thaler’s endowment effect for rent-control lock-in
- Real options theory for developer behavior under interest-rate volatility
- Land value capitalization for upzoning capture (Henry George’s framework, modernized)
The implementations are documented in SIMULATION.md, step by step. Gemini critiqued the model six separate times, posing as a housing economist looking for biases; each round produced ~10-15 concrete patches. The current grading function, the equity-via-collapse guard, the land capitalization mechanic, the voucher inflation effect — all came out of that critique loop.
The things I’d want a real housing economist to check before I’d raise my confidence one notch: the parameter calibration (most numbers are eyeballed, not estimated), the labor-capacity constraint shape, and whether the auction mechanic accurately models how NYC rent-stabilized units actually get allocated. If you’re that economist and you want to break this, the source is at github.com/KaighnKevlin/yimby.
Glossary
Every term I’d never heard before starting this — plus NYC specifics and source links. Search or click any term to expand.
Try it. Disagree with it. Tell me what’s wrong.
The simulator is at kaighn.com/yimby. Hit play, toggle some policies, watch the city evolve. The grading system maps three sub-scores to a 0-100 composite — but honestly the letter grades are arbitrary and you should ignore them in favor of the underlying metrics (rent in 2025$, households housed, units built, fraction fled).
The thing I’m most confident in after this whole exercise is the smallest possible claim: housing is a multi-equation problem. No single policy fixes it. The honest answer to “what should we do” is most of them, in the right order, sustained for 30+ years. Which is to say: we should start.
Disclaimer
This is a vibe coded housing simulator. We’re not simulating every atom in the universe — we’re just codifying some simple rules into code and seeing if there’s any emergent properties. So: don’t take the magnitudes literally. Don’t cite this in housing-policy debates. Just treat this as a way to interact with a political opinion essay in a video game rather than reading a dry urban econ PhD thesis.