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

271

reports under this root

#963,242

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-19

Confirmed in Bitcoin block #963,242.

Merkle root
14b5479881f4b877e928447f0471d3f57346b30aee1df79b9423cdd5b21a66f1
Reports covered
271
Sealed
2026-08-20T01:17:28.953Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #963,242

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

Verify it yourself

ots verify -d 14b5479881f4b877e928447f0471d3f57346b30aee1df79b9423cdd5b21a66f1 crawlcheck-2026-08-19.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 271 digests sealed under this root

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

01139335ec5459b4d917f8ca586b1fb2a79aa6e9909a25c9d7f35ecc323b1966
020b084087a0f24981ab197f22d7d034150e7cea0a9e57288b3a0ec1eda485d2
035feccbf606a151ff8f3277a861575261eed0520a82e9f3fc38be1c3fec1b76
03927692dc0de988332f948fa6b4475a3a676d32a0c9184a3f735b35ceb1434a
0442861586b513d1969071deaa6c61778c46b8c8519a64172c098f6d7ec7a036
04a7c7ec14f8a326db047256df57f8cee860ac82e9a1d6e7b1ebfce35a857932
04db5b8ca8057050f9a5ee82c5354ea85c9f95d08e993b4e43c6e076d0ec4cf3
0603b3537786b63f7f0e578142a764e5de7951fbc3c88ff50362c32124184de2
062dcdc526c9e87ee80e9a24d19ba818d8a40f5c94a038508f69db058971615a
06515fdd84e18446cfd0e7ba61f7c180a3d5b4feae898c8c97ae3cfa51c6b766
06c36afd6b6c877b049e2a659d788a7b94a0c8e0be6f7640791685ee1d5db3ce
0749eea8f18264380c2d3bc258412e3692c935503dcd19a27d8caa2b7b2a710c
08fc64b192d8838adc37980b2a1bfc6677c72eca4e41e14056ad002c3c22f38c
0a54716600a2d051300f62ffe808c8d75f619d8c10be35a3eeaf5e2a6742eb83
0a698b91b169ba6485a7fbe9aa0ac0aad529b6cda096e00b8ee111dec636decf
0aa6bf108d48a1fb9171ec8c76b079fceef025cb8e3e0b052286565e69737cd8
0aec6c79e29b2e0c8d43ffd3ee298dcac01fc7868c96e2286039a614792b2201
0b1dc83f548d8aa7f5ad172c3a92e2a587351cdaf6d7ec9242683d8ffb65405d
0c348a28b57e520ac46340d618d8fb76e65225f097a8c36a94f8a23e1f016462
0e4da954bd532bb891e686d958252c2ab45a9820422d9385ebe4bc99051e97b5

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.