Rewindex

RewindexArchive integrity

Archive integrity

Every record Rewindex captures goes into a daily checkpoint. Each checkpoint names the one before it and is timestamped by two independent authorities, so anyone can check that an archived incident or page version existed by a date and has not been changed since.

Covers what Rewindex captured live since October 17, 2026: 11,124 incident versions, 11,275 component status changes and 1,080 pricing, trust and legal page captures so far.

Older incident history came from vendors’ own published feeds and is not covered. The next checkpoint is made at 00:41 UTC.

What a checkpoint proves

Daily checkpoints

Newest first. Each one is a Merkle tree root over that day’s records, chained to the day before and timestamped (RFC 3161) by FreeTSA and DigiCert.

DayRecordsCheckpoint hashTimestampedDownload
2026-10-182,186f455acd8edc4…FreeTSA Oct 19, 23:18 UTC
DigiCert Oct 19, 23:18 UTC
JSON
2026-10-1721,29371b6e9ecf2c6…firstFreeTSA Oct 19, 23:18 UTC
DigiCert Oct 19, 23:18 UTC
JSON

Check a record yourself

The “Check it in your browser” button under Archive proof on incident and change pages does steps 2 to 5 with your browser’s own SHA-256. To do every step on your own machine (bash, jq, openssl):

  1. Get the proof. Use “Download proof” on any incident or change page, or ask for one by record:
    curl -s 'https://rewindex.com/integrity/proof.json?type=incident_version&key=…' -o proof.json
  2. Content. For incident versions and component status changes, the archived bytes must hash to payload_sha256 in the record:
    jq -j .payload.text proof.json | sha256sum
    jq -r .record.record_json proof.json | jq -r .payload_sha256
  3. Record. The record’s hash, with a zero byte in front, is its leaf in the day’s tree:
    { printf '\x00'; jq -j .record.record_json proof.json; } | sha256sum
    jq -r .record.leaf_hash proof.json
  4. Path. Combine the leaf with .proof.audit_path as in RFC 9162, section 2.1.3.2 (any Certificate Transparency library does this). The result must equal root_hash inside .checkpoint.checkpoint_json.
  5. Checkpoint. The checkpoint text hashes to checkpoint_sha256, and its prev_checkpoint_sha256 is the previous day’s checkpoint hash (from /integrity/<day>.json):
    jq -j .checkpoint.checkpoint_json proof.json | sha256sum
  6. Timestamps. Each token is signed by its authority over the checkpoint hash:
    H=$(jq -r .checkpoint.checkpoint_sha256 proof.json)
    jq -r '.timestamps[] | select(.name=="FreeTSA") | .tsr_base64' proof.json | base64 -d > freetsa.tsr
    curl -sO https://freetsa.org/files/cacert.pem -sO https://freetsa.org/files/tsa.crt
    openssl ts -verify -digest "$H" -in freetsa.tsr -CAfile cacert.pem -untrusted tsa.crt
    jq -r '.timestamps[] | select(.name=="DigiCert") | .tsr_base64' proof.json | base64 -d > digicert.tsr
    openssl ts -verify -digest "$H" -in digicert.tsr -CAfile /etc/ssl/certs/ca-certificates.crt
    openssl ts -reply -in digicert.tsr -text | grep 'Time stamp'

Format

Enough to write your own checker.

Records: 23,479 in 2 checkpoints. JSON, Markdown.