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

1,948

reports under this root

#973,903

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-10-30

Confirmed in Bitcoin block #973,903.

Merkle root
2e538d76776b32b2bc9db7187ce61a223e5975eb5c6f4596b9b4cf02c2c216be
Reports covered
1948
Sealed
2026-10-31T01:17:18.466Z
Calendars
https://a.pool.opentimestamps.org
https://b.pool.opentimestamps.org
Bitcoin
block #973,903

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

Verify it yourself

ots verify -d 2e538d76776b32b2bc9db7187ce61a223e5975eb5c6f4596b9b4cf02c2c216be crawlcheck-2026-10-30.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 1948 digests sealed under this root

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

000ff05724e3c6d3da63917b22eaae340c2c3241fc3135e097fbf839052a8caa
00306a70bb955af12f3741360e73ec83406c1c5c867f3cc29a20ab97f67f17dc
00698b5b5e9da3ca04b58786cd8320818a048554a982438aa4aed506ec142c79
0081536f704d6bd5fa8a2cf9d443e481e7bbbdbf94d0bfb510bc19dde8916f94
00af587b90041c595cb815f5acb5cf18d7ba56318850b80aac935d62be4781e7
00c9e8dcba4a6b52a77e6ea54266f01a792f7d123543ad22401462469e366460
00d51938aac1d531db5fc8885df062d1edd5e7fbc8a6a1a592562b87a73f1665
00fdd16e0f21409ad07ebe9caded5bf12c7b74aa1353055022ad7f03bcb892b1
012dfdbbb6b68ae0f47ade5de068ac44607407fe3d814edd72faff51d463612c
01465f1d3111d2d850ba20fa41ffa99f6b98a7650b7b77286deaa71686b86e83
018e53d5b146dfba46096918cefab98465aae61ad29f29eb27a68b0fc9b951b8
01baeaa18014034cd730fb77d3e2b0deefbdd2f6eb55821045d61fb1c6a167ca
01e7a2b78f92f8467034986c334c38835f197c1de8fdc3f138021c9dc6bab7cc
01fc7d7be456faf012bfcd6280e59c59aeae58fe90f52c12da48d8f9cbee9e02
0238324c52c75afc4517292d5ea400ff0b6ba1fd5ffd6e494b332d5d9a1ef73f
02be3b4e3483a0c8232c6728b540c4c9e176b057fd2281e8c1ad3358b8b44b3d
02cbe312589da3de4b78063946f7bc12e7028ef3696d959aa21aa4e99c82874f
02e9471fd1cc12e0e54d7d3c8d5aca8df6f2020a8133001ddab44b5c18d7bc86
030990e737bfb204aabffc0197ee169deb9ec4621b0df8d0afbd8fd343d72437
0310612b60e3f23d2776b22ef2de33cf05161d2a74a6c5dd4ad8cd165bfa130c

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.