Repository navigation
v3.0.0
-
Breaking: the SDK is dual-licensed under MIT or Apache-2.0. The package
licenseis(MIT OR Apache-2.0).LICENSEstates the grant, and
LICENSE-MITandLICENSE-APACHEcarry the full texts. The
AGPL-3.0-or-later terms and the commercial license (COMMERCIAL.md) are
withdrawn. -
Breaking: the Convex relay server is no longer published. The
./remote/relay/convexand./convex.configentry points, the
remote/relay/convex/**sources, and the@convex-dev/rate-limiterpeer
dependency leave the public package. Production clients connect to the
OpenE2EE Signal Protocol Relay throughcreateHostedSignalProtocolClient(),
development usesinMemoryRelay(), and any backend can implement
ISignalProtocolRelayServer. The Convex R2 object store
(./remote/object-store/convex-r2) stays. -
Breaking:
./device/expo-metadatais now./device/expo. The Expo
device metadata module moved todevice/expo/index.ts. The duplicate
./remote/relay/convex/relayentry point is removed with the Convex relay. -
The hosted relay is the OpenE2EE Signal Protocol Relay. Documentation,
doc comments, and user-visible error messages sayOpenE2EE Signal Protocol Relay, orSignal Protocol Relayas the short form, instead of
OpenE2EE Relay,Managed Relay, orhosted Relay. Code that matched
the old error message text must match the new text. Domain-separation labels
are unchanged. -
Correct the browser and Expo example package integrity. Both lockfiles pin
the public tarball, and release verification packs the public candidate
under the publication runtime and checks both pins before an export. -
Breaking: the Kyber last-resort prekey takes the next key id on every
rotation. Rotation, prekey regeneration, and the local-only rotation path
previously regenerated the key under id 1, which the local store now refuses
because it retains replaced keys under their ids for in-flight PQXDH
messages. Only a complete key reset starts at id 1 again. The
KemLastResortPreKeyUploadkey id is no longer fixed at 1. -
Breaking: Node.js 22.12 is the minimum supported runtime. Node.js 18 and
20 have reached end of life, the S3 object store dependencies require Node.js
20 or later, and the committed lockfile installs with npm 11. The Node store
authority checks run on Node.js 22 and 26. -
Breaking: hosted mailbox subscriptions deliver from the socket. A
durable-messageframe carries the envelope, and the subscription hands it
to the receive handler without a pull. Acknowledgments travel over the same
socket as oneacknowledgeframe per delivered batch, bounded at one hundred
message ids. The HTTP pull remains for recovery: once per reconnect attempt,
after a handler failure, and after a full recovery page. The HTTP
acknowledgment remains for the push-wake path and for a batch whose socket
closed before its acknowledgment left. Relay must replyacknowledged
without re-sending pending messages. -
Hosted group transport and issuer authority.
Clients create encrypted groups, invite members, synchronize revisions, and
distribute sender keys through Relay. Long-lived clients refresh signed
authority. Cached endorsements bind to their issuer, and issuance cannot
exceed the issuer's expiry. Self-hosted trust remains explicit. -
Interrupted receives preserve an encrypted device-local receipt. Receipt
persistence shares the transaction that advances cryptographic state.
Retries recover application handling after a restart without decrypting the
same envelope twice. Acknowledgment follows successful application handling. -
Breaking: endorsement cache entries include their public issuer key.
Custom stores must preserve that key with each entry. Thegroups/server
entry point exposes the existing group authorization engine for Relay hosts. -
Hosted mailbox subscriptions stop dispatch after unsubscribe. Polling
waits for each asynchronous message handler before the next envelope, batch
completion, and next poll. A handler failure closes the batch and leaves
unacknowledged envelopes available for retry. -
Breaking: Relay adapters implement
getPreKeyInventory. Prekey
synchronization reads both signed-key records and both one-time-key counts
through one operation. The Signal Protocol Relay uses one status request per
decision. Inventory is not a reservation or cache. Canonical identity checks and fresh replenishment
checks remain separate.