cwmail — terminal email with AI-drafted replies
v0.9

cwmail

A terminal email client with proper HTML rendering, inline image support, multi-account IMAP, and AI-drafted replies powered by DeepSeek V4 Pro.

Written in Go on Bubbletea v2. Reads real mail. Renders HTML newsletters, receipts, calendar invites, and event posters without dropping out to a browser. Drafts replies you can edit in place.

IMAP
multi-account
Gmail, iCloud, Outlook, custom
IDLE
push notifications
not polling
AI
DeepSeek V4 Pro
drafts your reply

What it is

cwmail is a full-screen Bubbletea TUI for managing IMAP mailboxes. It handles the actual hard parts of email — MIME multipart, HTML rendering, charset detection, inline images, attachments, threading, drafts — not just the obvious ones.

You can manage as many IMAP accounts as you want side-by-side in the sidebar. Folder navigation is fast (Vim-style or arrows), full-text search hits the local SQLite mirror so it returns instantly, and IDLE push keeps your inbox current without polling. Desktop notifications fire when new mail arrives.

The AI-drafted-reply feature is a one-key action: hit R on any open message and the model produces a contextual reply draft in the composer. You can edit, send, save as draft, or discard. Same DeepSeek profile cwcode uses, so one API key powers both apps.

It is not a service. There is no cwmail.io. Your IMAP credentials sit in ~/.config/cwmail/config.json; everything else lives in ~/.local/share/cwmail/. Offline-capable for everything except actually sending and fetching.

Why it’s different

Multi-account IMAP
As many Gmail / iCloud / Outlook / custom-IMAP accounts as you want in the sidebar at once. Each account’s folder tree, unread counter, and IDLE connection is independent. The Spam, Trash, and Drafts folders are merged into a unified view by default.
HTML emails that render
Most terminal mail clients dump the plain-text alternative and call it a day. cwmail’s HTML-to-terminal converter handles tables, horizontal & vertical rules, ordered & unordered lists, block quotes, links, charset translation, and HTML entity decoding. Newsletters, receipts, event invites all read cleanly.
Inline images
Embedded and CID-referenced images render as half-block ANSI in 24-bit color (via pixterm-style rendering). Works on any terminal with true-color support. Useful for event banners, product photos in receipts, and inline charts.
AI-drafted replies
Hit R on any open message. The DeepSeek V4 Pro model drafts a contextual reply (using the same profile cwcode uses). You see the draft in the composer ready to edit. The model knows the prior thread, your typical tone, and whether to be terse or warm based on the conversation. Costs ~$0.01 per draft.
IDLE push, not polling
IMAP IDLE means the server tells the client when new mail arrives. cwmail keeps one IDLE connection per account open and surfaces new mail within a second of receipt. No 5-minute fetch cycles, no batch checking. Desktop notifications fire on arrival.
Undo delete
Delete moves to Trash and shows a brief “undo” toast for 8 seconds. Hit u and the message comes back. Matches matcha.email’s UX for the most common reflex mistake.
Draft auto-save
Any time you’re editing a reply or compose, the buffer is persisted to ~/.local/share/cwmail/drafts/ every few keystrokes. Crash, force-quit, accidentally close the window — the draft is still there next time you launch.
CLI send mode
cwmail send --to alice@example.com --subject “build done” --body “all green” — non-interactive sending, useful for AI agents (cwcode included), CI pipelines, and shell scripts. Reads body from stdin too. Same auth as the TUI.
No SaaS lock-in
Config is JSON. Local mirror is SQLite. Drafts are plain files under ~/.local/share/cwmail/. You can grep your own mail. Credentials live in the OS keyring (macOS Keychain, libsecret on Linux, Credential Manager on Windows).

What it looks like

cwmail inbox view: account sidebar listing Gmail, Boxer, Handle, Inbox 19858, Junk, Sent, Trash, and several folders; main column shows email subjects, senders, and dates in a dense list
Inbox view — multi-account sidebar, dense subject/from/date list, vim-style nav.
cwmail rendering an NVIDIA newsletter HTML email with two embedded event posters shown as ANSI half-block art, event titles, dates, locations, and brief descriptions
HTML newsletter rendered inline — tables, event blocks, and inline images as half-block ANSI.
cwmail reply composer with To, Subject, and Body fields filled in; the body shows an AI-drafted polite reply: 'Thank you for sharing the CUDA sessions at ISC 2026. I'll review the lineup and let you know if I have any questions. Appreciate the update.'
AI-drafted reply — one keypress, contextual draft, then edit and send.

Install

Download a pre-built binary from the Google Drive release folder (current build: v0.9; macOS arm64 / amd64 and Linux amd64). Drop it somewhere on your PATH and make it executable:

curl -L <download-url> -o ~/.local/bin/cwmail
chmod +x ~/.local/bin/cwmail
cwmail --help

Configure your first IMAP account in ~/.config/cwmail/config.json:

{
  "accounts": [
    {
      "name":     "Gmail",
      "imap":     "imap.gmail.com:993",
      "smtp":     "smtp.gmail.com:587",
      "username": "you@gmail.com"
    }
  ],
  "ai": {
    "endpoint":  "https://api.deepseek.com",
    "model":     "deepseek-v4-pro",
    "api_key":   "sk-..."
  }
}

Run it.

cwmail                                # full TUI
cwmail send --to a@b.com --subject hi # non-interactive send
cwmail compose                        # straight to composer

On first launch cwmail prompts for the Gmail app-password (or OAuth flow), stores it in the OS keyring, and starts the IDLE connection.

FAQ

Does it support Gmail OAuth?
App-password is the default and the simplest path. OAuth is wired but requires registering a client; if that matters to you, get in touch.
What about calendar invites?
cwmail parses the ICS attachment and renders the event date, time, location, and summary inline. Hitting Accept sends the reply iCal; declining lets you add a brief note.
Search?
Full-text against the local SQLite mirror. Press / for instant search across subject, body, and sender. Server-side search is also exposed via /i:.
Threading?
RFC 5256 thread sort with In-Reply-To / References fallbacks. Conversations collapse and expand on Enter; navigation walks the tree.
What does the AI reply actually look like?
See the third screenshot above. The model is given the thread context plus a short system prompt that asks for a terse, professional draft. You can configure the tone in the config file. The draft lands in the composer ready to edit — nothing is sent without you pressing Ctrl+S.
Is the source available?
Pre-built binaries on Google Drive. Source currently private — will open once the IMAP edge cases settle. Reach out for early access.
Does it work with cwcode?
Yes — cwcode can call cwmail send as a CLI tool. We use this for “ship a build, email the team” runs at the end of long autonomous loops.