$ andrew.pyanzin / cost-of-living
github
andrew@pyanzin.com:~/research$ ./where-to-live --cities montreal,amsterdam,berlin,paris

WHERE TO LIVE

Four cities where a senior product role is realistic, measured on one page. Montréal leaves the most cash in hand and has the strongest safety net, but its homicide rate is triple Amsterdam's and still rising. Berlin is the cheapest of the four to rent and spends the most on healthcare, then takes 38% of pay in tax. Paris pays the least and loads 47% onto payroll. Amsterdam pays the most — and rent takes it back: on the same $100k, it leaves a third of what Montréal does.

[01]Four cities at a glance

score = cityparity composite, 0–100 · same scenario in every city

[02]What $100,000 gross buys

single person · 2-bedroom rent · transit pass · ordinary tax rates

The same salary converted into each city's currency, then taxed and spent on the same basket — now with health insurance and nursery shown on their own. Switch to the single-parent scenario to see what a two-year-old in full-time nursery does to the year: Berlin barely notices, Amsterdam goes into deficit. Dubai is the control case: zero income tax and still mid-pack.

[03]The scorecard

shading = rank within the row · darkest = best · arrow shows which direction is better

Every figure is official statistics or the cityparity model, read straight from the result tables. Country-level rows are marked; city rows use the city itself. Nothing is combined into an index — read each row on its own terms.

1st2nd3rd4th· country = national figure, the city has no own statistic

[05]How to read this

$caveats --important

  • Registry data has no sampling error, only systematic error. Under-reporting, legal definitions and recording reforms dominate. Read orderings, not decimals; treat differences under ~2× as possibly noise.
  • Crime rates divide by residents. Tourists and commuters add crime but not population, so city centres (Paris 1er, Amsterdam's Burgwallen) are inflated by construction.
  • Each country measures city crime its own way — Canada a severity index, the Netherlands and France per 1,000, Germany per 100,000. Only the rank within the country is comparable.
  • The tax wedge is a model. OECD computes what a stylised worker owes; it excludes VAT and wealth taxes. The cityparity figures are a second, independent model with a different basket — the two agree on ordering, not on level.
  • Price-to-income is each country against its own history, not an absolute ratio. Germany at 89 is cheap for Germany.
  • Amsterdam's 30% ruling is not applied. A qualifying newcomer (≥ €68.6k gross) pays no tax on 30% of salary for five years, capped at €262k; that materially narrows the gap in section 02. Germany, France and Canada have no equivalent.
  • Minimum wages are gross and monthly by Eurostat's convention — hourly rates × statutory weekly hours × 52 ÷ 12 (France 35 h, Québec 40 h). Canada sets minimum wages provincially; Québec's rate stands in for Montréal and is not in Eurostat, so it has no PPS or EU rank.
  • Reference years differ by row and are printed with each unit. Crime statistics lag ~16 months; PPP price levels ~18 months.

$sources --list

  • UNODC UN-CTS — homicide, theft, burglary, assault (the only harmonised cross-country crime series)
  • Eurostat crim_off_cat · ilc_lvho07a · prc_ppp_ind · hlth_silc_08 · earn_ses22_49 · nama_10r_2hhinc · earn_mw_cur · earn_mw_avgr2 (minimum wages)
  • OECD Analytical House Prices · PPP price level indices · Average Wages · Taxing Wages · Income Distribution Database · System of Health Accounts
  • Statistics Canada Crime Severity Index · CPI · 11-10-0190 · 14-10-0417 · CMHC Rental Market Survey · CNESST Québec minimum wage
  • CBS · BKA / Kriminalitätsatlas Berlin · SSMSI · SPVM — city and district crime
  • ECB MIR · Bank of Canada — mortgage rates
  • cityparity — take-home pay, rents, childcare, parental leave, commute, composite score (data 2024–2026)
  • All calculation in ClickHouse (clickhouse local); result tables feed this page directly via a build script. No number is typed by hand.