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

127

reports under this root

#965,700

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

Confirmed in Bitcoin block #965,700.

Merkle root
12793e8b01ed407fc45b38bce1f4d3350347fc554364f5d3178a5af65acfc231
Reports covered
127
Sealed
2026-09-06T01:17:01.907Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #965,700

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

Verify it yourself

ots verify -d 12793e8b01ed407fc45b38bce1f4d3350347fc554364f5d3178a5af65acfc231 crawlcheck-2026-09-05.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 127 digests sealed under this root

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

00a0b6c017515efe9b169a80f9421c9e4f70d8c080a571936dc620f1a70c0058
063df1d99f43c6a0587b81ece98101aba2bedaa44c21e2d3c35847ae927eeb6d
077e6863174d24c984b2a0b2bc30672e11e81f94ae0ad9c5125b9970f474a081
078c57c449109dc9ff6c26ba49cbc2f532a05aadbd1ffff028bac1ad005d9800
083a9ba8e4569952b3666d3bf88702af607ea6e44b1a6e084843ad66921c7d98
08bf7d237358166ae7586a19568e53f5821f6a37e9d9b5a86b4411fd7cd70cf3
0b7d8591a1c2fe53572aa675528eafb24e4f554bfdab1c72bb4b95d0829acdd4
0d21ff1bdc049177b0c6e0d5fa7235a2fb62e52a87fc169653c9c78c60f4df83
110dc537661fbeee7b220e46879f38cb4dc1a99b0e2a12df71c66aec2c9f0900
117913a6005f3ef66a12ef707287c0ffafffb0a176b70ef06a7370d4295016da
13e011ed24ed2612abd2e6e1c97b2bd945c2114da5cd1d3a25b31184d554772d
177d3716e2f88248761603922b83a1ccebfd9367c9fb4103925ba5ceac7fd64a
17ee204cb1ceabb8992c5677b7a1aa27c75f1fe411e6cc7ee73e1a75c4a2d1d8
19751bcfd4a23c0608570736cec39a1f697678a9a1792b91417ab3cca1b98821
19b2724ae0776f50ef84422f29607d027e6fcb8ea24f0363d2e892af82663047
19e21e9c85488a88e8f3bdb15a65230ca3c47565419caed4b984678dfc18d969
1a585183dd27ab537786d5ccc24db2887897aa2eb478d73cfacdebd122093151
1b31f11a59971b954ae5187ec542af315e3257b9481fe0c1d8b28d5effa7f97e
1d2b1b6223f2ee953777eeea9dc56c6b34a8621f2a525d4494bac34cd947a9f3
1d64e58cf2c8ec1510f4e6c68d7d74739f2e0ea5a18f5c0c3acc996bb2def6d8

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.