Prerequisites
Before installing whatsapp-rust, ensure you have:- Rust nightly (default) — required for Rust edition 2024 and SIMD-optimized binary protocol. The project pins
nightly-2026-04-05viarust-toolchain.toml. See Using stable Rust if you need stable toolchain support. - Cargo package manager
SQLite is bundled by default with the
whatsapp-rust-sqlite-storage crate, so you don’t need to install it separately. If you prefer to link against a system-installed SQLite, disable the default bundled-sqlite feature.Add to your project
Add whatsapp-rust and its required dependencies to yourCargo.toml:
Feature flags
whatsapp-rust supports several optional features:| Feature | Description | Included by default |
|---|---|---|
tokio-runtime | Enables TokioRuntime implementation of the Runtime trait. Also required for TypedCache::invalidate_all() on custom cache backends | ✅ Yes |
tokio-native | Multi-threaded Tokio runtime (tokio/rt-multi-thread) | ✅ Yes |
tokio-transport | Tokio WebSocket transport | ✅ Yes |
ureq-client | Ureq HTTP client | ✅ Yes |
sqlite-storage | SQLite storage backend | ✅ Yes |
moka-cache | Moka in-memory cache | ✅ Yes |
simd | SIMD-optimized binary protocol encoding/decoding (requires nightly Rust) | ✅ Yes |
signal | Unix signal handling (graceful shutdown on SIGTERM/Ctrl+C) | ✅ Yes |
danger-skip-tls-verify | Skip TLS verification (unsafe) | ❌ No |
debug-snapshots | Debug protocol snapshots | ❌ No |
debug-diagnostics | Memory diagnostics API (MemoryDiagnostics) | ❌ No |
wacore crate has an additional feature for WASM browser targets:
| Feature | Description | Included by default |
|---|---|---|
js | Enables browser-compatible random number generation via getrandom/wasm_js for wasm32 targets | ❌ No |
js feature on wacore:
Cargo.toml
waproto crate has its own feature flags:
| Feature | Description | Included by default |
|---|---|---|
generate | Enables prost-build for regenerating protobuf code from whatsapp.proto. Only needed when modifying the .proto file | ❌ No |
serde-deserialize | Adds Deserialize derive and #[serde(default)] to all protobuf types | ❌ No |
serde-snake-case | Accepts snake_case enum variant names during deserialization (implies serde-deserialize) | ❌ No |
whatsapp.rs) is checked into version control, so prost-build is never needed for normal builds. This keeps the dependency tree smaller and compilation faster. All protobuf types derive Serialize by default. Enable serde-deserialize when you need to parse protobuf types from JSON (e.g., in a WASM bridge). Enable serde-snake-case when your JSON source uses snake_case for enum variants (prost generates PascalCase by default).
Cargo.toml
whatsapp-rust-sqlite-storage crate has its own feature flags:
| Feature | Description | Included by default |
|---|---|---|
bundled-sqlite | Bundles SQLite (compiles from source, no system library needed) | ✅ Yes |
Cargo.toml
The default features provide everything needed for most use cases. Only customize features if you have specific requirements.
Using stable Rust
By default, whatsapp-rust uses Rust edition 2024 and enables thesimd feature, which uses Rust’s portable_simd API for optimized binary protocol encoding/decoding. Both of these require a nightly Rust toolchain. The project pins nightly-2026-04-05 via rust-toolchain.toml.
To compile on stable Rust, disable the simd feature by setting default-features = false. You must do this on both whatsapp-rust and wacore — otherwise Cargo’s feature unification will re-enable SIMD through the wacore dependency:
Cargo.toml
32-bit target support
whatsapp-rust usesportable-atomic instead of std::sync::atomic for 64-bit atomic operations. This means the library works on 32-bit targets (ARM32, MIPS, RISC-V 32, etc.) where AtomicU64 is not natively available — portable-atomic provides a software fallback automatically.
No extra configuration is needed. The portable-atomic dependency is included with the fallback feature enabled by default across all crates (whatsapp-rust, wacore, and whatsapp-rust-sqlite-storage).
Custom features example
If you want to use only specific features:Cargo.toml
Verify installation
Create a simple test file to verify the installation:src/main.rs
Docker deployment
whatsapp-rust includes a Dockerfile for building a minimal, statically linked container image. The multi-stage build produces ascratch-based image with only the compiled binary.
Build the image
- Uses
rust:alpinewith cargo-chef for efficient dependency caching - Compiles natively against musl on Alpine for a fully static binary
- Caches dependency compilation via
cargo chef cookin a separate layer for fast rebuilds - Produces a final image from
scratchcontaining only the binary
Run the container
/data as its working directory, so mount a volume there to persist your SQLite database and session data across restarts. For pair code authentication, pass the --phone flag:
Graceful shutdown
The container supports graceful shutdown out of the box. When thesignal feature is enabled (it is by default), the bot listens for SIGTERM and Ctrl+C, disconnects cleanly from WhatsApp, and exits. Docker sends SIGTERM on docker stop, so the bot will shut down gracefully without losing session state.
Since the image is built from scratch, PID 1 is the binary itself. It handles signals directly — no init system like tini is needed.
The Dockerfile uses
rust:alpine which builds for the host architecture’s musl target. For cross-compilation to other architectures, you need to modify the base image and build configuration in the Dockerfile.Next steps
Quickstart
Build your first WhatsApp bot in minutes