Open data, followed all the way down to one person inside it.
Every piece here starts with a public dataset and ends with a story. The numbers can be checked: any figure set in mono opens its own evidence in a column to the right, so you never have to leave the sentence you are reading to find out whether it is true.
open to work
02pieces
02public datasets
271occupations
4,810teenagers
work
files
verify.py
The pipelines are never run automatically. This checks them instead.
It would be easy to have a scheduled job re-run both pipelines and commit whatever came out. That would be a mistake. The prose on this site is written around specific findings — “not weak, inverted”, “the only negative one”, two fables — and no automation can rewrite a fable when a number moves. Auto-publishing would put new numbers underneath old sentences, which is the exact failure this whole site is built to avoid.
So nothing here ever writes to web/content. It re-runs both pipelines and reports whether the committed data still reproduces, naming three failures apart:
drift
the upstream dataset changed, so the numbers moved. Someone has to re-run the pipeline and then re-read every sentence citing it.
tamper
a data.json was edited by hand. The promise of this site is that those files come out of the pipelines.
break
a pipeline assertion failed — for instance the depressed column stopped being bdi_total ≥ 14.
$ python analysis/verify.py
─── 01-ai-exposure ───
OK 4268 values, identical to the commit
─── 02-screen-time ───
OK 1442 values, identical to the commit
PASS every committed data.json reproduces exactly.
analysis/verify.py
Run as a pull-request gate, this catches drift and tampering without ever publishing either. There is no backend and no database anywhere in this project: the data is computed ahead of time, committed as JSON, and served as static files.