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

176

reports under this root

#964,228

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

Confirmed in Bitcoin block #964,228.

Merkle root
79e848296953586d77cdb540a898f5d0669e289de42909409c70236e831e63b1
Reports covered
176
Sealed
2026-08-27T01:17:33.999Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #964,228

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

Verify it yourself

ots verify -d 79e848296953586d77cdb540a898f5d0669e289de42909409c70236e831e63b1 crawlcheck-2026-08-26.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 176 digests sealed under this root

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

01aa3da94c0749c10ce3b25a048232a53bb73325e8fb6961c3474437e03bd62e
0233439ca6981574494b4581a13fdfeda7447f97583ce8bdfc687440a2dd4094
041c2819dcdcc9887d9d6d1a63fb33441d15b166878e61b2ea5d11dac3684fa6
059080528c5f23b0ea39410cc07efa4fe78c97f3f33801e70f7bde32b9b39ce3
06a142f74972ba47f0cef21316c1f3b105589b96469b4bb844ddb2c44f39c0a4
0705251b2a5d8716f1bd72ad92ea3106fc3f3687920a688b33d6a6f4892bb495
078bea9ba6fe34c52bb1e38c3dc6dd6138fb178825822f5db602348f6f0bd722
07993b86d66370579666e427dbf6b57ca6f391e970a7a486985dece7ceae221d
0873096554fbf11a8b010031455982bbc7e9410daf3b0c1f3b52343168718df6
08a9c041ad8a6ec0fc56414d13a739609a69d76a1d008f579b7f9430e885a09b
08e897ff8b98edeafb1a97d76534fdc03dbfbe12aaf18ec2fc567891452104a3
09c2bcf7ea736c6fe1cec1cb4b819027cf561ddb58c5b7dc9e4f6a5dd380a5e0
0ab0feefe57417e26fb36069dc494cace73cf61042a8f6fd451096379a9bcbb1
0b7f414f2b6460bdfcea31848bdace943a6c2263c35fbb511e7812a55f6fcd1b
0c4f85662a19fb9b9a473da30d9a1aab185729059f21f03217f6dd9aa7a5b249
1026e6e9281ed8fc9cf2876ff6842cb38093ca35469fe831d02d2a3f7197f136
1075779cca698e9fdaeee7df4d9a28df2b22b2881b943159e26799739c103327
110e31e470866564b96e39f674868c09b55b8a3faa3bcde924251f52d972efa9
1154b3c3f2772713f92600ab4bcbd14061979942331de5569dee8f35c46ccae6
121165af9b3c771af5dcd468315df180b8aab072b22aee6b20e4a45f8eb940db

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.