GitHub - jlucaso1/whatsapp-rust: Whatsapp client written purely in Rust based on whatsmeow and baileys

2 min read Original article ↗

whatsapp-rust

A high-performance, async Rust library for the WhatsApp Web API. Inspired by whatsmeow (Go) and Baileys (TypeScript).

Features

Authentication

  • QR code pairing
  • Pair code (phone number) linking
  • Persistent sessions with automatic reconnection

Messaging

  • End-to-end encrypted messages (Signal Protocol)
  • One-on-one and group chats
  • Message editing and reactions
  • Quoting/replying to messages
  • Delivery, read, and played receipts

Media

  • Upload and download images, videos, documents, GIFs, and audio
  • Automatic encryption and decryption

Contacts & Groups

  • Check if phone numbers are on WhatsApp
  • Fetch profile pictures and user info
  • Query group metadata and participants
  • List all groups you're participating in

Presence & Chat State

  • Set online/offline presence
  • Typing indicators (composing, recording, paused)
  • Block and unblock contacts

Architecture

  • Modular design - Pluggable storage, transport, and HTTP clients
  • Runtime agnostic - Works with Tokio, async-std, or WASM
  • SQLite included - Default storage backend, easily swappable

Quick Start

use std::sync::Arc;
use whatsapp_rust::bot::Bot;
use whatsapp_rust::store::SqliteStore;
use whatsapp_rust_tokio_transport::TokioWebSocketTransportFactory;
use whatsapp_rust_ureq_http_client::UreqHttpClient;
use wacore::types::events::Event;

#[tokio::main]
async fn main() {
    let backend = Arc::new(SqliteStore::new("whatsapp.db").await.unwrap());

    let mut bot = Bot::builder()
        .with_backend(backend)
        .with_transport_factory(TokioWebSocketTransportFactory::new())
        .with_http_client(UreqHttpClient::new())
        .on_event(|event, client| async move {
            match event {
                Event::PairingQrCode { code, .. } => println!("QR:\n{}", code),
                Event::Message(msg, info) => {
                    println!("Message from {}: {:?}", info.source.sender, msg);
                }
                _ => {}
            }
        })
        .build()
        .await
        .unwrap();

    bot.run().await.unwrap().await.unwrap();
}

Run the included demo bot:

cargo run                          # QR code only
cargo run -- -p 15551234567        # Pair code + QR code
cargo run -- -p 15551234567 -c 12345678 # Custom pair code

Project Structure

whatsapp-rust/
├── src/                    # Main client library
├── wacore/                 # Platform-agnostic core (no_std compatible)
│   ├── binary/             # WhatsApp binary protocol
│   ├── libsignal/          # Signal Protocol implementation
│   └── appstate/           # App state management
├── waproto/                # Protocol Buffers definitions
├── storages/sqlite-storage # SQLite backend
├── transports/tokio-transport
└── http_clients/ureq-client

Custom Backends

Implement your own storage, transport, or HTTP client by implementing the respective traits. See the default implementations for reference.

Disclaimer

This is an unofficial, open-source reimplementation. Using custom WhatsApp clients may violate Meta's Terms of Service and could result in account suspension. Use at your own risk.

Acknowledgements