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

35

reports under this root

#962,972

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

Confirmed in Bitcoin block #962,972.

Merkle root
7201b21f0311709df1a791b5d0b57cc45156dd67fa2c9b9b845758f8d29433dc
Reports covered
35
Sealed
2026-08-18T01:17:19.714Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #962,972

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

Verify it yourself

ots verify -d 7201b21f0311709df1a791b5d0b57cc45156dd67fa2c9b9b845758f8d29433dc crawlcheck-2026-08-17.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 35 digests sealed under this root

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

12e03db967a175052af50d200f61a20af5701418b0c9877dfc958e599cae4f71
1584724063d0982fe4697428d85ff01a58bb378dd7b9deb9ddec48a57ed65481
206a9fc938532dc238780d74a669b537ce82cb8f7651e8c80e5d582cdeb21ca9
322b09a991e0f64610e3421a7d57a8d955b644c0ebf6b71b314b1eee7b9f2f7a
4df0e1a63e8fc1395e554824724363fe003041d38a1a2cb759b573ea8e3f7970
55cb5011a0847d4860ff501d574174da02567a00e154544bbf63da6e3f422588
5636ebe6b94b33caa6037081843d8e719f98a36c9dda214b44f0e67413a590ad
5bdd287602311e0b95fdcc362c8774017889d4d0507000e3e69cdb679ddabe04
5d5acff3557fb97fe6b6c085f127b1a0571191a80c80fe372440f327b1246bf1
5ea71e8e5c60832cebb4620073e686e5e8e66ac7b98fd238373845c45be07223
63b63052d3b286f38a87803ff26c282a9190d0b903a303876d72c0a405351c1b
6bffd8556891ef89bd23ac85d76f9c00b3fd58b7f3fd595d74e5928e599f83ac
73530f7d7613a0c73f0eb5ffe13c089bf14dac4024a147010c5bfb98dabcdaf3
82ce0cc044a84080941050355edc91c694dfcd0598268c7084eb8781a74f3480
838d93b86076ee49706cc0a13d57f1b34d9ad7c2fe5289a7417e7d4f86e9f66b
8725022893ad8a0695c701271aa888c11baa1a8a8990c3a7d8286afdb1f4d209
8bebc66d8b4e5bb63db527118ac0eab46ad538e0f135b1ed50b07f837924a6fb
a888b06b4a491575bc7e2a9482a4523463f1593da352c328406dcdd83acfd9ec
a9a77ccefa047c6cdb929e1f7bb76fca3631f07a699ca773f6e4dc781a72ed50
ae2914c20b4d7ac736d7a4d949418b037e33304a712ad6375a09e6fd17fbe4fb

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.