chum

Content-addressed object storage on AT Protocol.

The address is the content. Names resolve through a signed, hash-linked chain: each record names the one before it, so an altered record breaks the chain.

serving now · api.chum.blue

bafkreidr3vh5xjlqayw4hmnoi5jmgh3j55resat4m7kbhtzeiz7ykh3wmq

What conventional object stores ask you to trust

Two layers, one substrate

A bucket + key resolves to a CID; the bytes underneath stay content-addressed.

the pointer layer is signed and mutable; the object layer is immutable and deduped.

Verifiable across time

Each record links the previous record's CID and is signed, so given a name's history anyone can check offline that no record in it was altered and no interior link removed. Detecting a truncated or withheld head needs the external witness, which is not shipped yet.

Who signed it — stated, not assumed. A record's trust tier is part of its signed bytes, and the verifier shows the tier the server declares. Tier 1: the writer signs the write intent with a self-custody key (did:key or did:web) the operator never holds, and the record commits to that signature. Built; not enabled on the public instance yet. Tier 3: operator-signed, tamper-evident to everyone except the operator — what the public demo instance writes today. Forging a tier upward is rejected. What's still open is the other half — an external party witnessing the head, so the operator can't omit or equivocate. Specified (anchor + writer's-PDS counter-ledger), not yet shipped. We'd rather you read this here than find it in the code.

Every read re-hashes the bytes against their CID, or it aborts; signatures and prev-links are checked when you verify the chain.

Check a sample proof in your browser →

See the pointer record lexicon →

What a name resolved to, in order

A name's history is a list of dated, signed entries. Each one states the CID the name resolved to at that time, in append-only order. Today the operator signs that order; an independent external head-witness (in progress) is what will make omission and reordering detectable without trusting the operator.

One name's resolved-CID history, in append-only order.

See the full architecture →

It's live

chumd is deployed and serving content-addressed reads behind a TLS edge; writes are operator-only during the preview. The metrics endpoint stays private; only the API is public.

$ curl https://api.chum.blue/health
ok

this instance signs its pointer records as
did:key:zDnaeoYeKmUPkJLf3TUnDyvBgR11mto8xGjAL5nm4g9VyaMvp

For builders

Object addresses look like bafkrei…: CIDv1, raw codec, sha2-256 — the same address the demo above computes in your browser.

b         multibase: base32
01        CID version 1
55        codec: raw bytes
12 20     multihash: sha2-256, 32-byte digest

The record schemas chum publishes are the blue.chum.* lexicons, public on GitHub. A client library and CLI are not available yet.

What's merged

Designed in public, decision by decision. Each milestone links its design journal where one exists. The public instance runs a build from before 2026-07-17, so the July milestones are merged but not live there yet.

  1. SP-0 2026-06-09 Auth + substrate ADRs ratified
  2. SP-1 2026-06-08 AT Protocol pointer store — signed name→CID chain
  3. SP-5 2026-06-09 Durable content-addressed substrate — filesystem + S3 CAS
  4. SP-6 2026-06-10 Deletion done right — signed tombstones + journal-gated reaper
  5. SP-7 2026-06-17 Multipart assembly — Merkle-root manifests
  6. SP-13 2026-06-24 Hardening — robustness, observability, per-IP rate limiting, security review
  7. SP-4b 2026-07-02 Capability enforcement — attenuable, revocable DID-scoped grants (ADR-0007)
  8. SP-4e 2026-07-14 Writer-signed write intents + machine-readable trust tiers (ADR-0008)
  9. SP-13e 2026-07-16 Visibility-gated blob reads — the byte endpoint is not an existence oracle
  10. SP-17 2026-07-27 Adversarial conformance suite — ten forgeries, seven caught, three known gaps published

Where it stands

Live on api.chum.blue

  • Content-addressed reads behind a TLS edge; writes are operator-only during the preview
  • Content-addressed substrate — bytes immutable and deduped by CID
  • Every read re-hashes the bytes against their CID
  • Signed name→CID pointer chain — operator-signed (Tier 3)

Built, not yet available on the public instance

  • Multipart upload with Merkle-root manifests (ADR-0003)
  • DID-scoped capability grants — attenuable + revocable (ADR-0007)
  • Writer-signed write intents + trust tiers (ADR-0008)
  • Adversarial conformance suite — ten forgeries, seven caught, three known gaps published
  • Browser verifier — checks a proof's signatures and chain in your tab, with no server in the loop. Works on a sample proof today; the public instance doesn't serve proofs yet

Open, in progress

  • External head-witness — anchor + writer's-PDS counter-ledger
  • Tier 2 — the managed-PDS key-registration ceremony
  • Prefix listing at scale

Open decisions

Get involved

Chum is built in public: the design journal and the lexicons are open now, and the code opens at launch. The most useful contribution right now is discussion on the open decisions above.

Get early access