type: overview title: Quickstart description: What the wh WhatsApp terminal client with per-chat AI autoreply does, how to build and run it, and where to find each topic in this wiki. tags: [overview, quickstart, rust, whatsapp, tui, ai] sources:
651d1fb6c9
resource: repo://Cargo.toml9fec9d1af4
resource: repo://src/app.rs043e6252ba
resource: repo://src/autoreply.rs2a737474d8
resource: repo://src/config.rsb55a21a31e
resource: repo://src/main.rs
generated: { by: "claude-code", at: "2026-10-19T19:53:56.480Z" }
verified:wh (Cargo.toml:1-5) is a Rust terminal client for WhatsApp. It links as a
companion device by QR code, shows chats and contacts in a
ratatui interface, stores messages locally in
SQLite and can answer incoming messages automatically with an
OpenAI-compatible model, chat by chat — in private chats and in groups
(broadcasts, status and newsletters excluded).
cargo build --release
cargo run --release
cargo test
The crate uses edition 2024. whatsapp-rust is built with
default-features = false because its default simd feature needs nightly
(Cargo.toml:8-10). [lints.rust] linker_messages = "allow"
(Cargo.toml:25-27) silences the informational MSVC linker line printed
because the binary exports symbols.
On first start the app shows a QR code: scan it from WhatsApp → Linked
devices. The session is kept in session.db, so later starts connect
directly. Main keys: Tab switches list/input, F2 chats/contacts, Enter
opens a chat or sends, Ctrl+A toggles autoreply for the open chat,
Ctrl+C quits (key bindings).
Settings live in config.toml inside the data directory
<platform config dir>/wh (on Windows %APPDATA%\wh), next to session.db
and history.db (src/config.rs:40-49, src/config.rs:144-148). The two
databases are separate by design: session.db is the WhatsApp library's
session and key store, history.db holds the app's chats, messages and
autoreply flags. Without the file the app still runs as a plain WhatsApp
client; the autoreply needs openai_api_key and system_prompt. Optional
keys tune the cooldowns (cooldown_seconds, group_cooldown_seconds), the
startup catch-up (catch_up_seconds) and an AI request log (ai_log,
written to ai_requests.log in the same folder). Keys and defaults:
Configuration and data.
main loads the config, opens the history, starts the WhatsApp client and
an input thread, then runs the draw/receive loop until quit
(src/main.rs:28-51, see Runtime and event loop).
| Task | Page | Source |
|---|---|---|
| Startup, channels, threads, main loop | Runtime and event loop | src/main.rs |
| Events, state, keys, background tasks | Application state | src/app.rs |
| Screens, rendering, message formatting | Terminal UI | src/ui.rs |
| WhatsApp session, events, JIDs, media | WhatsApp client | src/whatsapp.rs |
| AI HTTP requests, vision, errors | AI client | src/ai.rs |
| When and how the AI replies (groups, cooldowns, deferred replies, catch-up) | AI auto-reply workflow | src/autoreply.rs, src/app.rs |
| Local SQLite messages, chats, contacts | History store | src/history.rs |
| Config keys, data dir, security notes | Configuration and data | src/config.rs |
| Test suites and how to run them | Unit tests | src/*.rs |