Pick a country, enter an age, choose a sex, and the site returns a ranked list of the causes of death most likely to eventually get you, with an approximate likelihood for each. The numbers come from the World Health Organization, cover about 185 countries, and are population statistics rather than a forecast about any one person. The interesting part is what sits behind that single list: two mismatched cause-of-death sources stitched onto a common survival model, trends fit and carried forward, and a competing-risks life table run over each cohort's remaining life so the shares add up to one.
The whole thing is a static site. Every projection is computed once at build time and baked into a small per-country lookup, so the page itself only reads JSON and renders it. There is no server, no database, and no request that touches a model.
The question it answers
The obvious version of this question is a snapshot: of everyone who dies at your exact age, what did they die of? That answer is misleading. A young adult is far more likely to die in a car crash this year than of heart disease, but over a whole lifetime the long-run diseases dominate, because most people survive youth. The snapshot describes who dies young; it says little about how a living 25-year-old eventually goes.
So the site answers the forward question instead. For a cohort alive at your age today, in your country, of your sex, what fraction will eventually die of each cause? Everyone dies of something, so those lifetime shares sum to one. That is a competing-risks quantity: each cause competes to be the one that gets you, and dying of one removes you from the pool for all the others.
Two data sources, one survival model
Survival, meaning how likely you are to make it from one age to the next, comes from the WHO Global Health Observatory life tables, pulled from the GHO OData API. They exist for every member state on an abridged five-year grid (0, 1, 5, 10, ... 80, 85+) for years 2000 to 2021, and they supply the all-cause death rate that decides when a cohort dies.
Deciding what it dies of needs a cause breakdown, and that comes from one of two sources depending on the country. The default is the WHO Mortality Database, national registrations of actual deaths coded in detailed ICD-10 on fine five-year age bands. Around 101 countries have recent, near-complete registration and use it. The rest, roughly 84 countries, fall back to WHO Global Health Estimates 2021 country files: modeled figures on seven coarse age bands (0-4, 5-14, 15-29, 30-49, 50-59, 60-69, 70+) with less cause detail. Those results are badged in the UI as a regional modeled estimate and are given wider uncertainty. The Mortality Database identifies countries by WHO numeric code, which is crosswalked to ISO 3166-1 alpha-3 so all three sources line up on the same country key.
The two cause sources are reconciled onto one taxonomy: the GHE cause list. ICD-10 codes from the Mortality Database are mapped to GHE causes by matching each code to the most specific ICD-10 range it falls in, with umbrella ranges used only as a fallback. Coarse GHE bands never straddle a life-table band (every GHE boundary lands on the five-year grid), so a fine survival band always nests wholly inside one cause band and inherits that band's cause split unchanged.
Redistributing garbage codes
Death certificates are noisy. A meaningful share of them carry ill-defined or "garbage" codes: unspecified heart failure, cancer of unknown primary site, injury of undetermined intent, symptoms with no underlying cause named. Left alone these would distort the ranking, inflating a vague catch-all above real causes. Following the GHE methods, the pipeline redistributes each garbage code's deaths onto plausible real causes within the same demographic cell, in proportion to the deaths already there. Ill-defined codes spread across broad disease groups, unspecified cardiovascular deaths across cardiovascular causes, cancers of unknown site across the malignancies, and undetermined-intent injuries across the injury causes. The redistribution conserves the total death count exactly, checked at build time.
Projecting the rates forward
A lifetime projection cannot use today's rates frozen in place, because rates change. Both halves of the model are fit on the recent past and carried forward, with the pandemic years excluded as trend anchors.
The all-cause level uses Lee-Carter, per country and sex. It factors the log death rate into an age profile and a single time index,
\[\ln m(x,t) = a(x) + b(x)\,k(t),\]estimated from the first principal component of the centered log-rate matrix over 2000 to 2019. The time index \(k\) is forecast as a random walk with a damped drift (a per-year damping factor of 0.98), so a projection saturates over decades rather than extrapolating a straight line for eighty years, and projected rates are floored so they cannot overshoot toward zero.
The cause mix within each age band is itself a composition (the shares sum to one), so it is forecast in compositional-data terms. Each band's shares are moved into centered-log-ratio space, a trend is fit and shrunk toward zero for rare, noisy causes, and the forecast is damped and inverse-transformed back to shares. That keeps every forecast composition positive and summing to one, and keeps it near the recent observed mix rather than chasing a twenty-year slope across a lifetime.
The cohort life table
The two forecasts are combined on the cohort diagonal: a cohort alive at start age today experiences age \(x+k\) in calendar year now plus \(k\), so each future age band is evaluated on that year's projected rates. Marching forward band by band, the model accumulates each cause's lifetime cumulative incidence. Within a band the hazard is treated as constant, so the probability of dying in a band of width \(w\) given survival to it is \(q = 1 - e^{-w\,m}\). Writing \(S_b\) for survival from the start age to band \(b\) and \(f_c(b)\) for the projected share of band-\(b\) deaths due to cause \(c\), the lifetime share is
\[\pi_c = \sum_b S_b\,q_b\,f_c(b), \qquad \sum_c \pi_c = 1.\]The open terminal band (85+) is fully absorbing, so any cohort that survives that far is assigned there and nobody leaks out of the sum. Because each band's cause shares sum to one and the terminal band takes everyone left, the lifetime shares sum to one by construction; the build asserts it to nine decimal places. For men aged 55 to 59 in Japan the projection puts cancer first at about one in three, then lower respiratory infections, stroke, and other circulatory disease clustered near one in twelve. For men aged 40 to 44 in the United States cancer leads at roughly a fifth, with dementia and ischaemic heart disease just behind.
Uncertainty
A single lifetime share is a point on a wide distribution, so the site shows an interval, not just a number. Each cohort is run over 200 draws that perturb both the Lee-Carter drift and the cause-composition trends by their estimated sampling error. The drift uncertainty accumulates with the raw horizon like a random walk, so a projection reaching eighty years ahead is honestly wider than one reaching five. The 5th-to-95th-percentile band from the draws is then clamped to a readable relative half-width, and modeled GHE countries get a wider floor so they visibly carry more uncertainty than the registered ones. The interface leads with rank order and rounds to phrases like "about 1 in 3" precisely because the exact decimals are less trustworthy than the ordering.
The build and the site
The pipeline is deliberately two-tier so the data stays reproducible. The heavy step, raw WHO downloads to a normalized intermediate snapshot, is run by hand and commits a versioned set of Parquet files plus a manifest of source URLs, file dates, and checksums. The light step, intermediate to projection to per-country JSON, is deterministic and byte-stable, so CI can rebuild the shards and a check step fails on any drift from what is committed.
That light step rolls the detailed causes up into curated display groups (so, for example, the various cancers rank as one row instead of fragmenting across a dozen sites) and writes one small JSON shard per country plus a shared index. Repeated strings, the group labels and cause definitions, live once in the index and are referenced by id, which keeps each shard tiny. The frontend is plain HTML, CSS, and JavaScript bundled with esbuild, with no framework. It loads the index, lazy-loads one country shard on demand, and renders the ranking. The country picker is an accessible searchable combobox over the ~185 countries, the sex control is a segmented toggle, and the headline share is drawn as a hundred-figure waffle grid. Tapping a row expands it to the specific causes inside the group and, for suicide and interpersonal violence, a national crisis line for that country.