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

113

reports under this root

#966,134

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

Confirmed in Bitcoin block #966,134.

Merkle root
ba072323ee16a87bb0bc726675555583a606bdc16f3a0b9b0e560cb56ad31ad2
Reports covered
113
Sealed
2026-09-09T01:18:00.961Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #966,134

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

Verify it yourself

ots verify -d ba072323ee16a87bb0bc726675555583a606bdc16f3a0b9b0e560cb56ad31ad2 crawlcheck-2026-09-08.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 113 digests sealed under this root

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

0058d3e3e4b17ed92b1c395767bcfc4d34afb7804c25bca3b6ed2337ca8858af
01ffa2705435bfc1162e8a5814695454d5df570fc7d8157c870541b6fdf5b6dc
0702f4ca6cbee97e8cf7c37babc749fdf2d5945de14b6ec9bd0cfccc32ebf113
08f326e4cb5749d9c076ffc9bd8915afa142f13b16eef5a8391d1a8cdba64bed
0ac52b7b340f50f3497715448827d46b8329bdfb9c900be57f025cd168d82813
0b522316cda1a2cd1e37ab9af6a4b681f453d841b4fdf6bd413c4be163391141
0c1292e0677d72c28c216107ccd20cdaffb5bd8ce6b6d3dc5e50d62e129d5b53
0d04dce774f1bac53e74cb7d2545a32e421839c17ba25192c9d58b521f5e9c2e
0fa30ba7d762ce8317aee118f4d06e6ec4510ea262f459bcac49668c04dcba1e
101df8ac4201eca95a8715c51155924c73015a45f49ef234be2ecb6af1750c13
1163233f797aba87c5a4b6487779fc97b8d7becc7315ec4183b5357a544c78f3
14713617c29ba03524ebe65a9d0ec3ba2475a0df36cdeca3fe5b8debe26336f4
16dd0272320a9736cf4f79e9c9a2d98607f37854e5d55a5ba599925856520267
18121679d9e513c28819a4bad5a6002be15877a761176f5818b908502972e7d6
1c95dad8602271b0eaacdf2737c0bbd977cf75e1d57980377d8a7d45faba10eb
1cb2620d2db3c01154e759d244faa21c942fda94c9ba53165f4c6964052b9aeb
21022528cc76149d72749e28a82945c38db0d5777797b1681c3bd7196ecc0196
2257d1ba2bf3608d2e46dd64dc10659838d7858286a707829c61b504c8be3741
22dda428a359b1c519d7d7991906035253325a26efbe49833504935eedae6f8e
284fb1cda6da12b0a84c86a6e1b624bf3192bcf0d591ea6fa28d64f093d5863a

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.