sign anything with a bitcoin address.
anchor the moment to bitcoin.
OC Stamp binds three things to a single envelope: authorship (BIP-322), priority (OpenTimestamps Bitcoin anchor), and optional stake (OrangeCheck). Verify anywhere, offline, forever. No vendor, no CA, no chain transaction fees.
{
"v": 1,
"kind": "stamp",
"id": "f0dd79a5…1485",
"content": {
"hash": "sha256:a4c8…",
"length": 12843,
"mime": "text/markdown",
"ref": null
},
"signer": { "address": "bc1qalice…", "alg": "bip322" },
"signed_at": "2026-04-24T18:30:00Z",
"stake": {
"attestation_id": "9e3f…",
"sats_bonded": 500000,
"days_unspent": 180
},
"ots": {
"status": "confirmed",
"block_height": 890123,
"block_hash": "0000…a0b1",
"proof": "…"
},
"sig": { "alg": "bip322", "value": "…" }
}five steps. one signing ceremony. no fees.
OC Stamp composes three primitives that already exist: BIP-322 for authorship, OpenTimestamps for the Bitcoin anchor, and the OrangeCheck attestation for optional stake signal. The protocol glue is small; the load-bearing systems are already battle-tested.
- [01]
pick content
A file, a Markdown post, a PDF, a git tree. Anything with a byte sequence. The client computes sha256(bytes) locally — content never leaves your browser.
- [02]
sign once
Your wallet signs a 6-line canonical message that binds (address, content_hash, length, mime, signed_at). BIP-322 across UniSat, Xverse, Leather, Sparrow, Electrum.
- [03]
compute the id
The envelope id is sha256 of that canonical message. It is the content-addressed identifier of the stamp, the input to OpenTimestamps, and the domain of the BIP-322 signature.
- [04]
anchor to bitcoin
OpenTimestamps batches the id into a Merkle tree and commits the root to a Bitcoin block (~1h later). The proof is a path from your id to a real block header. No fees. No custody.
- [05]
publish anywhere
A .stamp envelope is a self-contained JSON blob. Drop it next to your content. Paste it in a URL fragment. Email it. Publish it to Nostr kind-30083. Verify offline, forever.
the web has no durable,
permissionless, identity-bearing
provenance primitive.
Every adjacent system falls short on at least one axis. The combination of BIP-322 authorship + OpenTimestamps Bitcoin anchor + OrangeCheck stake is not substitutable on Ed25519 or on an alternative chain.
| system | authorship | priority (chain) | stake | offline-verifiable | permissionless |
|---|---|---|---|---|---|
| PGP | ✓ | ✗ | ✗ | ~ | ~ |
| OpenTimestamps alone | ✗ | ✓ | ✗ | ✓ | ✓ |
| C2PA / Content Credentials | ✓ | ✗ | ✗ | x509 dep | ✗ |
| Nostr kind-1 | ✓ (npub) | ✗ | ✗ | ~ | ✓ |
| EAS (Ethereum) | ✓ | ✓ (ETH) | token-gated | ✗ (RPC) | ✓ |
| oc stamp | ✓ (btc) | ✓ (btc) | ✓ (oc) | ✓ | ✓ |
See WHY.md for the full hypothesis-by-hypothesis design rationale. Each claim is stated, adversarially tested, and either KEPT or RETIRED with a reason.
one spec. two packages.
one hosted reference client.
OC Stamp is MIT-licensed and vendor-free. Re-implement the SPEC in any language — the test vectors are the ground truth. The web client is a convenience over the SDK, never the authoritative implementation.
sign anything with your bitcoin address.
anchor the moment to bitcoin.
verify anywhere, forever.
Open the create flow, connect a Bitcoin wallet, pick a file, one BIP-322 signature. The stamp anchors to a Bitcoin block within the hour.