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

113

reports under this root

#966,892

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

Confirmed in Bitcoin block #966,892.

Merkle root
1ea5af9306b4f28aa9af76fc2ee5c96dd0c02e5cf01a92f70b41d9c700b39732
Reports covered
113
Sealed
2026-09-14T01:17:46.566Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #966,892

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

Verify it yourself

ots verify -d 1ea5af9306b4f28aa9af76fc2ee5c96dd0c02e5cf01a92f70b41d9c700b39732 crawlcheck-2026-09-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

91 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:

069cdc14c74f6585213ae88ea765f707a204aca44a1e2452b2e066a4d4ef6e7d
06e0d62a3db53d042198d0329b5f22e810591a1d8ca8cf6ce268f70346b062fb
0dff95bf21350c95dd0281d68e2ba7cfd27392b7a48141ee000bd98e9afd8d05
0ef773609b430f942af7c68a0b07422d10060ecec0e15736cf06bacab3a87a2b
125a5c7135d80b109e7585f3295b8d86216ef592272d51ea3ccdbfc1b029486a
12ee5ad09cb17ce731f8abffe0a88e3ddab1db4452be77330b0e62aa2a941218
15081d2562573c87cd74f57ce4ea1af7b93187100782809a632b99de285ff830
182fa4be37c0f669bc46cb1b727d93ff4741257066210166e1f54f708654f85c
1b17a3b63e597cd99f6dd78de8c530bd194f2b32ea6fd130c0254b16af4508a6
1f5945eb06430baa6e88dee57427535518dd31ecd6483ecd0ee88745185c7ce4
219c0dc2b581f42aea7befadb79756e551911481354983848f86f9483be5ad94
2255ba7a2c7b44310b0b2eb2f117a9e30925fd7c19f87c27d3e5eba3a83a3f27
24e3e7ff18aefd68dfdd121fd1bbdc7e1faf27f62158a25502b53689da25b8fe
258d1e03be628368e9a5e36a739d4731b21ad747c64938007cae0bcc1a5b07ce
278544eea52206815212c798ab500688fa274d4b21a27f66454c8542396fab6f
284755d579cbf9b583b630fce8254772eb6bf6d9393e39ec730c3e8bdee2ad60
298aee08bf78245efc37ab5b898a888454264fcea0954b27d8e3ae36377df3da
2a4829b736d7f36a7c341ce9f11bcaba51dd89d4f2b2c5df2db67d1cdc88f144
2b27293fd57bde34dac9f969ad0bca5608c011d8ed91bd8b7e4e1fa11c6028e4
2e97d40a27b944c1ea11f7e6e8de2a0b786de662d1af70f6caf96bc5a2bd70e1

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.