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:

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

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.