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

115

reports under this root

#963,794

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

Confirmed in Bitcoin block #963,794.

Merkle root
0dcedd97f9038b9e0e65fb198a706d40b80b192a99adb15d445e900cbde15fda
Reports covered
115
Sealed
2026-08-24T01:17:36.457Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #963,794

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

Verify it yourself

ots verify -d 0dcedd97f9038b9e0e65fb198a706d40b80b192a99adb15d445e900cbde15fda crawlcheck-2026-08-23.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 115 digests sealed under this root

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

00d870dca783e1911b918974b7c1db78038883015b3e8814cc9a31bfec1d2eac
02b553913d04d239ae135618d4843d52331d20447f40be4887d2e72b764ae573
07305d31ec9a706271a15fc41a5393595a52dd944cbecd78f84b65d4bedf1220
0a3306300bca2ad3eb537f141cc8cb20bee83c3c4a79a7aefecf5b8285515bd6
0a6f271cf56330c62551dac27604a71d6eb992a2d72f9d0d6667c85a639074ff
0c4ff83ddf008a9cdc439054becc780c82d3b1c108fb8e5ec2176614294310ac
0e95a9f09bbd8b2468015ab6e5d6f22af358124f3fd8084b8bfbf6cdb6fbab37
14c76c50e07b6156ac8b8a7b1db5842225ddd6515d876aa3622857e9706d548a
177b4090647ae0670020caca779c5830732b54fae283f44e90f71e22bd4a03f0
17879d162751a5fc5519c4fbfdff4a6fac1369ed92d780541cc5eef129dc41b2
1b1fde0ef251787c723182da20573f9adbf6ba647576cf7abf25cad1c87c4463
1b52eb8de327aa97dccf024a0e176e6c8f3e00aaa2b9abb89fc896259e625947
1b533b11ce7b727e388b7e260ef239c649d231b3c8bf5b4d181fc12a4c81303a
1f357cbd8a6491072f8d03e3cbb429975d13cb9c34e465f622f64260e22724df
2039bc86ccc0307db81f72a8f7400239fbd7c3bf54f482980f9979ca8cd8acbe
24c070fadc2287722a352e821a055a6a4aca49c51a3740700632e1cf7fa1b9c7
25a723527a3ac5f6469bad33219df566ea581ce6a3c48112d81511d545ef7edb
27c6d79e909a4a061482f3f9fe3b18a4073cc7fc571c134f999a303c2ed603d7
29568f35b76067a808f94fb209c85df0d545f6081ea7ab51c0b4f48d2bed7b7a
2a6bf3a686e89f18d253afbf6d3ebe9536a2122345bbfcb30841ad44cbc7a754

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.