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

2,183

reports under this root

#971,867

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

Confirmed in Bitcoin block #971,867.

Merkle root
10a637691ae0e7fb8e1aaa5b1e8b14078ec5ce152f1383d0c942746a41c8052a
Reports covered
2183
Sealed
2026-10-17T13:17:28.877Z
Calendars
https://a.pool.opentimestamps.org
https://b.pool.opentimestamps.org
Bitcoin
block #971,867

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

Sealed late. The scheduled seal for this day did not complete, so this root was sealed on 2026-10-17. The anchor proves these reports existed by then, not by the morning after 2026-10-16.

Verify it yourself

ots verify -d 10a637691ae0e7fb8e1aaa5b1e8b14078ec5ce152f1383d0c942746a41c8052a crawlcheck-2026-10-16.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 2183 digests sealed under this root

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

000bb0e1a8f92c0ae1e53c79fcd1a4b7530af0e5ae076ab104573ad09213598d
001578525e3290a843f1c317de84a1a43cff4a4092ea426679b900c979862477
00193bec639dd0139c0db5841e797a240b7726724305c7f6455c6ea7d4957534
0038f6d60ebcafe10821bfc29fea6078092674d8ca5279574f373ec3e1da1077
0062a89dd583116803464df660739df82dc08e9385023915578a3e2895636b40
0063c4fbf66ae809616fce4685eeaff62ebd137793b0ecb10a1fddab0cdc826d
008dcc71e8fad0ab4af1500810eb17c341be611def09a0eb56e007a3f3ece044
00f6a229ddfb7236fbc3f19e8ee0453c42b1f17ae916c41805bac71e6b681d8f
0130d3bedbe172b55d14b8588321580e506e2719fd4b90ca850e0f4256366704
017b98a9292f4df5d593b90f4467764ebf157d5630ec565490eee5330fc450af
01e1c6a443eab61edd93873adde367ef3b1502c2560fa1e5aca809b6c1ad210e
02028f5905e5a89b03088f51dd813005e8cb3e6f4f13e28823509d1890ebb5d5
020a88a6a3f347915d43d25410582a50252fbff012f55d6a1c450a25379d9537
021bc77e66f4494626af7ddb998bbe6f2460c301bb1b3284f484b374c94391e8
02400bd39c18ad9230fdd89875c53aa5b416f20ab4eae676312a6e59c6d1076c
024d1516248271bf0ae0707c24d1d1461cb5c115a834854ac948eb22a40c37be
0260e3dbaab8468ce97e284fc036acbf64243e7caa1f166b42e3982127154dd6
032e6c138561850fd11d629454899b25aa937d8bb896f8e408be5556628ca357
03c3b6d5ee63005719d4fa60e9c59be2e8508b9e4384d517eb264ce7c9f5bc1b
042849c396fa6630c6c2a34894a6741168132049d0ac20fe8010593ebc5a72b0

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.