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

147

reports under this root

#966,749

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-09-12

Confirmed in Bitcoin block #966,749.

Merkle root
c93b3a851dab6b47eefe0f6d764eb59cdc51555b0bbb72115fa9318f9c71bfc3
Reports covered
147
Sealed
2026-09-13T01:17:52.076Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #966,749

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

Verify it yourself

ots verify -d c93b3a851dab6b47eefe0f6d764eb59cdc51555b0bbb72115fa9318f9c71bfc3 crawlcheck-2026-09-12.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 147 digests sealed under this root

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

004a804cc33111aee77e475f929cefd0389c5d42bf21283b33135e3c4cf3fcf5
01ebbef718073a1f75349b784209d2ce02cca7efaec8b194bcb3cd3073326f54
040a6db8bb309953c3f2b7e86c82909f270cd5cba6ef75f369aa22b27dc655cb
0546d4ff6b6712ab8ddd80488f8f671d6a9662a686a89d3d0a9998be7fbbd6cb
0552e53f48b65e79a7684bc8b977e8404e49a8d2dcb0cb7080f82e598d77e509
0574abf431ce62e9650c54c121e91fa78493ae6fe279f0da82dad1a684a07263
064990537a3b30e9af9b0f77bfd4c0ea4f289de285b9ca4553d3f6e0f53e5bb5
08eb423a3afc78920601c8eeec12f380ac1cec9a688013269d7e6db36b3cdb57
09275261a5b574a90244cb0c7024aeb0dfb0b061efa5953c12290cda90bbb134
0f575191c6e15e5c1ce537c7fa3f545570ecf4f14d5182be38dbc740babb68e1
107731d20c7c2ddc16b9dd0bb007ca8b59db33200a4e52135bb89bc4fc1043cd
114db87e8c985761246f356f3f6feffc36c62d5f4d6c0ded1b528de0aa2a8cdd
13ed7d195e65e6420872fc5fae47ecd682b6a9bbeb41484de8f71ef7023ec9ab
17e3a97933e37f03abbe9d8308d6ba47ac18c09699df240ed89d3542bda922eb
1974cf2b217f3101fce5cdd3adbc1caaca685cebc268382174a0b92d439570f5
1cc5df65b3379be66963e129360f2abf262e7c7d5fa9fc204d96a574b6b068e1
1f5acde43ee0de080e8629fe4bd8c6cdf1186c0f7bd5829814ba71692603e538
204da7342c628cdf64484e73b8f1f9f6d279e0464b388edcc40d16f723eba975
231ee468bc67152ba4c5a25d8f4bee2555ec33853d84123733a711bfba4f6342
2330a6cd5fa963c8a750e284b1147f7c850fd47a50166a5e9bed19c975c0bee5

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.