Decentralized RGB consignment exchange over Nostr.
Every RGB transfer has an off-chain step: the sender hands the receiver a consignment, the client-side data that proves the transferred rights. Today that hand-off runs through a handful of centralized proxy servers whose operators can read the consignment, see who is paying whom, censor, or go down.
Parcel21 moves the hand-off onto Nostr. The consignment travels as an encrypted, gift-wrapped event (NIP-44 + NIP-59): relays see only an opaque blob addressed to a throwaway key, receivers are pushed the data in real time instead of polling, and anyone can run a relay.
Try it live: demo.node21labs.com. A marketplace checkout settles as a real RGB transfer over Nostr on Mutinynet, then hands you the Bitcoin tx, the kind-1059 event, and the RGB contract id so you can verify each one.
Parcel21 mirrors RGB HTTP JSON-RPC v0.2 so it can act as a drop-in decentralized transport:
| RGB HTTP JSON-RPC | Parcel21 (Nostr) |
|---|---|
consignment.post (payer uploads, keyed by recipient_id) |
Payer publishes a gift-wrapped consignment event addressed to the payee |
consignment.get (payee downloads) |
Payee subscribes for gift wraps addressed to it and unwraps the consignment |
ack.post (payee ACK/NACK) |
Payee publishes a gift-wrapped ack to the payer's per-transfer reply key |
ack.get (payer polls status) |
Payer subscribes for the ack (push, not poll) |
media.post / media.get |
Same pattern; large blobs offloaded to encrypted Blossom storage |
The proxy's write-once invariants are preserved at the receiver. The full design (event kinds, the
anonymous-payer ACK return path, the authenticated-unwrap requirement) lives in
docs/architecture.md and the
spec.
- Spec:
spec/nip-XX-rgb-consignment-exchange.mdis the source of truth. - Relay: TypeScript/Bun + Postgres (
relay/), live atwss://relay-production-1664.up.railway.app. Reads are public; publishing to the hosted relay requires an access token. For development, run your own relay (relay/README.md): it accepts writes without tokens unless you configure them. - Client: the protocol library and a bare reference client (
client/) that runs the raw flow against the live relay (invoice, gift-wrap, deliver, unwrap, ACK) with every event logged: client-production-ffe8.up.railway.app.
cd client && npm install
npm run typecheck
npx tsx scripts/verify-protocol.ts # round-trip + forged-ACK rejection (3/3 checks)
npm run dev # http://localhost:3000Draft NIP and working implementations; test networks only, nothing is production-ready yet. Real transfers have settled end-to-end over Nostr on regtest and Mutinynet.
Not done yet: mainnet, the Blossom path for large consignments, full NIP-07 signer integration.
MIT © 2026 Node21 Labs. Builds on the RGB HTTP JSON-RPC protocol and rgb-proxy-server by RGB-Tools.
