Check the record
Every reading this site has published, stored so that nothing can be changed after the fact without leaving a trace. Record started Sep 13, 2026.
What this is
Each day's reading is stored with a fingerprint of the day before. Change any old reading and every fingerprint after it stops matching. That is what the button below checks.
Where the data is
/api/ledger returns the full record. /api/ledger/head returns the latest entry's sequence number, date, fingerprint, and the entry count.
Corrections
A reading that gets finalized later is added again as a new line for the same date. The old line stays. The newest line for a date is the current reading.
Exact rule
For anyone who wants to check the math without trusting this page, here is the exact rule.
Copied from the serving code, so the check below and the code agree by construction:
hash = SHA-256 hex over
prevHash + JSON.stringify({ seq, date, percentile, regime, provisional, scorecardComputedAt })
i.e. the previous entry's 64-hex hash string, immediately followed by the entry's fields as
compact JSON (no whitespace) in EXACTLY that key order: seq (integer), date ("YYYY-MM-DD"),
percentile (1dp number as JSON renders it, e.g. 29.4 or 30), regime (string), provisional
(true/false), scorecardComputedAt (ISO string or null). `hash` itself is excluded. Genesis
prevHash = 64 zeros. Verifiers recompute exactly this string per entry.
Check the record
Fetches /api/ledger in your browser and recomputes every fingerprint with WebCrypto. Nothing is sent anywhere.
Run it yourself
The same check in Node, for anyone who prefers their own machine:
import { createHash } from 'node:crypto';
const { entries } = await (await fetch('https://regimecard.com/api/ledger')).json();
let prev = '0'.repeat(64);
for (const e of entries) {
const canonical = prev + JSON.stringify({ seq: e.seq, date: e.date, percentile: e.percentile,
regime: e.regime, provisional: e.provisional, scorecardComputedAt: e.scorecardComputedAt });
const h = createHash('sha256').update(canonical, 'utf8').digest('hex');
if (e.prevHash !== prev || h !== e.hash || e.seq !== entries.indexOf(e) + 1) { console.log('mismatch at seq', e.seq); process.exit(1); }
prev = e.hash;
}
console.log('Chain intact,', entries.length, 'entries, head', prev);