Affordability
Affordability
Price-to-Income Ratio
National median home value ÷ median household income · 2000–2024
Home Values
National ZHVI
Zillow Home Value Index · monthly
Macro
Mortgage Rate
30-year fixed · weekly average
Geography
Geography
Home Values by State
Select a state to inspect it. Switch between current value and appreciation since 2000.
Select a state
Median Home Value
Since 2000
Value in 2000
Pipeline Architecture
Ingest
Sources
Zillow ZHVI CSV
FRED REST API
BLS QCEW
Orchestrate
Airflow
Scheduled DAGs
Weekly refresh
Retry on failure
Store
Postgres
5 tables · ~46MB
235k+ raw rows
3 schemas
Transform
dbt Core
Staging views
Mart tables
Affordability models
Serve
FastAPI
JSON endpoints
Cloudflare tunnel
CORS enabled
Visualise
Chart.js + D3
Live charts
No build step
This page
Notes
The pipeline runs on my own hardware — Airflow, Postgres and dbt live in an LXC container on a Proxmox host, and FastAPI is exposed through a Cloudflare tunnel so this page can read from it without opening a port.
Zillow publishes ZHVI as a wide CSV with one column per month, so the load step unpivots it into a long table before dbt gets involved. FRED is straightforward REST. The affordability mart is where the two meet: home value divided by median household income, aligned on observation date and carried forward where the income series reports less frequently than the home value series.
The state map is D3 over a TopoJSON US atlas, coloured by a quantised scale derived from the same FastAPI endpoint. Both scales recompute when you change the metric.