WhatsApp for your terminal — fast, keyboard-driven, and built for developers.
A full-featured terminal UI (TUI) client powered by whatsapp-web.js and OpenTUI. Chat, send media, update your status, and manage conversations without leaving the command line.
Features · Installation · Usage · Keyboard Shortcuts · Configuration · Troubleshooting · Project Structure
whatat brings WhatsApp to your terminal with a polished, keyboard-first interface. It connects through WhatsApp Web (Linked Devices), persists your session locally, and renders chats, images, and status updates directly in the terminal.
Designed for developers and power users who live in the terminal and want a lightweight alternative to the desktop app — without sacrificing core messaging features.
- Real-time chat — Send and receive messages with delivery/read receipts (
✓/✓✓) - Chat search — Filter conversations by name or last message (
Ctrl+F) - Message history — Initial fast load with automatic background pagination for older messages
- Group chats — Color-coded sender names per participant
- Reply previews — Quoted/replied messages shown inline
- Reactions — Emoji reactions displayed on messages
- Day separators —
Today,Yesterday, and date labels between message groups
- Inline images — Photos and stickers rendered in-terminal via framebuffer
- Image sending — Attach local images by file path (
Ctrl+I) - Media labels — Videos, audio, voice notes, documents, and stickers show descriptive placeholders when inline rendering isn't possible
- Keyboard-first navigation — Three-pane layout: sidebar → messages → input
- Emoji picker — Quick emoji insertion (
Ctrl+E) - Status updates — Set your WhatsApp About/status text (
Ctrl+S) - Live header — Connection indicator and clock
- Help overlay — Press
?anytime for shortcuts
- QR login — Scan once via WhatsApp → Linked Devices; session saved locally
- High-res QR fallback — Auto-opens scannable PNG in your system image viewer
- Single-instance lock — Prevents profile/browser conflicts between runs
- Auto browser detection — Finds Chrome, Edge, or Chromium on Windows, macOS, and Linux
| Requirement | Notes |
|---|---|
| Bun ≥ 1.0 | Recommended runtime |
| Chrome / Edge / Chromium | Headless browser for WhatsApp Web |
| Terminal with true-color support | Recommended for image rendering |
Node.js is not required when using Bun. Puppeteer (via whatsapp-web.js) handles browser automation under the hood.
git clone https://github.com/mine3krish/whatat
cd whatatbun installbun startOn first launch, scan the QR code with WhatsApp → Linked Devices → Link a Device. Your session is saved in .wwebjs_auth/ for subsequent runs.
Run with file watching for live reload during development:
bun devPrefer
bun startfor normal use. Hot reload can spawn duplicate browser instances and trigger profile lock errors.
- Run
bun start - A QR code appears in the terminal and opens in your default image viewer
- Scan with your phone
- Chats load automatically once connected
Press Ctrl+O to re-open the QR image if needed.
Tabto the chat list and select a conversationTabto the message input- Type your message and press
Enter - Use
Ctrl+Efor emojis orCtrl+Ito send an image
| Shortcut | Action |
|---|---|
Tab / Shift+Tab |
Cycle sidebar → messages → input |
Ctrl+F |
Focus chat search |
↑ ↓ |
Navigate chat list |
Enter |
Open chat / send message / pick emoji |
Ctrl+↑ / PgUp |
Load older messages |
Ctrl+E |
Open emoji picker |
Ctrl+I |
Send image from file path |
Ctrl+S |
Set WhatsApp status |
Ctrl+R |
Refresh chat list |
Ctrl+L |
Log out |
Ctrl+O |
Open login QR in image viewer |
? |
Toggle help overlay |
Esc |
Close overlay / navigate back |
Ctrl+C |
Quit |
| Variable | Description |
|---|---|
CHROME_PATH |
Absolute path to Chrome/Edge/Chromium executable |
PUPPETEER_EXECUTABLE_PATH |
Alternative to CHROME_PATH (Puppeteer convention) |
Windows (PowerShell)
$env:CHROME_PATH = "C:\Program Files\Google\Chrome\Application\chrome.exe"
bun startmacOS / Linux
export CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
bun start| Path | Purpose |
|---|---|
.wwebjs_auth/ |
WhatsApp session and auth tokens |
.wwebjs_auth/whatat.pid |
Single-instance process lock |
.wwebjs_auth/login-qr.png |
Latest login QR (for external scanning) |
All session paths are gitignored. Delete .wwebjs_auth/ to force a fresh login.
Could not find Chrome version
Install Google Chrome or Microsoft Edge, then set the browser path explicitly:
# Windows
$env:CHROME_PATH = "C:\Program Files\Google\Chrome\Application\chrome.exe"
bun startThe browser is already running
Another whatat instance or a stuck headless Chrome process is holding the profile lock.
- Close all other whatat terminals
- Kill stray Chrome/Edge processes (Task Manager on Windows,
pkill chromeon Linux) - Remove the lock file:
.wwebjs_auth/whatat.pid - Restart with
bun start(notbun dev)
QR code won't scan
- The terminal QR uses black-on-white for contrast
- A high-resolution PNG is saved to
.wwebjs_auth/login-qr.pngand opened automatically - Press
Ctrl+Oto re-open it in your image viewer - Ensure your terminal window is wide enough for the inline QR fallback
Messages not loading
- Wait for the header to show
● online - Switch to another chat and back
- Press
Ctrl+Rto refresh chats - Use
Ctrl+↑/PgUpto manually fetch older messages - Check that WhatsApp Web is working in a regular browser
Images fail to render
- Ensure your terminal supports true-color / RGB rendering
- Large images are downscaled automatically; very small or corrupt media shows a
[image]fallback - Videos and documents display as labeled placeholders (not playable in-terminal)
whatat/
├── src/
│ ├── app/
│ │ └── App.tsx # Root layout, keyboard routing, lifecycle
│ ├── components/
│ │ ├── AttachImage.tsx # Image send overlay
│ │ ├── ChatList.tsx # Sidebar with search + chat select
│ │ ├── HelpOverlay.tsx # Shortcut reference
│ │ ├── MessageBubble.tsx # Individual message rendering
│ │ ├── MessageInput.tsx # Compose bar + emoji panel
│ │ ├── MessagePanel.tsx # Thread view + pagination
│ │ ├── QrLogin.tsx # QR login screen
│ │ ├── StatusEditor.tsx # WhatsApp status editor
│ │ └── TerminalImage.tsx # Framebuffer image renderer
│ ├── state/
│ │ └── app-store.ts # SolidJS signals + message store
│ ├── utils/
│ │ ├── emojis.ts # Quick emoji list
│ │ ├── format.ts # Time, ack, date helpers
│ │ ├── image.ts # Sharp decode + QR generation
│ │ ├── message-content.ts # Message type labels
│ │ └── theme.ts # Color palette
│ ├── whatsapp/
│ │ ├── browser.ts # Chrome/Edge auto-detection
│ │ ├── service.ts # whatsapp-web.js client wrapper
│ │ ├── session-lock.ts # PID lock + stale lock cleanup
│ │ └── types.ts # Shared TypeScript interfaces
│ └── index.tsx # Entry point
├── package.json
└── README.md
| Layer | Technology |
|---|---|
| Runtime | Bun |
| Language | TypeScript |
| UI framework | SolidJS |
| Terminal renderer | OpenTUI (@opentui/core, @opentui/solid) |
| WhatsApp bridge | whatsapp-web.js |
| Browser automation | Puppeteer (transitive) |
| Image processing | Sharp |
| QR generation | qrcode |
This project is not affiliated with, endorsed by, or connected to WhatsApp or Meta.
whatat uses unofficial WhatsApp Web automation via whatsapp-web.js. Using third-party clients may violate WhatsApp's Terms of Service and carries the risk of account restrictions. Use at your own discretion — preferably with a secondary number or test account.
Contributions are welcome. To get started:
- Fork the repository
- Create a feature branch:
git checkout -b feat/my-feature - Make your changes and test with
bun start - Open a pull request with a clear description
Please keep changes focused and match the existing code style.
MIT © whatat contributors
Built with ☕ for terminal lovers.
If you find this useful, consider giving it a ⭐ on GitHub.