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.

91

sealed days

186

reports under this root

#963,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-20

Confirmed in Bitcoin block #963,370.

Merkle root
66672fa45b11ee0bf160071d55fc544f7599e4086ad56b024b5841aef1c9867e
Reports covered
186
Sealed
2026-08-21T01:17:30.832Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #963,370

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

Verify it yourself

ots verify -d 66672fa45b11ee0bf160071d55fc544f7599e4086ad56b024b5841aef1c9867e crawlcheck-2026-08-20.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

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

The 186 digests sealed under this root

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

015af268d08a24bc184310131a0a240af275a6a342e5a25dfa1b47ccb2aaca88
02f8e2f18568b25c858509d121baaeda0d12bdc78e1a3690e31e5f77c6a0ebce
0379657ee7f11cb6d779c53c2e9bc663857594058f7ecb61fe765bb16d34a03c
04c2f0d1222cf5bbecc4366c5f10b7cdaaf5f1d3db6a398ca32d2983b562aed7
0529a7b1680e8d5d46ec7386b9c9917c4e5a750a0687446e5a86dce2180efdb4
062f34581964600eb4543bcb5f0c565b9e1b109436e224f05bdf5769e008aae9
0a9b3d5e1e1eb7c719fc4cda78e913c4cb8dace53db0689b9cdb40e09b4399ae
0afd869cc11565fdfb038abd07aebe61e3b706b285c52647ed32528eb05e01fe
0bad560bcdca9a97b53d1ed5e8849ef9e6dd5df8737b3849d89d30fbfa5fae8c
0cdaa951b450f656a00ed72dd39a8a2962a4b4c626d345f3798736bfcacb54c3
11c9f61486e163883076abd9f254c3427b17594f385479d7e34bbb7d2958d188
1275076d7e1e6382b4af2bf546c7d22123cfdc993d2b8fc2616a4093764e38ae
13638d0ca74cff80554e9fd44708e19d247c1afd04556710b81318505e797649
13841502c186b1da8e866ebc76ec294ca234ce307b4bbf4c38102fd20e6d0982
16c1d1d699bf4194e11c90e9d7b572a3d346f66b7bb8088cb98ed6fb41a3b146
18e569e76a90ccd1e6341cd6a559d78350199e7cd0d95836a70371c937c5b903
1b2d9ef3dfbd0756f706dee6bd68cee7931aed9fc2c08ae65edf5b68521fd191
1c78af34d51c0a4caa6d6ce26dc5acbb26bda0cd3f2623f0959b5cfa3e17b0a1
1c8d944f4a95da6771846780db0d17c8f6d8fd3b0d601a8d35c96b4242cba36e
1dba72729d09fde7086ed3cea80556b82111985ce668407dcd0b5b3d1c50c649

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.