Search
Neomd
Neomd this is my way of implementing a email TUI based on my experience on Neomutt focus on Neovim (input) and reading/writing (Markdwon) and navigating, Vim Motions.
Keyboard-first TUI email: write in Neovim, render as Markdown, screen senders first, organize emails once.
eomd is a terminal email client that lets you compose and read emails in Markdown using your $EDITOR (neovim), rendering them as minimal but beautiful HTML on send with possibility of all Markdown features and Callouts — all from a single bubbletea TUI. It features a HEY-inspired Screener workflow where new senders are triaged into accept/reject lists before hitting your inbox, turning email into a GTD-friendly, and triage emails only once workflow.

see almost all feature: reading newsletter directly in your email client (feed) - see spy pixel, if you have replied (dot) and thread mode if replied)
Reading view on the right, different screener list below:

Find a short rundown on YouTube:
# What is Unique about Neomd?
The key here is speed in which you can navigate, read, and process your email. Everything is just a shortcut away, and instantly (ms not seconds). It’s similar to the foundations that Superhuman was built on: it runs on Gmail and makes it fast with vim commands.
With the HEY-Screener, you get only emails in your inbox that you screened in, no spam or sales pitch before you added them. Or don’t like them, just screen them out, and they get automatically moved to the “ScreenedOut” folder.
With the GTD approach, using folders such as next (inbox), waiting, someday, scheduled, or archive, you can move them with one shortcut. This allows you quickly to move emails you need to wait for, or deal with later, in the right category. Processing your email only once.
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.
# Core Features
Only a few of the features:
- Markdown compose — write in $EDITOR (nvim default), send as multipart HTML + plain text
- Attachments — via yazi or
<leader>ain nvim; images inline, 1–9 to download - Preview emails including images.
- Open HTML emails such as Substack or others with w3m
- Multiple from addresses — SMTP-only aliases, cycle with ctrl+f
- Glamour reading + Kanagawa theme — emails as styled Markdown, nvim palette
- Markdown formatting with bold, links, and italic. Formatted in-line and code blocks, header h2, h3
- Clever and sophisticated shortcuts to move or screen emails.
Find all at GitHub - ssp-data/neomd: A minimal email TUI where you read with Markdown and write in Neovim. · GitHub.
# How to Use
Read the details with all its shortcuts at GitHub.
flowchart TD
Start([New Email Arrives]) --> AutoScreen{Auto-Screener
Known Sender?}
AutoScreen -->|screened_in.txt| Inbox["📥 Inbox (Next)"]
AutoScreen -->|screened_out.txt| ScreenedOut[🚫 ScreenedOut]
AutoScreen -->|feed.txt| Feed[📰 Feed]
AutoScreen -->|papertrail.txt| PaperTrail[🧾 PaperTrail]
AutoScreen -->|Unknown| ToScreen[❓ ToScreen]
ToScreen -->|Press I| ClassifyIn[Add to screened_in.txt]
ToScreen -->|Press O| ClassifyOut[Add to screened_out.txt]
ToScreen -->|Press F| ClassifyFeed[Add to feed.txt]
ToScreen -->|Press P| ClassifyPaper[Add to papertrail.txt]
ClassifyIn --> Inbox
ClassifyOut --> ScreenedOut
ClassifyFeed --> Feed
ClassifyPaper --> PaperTrail
Inbox --> Process{Process Email
GTD Decision}
Process -->|< 2 min?
Do it now| Action[Reply/Handle
Immediately]
Process -->|Waiting for others
Press Mw| Waiting[⏳ Waiting]
Process -->|Not now, later
Press Mm| Someday[📅 Someday]
Process -->|Time-specific
Press Mc| Scheduled[🗓️ Scheduled]
Process -->|Delete
Press x| Trash[🗑️ Trash]
Process -->|Reference only
Press Mp or P| PaperTrail
Process -->|Newsletter
Press F or Mf| Feed
Action --> Done{Done?}
Waiting --> Review[Review Later]
Someday --> Review
Scheduled --> Review
Feed --> ReadLater[Read in
Feed Tab]
PaperTrail --> SearchLater[Search when
needed]
Done -->|Yes| Archive[📦 Archive]
Done -->|Not actionable| Archive
Review --> Archive
ReadLater --> Archive
classDef folderStyle fill:#54546d,stroke:#7fb4ca,stroke-width:2px,color:#dcd7ba
class ToScreen,Inbox,ScreenedOut,Feed,PaperTrail,Archive,Waiting,Someday,Scheduled,Trash folderStyle
all colored boxes represent neomd folders
Key principles:
- Screener first: Unknown senders never clutter your Inbox — they wait in ToScreen for classification
- One-time decision: Once you classify a sender (
I/O/F/P), all future emails from them are automatically routed - GTD processing: Emails in Inbox are processed once — if < 2 min, do it or keep it in inbox as doing Next otherwise move to Waiting, Someday, or Scheduled
- Minimal filing: Only Archive when done; no complex folder hierarchies — use search to find old emails
- Separate contexts: Feed for newsletters (read when you want), PaperTrail for receipts (search when needed)
# A Happy User
A happy neomd user 😉. 

# History
Find the full history at Twitter - inspired by seeing Email.md on HackerNews.
It’s fully Vibe Coded, I only omitted the taste with pointing it to all my tools and astetics, also showing it the code from open source tools.
# Inspiration
See inspirations for this project such as:
- Neomutt — the gold standard terminal email client; neomd reuses its screener list format and borrows many keybindings
- HEY — the Screener concept: unknown senders wait for a decision before reaching your inbox
- hey-cli — a Go CLI for HEY; provided the bubbletea patterns used here
- HEY-Screener in (Neo)Mutt: My way of using HEY screener in neomutt.
- Newsboat — RSS reader whose
Oopen-in-browser binding and vim navigation feel inspired neomd’s reader view - emailmd.dev — the idea that email should be written in Markdown
- charmbracelet/pop — minimal Go email sender from Charm
- charmbracelet/glamour — Markdown rendering in the terminal
- Kanagawa — the color palette used for the inbox
- msgvault — Go IMAP archiver; the IMAP client code in neomd is adapted from it
If you rather see the prompt, check out initial prompt and its plan.
# Roadmap
Some ideas in random order:
- Sent later
- extend serach of emails with DuckDB - see
Full-Text Search with DuckDB - peterdohertys.website
- also check msgvault
- people can add their own folder: make it dynamically? (currently hard coded) - see FAQ – neomd Documentation
- potential offiline mode: this is a workflow change and atm not priority, but downloading offline to batch reply on an airplane would be great. Would need encryption too, that we download all emails encrypted. Potentially encrypting our lists too? download with POP3
- image rendering with neovim Image API:
https://github.com/neovim/neovim/issues/30889 (would be only during composing, not reading)
- not inside goldmark, as this does not work. Matcha uses
sixel + kitty + iTerm2 + ghosttyvia terminal env-var detection, renders out-of-band by writing to stdout with cursor positioning (bypasses bubbletea). Uses mattn/go-sixel + stdlib image/png. and does not use glamour: has its own HTML→element pipeline (view/html.go, 1087 LOC).
- not inside goldmark, as this does not work. Matcha uses
# DONE
-
check similarity with matcha TUIs
-
Get notifications for certain domains/senders on Hyperland (integrated in notifications)
-
approving full domains, not individual senders only
-
Emoji reaction should be sent from the account the email was sent too
-
I use Listmonk for my email, it’s open source too, so I’m thinking of integrating an email or an integration that let’s me send directly from neomd to all my subscribers.. 🤔
-
! deamon to run on NAS or server, to automatically run screener to have screened emails also when opening on mobile
- Background sync daemon — separate
neomd-syncbinary (or cron job) that runs IMAP fetch + screener headlessly, so the inbox stays clean even when neomd is closed; complement to the in-process 5-mintea.Ticksync already running while neomd is open - ? Should we use syncthing to sync text-files between my desktop, server and android phone?
- Background sync daemon — separate
-
(I just use normal spellchecker, works well)
- integrate Aspell (or any other spellchecker) into neomd - here someone integrated it into neomutt: Still loving the Micro Journal Rev.2 with Neovim—Chill writing session. : r/writerDeck
- has normal spell checker from neovim. not working super nicely yet, but it works: dotfiles/nvim/.config/nvim/lua/sspaeti/set.lua at a66451e7f29afce97f44d0965d31c0fa39d29c61 · sspaeti/dotfiles · GitHub
-
set up IMAP with proton.me and mail bridge https://proton.me/mail/bridge
-
Add callout support
-
Showing and being able to attach files
-
Change A for switching account not a
-
cmd mode like vim wtih
: -
fix search? (e.g. find all keys that are shortcuts like above a, or disable shortcuts when searching?)
-
integrate Newsboat into Feed of my email? -> not great idea
-
Unread counts in folder tabs — e.g.
Inbox (3) -
having a signature when composing an email
-
d/uhalf-page scroll in reader (vim-style) -
Reply-all — group reply to all original recipients
-
CC field in compose
-
Forward email —
fkey, pre-fills “Fwd: " subject with quoted body -
Add an Attachment, quite important: the flow should be easy from within Neovim as this is the composer
-
choose sender in composer: setup gmail, hey, and others in one account to send - without need to switch account
-
highlight threads or conversations that are forth and back in a thread
-
Docs instad of readme.md?
-
better search: overall and keeping search when to apply multi command on search result
-
integration with contact or email - reading from screened_in list?
-
create a demo account for showcasing the features (e.g. neomd.demo@gmail.com)j
- create a hostpoint demo account, as gmail is way slower… defeates neomd
- when finished or restart
- ./scripts/reset-demo.sh welcome screen
- add or create truncates the screener lists (doesn’t delete them) and removes the welcome marker.
-
always on bcc in config.toml (if each email should be sent to your other email for example)
-
### Not priority right now
-
Background sync daemon — separate
neomd-syncbinary (or cron job) that runs IMAP fetch + screener headlessly, so the inbox stays clean even when neomd is closed; complement to the in-process 5-mintea.Ticksync already running while neomd is open -
looks pretty nice, looking forward to that keychain support merge, or if you supported command line argument to fetch password like neomutt that would also be great PASS=
pass xyzReddit suggestions
Full Change log at neomd/CHANGELOG.md at main · ssp-data/neomd · GitHub.
# Presenting and Key Features
Points to showcase, see the video here - Neomd: Vim-native Email TUI with Markdown Compose & HEY Screener | Take 2 - YouTube:
- opening new account
- welcome screener
- using neovim, yazi
- kanagawa theme
- email start in inbox
- amount of loaded emails
- screener
- and screen-all if you want
- GTD
- tabs
- move around, move emails
- speed
- lists
- sorting
- ! search - search overall
- reading emails: markdown
- opening w3m, browser AND nvim
- images
- composing
- markdown native
- images attach
- send forth and back in neomd
- signature
- Preview
- drafts
- different [senders] and [accounts]
- autocomplete emails
- saving drafts - UNDO
- threaded view and reply DOT
- threaded view with T
- comparision neomd with IMAP web view -> Always in sync if accessed from mobile
- ! everything folder
- zoom out and jump to next read email
- keyring
- theming
- ai integration, as it’s just a local markdown file
- (Calendar integration)
# Further Reads
- Email and Email TUIs
- Email, and the way we (should) communicate at work | ssp.sh
- Learning from someone else’s vibe coded project: Im going back to writing code by hand | k10s devlog
Origin: Vibe coded after seeing Show HN: Email.md – Markdown to responsive, email-safe HTML | Hacker News