Catalyst · .rain version 2

Evidence packets you can actually verify.

Every .rain v2 packet carries two independent signatures — ML-DSA-65 (FIPS 204, a module-LWE lattice scheme) and Ed25519. Both must pass. The public keys are published below, so verification needs nothing from us and works offline.

Verify a packet

Public endpoint, no authentication. Post any packet and get a structured verdict.

curl -X POST https://catalyst-rain.strategic-innovations.workers.dev/rain/verify \
  -H 'content-type: application/json' \
  --data @packet.rain

The public keys

Served at the well-known path. Key id catalyst-prov-2026-07.

curl https://catalyst-rain.strategic-innovations.workers.dev/.well-known/catalyst-rain.json

The chain

Packets are appended to a hash-linked chain: each carries the digest of the one before it, so records cannot be reordered or removed without breaking every link that follows.

curl https://catalyst-rain.strategic-innovations.workers.dev/rain/head        # current head
curl https://catalyst-rain.strategic-innovations.workers.dev/rain/list        # recent records
curl https://catalyst-rain.strategic-innovations.workers.dev/rain/rec/<id>    # one signed packet

What is signed

Both signatures cover canonical(body ‖ hmk ‖ chain) — deep key-sorted, compact JSON. Never the whole envelope, since a signature cannot sign itself.

Try it

Sign a demo packet, then break one byte of the body and watch verification fail.

curl -X POST https://catalyst-rain.strategic-innovations.workers.dev/rain/demo | tee p.json
curl -X POST https://catalyst-rain.strategic-innovations.workers.dev/rain/verify -H 'content-type: application/json' \
  --data-binary @<(jq '.packet' p.json)