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.

benchmark gmail vs my provider: add findings that gmail is slowish

sspaeti 6f7f859c a2c377d6

+36 -3
+4
CHANGELOG.md
··· 2 2 3 3 # 2026-04-02 4 4 - **Auto From on reply** — replying auto-selects the From address that matches the email's To/CC field (e.g. email sent to `simon@domain.com` replies from `simon@domain.com`); `r` now works from inbox list view; `# [neomd: from: ...]` shown in editor; `x` in pre-send discards the email 5 + - **Email safety hardening** — bulk operations show live progress counter ("Screening: 42/1000…") for batches >10; screener now moves emails before updating list files (no inconsistent state on failure); SaveSent failure shown as warning instead of silently swallowed; batch failures report exact moved/total counts; partial batch undo info preserved on error; undo stack capped at 20 6 + - **Screener lists created on startup** — all 5 screener `.txt` files are created as empty files on first run (alongside directories), consistent with IMAP folder creation 7 + - **Config-isolated cache** — demo and production configs use separate cache directories (derived from config dir name), so `make demo-reset` never touches production data 8 + - Added benchmark to readme as Gmail was considerly slower than my IMAP provider here from Switzerland. 5 9 6 10 # 2026-04-01 7 11 - **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
+1 -1
Makefile
··· 4 4 VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") 5 5 LDFLAGS := -ldflags "-X main.version=$(VERSION)" 6 6 7 - .PHONY: build run install clean test send-test vet fmt tidy release docs help check-go demo demo-reset 7 + .PHONY: build run install clean test send-test vet fmt tidy release docs help check-go demo demo-reset benchmark 8 8 9 9 ## check-go: verify Go is installed 10 10 check-go:
+31 -2
README.md
··· 4 4 5 5 [Neomd](https://www.ssp.sh/brain/neomd/) is my way of implementing an email TUI based on my experience with Neomutt, focusing on [Neovim](https://www.ssp.sh/brain/neovim) (input) and reading/writing in [Markdown](https://www.ssp.sh/brain/markdown) and navigating with [Vim Motions](https://www.ssp.sh/brain/vim-language-and-motions) with the GTD workflow and [HEY-Screener](https://www.hey.com/features/the-screener/). 6 6 7 + > ⚠️ **Warning:** neomd moves, deletes, and modifies emails directly on your IMAP server. These operations affect your mailbox across all devices. **Back up important emails before first use.** neomd is experimental software and can't take responsibility for lost or misplaced emails. Consider testing with a secondary email account first. 7 8 8 9 ## The philosophy behind Neomd: What's unique? 9 10 ··· 15 16 16 17 With the additional **Feed** and **Papertrail**, two additional features from HEY, you can read newsletters (just hit F) on them automatically in their separate tab, or move all your receipts into the Papertrail. Once you mark them as feed or papertrail, they will moved there automatically going forward. So you decide whether to read emails or news by jumping to different tabs. 17 18 18 - >**Note on Speed**: Startup fetches headers via IMAP — this takes a network round-trip (0.5-2s depending on server), after that everything is in-memory and navigation is instant. IMAP calls (switching folders, opening emails) are typically ~50-150ms on dedicated providers like Hostpoint, Fastmail, or HEY. **Gmail's IMAP is significantly slower** (~200-500ms per command) due to its label-to-folder translation layer — expect 1-2s for folder switches. This is a Gmail limitation, not neomd. For the fastest experience, use a dedicated email provider. 19 + >**Note on Speed**: neomd's speed depends entirely on your IMAP provider. On Hostpoint (the provider I use), a folder switch takes **~33ms** which feels instant. On Gmail, the same operation takes **~570ms** which is noticeably slow. See [Benchmark](#benchmark) for full details and how to test your provider. 19 20 20 21 ## Screenshots 21 22 ··· 106 107 yay -S neomd-bin 107 108 ``` 108 109 109 - > ⚠️ **Warning:** neomd moves, deletes, and modifies emails directly on your IMAP server. These operations are real and affect your mailbox across all devices. **Back up important emails before first use.** neomd is experimental software and I can't take responsibility for lost or misplaced emails. Consider testing with a secondary email account first. 110 110 111 111 On first run, neomd: 112 112 1. Creates `~/.config/neomd/config.toml` with placeholders — fill in your IMAP/SMTP credentials ··· 204 204 ## Changelog 205 205 206 206 See [CHANGELOG.md](CHANGELOG.md) for what's new. 207 + 208 + ## Benchmark 209 + 210 + neomd's responsiveness depends entirely on your IMAP server. Every folder switch, email open, and move requires IMAP round-trips (SELECT + UID SEARCH + FETCH). Here are real measurements from the same machine, same network: 211 + 212 + **Hostpoint** (dedicated email provider) — folder switch: **~33ms total** 213 + | Operation | Time | 214 + |-----------|------| 215 + | SELECT | 12ms | 216 + | UID SEARCH | 10ms | 217 + | FETCH (200 emails) | 76ms | 218 + | MOVE (1 email) | 46ms | 219 + 220 + **Gmail** — folder switch: **~570ms total** (17x slower) 221 + | Operation | Time | 222 + |-----------|------| 223 + | SELECT | 200ms | 224 + | UID SEARCH | 180ms | 225 + | FETCH (2 emails) | 190ms | 226 + | MOVE (1 email) | 339ms | 227 + 228 + Interestingly, Gmail benchmarks fast on a **fresh single connection** (`scripts/imap-benchmark.sh` shows ~70ms total, same as Hostpoint). But on a **sustained session** with sequential commands — which is how neomd actually uses IMAP — Gmail adds ~180ms latency per command. This is likely Gmail's internal label-to-folder translation and session management overhead. The result: every action in neomd feels much slower on Gmail, while Hostpoint stays instant. 229 + 230 + > **Gmail is not recommended.** If you're on Gmail, consider a dedicated email provider (Hostpoint, Fastmail, HEY, Migadu, etc.) for the best neomd experience. Or use Gmail just for fun :). 231 + 232 + **Test your own provider:** 233 + ```bash 234 + IMAP_HOST=imap.example.com IMAP_USER=me@example.com IMAP_PASS=secret ./scripts/imap-benchmark.sh 235 + ``` 207 236 208 237 ## Security 209 238