Methodology
This page documents the model precisely enough that you can decide whether to trust it. The simulator runs entirely in your browser: thousands of joint paths of market returns, home prices, and employment, with the purchase evaluated across a grid of prices on identical draws so every price comparison is apples-to-apples, path by path. The headline question is the purchase price that keeps your probability of reaching financial independence by your target age in comfortable territory. (Internally the engine also runs a no-purchase reference path on the same draws; it anchors the math but is not a product surface.)
Market and home-price model
Portfolio returns are annual, independent lognormal draws with your expected return and volatility. Home prices follow their own lognormal process, correlated with the market through a Cholesky factor (default correlation 0.35 — home prices and equities fell together in 2008–2012 and the model lets them). Returns are nominal; all reported wealth is deflated to today's dollars at your inflation assumption.
Because paths are sequential, the model prices sequence-of-returns risk: a crash the year after you drain your taxable account for a down payment hurts far more than the same crash in year 25, and the simulation sees exactly that difference.
Income and job-loss risk
Income grows at your nominal rate. Each year carries a job-loss hazard (default 3%) that is multiplied (default 3×) in any year the market falls more than 15% — the mechanism by which your job and your portfolio crater together. A job-loss event costs a configurable number of months of income (default 6), spilling into the next year when the spell crosses a year boundary. During shortfall years the household pauses retirement contributions before selling assets.
Life changes (what-ifs)
Optional future events, all specified in today's dollars. An income change (e.g. going part-time in year 5) applies from that year onward and is indexed with your income growth rate, like the base salary; a spending change applies from its year onward and is indexed with inflation, like base spending; a one-time expense or windfall lands once, as after-tax cash in that year (a windfall flows into the taxable account). Both the buy path and the internal no-purchase reference see the same events, so comparisons stay apples-to-apples. Changes affect pre-independence cash flow only — your retirement spending target is set separately in the FIRE panel, so a permanent spending change you expect to persist into retirement should also be reflected there.
Taxes
- Ordinary income: 2026 federal brackets and standard deductions by filing status, with bracket thresholds, the standard deduction, and the Social Security wage base indexed to your inflation assumption over the simulation.
- Payroll: employee-side Social Security (wages split across two earners when filing jointly), Medicare, and Additional Medicare above the statutory (unindexed) threshold.
- Capital gains: long-term rates (0/15/20%) stacked on top of ordinary taxable income, plus 3.8% NIIT above the statutory MAGI threshold. Dividends are taxed annually in the taxable account (tax drag) and reinvested.
- State: a flat effective rate you set, applied to income and investment gains; it feeds the SALT deduction.
- Itemization: each year the model takes the better of the standard deduction or itemizing — mortgage interest capped at $750k of acquisition debt plus SALT (property tax + state tax) under a $40k cap that phases down to $10k above $500k of income. The tax benefit of owning is computed, never assumed.
Accounts and the withdrawal ladder
Three buckets: taxable (with cost-basis tracking), pre-tax (401(k)/IRA), and Roth. The down payment is funded by selling taxable assets, which realizes capital gains at time zero — a cost most calculators skip. When a year's bills exceed income, the model sells taxable first (grossed up for the capital gains tax on the sale), then pre-tax (grossed up for ordinary tax plus the 10% penalty before age 59½), then Roth. All accounts earn the same portfolio return.
The full cost of owning
Principal and interest from true monthly amortization; property tax on the simulated home value each year; insurance growing with inflation; maintenance as a percentage of simulated home value; HOA dues; PMI on the original loan until amortization reaches 78% of the purchase price; buyer closing costs at purchase. Home equity is always counted net of selling costs, so "net worth" means what you could actually walk away with.
Financial independence detection
A path reaches financial independence in the first year its investable portfolio (taxable + pre-tax + Roth, excluding home equity) crosses a housing-aware FIRE threshold:
- While owning: (retirement spending + that year's recurring housing costs — property tax, insurance, maintenance, HOA, PMI) ÷ withdrawal rate, plus the remaining mortgage balance. A finite debt is a lump to retire, not a perpetual expense — so the threshold falls as the mortgage amortizes and steps down at payoff.
- Not owning: (retirement spending + that year's rent) ÷ withdrawal rate.
- Net-worth mode: your explicit target, constant in today's dollars, for both paths.
The reported probability is the share of paths that have crossed the threshold by your target age while the plan is intact. First crossing counts — a later crash can dip a path back below it, which is the same convention most FIRE planning uses — but a crossing after the plan has broken does not: a forced sale dumps home equity into the portfolio and swaps in the lower renter threshold, and crediting that as independence would make an unaffordable price score better than a barely-affordable one. Escape velocity is detected as the first year expected portfolio growth (balance × expected return) exceeds that year's additions from saving; note that a house-poor path can hit it early simply by contributing less.
The price sweep re-runs the purchase at a grid of prices up to the largest you can fund, on the same draws, tracing how FI probability falls as price rises. The headline's "comfortable up to" and "stretch to" prices are where that curve crosses the verdict-tier thresholds (85% and 70% — product judgments, documented in the code), interpolated between grid points, and never exceed the ruin guardrail's forced-sale cap below. When the failure probability at your target price exceeds your acceptable failure rate, the verdict is Risky regardless of the FI odds among surviving paths.
What failure means
A buy path fails when liquid assets (taxable, then pre-tax, then Roth) cannot cover the year's expenses: the household is forced to sell the home, pays selling costs, settles any gain above the §121 exclusion, and rents thereafter. A rent path fails when all accounts are depleted. The failure curve reports the cumulative probability by year; the example paths describe the specific market/job-loss combinations that caused representative failures.
The ruin guardrail
Separately from the FI analysis, a bisection search finds the largest price that (a) you can fund from taxable savings including the capital gains tax on the sale, and (b) keeps the forced-sale probability within your ruin tolerance (default 5%). All candidate prices reuse the same random draws, so every solver is consistent with the headline result.
Where the area benchmarks come from
The "benchmark it from your area" helper draws on three tables, each with its own provenance:
- State income tax — computed from statute. 2025 rates, brackets, and standard deductions per state (encoded from Tax Foundation's State Individual Income Tax Rates and Brackets, 2025), applied to the reference household's income; metro-level local income taxes (NYC, Philadelphia wage tax, Maryland county taxes, Ohio municipals, and similar) are added with per-metro citations in the source code.
- Cost multipliers and effective property tax — survey-based. Multipliers follow BEA Regional Price Parities excluding housing; property tax rates follow Census ACS effective rates (median real-estate taxes ÷ median home value per metro). The repo ships a regeneration script that rebuilds both tables directly from api.census.gov and BEA's published MARPP file, stamping the data vintage; values in between regenerations are close approximations of those sources.
- Spending bases — survey patterns. Household-size bases approximate BLS Consumer Expenditure Survey non-housing spending in today's dollars.
All benchmark outputs are rounded planning numbers, labeled as such in the interface — your own statements beat any benchmark.
Known simplifications
- Annual time steps (mortgage amortization is monthly within each year).
- One flat state tax rate; no local income taxes or state-specific brackets.
- No refinancing, recasting, or rate changes after purchase.
- Job-loss severity is months of gross income; unemployment insurance can be folded in by lowering the months.
- Roth withdrawals are modeled as tax- and penalty-free (contribution basis).
- Rent grows deterministically at your assumed rate.
- Pre-tax balances are reported gross of the deferred tax liability, for both strategies alike.
- NIIT thresholds and SALT/mortgage caps stay nominal (as statute currently reads).
Reproducibility
The simulation is seeded: the same inputs always produce the same outputs, and both strategies plus every safe-price candidate share the same draws. Nothing you enter leaves your browser — there is no server, no account, and no analytics on your financial inputs.
Embed the quick check on your site
Writing about housing, FIRE, or personal finance? A compact version of this simulator — household income in, comfortable and workable price ceilings out, computed by the full engine in the reader's browser — can live on your page with one iframe. No scripts, no tracking, and nothing typed into it leaves the frame:
<iframe
src="https://home-affordability-app-rouge.vercel.app/embed"
title="Home affordability quick check"
width="100%" height="440" style="border:0"
loading="lazy"></iframe>