Skip to content

Releases: vineyardbovines/expo-libsignal

Release list

v0.2.0

Choose a tag to compare

@vineyardbovines vineyardbovines released this 19 Jun 17:01

0.2.0 (2026-06-19)

Features

  • fingerprint: add Fingerprint + ScannableFingerprint to v0.94.x surface (cb613ec)

Bug Fixes

v0.1.0

Choose a tag to compare

@vineyardbovines vineyardbovines released this 18 Jun 15:27

0.1.0 — 2026-06-18

First public release. Wraps libsignal 0.94.4 (iOS pod LibSignalClient, Android org.signal:libsignal-android).

Added

  • Identity (IdentityKeyPair, IdentityKey, PrivateKey, PublicKey, ProtocolAddress).
  • 1:1 messaging: SessionBuilder, SessionCipher, PreKeyBundle, PreKeyRecord, SignedPreKeyRecord, KyberPreKeyRecord, SessionRecord. X3DH + Double Ratchet + Kyber PQ hybrid.
  • Groups: GroupSessionBuilder, GroupCipher, SenderKeyRecord, SenderKeyDistributionMessage.
  • Sealed sender: SealedSender, SenderCertificate, ServerCertificate.
  • Pluggable store interfaces (SessionStore, IdentityKeyStore, PreKeyStore, SignedPreKeyStore, KyberPreKeyStore, SenderKeyStore).
  • Default SQLCipher-backed store at expo-libsignal/stores (SQLCipherProtocolStore), keyed via expo-secure-store by default.
  • Messaging transport seam: Address, Envelope, Received, Transport, dispatchReceived.
  • Typed error hierarchy: LibsignalError, UntrustedIdentityError, SessionNotFoundError, SenderKeyNotFoundError, InvalidMessageError, DuplicateMessageError, InvalidKeyError, StoreError, SchemaTooNewError.
  • Expo config plugin: pins the libsignal iOS pod and verifies its FFI prebuild checksum at pod install; injects Signal's Maven repo and enables core library desugaring on Android.
  • Example app with Client and Chat tabs exercising 1:1, sealed sender, and groups across three personas. Verified on iOS Simulator and Android emulator (see example/SMOKE_TEST_LOG.md).

Known limitations

  • Kyber base-key replay detection is not yet enforced for last-resort kyber prekeys; see SECURITY.md.
  • Provisioning is not bound. libsignal 0.94.4 exposes it only through the chat-connection layer, which we do not wrap.
  • Group membership is the app's responsibility.