Methodology

Every published city page must include the full metric set. Incomplete records are blocked from shipping by a catalog validation step at build time. A city may still launch on complete curated-seed estimates until a live agency pull replaces them — those estimates are labeled as such, especially on safety.

Live enrichment sources

City figures are merged from public agency feeds into checked-in enrichment JSON, then built into the published catalog. Each city page lists source labels and a last-updated date.

  • U.S. Census Bureau ACS 5-year — population, median household income, median home value, and median gross rent from Census summary files. The on-page housing cost index is derived from home value and rent versus national ACS medians (100 ≈ U.S. average) — not a BLS consumer price index.
  • BLS LAUS — county unemployment rates via Local Area Unemployment Statistics series, joined to each city through FCC lat/lon → county FIPS.
  • FBI Crime Data Explorer / CIUS — agency violent and property offense rates. Prefer live CDE annualized monthly rates per 100k. When the CDE API gateway is unavailable, we fall back to FBI CIUS Table 8 city offense counts converted to rates per 100k (vintage noted in the source string). When an agency or city match is still missing, we publish the rate as data unavailable instead of keeping a placeholder number.
  • NOAA Climate Normals (1991–2020) — summer high, winter low, annual rainfall, and a sunny-day proxy from the nearest normals station.
  • Census Bureau Population Estimates Program (PEP) — annual population by year for city trend charts and the national population-over-time race, loaded from the Bureau’s public city/town PEP CSV releases (2010–2019 and 2020–2024 vintages). A city only gets a trend once at least two years resolve; missing history is omitted rather than interpolated. The Population figure in a city’s Key Figures uses this same latest PEP estimate (not the ACS 5-year figure) so it always matches the trend chart on the same page — PEP is the Bureau’s own preferred product for a current point-in-time population, while the 5-year ACS remains the source for income, home value, and rent, which PEP doesn’t cover.
  • Unsplash — two photos per city, used under the Unsplash License and credited to the photographer on the page. A city with no usable search results simply shows no gallery.

What we still curate

Commute minutes, Walk Score (where shown), featured flags, and neighborhood shortlists remain curated companion fields. They are not overwritten by live agency feeds. Nearby-city links default to the six closest catalog cities by great-circle distance; a city may optionally keep a curated override in the seed.

New cities can ship with a complete curated-seed baseline — population, income, housing, climate, and crime figures that are reasonable estimates, not yet a live agency pull — as long as every required field is present. Thin or partial records never publish. Pages built from curated-seed data say so explicitly wherever a real per-agency figure would otherwise be implied, most visibly on the safety metric.

Publishing rules

Thin pages are out of scope. If a city cannot be fully populated, it is omitted until the next batch. See the city index for what is live today. State overview pages average only mapped catalog cities — they are not full-state statistical universes.

City limits vs metro

Population, income, home value, rent, and crime figures on city pages describe the incorporated place (city limits / municipal agency), not the broader Metropolitan Statistical Area, unless a metric note says otherwise. Unemployment uses BLS LAUS county rates joined via lat/lon → county FIPS.

Crime is hyper-local

A single citywide violent or property rate can misrepresent neighborhoods within the same municipality. Treat FBI CDE / CIUS city aggregates as a starting point, then inspect local police reports and neighborhood-level tools before drawing relocation conclusions.