Programmable infrastructure for decentralized communication. Identity, encryption, consent-based routing, and encrypted storage — with zero-knowledge mediators.
Dual delivery — one copy stored on yours, one relayed to theirs. Neither mediator can read it.
// deep dive
Four building blocks that give you ownership of your identity, data, and communications. Your mediator hosts encrypted data it can never read.
Every user gets a DID with cryptographic key pairs for signing and encryption. No central authority needed.
A Decentralized Identifier is a globally unique ID that you control. Unlike usernames on centralized platforms, your DID is cryptographically yours.
Ed25519 for digital signatures (proving identity). X25519 for key agreement (establishing shared secrets). Both generated client-side. Private keys never leave your device.
Messages are encrypted end-to-end using X25519 key agreement and AES-256-GCM. The mediator relays ciphertext it can never read.
Before messaging, both parties sign a bilateral contract. This establishes mutual consent and exchanges encryption keys. Either party can revoke at any time.
The mediator only sees encrypted blobs. It cannot read message content or tamper with messages. Ed25519 signatures ensure authenticity.
All data is stored as encrypted events. Reducers derive current state from event history. You own your data.
Every change is an immutable event. Current state is derived by reducing all events. Full audit trail and ability to reconstruct state at any point.
Every event is encrypted before being stored. The mediator stores opaque blobs. Only you can decrypt and read your own events.
Your profile is built from events you publish. Display name, bio, posts — all self-sovereign data.
Every piece of profile data is an event you published. Change your name? Event. Update bio? Event. You can take your entire profile to a different mediator.
Your profile is just events encrypted with your keys. Export and re-publish them elsewhere. No vendor lock-in, no data held hostage.
// developer experience
Define events and reducers. Get identity, encryption, contracts, and sync for free.
import { defineDecentrlApp } from '@decentrl/sdk' import { z } from 'zod' const app = defineDecentrlApp({ events: { 'chat.message': { schema: z.object({ id: z.string().uuid(), chatId: z.string(), text: z.string(), }), tags: ['chat.${chatId}'], }, }, state: { messages: { initial: [], reduce: { 'chat.message': (state, event) => state.some(msg => msg.id === event.id) ? state : [...state, event], }, }, }, })
import { useDecentrl, useDecentrlState } from '@decentrl/sdk-react' function Chat({ chatId }) { const { publish } = useDecentrl() const messages = useDecentrlState( state => state.messages.filter( msg => msg.chatId === chatId ) ) return ( <div> {messages.map(msg => ( <Message key={msg.id} data={msg} /> )))} <Composer onSend={text => publish('chat.message', { id: crypto.randomUUID(), chatId, text, }) } /> </div> ) }
// get started