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.

add B for business archives

sspaeti 77bf77e4 32726962

+18
+1
CHANGELOG.md
··· 1 1 # Changelog 2 2 3 3 # 2026-04-16 4 + - **`B` move to Work/business** — press `B` to move marked or cursor email(s) to Work folder (similar to `A` for Archive); quick single-key action without screener list updates; shows friendly error if Work folder not configured; useful for rapid GTD-style email processing; complements existing `gb` (go to Work) and `Mb` (move to Work) shortcuts 4 5 - **Redesigned welcome screen** — new two-column layout with ASCII art logo, philosophy/getting started guide on the left, and essential shortcuts organized by category on the right; wider box (100 chars) with cleaner spacing; maintains kanagawa color scheme; more scannable and visually appealing for new users 5 6 - **ASCII logo in help overlay** — pressing `?` now shows the neomd ASCII art logo overlaid on the top-right corner of the help screen; shortcuts start immediately at the top without vertical space taken by the logo; logo only appears when scrolled to the top 6 7 - **`space+w` welcome shortcut** — press `space` then `w` to reopen the welcome screen anytime; useful for reviewing keybindings and getting started guide; documented in help overlay and keybindings reference
+1
docs/content/docs/keybindings.md
··· 58 58 | `F` | mark as Feed → feed.txt + move to Feed | 59 59 | `P` | mark as PaperTrail → papertrail.txt + move to PaperTrail | 60 60 | `A` | archive (move to Archive, no screener update) | 61 + | `B` | move to Work/business (no screener update, if configured) | 61 62 | `S` | dry-run screen inbox (loaded emails), then y/n | 62 63 63 64
+1
internal/ui/keys.go
··· 45 45 {"F", "mark as Feed → feed.txt + move to Feed"}, 46 46 {"P", "mark as PaperTrail → papertrail.txt + move to PaperTrail"}, 47 47 {"A", "archive (move to Archive, no screener update)"}, 48 + {"B", "move to Work/business (no screener update, if configured)"}, 48 49 {"S", "dry-run screen inbox (loaded emails), then y/n"}, 49 50 }}, 50 51 {"Move (marked or cursor, no screener update)", [][2]string{
+15
internal/ui/model.go
··· 2278 2278 m.bulkProgress = m.newBulkOp("Archiving", len(targets)) 2279 2279 return m, tea.Batch(m.spinner.Tick, m.batchMoveCmd(targets, m.cfg.Folders.Archive)) 2280 2280 2281 + // B = move to Work/Business (pure move, no screener update) 2282 + case "B": 2283 + if m.cfg.Folders.Work == "" { 2284 + m.status = "Work folder not configured" 2285 + m.isError = true 2286 + return m, nil 2287 + } 2288 + targets := m.targetEmails() 2289 + if len(targets) == 0 { 2290 + return m, nil 2291 + } 2292 + m.loading = true 2293 + m.bulkProgress = m.newBulkOp("Moving to Work", len(targets)) 2294 + return m, tea.Batch(m.spinner.Tick, m.batchMoveCmd(targets, m.cfg.Folders.Work)) 2295 + 2281 2296 // ── Auto-screen dry-run (Inbox only) ──────────────────────────── 2282 2297 case ":": 2283 2298 m.cmdMode = true