A minimal email TUI where you read with Markdown and write in Neovim. neomd.ssp.sh/docs
email markdown neovim tui
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

update changes

sspaeti 4835e926 824a10f7

+14 -3
+10 -1
CHANGELOG.md
··· 1 1 # Changelog 2 2 3 + ## 2026-04-01 4 + - **Threaded inbox** — related emails are automatically grouped in the inbox list with a Twitter-style vertical connector line (`│`/`╰`); threads detected via `In-Reply-To`/`Message-ID` IMAP envelope headers with a reply-prefix subject fallback (only emails with `Re:`, `AW:`, `Fwd:` etc. are grouped by subject — recurring notifications/invoices stay separate); newest reply on top, root at bottom; threads sorted by most recent email so active conversations float to the top 5 + - **Clickable tabs** — folder tabs in the top bar are clickable with the mouse; click any tab to switch folders 6 + - **Spell check in pre-send (`s`)** — opens nvim with spell checking enabled (`en_us` + `de`), cursor jumps to the first misspelled word; use `]s`/`[s` to navigate errors, `z=` for suggestions, `zg` to add to dictionary; corrected body flows back to pre-send 7 + - **`:debug` / `:dbg` command** — writes a diagnostic report covering IMAP connectivity (ping test), account config (emails masked), folder mapping, screener list status, UI config, and current state; opens in the reader and saves to `/tmp/neomd/debug.log` for sharing; no sensitive data (passwords, full emails) included 8 + - **Drafts show recipient** — Drafts folder now shows `→ recipient` instead of From (same as Sent tab), since all drafts are from you 9 + - **`ctrl+b` in pre-send** — toggle CC/BCC fields from the pre-send review screen (previously only available during compose) 10 + - **`u` / `U` rebind** — `u` is now free for page-up (vim-style half-page scroll); `U` is undo last move/delete; `ctrl+u` clears all marks 11 + - **Temp files in `/tmp/neomd/`** — all temp files (compose, preview, spell check) now live in `/tmp/neomd/` subdirectory for easy recovery after crashes and less clutter 12 + 3 13 ## 2026-03-31 4 - - **Threaded inbox** — related emails are automatically grouped in the inbox list with a Twitter-style vertical connector line (`│`/`╰`); threads detected via `In-Reply-To`/`Message-ID` IMAP envelope headers with a normalized-subject + participant overlap fallback; newest reply on top, root at bottom; threads sorted by most recent email so active conversations float to the top; thread connector colored subtly in the Kanagawa border color 5 14 - fix showing recipient in SENT tab (instead of from) 6 15 - **IMAP search across all folders (`space /` or `:search`)** — server-side IMAP SEARCH across all configured folders (Inbox, Sent, Archive, Feed, etc.); results displayed in a temporary "Search" tab with `[Folder]` prefix on each subject; supports query prefixes: `from:simon`, `subject:invoice`, `to:team@`, or plain text to search all three fields; press `esc` to close results 7 16 - **Filter preserves across actions** — the local `/` filter no longer clears when pressing `n` (toggle read), `m` (mark), `U` (clear marks), or sorting; filter stays active until `esc`
+4 -2
internal/ui/keys.go
··· 55 55 {"Mw", "move to Waiting"}, 56 56 {"Mm", "move to Someday"}, 57 57 }}, 58 - {"Multi-select", [][2]string{ 58 + {"Multi-select & Undo", [][2]string{ 59 59 {"m", "mark / unmark email + advance cursor"}, 60 60 {"ctrl+u", "clear all marks"}, 61 61 {"U", "undo last move or delete (reverses x, A, M* — not screener actions)"}, ··· 83 83 {"shift+R", "reply-all — reply to sender + all CC recipients (from reader)"}, 84 84 {"f", "forward email (from reader or inbox)"}, 85 85 {"c", "compose new email"}, 86 - {"ctrl+b (compose)", "toggle Cc+Bcc fields (both hidden by default)"}, 86 + {"ctrl+b (compose/pre-send)", "toggle Cc+Bcc fields (both hidden by default)"}, 87 87 {"ctrl+f (compose/pre-send)", "cycle From address through all accounts + [[senders]] aliases"}, 88 88 {"a (pre-send)", "attach file via yazi file picker (or $NEOMD_FILE_PICKER)"}, 89 89 {"D (pre-send)", "remove last attachment"}, 90 90 {"d (pre-send)", "save to Drafts folder (IMAP APPEND with \\Draft flag)"}, 91 + {"s (pre-send)", "spell check — open in nvim with spell on, jump to first error"}, 91 92 {"p (pre-send)", "preview email in $BROWSER (images rendered, same as recipient sees)"}, 92 93 {"e (pre-send)", "re-open editor to edit body"}, 93 94 {"enter (pre-send)", "confirm and send"}, ··· 113 114 {":empty-trash / :et", "permanently delete ALL emails in Trash (y/n)"}, 114 115 {":create-folders / :cf", "create missing IMAP folders from config (safe, idempotent)"}, 115 116 {":go-spam / :spam", "open Spam folder (not in tab rotation)"}, 117 + {":debug / :dbg", "diagnostic report — IMAP ping, config, folders, state (saved to /tmp/neomd/debug.log)"}, 116 118 {":quit / :q", "quit neomd"}, 117 119 }}, 118 120 {"Composing", [][2]string{