Skip to content
OpenE2EE

The Signal Protocol, where your app actually runs.

Expo, React Native, browsers, and Node from one package. Post-quantum PQXDH, the Double Ratchet, multi-device, groups, sealed sender, and encrypted attachments. The protocol code is pure TypeScript with no native crypto module to link.

What the package covers

One coherent API surface, imported by subpath so your bundle only carries what you use.

  • Identity and trust

    One versioned X25519 and Ed25519 tuple is the trust object. Safety numbers, rotation, and fail-closed trust mutation after pinning.

  • Sessions and messaging

    PQXDH and the Double Ratchet, with post-quantum ratcheting, replay boundaries, skipped-key limits, and bounded state recovery.

  • Devices and groups

  • Attachments and files

  • Application integration

  • Anonymous group credentials

    ZK credential primitives, for products whose group membership should not be legible to the relay.

Four adapter boundaries you own

You pass adapters into createSignalProtocolClient. The protocol logic above them does not change.

The Expo, Node, browser, and bare React Native stores implement ISignalProtocolLocalStore in full, so groups and multi-device work on any of them. They differ in where the bytes land. Expo uses expo-sqlite with SQLCipher, and Node an encrypted filesystem under node:crypto with 0600 permissions. The browser uses IndexedDB scoped to the page’s origin, and bare React Native a key-value backend you supply. ISignalProtocolLocalStore and ISignalProtocolRelayServer are documented interfaces, so you can write your own.

The Expo store needs a development build, because SQLCipher is not available in Expo Go. There is no native module of ours to link.

Adapter reference (opens in a new tab)Client composition guide (opens in a new tab)

How it compares

libsignal is the most scrutinized Signal Protocol code there is, and it is actively maintained. It is also a Node native addon with no browser, Expo, or React Native build.

This repository is used by the Signal client apps (Android, iOS, and Desktop) as well as server-side. Use outside of Signal is unsupported. All APIs and implementations are subject to change without notice, as are the JNI, C, and Node add-on "bridge" layers.
signalapp/libsignal, README.md (opens in a new tab)

Read from the GitHub API, the npm registry API, and the published package tarballs on 2026-08-03. Dates are the ones those APIs returned. The axes are the ones this SDK was built to change, not a quality ranking. Nobody independent measured our own column.

ts-mls is MIT, which already permits proprietary use, so that row costs its users nothing. This SDK is AGPLv3 with a commercial license available, which is a real cost to some readers.

Every project links to its repository, and every date came from a public API. The commands are in the comment at the top of src/lib/comparison.mjs.

The shorter table in the SDK README (opens in a new tab)

Licensing

The complete SDK is available under AGPLv3. Proprietary products purchase annual commercial production rights at a published price, starting at $5,000 per year.

PricingLicensing

Check the work

Reviewed continuously by adversarial AI agents; not audited by any independent firm. Every change passes an adversarial AI review before it merges, and recurring whole-codebase AI audit passes run against the engineering repository. The assurance summary states what that covers and what it does not.