CrawlCheck
Proof

Proof an agent can check without trusting us.

An agent that acts on what CrawlCheck measured should not have to take our word for it. Every report is fingerprinted and each day anchored to Bitcoin; every answer an agent acts on is signed; every signed answer is entered in a log that a witness we run on GitHub, outside our servers, re-checks. Each of the three is checked on the reader’s own machine.

Proves

A report with this digest existed in exactly this form by that day, and has not been edited since.

Does not prove

That the measurement was correct. Only the first claim can be settled by mathematics.

90

sealed days

131

reports under this root

#964,370

bitcoin block

Three proofs

What each record proves, and how to check it

Each check runs on the reader’s own machine, from files that are published and can be kept.

1 · Reports

Sealed and anchored to Bitcoin

Each report’s measurements are hashed; each day’s hashes become one root, committed to a Bitcoin block through OpenTimestamps.

Proves the report existed in exactly this form by that day.

The latest sealHow it is built

2 · Answers

Signed with Ed25519

Every Resolve answer an agent receives before it reads, cites, connects or transacts carries a signature over its canonical content.

Proves the answer came from CrawlCheck and was not altered in transit or afterwards.

The signing keysThe offline verifierWhat an answer holds

3 · History

Logged, chained and witnessed

Every signed answer names its leaf in an append-only Merkle log. Each signed tree head chains to the one before, and a witness we run on GitHub, outside our servers, re-checks and co-signs it. It is our own workflow: it proves the log was not rewritten on our servers, not that an independent party checked it.

Proves an answer was not rewritten or removed after it was logged.

The log headThe latest witness

Method

How a report becomes a proof

No wallet, no fee, no key held by us. The proof is a file, not a coin.

1Reportmeasurements only2SHA-256one digest3Merkle rootone per day4OpenTimestampstwo calendars5Bitcoin blockpermanent
  1. 1

    Measurements only

    Host, timestamp, section scores, every path and status fetched, every crawler identity and what it received, the citation state. Wording and layout are excluded, so an editorial change never breaks a proof.

  2. 2

    One digest

    Canonicalised with sorted keys and hashed with SHA-256.

  3. 3

    One root a day

    Digests sorted and folded into a Merkle tree: parent = SHA256(left || right), an odd node paired with itself. Arrival order cannot change the root.

  4. 4

    Anchored

    The root goes to the OpenTimestamps calendars, which commit it into a Bitcoin transaction.

The seal

2026-08-27

Confirmed in Bitcoin block #964,370.

Merkle root
e2afa29ceacc0bbff3f715e9834d27f0fddc640bce0cbb843a12d4e3ecb4cf09
Reports covered
131
Sealed
2026-08-28T01:17:20.411Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #964,370

Download the .ots proofOne report’s receipt as a single file →

Verify it yourself

ots verify -d e2afa29ceacc0bbff3f715e9834d27f0fddc640bce0cbb843a12d4e3ecb4cf09 crawlcheck-2026-08-27.ots

The reference client checks the file against a Bitcoin node or a public calendar. No CrawlCheck server is needed, or trusted. A fresh seal reads pending confirmation until the next Bitcoin transaction confirms; ots upgrade then stores the block attestation in the file for good.

Ledger

Every sealed day

90 days anchored. Each links to its own root and proof file. Days are sealed once and never recomputed.

The 131 digests sealed under this root

All 131 digests as plain text, one per line; the first 20:

0084e934667be31c5e4d00019a37c1c5886dd3922cfb89bab67f889e76cfc801
046272b9cafca69140bde4235407f40bb66f050e06b58d1b1adbd9fcc71625a8
0614e429fe7b20d7d75034f746516c60a1a55b7828a0bed71c216c6ea338b188
0a03d887630fd45b42a183106e6c7ff6323ba2d9bbf8f7a6adf71dd6cb7ff176
0a22c80f35f027253acc8b2deccfe83f734f63fe501c7e310743fa1a94a668d1
0d8cd8d0f4dbf85e49ccc7cb3b9e454b29cbf80aafe7cb33ca43e13f22666c37
0dbddcdf8a33e5c4531e7dfb34ae2a98623d1d0c7a986ccb6eff565b855dd1d8
11ed489aeee9cd900ed1758219c0b6bd79bf53013a85ac5bbada0c87087128be
1286b4b27e3c57378d90bf960402c3539968895669e17bf37b2d9e7d4f85f626
15e18b31bfe0c4ee242c6b466dc5b702941b829360b81640c4b144d14e2734be
183eb8b12bb94988f38bab3b4f88e8af617a84ccd86c70f2b8409518ff8d5cf3
19c5e0dfcae2a70ba24bec717f9cea7c9d008edee374197cb55fec032fc039ab
19d221a9281e8f44078adef27eb780601c9d99ecf575f5dbceb3a947b3532e7e
1c20c11a7ceb9738abe3dc2b8f46fe33d063d497b538bf265986dd0b93a8aa44
221a7527cff531d79d18829c50f46ecc421e03d7e09c987d402dfb6b79916013
22257d66d9c76552fdde5b8c2b99d8bfa98ccabf10fe6f406e6511454c456bf2
24b14727dc6446c73d3c73bbd4b26f3381df64c28503ce5ca1e5dcb5b95ab0b1
24f4a6c4daebe2c87c7434cdab60198887f5ef0b0f8fa79a7d4f1b584ee7f02a
26436ce40e2b9459a31077b907ce87fec6216c1acf1f13c403bfd6577457bb68
28b75e5c53047ad194deead71edbd65d8800bc2560dd553d25698e8b61f2008a

Questions about this page

QWhat does the Bitcoin anchor prove?
That a report with exactly this digest existed no later than the anchored block, and that it has not been edited since. It is a proof about time and integrity, not about correctness.
QHow do I verify a report myself?
Download the day’s .ots proof from this page, recompute the report digest from its JSON record, and verify the proof with the OpenTimestamps client against a Bitcoin node or public calendar. No CrawlCheck server is needed for the check.
QWhy exclude wording and layout from the hash?
So an editorial change never invalidates a measurement. Only the measured fields are hashed; the words around them can be improved without the proof breaking.
QWhich days are anchored?
Every sealed day is listed on this page with its digest and proof file. Days are sealed once, after they end, and never recomputed. A day sealed within the last day or so reads as pending in the reference client: the calendar holds the commitment, and the Bitcoin block confirming it is usually mined within 24 hours. The proof file here is upgraded to carry that block header once it exists, so a pending file is a proof waiting on a block, not a missing seal.