You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+26-23Lines changed: 26 additions & 23 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,8 @@
1
1
# neomd
2
2
3
-
A minimal terminal email client for people who write in Markdown and live in Neovim.
3
+
A keyboard-first TUI email: write in Neovim, render as Markdown, screen senders first, organize emails once.
4
4
5
-
*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/).*
5
+
_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
7
## The philosophy behind Neomd: What's unique?
8
8
@@ -16,7 +16,6 @@ Also, we intentionally don't add more folders to the archive or file emails too,
16
16
17
17
But we have two additional **Feed** and **Papertrail**, two dedicated folders from HEY where 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.
18
18
19
-
20
19
### Email Processing Workflow
21
20
22
21
Here's how neomd combines HEY-Screener + GTD + Feed/Papertrail to process your email:
class ToScreen,Inbox,ScreenedOut,Feed,PaperTrail,Archive,Waiting,Someday,Scheduled,Trash folderStyle
68
67
```
69
-
*all colored boxes represent neomd folders*
68
+
69
+
_all colored boxes represent neomd folders_
70
70
71
71
**Key principles:**
72
+
72
73
-**Screener first**: Unknown senders never clutter your Inbox, but get automatically wait in ToScreen for classification [more](https://neomd.ssp.sh/docs/screener/)
73
74
-**One-time decision**: Once you classify a sender (`I/O/F/P`), all future emails from them are automatically routed [more](https://neomd.ssp.sh/docs/screener/#how-classification-works)
74
-
-**GTD processing**: Emails in Inbox are processed once. Inbox acting as want/need to do *Next*, otherwise move to Waiting, Someday, or Scheduled
75
-
-**Minimal filing**: Only Archive when done; no complex folder hierarchies. Use search to find old emails
76
-
-**Separate contexts**: Feed for newsletters (read when you want), PaperTrail for receipts (search when needed)
75
+
-**GTD processing**: Emails in Inbox are processed once. Inbox acting as want/need to do _Next_, otherwise move to Waiting, Someday, or Scheduled
76
+
-**Minimal filing**: Only Archive when done; no complex folder hierarchies. Use search to find old emails
77
+
-**Separate contexts**: Feed for newsletters (read when you want), PaperTrail for receipts (search when needed)
77
78
- See full features list below.
78
79
79
-
80
80
## Screenshots
81
81
82
82
### Overview: List-View
83
83
84
84
Feed view with all Newsletters - also workflow with differnt tabs and unread counter only for certain tabs (not all):
85
85

86
-
*Features seen: Reading newsletter directly in your email client (feed) - see spy pixel, if you have replied (dot) and thread mode if replied*
86
+
_Features seen: Reading newsletter directly in your email client (feed) - see spy pixel, if you have replied (dot) and thread mode if replied_
87
87
88
88
### Reading Panel
89
89
@@ -92,10 +92,12 @@ Reading an email with Markdown 💙:
This email is from Neomd. Great I can add links such as [this](https://ssp.sh) with plain Markdown.
@@ -112,8 +114,7 @@ how does that look in an email?
112
114
Best regards
113
115
```
114
116
115
-
*Compose emails in your editor, read them rendered with [glamour](https://github.com/charmbracelet/glamour), and manage your inbox with a [HEY-style screener](https://www.hey.com/features/the-screener/) — all from the terminal.*
116
-
117
+
_Compose emails in your editor, read them rendered with [glamour](https://github.com/charmbracelet/glamour), and manage your inbox with a [HEY-style screener](https://www.hey.com/features/the-screener/) — all from the terminal._
_(shorter but limited showcase [part 1 video](https://youtu.be/lpmHqIrCC-w))_
131
131
132
132
## Features
133
133
@@ -142,7 +142,6 @@ These features are the one that makes neomd different to other email clients out
142
142
-**GitHub/Obsidian-style callouts** — compose emails with callout syntax `> [!note]`, `> [!tip]`, `> [!warning]` for styled alert boxes in HTML emails; rendered with colored left borders, subtle backgrounds, and emoji icons [→](https://neomd.ssp.sh/docs/sending/#callouts-admonition)
143
143
-**Listmonk newsletter integration** — compose an email to a virtual address (e.g. `[email protected]`) and neomd creates a scheduled campaign in [Listmonk](https://listmonk.app) via API instead of sending via SMTP; configure multiple trigger addresses to target different subscriber lists; pre-send screen shows campaign details [→](https://neomd.ssp.sh/docs/integrations/listmonk/)
144
144
145
-
146
145
### Inbox & Screener
147
146
148
147
Keep your inbox clean without effort.
@@ -154,7 +153,6 @@ Keep your inbox clean without effort.
154
153
-**Desktop notifications for VIP senders** — opt-in `[notifications]` block fires `notify-send` only for senders/domains you list in `notify.txt`; independent of screener categories; first run silently records a baseline so you don't get flooded [→](https://neomd.ssp.sh/docs/notifications/)
-**Pre-send review** — after closing the editor, review To/Subject/body before sending; attach files, save to Drafts, or re-open the editor — no accidental sends [→](https://neomd.ssp.sh/docs/sending/#pre-send-review)
@@ -203,6 +201,7 @@ Keep your inbox clean without effort.
203
201
204
202
> [!NOTE]
205
203
> **Optional Neovim & file picker helpers:**
204
+
>
206
205
> -`yazi` enables the built-in file picker used by pre-send `a`
> - a tiny [yazi `init.lua`](https://github.com/sspaeti/dotfiles/blob/master/yazi/.config/yazi/init.lua) snippet (`ps.sub("cd", ...)` guard on `rt.args.chooser_file`) is recommended — it clears any stale yazi selection on every `cd`, so a stray `<Space>` (yazi's toggle-selection key) in the picker can't cause `--chooser-file` to write the wrong path. Only fires in chooser mode; standalone yazi usage is unaffected.
@@ -223,18 +222,18 @@ make build
223
222
```
224
223
225
224
Or if on Arch Linux (AUR), you can use my [neomd-bin](https://aur.archlinux.org/packages/neomd-bin) via:
225
+
226
226
```sh
227
227
yay -S neomd-bin
228
228
```
229
229
230
-
231
230
On first run, neomd:
231
+
232
232
1. Creates `~/.config/neomd/config.toml` with placeholders — fill in your IMAP/SMTP credentials
233
-
- Important: Make sure that the Capitalization and naming of folder in `config.toml` is accroding to webmail IMAP, e.g. [Gmails](docs/content/docs/configuration/gmail.md) uses `sent = "[Gmail]/Sent Mail"` and not `sent` etc.
233
+
- Important: Make sure that the Capitalization and naming of folder in `config.toml` is accroding to webmail IMAP, e.g. [Gmails](docs/content/docs/configuration/gmail.md) uses `sent = "[Gmail]/Sent Mail"` and not `sent` etc.
234
234
2. Creates `~/.config/neomd/lists/` for screener allowlists (or uses your custom paths from config)
Neomd also runs on Android (more for fun) — see [docs/content/docs/configuration/android.md](docs/content/docs/android.md).
239
238
240
239
## Configuration
@@ -268,6 +267,7 @@ Use an app-specific password (Gmail, Fastmail, Hostpoint, etc.) rather than your
268
267
For the full configuration reference including multiple accounts, OAuth2 authentication, `[[senders]]` aliases, folder customization, signatures, and UI options, see [docs/content/docs/configuration](docs/content/docs/configuration/_index.md).
269
268
270
269
**Provider-specific guides:**
270
+
271
271
- Gmail: [docs/content/docs/configuration/gmail.md](docs/content/docs/configuration/gmail.md) — folder name mapping and OAuth2 setup
272
272
- Proton Mail Bridge: [docs/content/docs/configuration/proton-bridge.md](docs/content/docs/configuration/proton-bridge.md) — non-standard port configuration
273
273
@@ -301,6 +301,7 @@ You choose who can land in your Inbox. Bye-bye spam. This is the beauty of [HEY-
301
301
### Screener Workflow
302
302
303
303
Find full Screener Workflow at [docs/content/docs/screener.md](docs/content/docs/screener.md), classification tables, and bulk re-classification instructions.
304
+
304
305
### Keybindings
305
306
306
307
Press `?` inside neomd to open the interactive help overlay. Start typing to filter shortcuts.
@@ -313,7 +314,7 @@ Compose in Markdown, send as `multipart/alternative` (plain text + HTML). Attach
313
314
314
315
Discarding unsent mail now asks for confirmation in compose/pre-send, and `:recover` reopens the latest backup if you want to resume after an abort.
315
316
316
-
- See [docs/content/docs/sending.md](docs/content/docs/sending.md) for details on MIME structure, attachments, pre-send review, and drafts.
317
+
- See [docs/content/docs/sending.md](docs/content/docs/sending.md) for details on MIME structure, attachments, pre-send review, and drafts.
317
318
- See [docs/content/docs/reading.md](docs/content/docs/reading.md) for the reader: images, inline links, attachments, and navigation.
318
319
319
320
### Dev: Makefile Commands
@@ -341,9 +342,10 @@ make help print this list
341
342
-[goldmark](https://github.com/yuin/goldmark) — Markdown → HTML for sending
You have more questions, check out the [docs](https://neomd.ssp.sh/) with more information, or check [Frequently Asked Questions](https://neomd.ssp.sh/docs/faq/).
348
+
347
349
## Changelog
348
350
349
351
See [CHANGELOG.md](CHANGELOG.md) for what's new.
@@ -378,11 +380,11 @@ neomd's responsiveness depends entirely on your IMAP server. Every folder switch
378
380
379
381
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.
380
382
381
-
382
383
> [!NOTE]
383
384
> **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 :). See [docs/content/docs/configuration/gmail.md](docs/content/docs/configuration/gmail.md) for Gmail-specific folder configuration.
@@ -414,6 +416,7 @@ This TUI is mostly [vibe-coded](https://www.ssp.sh/brain/vibe-coding) in the sen
414
416
I used my experience with Neomutt, TUIs, and the GTD workflow for handling emails with HEY Screener, and added some (hopefully) _taste_ using my favorite tools and aesthetics. Find the full history at [Twitter](https://xcancel.com/sspaeti/status/2036539855182627169#m) - inspired by seeing [Email.md](https://www.emailmd.dev/) on HackerNews.
415
417
416
418
If you [rather read the prompt](https://www.ssp.sh/brain/id-rather-read-the-prompt), check out my [initial prompt](https://github.com/ssp-data/neomd/blob/main/docs/initial-prompt/prompt.md) and its generated [plan](https://github.com/ssp-data/neomd/blob/main/docs/initial-prompt/prompt-plan.md) - which I have iterated and added features by the 100s since then.
419
+
417
420
## Roadmap
418
421
419
422
See at my second brain at [Roadmap](https://www.ssp.sh/brain/neomd#roadmap).
0 commit comments