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

130

reports under this root

#962,358

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

Confirmed in Bitcoin block #962,358.

Merkle root
70bdfd2db54d008476fcbbb59076f088ff14eb40fde22c465be5ccb432032aa0
Reports covered
130
Sealed
2026-08-14T01:17:45.731Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #962,358

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

Verify it yourself

ots verify -d 70bdfd2db54d008476fcbbb59076f088ff14eb40fde22c465be5ccb432032aa0 crawlcheck-2026-08-13.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 130 digests sealed under this root

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

04ab3132520c5a0419c14793f19340e43cdf7563942bca5c975bcfdcb437d514
04ef9d3771f63d3ad896ed94d662e61fda2b833f3b0d80f333af79baa84c3010
067ffe491f85bacb6889ab69802d5571ded7de9bffe89f463b5d54a39adc86fe
075e896d7e5b8ddf9312a7d1d893b6fcee5c4f9432ba301623c6b6c01e1ec19a
092f48f1b9da26076d705366a2e64e695e424707c999843fc6e17b9c9088ec3f
0b30fe86ee1f985300e85f4fb9ada50e984e7659bececdbd2c5fecc1533605ec
0e5f3f27fb68524525ee91c9832b90bf8639e51e3aeb23da3026887c0379aaf9
142d325a395d20068878c2578fa3aebec69113c7ac34691074d59682e33a2afa
14f629ff9922335296813713c3262628d0a93086955dbbd598195a7e59d89e02
1530e3c9905b8dbff36a0130ddb1ca94f4ff75010f7d3809d93bd10130b75e35
15c59071ada2b5c3576b32e321eaec8f331380463f6aad196175a43fe07b2c90
169cccd0479b07e73f186452158a9d57788eb264700985bc620dc61d213f491b
1ba7d3ed8599fe4efe70190e1b8bbdb693f7c9cde435cb4da0c56e6d556548b6
22f253e1e42a31da62f26ce7714163513a2c4f2720ec6acd2820d378be5bb7d5
26fee5a194be5e0e0480b63131dfff78a185e02d31aac4ea54cb0cb617ad4fc2
2823eda893122b0c2eabb5c40236819eedd103967406096522b432fed34cdfbf
2858dcfa1f8e014838e2e70f354c69a7348e1a30a149b74a46fa2357d02f2f56
28fa000eb89d981f678f92a4bcc64acf9532e74bb78a1ecf04c83e71dff109e6
29441361f740f9fdfa300a796bffa6681093c019a3b7f1fe16523679f1813566
2a4e33df35356e689076d8ea467a668ea2ab83d72ac5f231eccb1259d391f552

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.