What "viability" actually means on this map
A plain-English walkthrough of the score, what goes into it, and what it deliberately ignores.
Every polygon on the map gets a number from 0 to 100 we call viability. Here’s exactly how it gets computed, with no hand-waving.
Step 1: estimate locally-priced cost
For each geography we estimate the cost of a household-of-your-shape’s basket of needs:
- Housing: HUD Fair Market Rent for a unit sized to your household size.
- Healthcare: ACA silver-plan benchmark for your ages, post-subsidy.
- Taxes: state + local on your spend (treated as a proxy for income at this stage).
- Climate buffer: a small premium where catastrophic risk is high enough to drive insurance costs that aren’t yet reflected in the rent number.
Add those up. That’s the local cost for that geography.
Step 2: divide by your annual spend
ratio = local_cost / your_spend
A ratio of 1.0 means “this place will exactly consume your stated spend.” Below 1.0 is
slack. Above 1.0 is a deficit.
Step 3: squash into 0–100
We map that ratio through a smooth curve so the score behaves nicely as you drag the sliders. The
exact curve lives in viability.ts and is intentionally a pure function — no hooks, no globals,
trivially unit-testable.
What this score deliberately ignores
- Job availability. Out of scope. The map is descriptive, not prescriptive.
- Schools. Out of scope for v1. Adding zip-level school ratings is a separate project.
- Vibes. Vibes are not a number. Sorry.
Why a single score and not a dashboard
Because the point is to make a map. A 12-axis radar chart per polygon doesn’t render at zoom 4. One score, one color ramp, one decision rule.