An unofficial WhatsApp client in Rust, built on whatsapp-rust.
Not affiliated with, endorsed by, or connected to WhatsApp or Meta.
Early. Pairing, chats with durable history, media and 1:1 voice calls work. Read known limitations before relying on it.
The WhatsApp connection lives in one background process, oxidezapd. It holds
the session, owns the store, shows a tray icon on Linux and serves front ends
over a per-user local transport — a Unix socket, or a named pipe on Windows. oxidezap is the GPUI desktop window; it owns no session of
its own and starts the daemon when none is running. One session per user, one
process that opens the database, however many windows you like.
| Crate | What it owns |
|---|---|
oxidezap-core |
Domain types: chats, messages, calls, UI events. No UI, no I/O — and the daemon's wire format. |
oxidezap-audio |
Capture, playback, Opus encoding, waveforms. |
oxidezap-chat-store |
SQLite chat history materialized from the event stream, with FTS5 search. |
oxidezap-session |
Connection, event stream, sends, store hydration. |
oxidezap-ipc |
The protocol between the daemon and its front ends, and the client end of the transport. No runtime. |
oxidezap-daemon |
oxidezapd: the session, the socket and the tray. |
oxidezap-gui |
oxidezap: GPUI front end, plus video decode. |
Prebuilt binaries for Linux, macOS and Windows are attached to each
release. Builds of main are
published continuously under the nightly tag.
Each asset is an archive holding two binaries that belong together:
oxidezap is the window and oxidezapd holds the session. Keep them in the
same directory — the window looks for the daemon beside itself.
tar -xzf oxidezap-nightly-linux-x86_64.tar.gz
cd oxidezap-nightly-linux-x86_64
./oxidezapThe binaries are unsigned, so macOS Gatekeeper and Windows SmartScreen will object. On macOS, clear the quarantine flag before the first run:
xattr -dr com.apple.quarantine oxidezap oxidezapdStable Rust. On Linux you also need the ALSA, X11/Wayland and fontconfig development packages:
sudo apt install libasound2-dev libxkbcommon-dev libxkbcommon-x11-dev \
libwayland-dev libxcb1-dev libfontconfig1-dev libfreetype6-dev
# Both, because the window starts the daemon beside itself.
cargo build --release --bin oxidezap --bin oxidezapd
./target/release/oxidezapThe first build compiles the GPUI tree and takes a while. Debug builds keep
gpui itself optimized (see [profile.dev.package.gpui]), which is what makes
them usable at all.
State lives in one SQLite file under the platform data directory
(~/.local/share/oxidezap/whatsapp.db on Linux): device identity, Signal
state and chat history together. Deleting it unlinks the device and discards
local history, which is exactly what the in-app "pair again" action does.
- Voice calls only. The library's call facade is 1:1 audio, so video calls, group calls and output-device selection are drawn but disabled.
- Spacing does not yet follow the rem scale, so the UI ignores base-font zoom.
MIT.