Changelog
View SourceAll notable changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
[0.1.0] - 2026-06-19
First public release.
Added
- Offline sandbox +
Amarula.Testing— test your bot's receive→reply logic with no WhatsApp connection.Amarula.new(%{profile: x, offline: true})runs a connection with no socket whosesend_*calls short-circuit to{:ok, msg_id}(no encrypt, no frame, no real-world effect).Amarula.Testing.start_offline/1starts one;deliver_text/2anddeliver/2feed synthetic inbound messages through the real decode/classify pipeline, so your bot receives a true%Amarula.Msg{}.send_media/5is unsupported offline (needs a live socket). Amarula.list_profiles/1— list the profiles that have stored credentials in a given storage source (aConn, aStorage.Scope, or a{adapter, opts}/ bare-opts storage spec). Returns the names you'd pass as:profileto reconnect.Amarula.list_profiles_with_metadata/1— likelist_profiles/1, but each entry carries the logged-in identity read from that profile's creds (%{profile, jid, lid, name}), for building account pickers.Amarula.Storagegains an optionallist_profiles/1behaviour callback, implemented by theFileandDETSadapters. Adapters that don't implement it report{:error, :not_supported}.
Changed
- Teardown API reworked.
wipe_credentials/1is now the single destructive path: it unlinks the companion server-side (remove-companion-device, the phone drops the device), wipes all local storage for the profile, then disconnects. After it, the profile must be re-paired.
Removed
Amarula.logout/1removed. For a non-destructive teardown that keeps credentials, usedisconnect/1(closes the websocket only) orstop/1(takes the supervision tree down and frees the profile slot). The server-side device-unlink now lives only inwipe_credentials/1.