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

118

reports under this root

#967,779

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

Confirmed in Bitcoin block #967,779.

Merkle root
a338c6e7d6ead3d49bc41571f8b3e6ff6190cfffc2a095a58ad66acc22e36e80
Reports covered
118
Sealed
2026-09-16T01:17:03.498Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #967,779

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

Verify it yourself

ots verify -d a338c6e7d6ead3d49bc41571f8b3e6ff6190cfffc2a095a58ad66acc22e36e80 crawlcheck-2026-09-15.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 118 digests sealed under this root

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

02f8b506be07507b66c4d48b0bcbe6b769a9d9e70478acf32245ee744d709d5b
0485a769127946cd28f0efc6c18c6fabedb835a6478a7a306a1103abd51f3fb1
056aee9fe4562d8a75cb5bf6dcf8f8a53a9e43ae9ae537d6d6c1c97264e4a6fc
069ee4feb24e08e5e562506ca019cd8a53c98635c3e8d7eeb34700366aec1d66
07f63340858f4f34911f6d2a95de7db5aa8ec55b9d8ce70fafb8c3f6d4488525
0853ee718d3fc221a747ebc335e05c8a5f1a533d1f74d81819c8c61a02f614f1
0da981fdc55f58f21f3813d09c03bfd6bb103c2f72d0c9a610450f2fa92cb344
100ad0a2dbdad04405a8f99a6176a505b2f777f41a21ebb5f88e98e79f043677
117381b483b8ac05be19b1795772b25ad0185ee248ffad50f5d8e947008fff50
153700f07f37ac04804c0f9739cce20e967378a6df0280fafe0e7e086fb73612
161f2216762c0a12a53581b8bb6fe0e15ce22c1ab3c490b40e478152b87b15ba
1667fef6c1bb3560d81287edd87adf78a0bbb3f00dacccfdc1f9e3ead74ff00d
16c7e3c61e187632d6404ea5f268ae71d2d043ea7422956a962c8898aaa074cb
17c1a73d63406d0ed56b57080ed78f035d3c804d03724040830445735c40f321
19aeb54642f9b465d35501bbc42163cb28d506dce2fb42b890dd600809bffda5
1f861b853d7bd14ef3e8949bb45ac7a830b662af027e12234f98f9e377337d7c
21e13df3d8e1fdec3fa3f3d21382da7fb2725cdc8c8b877eda7f9e6dc8274b8e
2365adce8af3d8ef0f463f0942a25bae2f4f485803a9d454ee0f535424bd6e83
23d2d61ee02ae0a4cad4cca2a0388b62db87e79a6164c9d5cb730973a2e2cc4c
23ed404ebdaccad9f1a7a5d1778c62e3ee105d6590a88d4acb70e1ae3d168818

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.