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

121

reports under this root

#963,117

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

Confirmed in Bitcoin block #963,117.

Merkle root
dc1802f20c42c78861d2258a85b573a99d2e4b5028a59b412565d55acf9b7944
Reports covered
121
Sealed
2026-08-19T01:17:54.881Z
Calendar
https://a.pool.opentimestamps.org
Bitcoin
block #963,117

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

Verify it yourself

ots verify -d dc1802f20c42c78861d2258a85b573a99d2e4b5028a59b412565d55acf9b7944 crawlcheck-2026-08-18.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 121 digests sealed under this root

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

01bda1c235ef95f1599eed35324cada58eeed5ae8b21f572b65ccd58e94e2973
03272bdb8e3ac5940714b961a206a54ac9c429f6bac83b3fc2cd6a7e0b840588
077011e50f1ac2e2feb037968b272db263ca95738a1de7a0d3194e9412f765f8
089eb3d577fa151e2413a40b7149f2dea10c89838668ba03e310fb36bfdc452b
0d7b418c0cbd71af00605b8d0867722e6ab250ee947bbbf2f6d0fa2db807277c
0e02e4fbcb3582910d6453a2f6458a9ea4bf1adfaa93e9c43c0f25b5c74ed722
0f18d1b992279f3512567a06cef56e11b3b19933d06d228d2086f9b86768b190
11c990c4391e50b3fedee6dd8a50863437ffc772b2318645dfd44179d821b76f
11cc46b65a60132abee38127f2ddf1fd59a38748dca17f7aa2c7d364d2de1de0
15c30c334c679fff851c6635303b5b75393b8adf3c7d18ce0e476a696335d765
1836539ed6e260dd9295ada10cef3cce4e8a9a6692f301b8b46bbfebe7ec53a0
18f83f38e368ff4a959ffa24db7afeec86759e7853ef3d58a551ed9207006280
19031a0752816b59479af1fa284d7b21821b321fbe01604a0e3804393e782639
1a2581a0d0e195ff492f16d761151110a803d3abf4a0a570d70061ba87a152d7
1a75f027bdf1165f4c2a974f5fbd4a97c00f73f13adc97d5fdf3a0476a570bc4
207e0129037c94b05d7ad4c0a745439557dae227e55d0110760d933f4a9ad9a4
235c94d8f1b4ff922ad3bef5dabf559880248a1ad99e5858eda4174e319e3732
2746ec2b269d34eabc5d01b8cd985a489ff6180993c2b1d59e7df5afdc1751d6
282a013f7580cc6d6d8b2f8d2ed45ee565732e3932996092adee474b86b78534
2a04ef0ce4bfae0cbe40e2570be749593ed8717189bca69a43eff8068ff73ae6

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.