Methods
How the numbers on this site are made, what each page's figures mean, and which of the program's rules this project follows.
Where the numbers come from
The All of Us Research Program publishes a public Data Browser with a JSON API behind it. The site uses three of its aggregate endpoints for the cohort pages: the release catalog (cdrVersions), the per-domain totals the browser's home page shows (domain-totals), and the genomic data type counts (genomics/participant-counts); the Pharmacopeia adds the concept search and the drug hierarchy endpoints described under its heading below, and The Dictionary one unlimited concept search per EHR domain. Each response is stored verbatim as a raw snapshot with the URL, HTTP status, byte size, and fetch time beside it, filed under the release it describes. A release is fetched once; re-running the snapshot never re-asks for a release already on disk. The API has no way to request an older release, so each release's figures are captured when it is current and the catalog is the only record of past releases.
The Representativeness map, Thinning and The Strip use a second program source: the metrics route behind the program's Data Snapshots page, which reports enrollment to date by state. It is fetched once per snapshot run and kept as a dated raw file, never overwritten. A third source, the program's User Support Hub, gives Four Kinds of Genome its past-release counts and the sentences on how the genomic data types relate: the release notes and the Genomic Quality Reports, one GET per page, kept dated, every figure and sentence copied as written and marked reported. These three are the only sources of participant counts on this site.
- Current release
- Release build date
- Totals fetched
- Catalog fetched
Derived tables and the audit
From the raw snapshots a script writes small derived tables (releases, domains, surveys, genomics, states) and one combined file that every page reads. The derived files only re-arrange raw fields: they sort, rename, flag, and group, and they contain no computed numbers, with two exceptions: the states table's rate and ratio, which the audit recomputes from the two raw sources they come from, and the daily differences in the enrollment history, which the audit recomputes from the two raw rows each comes from. An audit test suite then checks, for every derived number, that the same value appears in the raw response it claims to come from. It also checks that the data block inlined into each page of this site is byte-for-byte the derived file, that no page loads an external script, and that the definitions below still hold for the current release. A page is not finished until the audit passes.
Anything that is a calculation (a percentage, a mark count, a maximum) happens in the page itself, in a few lines of code next to the chart, from the inlined data. There are no numbers typed into the pages or into this text.
The 20-count rule
The public tier rounds every participant count to the nearest 20 and suppresses counts under 20. This site treats that as the finest resolution that exists. It shows those counts as given, shows shares of the cohort only as whole percents of two such counts, and draws one mark per 20 participants where it draws marks at all. The audit asserts that every number used as a mark count is an exact multiple of 20, so a division can never truncate silently. No count is combined with any outside dataset, with one exception: on the Representativeness map a state's reported count is divided by that state's Census population total. That join is at state level, the finest geography the program publishes, and a ratio of two public totals cannot narrow any cell. The Data Snapshots source describes its numbers as "approximated to protect participants' privacy" rather than rounded to 20, so no floor is assumed there: the audit computes the step the reported values share and records it, and the page shows the values as given.
The site's language
The mark is the unit: one per 20 people wherever a crowd is drawn, because 20 is the public tier's rounding unit. The palette is the page ink and one accent; series are told apart by position (lanes, columns, chapters), never by hue, and the accent marks only the playhead, the hovered element or the single thing being pointed at. Motion only where the movement itself is the finding, with a pause button and a reduced-motion branch wherever there is motion. Numerals are tabular and label boxes fixed-width, so nothing reflows as a value changes. The states of an animated page are one row of labels, every state a button, the lit one the state showing or being changed to, and its crossfade begins when the page's own change begins and lasts as long; there is no separate caption of the phase. The row is one strip that never wraps: it scrolls sideways, the lit label is brought into view, and a fade at an edge says there is more beyond it. On every piece page the piece comes first: its pane is the first thing under the nav, at the same height on every page (the nav's height plus one padding, a rule of the shared stylesheet). Under the pane sits one row of fixed height, the deck, holding the pause button and then the strip of states (on the Dictionary, Tour and the domain buttons); under the deck the title, with its bottom at the fold; then the lede and the caption. The pane takes what the viewport leaves after that fixed reserve, so a taller screen gets a taller piece and the title sits at one height on every page.
Definitions used on each page
Cohort Atlas
- All participants is the catalog's participant count for the current release. The browser's own participant-count endpoint reports a slightly different total for the same release; both are kept raw and neither corrects the other.
- Each ribbon is a layer's participant count from the domain totals or the genomics counts, drawn at its share of all participants. The percent is rounded to a whole number in the page.
- Rows are sorted by count within each section at render time. Genomic rows are the four typed data types; the overall genomics row is not a data type and is not drawn.
- Participants by release, the strip at the foot of the page: one point per catalog row, at the row's build time from the catalog. That is when the dataset was built, not a public announcement date. A catalog row whose name contains "Synthetic" is a test dataset, not participants; it stays in the derived table flagged as excluded and is not plotted, and the audit checks both. Hotfix and release-candidate rows are plotted as the catalog reports them; the line is straight between points, with no smoothing, and the axis starts at zero. The dashed line is the end of FY2026, for the funding statement quoted below.
Silent Records
- One field, the whole cohort, one cell per 20 participants, and one data layer at a time: survey modules, physical measurements, genomic data types, EHR domains, Fitbit. The lit cells are that layer's participant count divided by 20; the dark cells are the rest of the cohort.
- Motion. A sequence of chapters, one per layer in descending order of count. The field starts fully lit (six tenths of a second on the first pass, two seconds after each relight) and dims to the first layer over four seconds, the marks beyond its count going dark in the seeded scatter order; holds a second and a half; dims directly to the next layer without relighting, and so on to the sparsest; holds four; relights once over three seconds; repeats. A chapter whose count equals the state before it, as The Basics equals the cohort total in this release, dims nothing: it takes no dim time, its label lights at once and its hold stays, so the first marks go dark at the chapter after it. The label row is the compact variant, nineteen states in less room. The labels are the states, the whole cohort and then the chapters, the lit one the state showing or being dimmed to, its crossfade running with the dim; a click, playing or paused, jumps to that state's final field and plays on from there. The movement is the finding: what goes dark at each chapter is the part of the cohort that layer does not cover. A button pauses it; with a reduced-motion setting each chapter is a crossfade to its final state.
- Layers are drawn one at a time and never added together or de-duplicated. The public tier exposes no union across layers, so none is estimated.
- Positions are a fixed seeded scatter from one seed, identical on every load and for every layer. They carry no information: a cell is not a person, and the same cell lit for two layers is not the same participant.
Thinning
- Source. The Data Snapshots metrics route, the same enrollment-to-date source as the map: the
LIFECYCLEblock'scompletedcount for each of its steps, andEHR_RECEIVEDfromEHR_METRICSas the final column. Step names are the route's keys, unchanged. This is not a curated release, so the page carries the route's collected-through date instead of a release name. - Definition. One mark per 20 people, as on Silent Records. Every column is the same field, the largest step's count divided by 20, and each column draws its own count divided by 20 from one seeded scatter, so a smaller step is a subset of the cells of a larger one. One pitch is solved for every column so that the full column fits the screen under the nav, the columns sharing the width and the dot half the pitch (below one pixel the dots touch, and a full column reads as a tone, a partial one as a dither); on a narrow screen the columns are 96 pixels wide at a one-pixel pitch and the corridor scrolls sideways. The hover figure is the column's count divided by the previous column's count, rounded to a whole percent; it is not defined where the previous column reports zero.
- Motion. Only the first column is lit; then, column by column, the marks the next status counts cross from their cell to the same cell in the next column over one second, the top rows starting first over three tenths, and the column holds four tenths; after the last column the corridor holds three seconds, every column but the first fades out over one, and it repeats. The crossing marks are the next status's count carried forward in the same seeded cells, not people moving; what stays behind is the difference between two counts. Where a later count is higher, the extra marks light in place in that column, arriving from no column, because the source does not say those people passed through the earlier status; nothing is summed. The movement is the finding: what crosses and what stays is the thinning between two counts, and what lights from nowhere is a count that is not a prerequisite. The column headers are the states, the lit one the column whose marks are arriving, its crossfade running with the travel; a click on a column jumps to the state where it has just arrived. A button pauses it; with a reduced-motion setting the completed corridor is drawn at once and the button is hidden.
- Order. Columns follow the route's own key order, which the raw file keeps as received; the page does not reorder them, and nothing is summed, because completed plus not-completed is not constant across statuses in the source. Not every status is a prerequisite for the next, so a later column can be higher than an earlier one; the caption names the first such case from the data and offers no explanation, because the source gives none. A status the route reports as exactly 0 is not drawn: the footer names it verbatim and the hidden table keeps it. The audit checks that the stored block and the derived table carry the same order and that the client writes keys as received.
- Labels. Column labels are plain-language renderings of the route's keys, fixed in the page (for example
Consent_Enrollmentas "Consent: enrollment",PPI_Module_The_Basicsas "Survey: The Basics"); the key itself is shown verbatim on hover, in the table and in each column's accessible name, and a key the page does not know is shown as is. The Data Snapshots page defines only its "initial steps" as a set and names none of these statuses, so no status is given a definition.
The Strip
- Source. The Data Snapshots metrics route's own daily history:
coreandregisteredfromENROLLMENT_STATUS_OVER_TIMEandPrimary_ConsentfromPRIMARY_CONSENT_OVER_TIME, one row per date the route reports, cumulative totals as reported, labels the route's keys. Enrollment to date, not a release. The route defines none of the three; the Data Snapshots page defines "the initial steps" in one sentence and fills its initial-steps heading from a function named for core participants, so that sentence is quoted as the definition ofcore(kept as a dated copy of the page, re-found by the audit); of the other two the page says only that the route labels them and the Data Snapshots page does not define them, and that they track each other closely without the route stating how they differ (the audit checks the closeness: on the days both are reported and plausible, the median gap is under two percent). The definitions are on the legend's hover and in the caption of the hidden table. - Differences. The route reports cumulative totals. The derived table adds, for each series, the row's value minus the previous row's (null on the first row and where either side is unreported); the rows are consecutive days, so that is the number new per day. The audit recomputes every difference from the two raw rows it comes from. Because the totals are rounded to 20, every difference is a multiple of 20 and noisy by construction.
- Definition. One lane, the series shown as layers in the ink at different opacities (core in front at 100 percent, primary consent behind it at 35, registered at 20 when shown; core and primary consent on by default, each a toggle in a fixed-width box in the mono face that reads the exact difference and total at the playhead in fields padded to a fixed count of characters), one column one pixel wide per day, and in it one mark per 20 new people, stacked from the baseline on a square-root scale whose top is the largest difference in view, so a column of four marks is half the height of one of sixteen; the scale is named on the lane with gridlines at its top and two round values. A mark in front covers the one behind it at the same height, so what shows of a layer behind is the cap by which its column is taller: the lighter cap above the ink is the day's consent beyond its core. Hovering a series in the legend brings it to full ink and drops the others. A series is its layer, not a hue, and the accent marks only the playhead. A cumulative value below half of its series' running maximum is a value the route cannot mean; the page lists such days in its caption, hatches the differences into, inside and out of them with the label "route reports an implausible value", draws none of them, and sets the one scale at the largest remaining difference in view, so no column is cut. Year marks and the gridlines are the only annotation on the canvas; the program's funding note sits in a separate aside and marks nothing on the strip.
- Motion. A playhead crosses the whole series at a constant pace, about ninety seconds per pass, and the marks are drawn as it passes them, with a faint column over the current day; the legend reads each series' difference and total at the playhead; hovering moves the playhead to the cursor and leaving resumes it; a button pauses it. With a reduced-motion setting the strip is drawn in full and hover reads a day. The movement is the finding: the pulse is in the rhythm of the columns, which a static strip the width of nine years cannot show at once.
- Print.
scripts/strip.pyscreenshots the same page in its print mode with headless Chrome at 576 pixels wide, the dot width of an 80 mm receipt roll, with the daily differences of all three series as lanes of marks side by side at full ink (the thermal printer has no grey, so the receipt keeps lanes where the screen has layers), the same square-root scale, hatched gap and scale rule, and time running down the roll one pixel per day, tosite/dist/print/strip.png. The audit checks the file's dimensions against the row count.
Sixty-Eight Thousand Wrists
- Source. The Fitbit row of
domain-totalsand the catalog's participant count for the current release, the same two figures Silent Records uses for its last band and the Atlas for its Fitbit ribbon. - Definition. One canvas the size of the viewport: the whole cohort as a faint field, one cell per 20 participants, and over it one mark per 20 participants with Fitbit data, placed by the Silent Records seed so the scatter is that page's Fitbit band. "About 1 in N" is the cohort total divided by the Fitbit count, rounded to the nearest whole number in the page. The page calls Fitbit "one of the thinnest layers" or "the thinnest layer" by comparing its count in code with every other layer the Atlas carries; nothing evaluative is said about it.
- Motion. The marks travel slowly between two arrangements of themselves: their scatter in the field and rows of exactly N cells with one mark each, one row per mark, tiled over the same area. The scatter and the ratio are the same marks; the motion adds no information. Each travel takes twelve seconds and each hold a second and a half; the two labels are the two arrangements, the lit one the arrangement showing or being travelled toward, its crossfade running with the travel. A button pauses it, and with a reduced-motion setting the two arrangements crossfade instead of moving.
Four Kinds of Genome
- Sources. The four typed rows of
genomics/participant-countsand the catalog's participant count for the current counts, the same figures as the Atlas and Silent Records genomic rows; and, for the past releases and the relations, the program's User Support Hub: the release notes and the Genomic Quality Reports for CDR versions 7, 8 and 9, each fetched once and kept dated. Every figure and sentence from the hub is copied as written, marked reported, and re-found by the audit in its cached page. - One pyramid that changes shape. Each data type by age and sex at birth as the Data Browser's genomics demographics route reports it (analysis 3505, one row per age decile and sex per type), one mark per 20 participants in a cell, drawn as reported: a cell at 20 is one mark, a cell the route does not report is absent, not zero, and nothing is summed across cells or types. The deciles are rows in the route's order, youngest at the bottom; Female packs leftward from a centre spine, Male rightward, the route's third sex row (Other) as a thin band on the spine. The age is the participant's age on the day the browser built its tables (its code calls it current age; its chart is titled Age + Sex), not age at any record; sex is the browser's Biological Sex analysis. A cell's share is of the type's participant count (the figure the Atlas uses), which the cells' sum exceeds by the rounding; the route's sex and age totals (3501, 3502) are shown beside a cell and in the table.
- Motion. The four types in the Atlas's order are the states. A change grows or shrinks every cell's block at its outer edge in pack order over four seconds and holds two, 24 seconds a loop, so the shape changes in place and what shrinks is where the next type reaches fewer people. Marks never move between cells or types, because how the sets overlap is not reported, except that the shrink from short-read WGS to structural variants is a subset, the one containment the quality reports state. One pitch for all four types, solved so the widest half-cell of the largest type fits beside the spine at the row height; the spine, the row labels and the axes never move. A pause button; a 1.5-second crossfade under reduced motion.
- Across the releases. A small static panel in the ink: one line per type over the releases as ordered categories (v7, v7's structural-variant re-release, v8, v9, then the current API), the counts as the quality reports state them as solid points, the current counts as hollow final points labeled computed, each line named at its end. Log scale. The release notes' rounded figures are in the table only.
- What each one reads. One illustration per type, labeled as an illustration and carrying no number, one general sentence with no claim about this cohort, and the count as a bar against the release total, the percent computed in the page and rounded to a whole number.
- Not additive. Beyond the one stated containment, the public tier does not report how the sets overlap, so the counts are never summed and no single genome total is drawn or stated.
The Dictionary
- Source. The Data Browser's concept search, one POST per EHR domain (conditions, drug exposures, labs and measurements, procedures) with no query, standard concepts only, a minimum count of 1 and no result limit, which the browser's own source maps to an unlimited page. Four calls, cached per release; each returned exactly as many rows as the domain's standard-concept total in the domain totals, and the page states both numbers. Every count is a multiple of 20 and at least 20, because the public tier rounds every count up to 20 and lists nothing below it.
- Definition. Each concept is its own name, set at a type size that follows the square root of its participant count, so the area a word covers is proportional to its count, with a floor of one pixel so the smallest words still mark the wall; the scale constant is solved so the words fill a fixed share of the wall. Positions are a seeded packing, largest first, each word walking a spiral from its own seeded start, so the ink is even across the wall; they are the same on every load and carry no information. A small inset counts the concepts at exactly 20, 40, 60 and 80: the public tier rounds every count up to 20, so the tail of each domain is quantized by that step. The hidden table shows the 200 largest counts per domain; the full list is in the derived file, with concept id, name and count copied from the response.
- What the count is. The browser's participant count for the concept. The browser's build scripts (read in its open-source repository) set that count, for SNOMED conditions and procedures, to the rolled-up count of the concept and every concept under it in the hierarchy, each person counted once; for drugs and measurements it is the concept's own count. The page says so in its footer and does not add counts across concepts, because a person appears under every concept they were recorded with.
- Motion. A change of domain moves the words as marks. Every legible word, the placed words of four pixels and up, is rasterized to marks by sampling its ink pixels on a grid of two device pixels (three on a phone), the grid coarsened until a wall has at most sixty thousand marks; the haze is not particled. A mark's ink is the mean ink of its cell, so the raster is as dense as the text it stands in for. A change takes three seconds: the marks rise over the resting words for three tenths of a second, at their places, so nothing moves while the text still shows through; then each travels in a straight line over two and a half seconds to its paired place in the incoming wall (outgoing marks paired with incoming ones by horizontal rank, starting after a delay that grows from the right edge to the left so the front moves like a page turning, with slight seeded jitter, the surplus fading out of or into the haze at its own place while the two walls' haze layers crossfade beneath); then the incoming wall is drawn under the marks and they fade into it over the last three tenths. The marks are WebGL points in the ink, drawn only during a change; at rest the wall is the same drawing as before, pixel for pixel. In this piece a mark is a pixel of ink, not twenty people: because a word's area is proportional to its count, within a domain each mark stands for a near-constant number of participants. A click during a change freezes the marks where they are as the new sources. Tour cycles the four domains with a six-second hold and is off by default. With a reduced-motion setting, or without WebGL, the change is instant. The domain buttons stay in place of the label row because a label row would shrink the wall.
Representativeness
- Two populations. Every other page reports a curated Data Browser release, a dataset built at one time and given an id. The map reports enrollment to date from Data Snapshots, counted through the date the route carries, because the Data Browser publishes no by-state count of the cohort; its only geography is the state breakdown of participants with genomic data. The map says this in its first sentence and carries its own dates in its footer.
- Participants is the by-state block of the metrics route, every code as reported. Codes with no row in the Census file (the territories and the freely associated states) are listed below the map with their count only; nothing is dropped and no other Census product is mixed in.
- Per 100,000 is the state's count divided by its Census Vintage 2025 estimate (as of July 1, 2025), times one hundred thousand. The ratio is the state's share of all mapped participants divided by its share of all mapped population, so the population-weighted mean across the mapped areas is exactly 1.0. The audit recomputes both from the raw files. Both are on a state's hover and in the table.
- Marks. One mark per 20 participants in each mapped area, placed at seeded uniform positions inside the area's projected outline (Puerto Rico in its inset), so positions within a state carry no meaning. The second placement shares the same total of marks out to the areas in proportion to their Census population, whole marks by largest remainder, computed in the page and recomputed by the audit; an area's proportional marks are its enrolled marks over its ratio, to within a mark. The first min(enrolled, proportional) marks of an area stay put; the surplus of the areas enrolled above their share travels to the deficit of those below it, paired west to east.
- The sequenced. A second population on the same map, never reconciled with the first: the participants with short-read WGS in the current Data Browser release, by state, from the location analysis of its genomics demographics route (counts rounded to 20, as reported; short-read WGS because the genotyping array is not sequencing). Its own marks, one per 20, in the same two placements by the same rule, its own rates and ratios; a code the Census lacks, and the route's one empty code, are listed below the map with their counts.
- Motion. Four states. Within a population the marks hold as reported (1.2 seconds), travel for eight to the proportional placement and hold three, because the two placements are the same marks; between the enrolled and the sequenced the page crossfades over three seconds, because they are not the same marks, so nothing travels: 30.4 seconds a loop, computed in the caption. The movement is the finding: where the marks go is the gap between where the program has enrolled, or sequenced, and where the people are. Under reduced motion every change is the crossfade.
- A ratio above or below 1.0 describes enrollment relative to population, which follows where the program's partner sites are. It says nothing about participants.
Figures that are not from the program
Two places on the site quote numbers that were not computed here: a STAT News report on consent rates and participants without EHR data (on Silent Records), and the program's own funding page (below, the context for the FY2026 line on the Cohort Atlas's release strip and on The Strip). Both are labeled as outside reporting, sit apart from the data captions, and are not joined to any count. The one outside dataset that is joined is the Census Bureau's state population estimates on the Representativeness map, cached raw with its URL, vintage, fetch time, and checksum, and used only as the denominator described above.
Program terms this project follows
There is no terms-of-use page for the public tier. The Data Browser needs no login and no agreement, and the Research Hub's privacy policy covers only its email list and server logs. The program's written rules, its Data User Code of Conduct, Data and Statistics Dissemination Policy, and Publication and Presentation Policy, are for researchers who sign in to the Researcher Workbench to reach individual-level data. This project never touches that system and is not bound by those documents. It follows them anyway where they can apply to aggregate counts:
- No count under 20, and nothing from which one could be derived, in text, tables, or figures.
- No re-identification and no linkage. There is no participant-level data here to begin with, and no count is combined with any other dataset except the state-level population denominator on the map.
- Acknowledgement. The program asks that work using its data honor the participants. These pages exist because hundreds of thousands of people chose to share their health information for research. The program and the Data Browser are named as the source on every page.
- No endorsement. This is an independent project. NIH and the All of Us Research Program have not reviewed or endorsed it.
- No marks. "All of Us", its logo, and its tagline are service marks of the U.S. Department of Health and Human Services. None of the artwork appears here; the name is used in plain text only to say where the data come from.
- No mirroring. The raw snapshots are the same top-level totals the Data Browser shows every visitor, kept so the figures can be audited, not to reproduce the browser.