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

344

reports under this root

#965,109

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

Confirmed in Bitcoin block #965,109.

Merkle root
ae130275fe7f77708ecbca864d4a4ff1be9b22c792ccc9ad64a4c92ea31794f9
Reports covered
344
Sealed
2026-09-02T01:17:58.795Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #965,109

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

Verify it yourself

ots verify -d ae130275fe7f77708ecbca864d4a4ff1be9b22c792ccc9ad64a4c92ea31794f9 crawlcheck-2026-09-01.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 344 digests sealed under this root

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

0046bf005404e72af6b51443bed2eb1fe8a29aa8c4895c4720fef83287f5937d
0115cef17a7c2350cd6155da8fb869d47c6c096707e633363e00f27a97bf0573
0126c045c1d63f3aabf12a2204178fcd7b9004e9c9839adfee1636fbc6339680
02792d0d5d3fd0ae3f1328b80d77ea2466f5b06ef3be9a27e1a0284597f7fbb6
036218ff8e9ce2d28f94f96ffe2450a8624d90442b0bcff982a6e4915c7ef371
03e9d2ea398410ed7542253f3ad340d9a3a5ac13f48556bdac6925178a07b57f
04a8ce14c2b047791c9dd4c0e0ecbc2ec83686b1b5e0f0e05158bdf0c04e1eb6
04c07cfa79b5ce88b85e7dbbc511c0075da0ebdfe2f320fc93f2350b5f130f5a
05013fd1eabc9c1eeb3ed4e172f93f5733a738a2e51dc049ff66fbba8fcd743e
05357914726b225b66a59e7456458a452d99a1efd62cfdc113aa93b087b95ece
05aa90902476e817d15457d7a79c0e0dc5835ad1a64887d637c99796fbfdacf1
066c5525f16299db35925b62cd4e74fc3f9f58201dd39101b9e99a22db0297a5
06936dc2d2d9bf4f307037dcdbf8677dab3551e8e5e360b8d3647c7516e7a233
06d82e0f5903845789cfe54dc6b23ab2da100c2455dba772c636c73b6509ba59
07131af1ed55c8cd72bdd417d6bdfbf1360e8dc15ae3f41d5fd6d12d6ef79bbe
0784bfa81f9d80e6b838658df1295de3c2c5d10497b42a864fb82912a42b534a
0809c1428b35a9e017569fb23cdcc912a273a5cad284f258a3c9fcdfe5236a67
0936e415f229f3b1240d65d1fa27158024e2a8038a1bd345a98412c1175b957d
098b6b966bb8f4bbb84f46e8eafbf4eb84c7ce43c543f272b314ebda7b2b4897
0b8c6895ae9a083462b085a5d3d9783a3d3db9f3a5426d69bba37455307ea328

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.