For agencies and teams
Run this for your condition, your state, your people
The whole application is one download and it runs on your own machine in three commands.
The rule that has to survive the fork. No model, average or interpolation produces a dollar figure anywhere in this codebase. Every number on the screen is a row of a published federal file, carrying its year, its basis and the population it describes. If you keep one thing when you adapt this, keep that.
On this page — 5 sections
Take it
This page is the procedure, not the pitch: the files you change, the command that refuses a figure that does not reproduce, and what happens when no federal file describes the people you serve.
No account, no request, nothing to sign. The archive is the tree this site is built from, minus the build output and our own credentials: app/, components/, lib/, data/, cf/functions/, cf/migrations/, scripts/, tests/, and a README that is these commands with the reasons attached.
# the whole application: source, data, migrations, tests, README
curl -sL https://waypointledger.org/waypoint-ledger-source.tar.gz | tar -xz
cd waypoint-public
npm install
npm test # the suite that guards every rule below
npm run dev # http://localhost:3000
# the full stack, with the database, on your own Cloudflare account
npx wrangler d1 create waypoint-ledger # put the id in cf/wrangler.toml
npx wrangler kv namespace create LEDGER # put the id in cf/wrangler.toml
npm run db:migrate:local
npm run dev:full # http://localhost:8788The Cloudflare configuration ships with placeholders rather than our project’s identifiers, so a first run cannot point at somebody else’s deployment. Nothing in the archive talks to us: take it offline and every figure on this page still reproduces from the federal files it cites.
What you are starting from
| File | What is in it | Take it |
|---|---|---|
| data/prices.json | 274 published federal figures, 251 of them priced and addable, each with its file, year, basis, population and combination rules. Version 2026-09-09.1. | price-table.csv |
| data/state-prices.json | 5,668 figures: 52 CMS codes priced for each of the 109 Medicare payment localities in 53 states and territories, every one re-derived from CMS’s own formula. | locality-prices.csv |
| data/conditions.json | 9 conditions. 6 carry an ICD-10-CM code from the CDC/NCHS file; 3 point at a published year-ahead figure and the rest carry an explicit null, because no federal file publishes one. | /api/table |
| data/synonyms.json | Extra plain-language phrases that map to a unit of care, beyond the ones each price row already carries. This and the row synonyms are the whole matcher; there is no model behind it. | dictionary.csv |
| public/data.json | A DCAT-US v1.1 catalog describing every open file here — the metadata standard data.gov harvests — validated against the government’s own published JSON Schema. Point a harvester at it and these files appear in a catalog beside the federal files they came from. | /data.json |
| cf/migrations/0001_init.sql | The whole schema: journeys, corrections, gap reports, survey responses, interviews, the change log. One file, no ORM. | what each column holds |
Column meanings: price-dictionary.csv and locality-dictionary.csv. The data is CC0 1.0 — the federal figures are U.S. Government works and already public domain, and our arrangement of them is dedicated to the public domain too. The code is Apache-2.0. Both are files you can read, not sentences on a page: LICENSE and NOTICE, which says line by line which licence covers what.
1 · Another condition
One object in data/conditions.json, pointing at a row that already exists in the price table. No figure lives in the conditions file, so adding a condition cannot introduce a number nobody checked.
# 1. find or add the published figure, in data/prices.json
# a row needs the file it came from, the year, the population it describes
# and its basis. Nothing else may carry a dollar amount.
# 2. prove the row reproduces from the file it cites
python3 data/verify_price_table.py # exits 1 if your row does not
# 3. name the condition, in data/conditions.json
{
"id": "sickle-cell",
"label": "Sickle cell disease",
"icd10cm": "D57.1",
"icd10cm_source": "CDC/NCHS, ICD-10-CM code descriptions, FY2026",
"price_row_id": "your-new-row-id", # or null, and the product says so
"figure_kind": "condition_attributed", # or "excess" — they are not the same number
"note": "…"
}
# 4. nothing else. The panel renders whatever that row says.When there is no published figure. Set price_row_id to null. The product then says, in its own voice, that no federal source publishes an annual figure for that condition, and sends the person to the gap so the absence is counted. An absence you count is data. An absence you fill with the nearest number is a fabrication.
2 · Another state
Nothing to edit. All 109 CMS payment localities ship with the tool, so a person in any state sees their own locality’s figure and the drawer shows the three geographic indices that produced it. What you change is what you build on top: hand the API your state and it reprices every line without the interface.
# every state is already priced. To check one:
grep '^cms-99213,.*,TX-31,' public/data/locality-prices.csv
# to add a service, add a row to data/prices.json with its CPT/HCPCS code,
# then re-derive every locality figure from the CMS files:
python3 data/build_state_prices.py <dir-with-PPRRVU2026_Jul_nonQPP.csv-and-GPCI2026.csv>
node scripts/gen-locality-table.mjs # recomputes all 5,668, exits 1 on a cent of driftOne curl returns your state’s figure with the arithmetic: GET /api/table?locality=IA-00, or /api/localities/IA-00 for every figure published for one place. A locality we cannot honour is refused with a sentence, never answered with the national number.
The generator is also the audit: it recomputes every one of the 5,668 figures from the RVUs and the geographic indices on its own row and exits non-zero if a single one is off by a cent. A published number that drifts from the formula printed beside it cannot leave this repository.
3 · Another population
lib/fit.ts holds the whole rule in one function: given a published row and a person, does this figure describe them. It chooses between published figures and never computes one.
// lib/fit.ts — fitOf() is the whole rule, in one function.
// Add the coverage to COVERAGE_OPTIONS, then add its branch:
case 'tricare':
return base('REFERENCE PRICE',
'TRICARE pays its own rates and they are not in this table. '
+ 'This is the federal reference figure for the same service.');
// A population with no published figure returns NOT DESCRIBED with
// offerGap: true. That is the honest answer and it is counted at /gap,
// never filled with the nearest number.The API answers the same question as the screen, from the same module: POST /api/price with coverage and state returns the fitted figure and the verdict per line. See the API.
4 · Your own community, counted separately
The burden instrument takes a channel. Give your organisation a slug and every response through your link carries it, in the public export as well as in your own reading of it.
https://waypointledger.org/survey?c=your-org-slug
# the slug is validated /^[a-z0-9-]{1,24}$/ and published as the channel
# column of /api/export/survey.csv, so your community's responses are
# separable from everyone else's — by you, and by anyone reading the export.Small cells are suppressed before anything is published. The instrument, its exact wording and every response option are in dictionary.csv, so a reviewer can read the questions without running the site.
The two commands that keep it honest
| Command | What it refuses |
|---|---|
python3 data/verify_price_table.py | Re-downloads every federal file, hashes it, and re-derives every figure. Exits 1 if a row does not reproduce from the file it cites. |
node scripts/gen-locality-table.mjs | Recomputes all 5,668 locality figures from the published RVUs and geographic indices. Exits 1 on one cent of drift, and names the row. |
npm test | Runs the rules as tests, not as prose: that no code path can produce a dollar figure, that figures on different bases are never added, that the published catalog validates against the government’s schema, and that the licence on the page is the licence in the tree. |
Standards
Where this tool stands against each standard the challenge names, today. Nothing on this list is a connection we do not have.
| Standard | Today | What that means here |
|---|---|---|
| HL7 FHIR R4 | Live | Every ledger downloads as an HL7 FHIR R4 Bundle, with CPT and HCPCS codes, and a LOINC code on 36 of our 81 lab tests. /api/fhir/example returns one. The test suite checks every Bundle against HL7’s official R4 schema. |
| USCDI | Four data classes | The Bundle carries data from four USCDI classes and no others: Encounter Information (the kind of visit), Procedures (CPT and HCPCS codes), Laboratory (the test, by its LOINC code) and Provenance (who wrote the record, and when). It has no name, birth date, dates of care or other identifiers, because the tool never asks for them. It does not use the US Core profiles. |
| Blue Button 2.0 | Written, switched off | Blue Button lets a person with Medicare share their Part A, B and D claims with an app. Our import is written against the CMS sandbox and stays off until CMS issues us credentials. /api/bluebutton/status says so. |
| CMS Interoperability Framework | Not pledged | CMS’s voluntary criteria for health data networks and the apps that use them. We are not a CMS Aligned Network. Two of its criteria match choices already made here: lab codes in LOINC inside FHIR, and passkeys for sign-in. Price transparency is one of its newest use cases. |
| TEFCA | Not connected | The nationwide framework HHS set up for sharing health records between providers, patients, payers and public health. This tool holds no health records and takes no part in it. |
| USCDI+ | Not used | Lists of data elements that extend USCDI for a particular program or field. We use none today. |
What we would want to know
If you stand this up, the thing worth sending back is not a thank-you. It is the corrections: which published figure your community says does not describe them, and what care never entered a claims file at all. That signal is addressed to the agency that published the number, and it travels better with more than one community behind it. Here is what one of those looks like — the provenance and the counts for a single row, in a form that needs nothing of ours to read.
Questions, or a row you think is wrong: [email protected].