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

153

reports under this root

#966,435

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

Confirmed in Bitcoin block #966,435.

Merkle root
b70be949fdd8762d8b4a3aa03c643a8c1e84d7d2ff3011ed0edd56797819e44d
Reports covered
153
Sealed
2026-09-11T01:17:51.748Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #966,435

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

Verify it yourself

ots verify -d b70be949fdd8762d8b4a3aa03c643a8c1e84d7d2ff3011ed0edd56797819e44d crawlcheck-2026-09-10.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 153 digests sealed under this root

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

0138a8b0d39aadfba4b473f93adaab693f83fa1a85a488571ac524af55f0a964
02b2f50a4819018293ec1a500646d54ac1a89055f9ac9e8ce94499dd7ebf3ee8
036013e1980f0dcf87ae3d88bd7d6fec3027cf76d5076d5499b778dc2286a3a5
0417fc890114913a319a9cfd43612693bd129907f5665c257819758a577493f8
0467b05e53186c0f4a44e01c7fb5c3622352b38f530d7f609db85bb2f124bb69
07e590de4357f57c2418bcbb44d9002d6b1b028d501d9a82c5e989562331c2d4
0a871168e5c2e337bf7ffba26153324a433317e73ad88ebf10694485d3a69606
0bb0323047561739f1f9843232ece715bdf75facc154270ea51d387cd86aec2b
0d01e3cabc2784cd35cc6afb03e92fd94fef7904c08cebab32e35c750da906db
11f167449834f639684d2020ce0c253c1657047e21d621f8afd60cb37854a44d
1274e876eddfc24eeac2afa9fec71ac44904e37277250e2f5339445436bfade1
16e2992b8b9e6b90d84840be5af13409b7b43ca23ae7f5cd6e57b7f6ca5657ac
17ca7b1ca83a60840a40e01934fa47f7a4d7b058e4f9ec66f2e160a4fa49f835
1cd3e26b359b56348633b1d8d61e826fb6d6433f1ff96752ba09b543314f9dd7
2041fe627650c5095473eb7d1dd3bfcfd04b70714ae376209df462c0032dc330
23fb81187333c684de3fcb18d5f9305827cd33ef991810bfb70045fabb880e39
260b75470eb781bee274efffd0e40d743cce3af601387e1bf5bf91085bfeecaf
28ff6e36d046f1ecd87ac21a09bcb538a84217f8a52f250d33e770be113bdb18
2bff6744340390685518e1c70efe80b7c82771381575681e494b8350843bcc3e
2c2f1d34f48f901634ee1993ddc5645d6af79e662d27822fd63673aa2a4d7035

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.