[0.1.0-alpha.7] - 2026-03-21
DRY audit and bug-fix pass. Duplicated transport wrappers across feature and media modules had diverged silently, producing a runtime crash path.
Added
Connection.TransportAdapter— shared transport dispatch replacing diverged copies across 12 modulesSignal.Store.wrap_running/1— centralized signal store resolution
Fixed
Media.Uploadcrash when given{module, pid}queryable tuples from runtime APIsStore.put/3withnilsilently preserving old values instead of deleting- Stale LTHash state on Syncd retry-from-scratch due to nil writes being dropped
- EventEmitter silently losing events after dispatcher process death
Changed
- EventEmitter dispatch hardened with queue-based delivery, monitor/restart, and
throw/exit/raiseisolation
[0.1.0-alpha.6] - 2026-03-20
Eliminates the last JS-shaped design pattern in the codebase. Signal store
transactions previously used a zero-argument closure with hidden state in
the process dictionary — a literal port of Baileys' keys.transaction(async () => ...). Transactions now pass an explicit handle through the closure,
matching the Ecto Repo.transaction(fn repo -> ... end) convention. This
makes transaction state visible, testable, and composable without hidden
coupling to the calling process.
Added
Signal.Store.transaction/3now passes explicit transaction handlesTransactionBuffermodule extracts reusable ETS-based transaction caching
Changed
- Signal store internals redesigned: all consumers receive
tx_storeexplicitly through closures
Fixed
- Weak test assertions (
assert %{} =) replaced with strict equality checks
[0.1.0-alpha.5] - 2026-03-20
Post-merge hardening of the persistence architecture from alpha.4. Shared write primitives extracted, exception-driven JSON parsing replaced with explicit error handling, and migration edge cases closed.
Changed
- Extracted shared crash-safe file IO into
PersistenceIOand key-index merge intoPersistenceHelpers - Replaced exception-driven
JSON.decode!with explicitJSON.decodein compatibility backend
Fixed
- Migration publish now uses backup-and-swap for both empty and existing targets
- Nil propagation in compatibility JSON decoders for malformed input
- Credo nesting depth violation in
read_data
[0.1.0-alpha.4] - 2026-03-19
Major persistence architecture overhaul. The library previously used a generic Elixir term serializer on top of JSON — encoding atoms, structs, and tuples with custom tags — which caused fresh-VM crashes, atom table exhaustion risks, and ongoing allowlist maintenance. This release separates persistence into two backends: a durable ETF-based native backend (recommended) and a Baileys-compatible JSON backend rewritten with explicit codecs. Also fixes several Elixir antipatterns across the codebase.
Added
NativeFilePersistence— durable ETF-based file backend with crash-safe writes, recommended for Elixir-first deploymentsPersistenceMigration— staged atomic migration from compatibility JSON to native formatPersistenceIO— shared crash-safe file write primitives (temp + fsync + rename + dir fsync)- Format versioning and manifest support for both persistence backends
- Cross-backend contract tests and fresh-VM regression tests for persistence decoding
Auth.Persistencebehaviour extended with context-aware optional callbacks
Changed
FilePersistencerewritten with explicit Baileys-shaped JSON codecs — no more generic tagged Elixir term serialization- Docs and README recommend
NativeFilePersistenceas default for Elixir apps
Fixed
- Atom table exhaustion risk from
String.to_atomon untrusted disk data - Flaky CI test from PBKDF2 timing — iteration count now injectable at socket startup
- Quadratic list appending in protobuf decoder, history sync, message sender, and other hot paths
- Nil-punning (
value && value.field) replaced with pattern matching across feature modules - Dialyzer and Credo strict warnings resolved
[0.1.0-alpha.3] - 2026-03-19
Changed
- Event emission no longer blocks callers on slow subscribers
- Protocol and connection logging demoted from warning to debug level
- Improved binary node encoding and decoding performance
Fixed
- Programmer errors in Noise protocol functions are no longer silently swallowed
- Rust NIF error handling hardened to eliminate panic paths
[0.1.0-alpha.2] - 2026-03-19
Initial alpha release.
Added
- Connect to WhatsApp Web via the multi-device protocol with QR code or phone number pairing
- End-to-end encrypt all messages via a pure Elixir Signal Protocol implementation
- Send and receive 27+ message types: text, images, video, audio, documents, stickers, contacts, location, polls, reactions, forwards, edits, deletes, and more
- Upload and download encrypted media with AES-256-CBC and HKDF-derived keys
- Manage groups and communities: create, update, leave, add/remove/promote/demote participants, invite flows
- Subscribe to and manage newsletters
- Send presence updates and subscribe to contact presence
- Sync app state (archive, mute, pin, star, read) across linked devices via the Syncd protocol with LTHash integrity verification
- Fetch and manage business profiles, catalogs, collections, and orders
- Reject calls and create call links
- Manage privacy settings and blocklists
- Persist credentials to disk via
FilePersistencewith automatic reconnection - Encode and send WAM analytics buffers for Baileys wire parity
- Emit telemetry events under the
[:baileys_ex]prefix for connection, messaging, media, and NIF operations - Noise Protocol transport encryption via
snowRust NIF - XEdDSA signing via
curve25519-dalekRust NIF :gen_statemconnection state machine with automatic reconnection- ETS-backed concurrent signal key store
- Supervised process tree with
:rest_for_onestrategy