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,819

reports under this root

#972,410

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

Confirmed in Bitcoin block #972,410.

Merkle root
341c45f386d4718c0e64205491d73769c0acfe852da1a053d596f76debb21de5
Reports covered
1819
Sealed
2026-10-21T02:17:42.397Z
Calendars
https://a.pool.opentimestamps.org
https://b.pool.opentimestamps.org
Bitcoin
block #972,410

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-21. The anchor proves these reports existed by then, not by the morning after 2026-10-20.

Verify it yourself

ots verify -d 341c45f386d4718c0e64205491d73769c0acfe852da1a053d596f76debb21de5 crawlcheck-2026-10-20.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 1819 digests sealed under this root

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

00492b1142a59ade19e48b3170c8682e7b952045d1970b3caddddde53ff469f2
00540c03893acc32cbde727346c1909256dd9add13edb1292619a811c627e4ae
006a5b1c9e65bbe779b2c0b41f70feb35071ca8862fc60b41c2c05b559a428c7
007923e2146ad727c796217b4bea6a817baf5e98c6e9b45b952d70a90b1d6d56
007d54e16a020485ae1fae20583e814c84826687c94b6186cd82419be00acd4d
009bb47c14670f4f636cbb1fd99d39bc30c0ad0ef238b8a20c45ee0f8dd51cc2
00af8ca9ed2876ce80cfde5cb39153de4d53823d81fa2644b0ada889daaacee8
00b00bc201d5d47bade922da69bc6d80e54fd26a9079ff2b37beba3b3ae88387
00b7fc980442cbe4c38330eb32df224637d511486cdad5d31f45cdb91778be39
00bfc97ab01241ea318de89662628b6ae1f57ea4f10f0dca74bf0de9ce34bea9
00c63ba6ad42b7eab3d13db8d0b720958a85be01f3212ccc2361acf583bd4e88
0108da5283731adc08a493e467400bd5b4118b3123d521abf267dc5ba867e78c
012226c7503612dcfb9e36cc88102b87337c03376360ed71fdcc6b8bfa6fc2d5
017543af20f28945e8488a399ccbaa5ac4d6e1a36b5044b03f666e0e9aab2a3c
01ba27f75518fcb53cb672d1b86b8ac6107fadc555bb8a494de243cdd8b3ba38
01bc35089dfac474065b5cbbdc8b45671f1c7346513116e504ac4e96f99975af
01c33ac39bf34e9a9ea29a939769d3f2b2a55f32cf9d45c5ae0016869a7ec16e
01ec1e55fae1dec287f0d31147e33d94ccf2a1d1e00f31f26d2f882f4420f091
0226e862d0e4527a05fae6b9f5bc5b912ac4e61c1bf70d310cef07d0d00b2649
02549c71cfd82cad63ff0630e88389c6d9db673cd74196fdb9c768ae87ea8251

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.