tubedude

tubedude

Amarula - a WhatsApp client in pure Elixir

Hi all, I’m posting a new thread for Amarula as the original went off topic and the mods have suggested I create a new one with that feedback in mind.

Amarula is an unofficial WhatsApp client written in Elixir. It’s a port of the JS library Baileys, and it speaks the real protocol end to end. It’s no wrapper over another runtime: you receive messages as events in a process/GenServer of your choosing, and can run multiple connections side by side, each in its own supervision tree.

So in v0.5.0 you get:

  • QR-code, phone-pairing, credential persistence;
  • Send/receive text, media, reactions, and more, in 1:1 and group chats;
  • Pluggable Storage;
  • quick start via mix task to pair a device;
  • multiple parallel devices;

I tried to keep its deps as lean as possible, and implemented community feedback to keep it less intrusive and more flexible. I’ve also been looking at references of the same implementation in other languages for bugs and issues, trying to reproduce them here, and I’m hopeful to get your feedback to make it better.

Noise and Signal (double-ratchet E2E) are implemented in Elixir, with the primitives (AES-GCM, X25519, SHA) backed by Erlang’s :crypto. The one exception is XEdDSA signing, which is written in Elixir and not constant-time, so it’s a faithful protocol port, but that signing path isn’t hardened against timing attacks.

:warning: Two important warnings: :warning:

  1. This is an unofficial WhatsApp client, not endorsed in any way by Meta. Use it knowing Meta may ban your number (with no warning and no appeal) so only use an account you can afford to lose.
  2. The whole thing was vibe-coded, and this is explicit in the commits and PRs.

I’ve been having quite a lot of fun building it. I’m curious what the community will use it for.
All feedback is quite welcome!

Where Next?

Popular in Announcing Top

deadtrickster
I’ve just released stable versions of my Prometheus Elixir libs: Elixir client [docs]; Ecto collector [docs]; Plugs instrumenter/Export...
New
sasajuric
I’d like to announce a small library called boundaries. This is an experimental project which explores the idea of enforcing boundaries ...
New
mischov
import Meeseeks.CSS html = HTTPoison.get!("https://news.ycombinator.com/").body for story <- Meeseeks.all(html, css("tr.athing")) do...
New
Crowdhailer
The latest release of Ace (0.10.0) includes serving content over HTTP/2. I have started writing a webserver to teach my self more about...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 43757 214
New
Eiji
ExApi is a library that I’m developing now and hope release soon This library will allow to: list all apis list all api implementation...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52673 488
New
RobertDober
Earmark is a pure-Elixir Markdown converter. It is intended to be used as a library (just call Earmark.as_html), but can also be used as...
239 12645 134
New
aditya7iyengar
Rummage.Ecto and Rummage.Phoenix provide ways to perform Searching, Sorting and Pagination over Ecto queries and Phoenix collections. Fo...
New
benlime
LiveMotion enables high performance animations declared on the server and run on the client. As a follow up to my previous thread A libr...
New

Other popular topics Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 43487 311
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31013 112
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39467 209
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement