Decentralized app platformv0.6Open source

Build apps your users own.

Identity, end-to-end encrypted sync, storage and groups, as an open protocol and a TypeScript SDK. Your app needs no backend of its own, and nobody in between can read your users' data. Not the network, not even you.

In your appwhat your users see
AliceDinner at eight?
BobYes. Bring the plans for the trip.
AliceAlready printed them.
BobPerfect. See you there.
On the networkwhat a mediator stores
#7309 · did:decentrl:mYWxp… · 388 BUvImZaYMEtKJGF2VDuiBNgkWb2sRPReNbA/TkB/yOaGg
#7310 · did:decentrl:mYm9i… · 412 B2yJKaySKHpJOj9CuLhqUkqMwXxiMthCQD540f66IbcZQd5XsdFxMP8suss
#7312 · did:decentrl:mYWxp… · 376 BHoNrKsFXJu59awr2qxPDjpLK4NFQV7FZmH+U
#7315 · did:decentrl:mYm9i… · 404 BqhAPu7NPpZP+rtJySLdi46tYBfB2WiucHX4PN8RJIb0/ZWTq338UKnJmjEfiI9

The same four messages. Encrypted on the sender's device, decrypted on the recipient's, and only ciphertext in between. Point at a line to find its envelope.

What you get out of the box

The parts every social app rebuilds, done once, encrypted end to end, and portable between apps because users bring their own identity.

  • Identity · DCTRL-0001

    Sign-in without an accounts table

    Every user gets a did:decentrl with keys on their own device. They bring it to your app, and to the next one.

  • Sync and storage · DCTRL-0005

    Encrypted state on every device

    Events are encrypted before they leave the device and folded into typed state wherever the user signs in.

  • Contacts · DCTRL-0003

    Connections with consent

    Two people sign a contract before anything flows between them. Revoking it closes the channel.

  • Groups · DCTRL-0006

    Communities with roles

    Owners, staff powers, join requests and member counts, enforced by the mediator and checked again by every client.

  • Public channels · DCTRL-0007

    Posts anyone can read

    Signed public events for profiles, announcements and feeds, verifiable without a contract.

  • React and the extension

    Keys stay out of the page

    Typed hooks for React, and a browser extension that holds keys so web apps never see them.

Built on Decentrl

Communities, a forum with no server of its own

Sections, threads, ranks and moderation, built entirely on the SDK and served as static files. Its source is in the repository.

Open Communities →

Define your events. Ship an encrypted app.

Describe what your app records with Zod. The SDK signs, encrypts, syncs and folds it into typed state on every device. No backend required: your client talks straight to a mediator, a shared one or your own.

pnpm add @decentrl/sdk zod

Getting started →
app.ts · runs in the browserNo backend required
import { defineDecentrlApp } from '@decentrl/sdk'
import { z } from 'zod'

export const app = defineDecentrlApp({
  events: {
    message: {
      schema: z.object({ text: z.string(), threadId: z.string() }),
      tags: ['thread.${threadId}'],
    },
  },
})

const client = app.createClient({ mediatorDid, persist: { key: 'my-app' } })
await client.publish('message', { text: 'Hello, private world.', threadId })