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

281

reports under this root

#965,241

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

Confirmed in Bitcoin block #965,241.

Merkle root
3e9891f1c6cd4f8d56de7cbbb535ba23a3b67552d4394482065b191d1049509c
Reports covered
281
Sealed
2026-09-03T01:17:02.953Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #965,241

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

Verify it yourself

ots verify -d 3e9891f1c6cd4f8d56de7cbbb535ba23a3b67552d4394482065b191d1049509c crawlcheck-2026-09-02.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 281 digests sealed under this root

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

0035931da50960e05351b91cbd54d82eb7e90a93325e4a5df3e3d3ebe4c26fbc
00da6f035330cafa0f0f0e20c46cf6775672171dde8091865af8e79881502707
00f8cf9b9c53a0d73d75d483e289ed665ad355f0939a7bf5ff5c1dd163b6f948
011e4ec920e3203dded0a918625ecdbc1d4eb62e39d976c6226c51da95b8fa37
012be5a9d6de07403cf2beac4cb2b29118619a4d8171e42b96078106db699fea
02848d8d590e8614adcc91eea5dcdf96ee99733456e24660048fd416144034aa
043472247a171bbb59a871cae263d9f1aa91f9898319d91fc0cf4085adf9fb5a
04a614e2a45144ce46e10c353dfc66e7e33f056be2fe8a0bf57375ba12e4dfb0
099e79915fd5cceabf6da24e85d93174e3158978c20d1db8da4efc1559905986
0a33cc7aeb2686b07097ce85e98f1914b1f6719df3a543b81861cc361b01e201
0bb3627a2ba9e48534845cf5437d7d7104ac716f3d24af34fb52255d79b53e2a
0c85bce8e2bfa207672324918624cc4aa0ddd3326cac250610bd5abfafb3f9e1
0e65a51ae64725d1d88989aa7c8e3dcf66ad819c85e9cc60007b28579dcd458f
1079bed66d1a9504c597b1ec006e693af8018723ace81c98b1bb3089b9c8d69f
10e39cebf80ee07b24af98a1a292a3318774fcb59c819bebdfbcd2b4392377ec
121ae2eea5d1c2b20173fe4ec21434a9dd4a4ddaf59e202614c0d82479c5ce3c
14ed8c96c813432808a201f4488930031640f431ce14a96f5f125ed68870d145
165cbbda339f3f69d1559fde963198f4e563e067d89d567da5e5143b14f1684a
16b580cfd53197dd2e5f481cd8ab310803e0fd17fdc529dda9c78cb86f10c215
1771838e08d8cbf3322bd7ddd784f5d9411fc84f811ce8f94206bb9dc5eed592

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.