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 shortcut for scheduled and add FAQ

sspaeti 57a0a8c2 c1c92b42

+31 -9
+3
CHANGELOG.md
··· 1 1 # Changelog 2 2 3 + # 2026-04-15 4 + - **Scheduled folder keybindings** — added `gc` (go to Scheduled, mnemonic: "calendar") and `Mc` (move to Scheduled) shortcuts; Scheduled folder now accessible via dedicated keybindings alongside existing tab navigation (`[]HL`, `space+1-9`); help overlay and generated keybindings documentation updated 5 + 3 6 # 2026-04-14 4 7 - **Extended link support (99 links)** — link opener now supports up to 99 links per email (previously limited to 10); `space+1-0` opens links 1-10, `space+l11-99` opens links 11-99 using intuitive numeric shortcuts (e.g. `space+l26` for link [26]); status line provides progressive feedback during multi-key input; footer help and `?` overlay updated 5 8 - **Fix: link extraction with brackets in text** — markdown link regex now correctly matches links with brackets inside the link text (e.g. `[[Watch the studio tour here]](url)`); changed from `[^\]]+` (anything except `]`) to non-greedy `.+?` to handle nested brackets; fixes newsletter links from Beehiiv and similar services
+20 -7
docs/content/docs/faq.md
··· 8 8 9 9 ## Is it possible to create new directories/tabs 10 10 11 - You basically create the folder in your web mail and configure it in your `config.toml` and add the new folder under `[folder]` and in the `tab_order` so neomd knows where to place it: 11 + Currently, no. All folders are hard coded in a struct in a code as this is optimized for the GTD and HEY Screener workflow and keeps things simple. 12 + 13 + But, please reach out to me and tell me which folders you need, maybe it's a folder that everyone might use, or otherwise, if I get enough request, I add a way to customize folders as I do with the sort order of folder tabs already. 14 + 12 15 16 + ### Advanced: Add custom folders yourself 13 17 14 - ```toml 15 - [folders] 16 - ...existing folders 17 - new = "NewMissingFolder" 18 - tab_order = ["inbox", "to_screen", "feed", "papertrail", "waiting", "someday", "scheduled", "sent", "work", "archive", "screened_out", "trash", "new"] 18 + You can fork neomd and modify the Go source code: 19 + 20 + 1. **Edit the code** (ask Claude to help with this): 21 + - Add a field to `FoldersConfig` struct in `internal/config/config.go` 22 + - Add entry to `keyToLabel` map 23 + - Optionally add keyboard shortcuts in `internal/ui/model.go` 24 + - Run `make build` to compile 25 + 2. **Create the IMAP folder** via webmail (e.g., "NewFolder") 26 + 3. **Configure it** in your `config.toml`: 27 + ```toml 28 + [folders] 29 + # ... existing folders ... 30 + new = "NewFolder" 31 + tab_order = ["inbox", "to_screen", "feed", "new", "sent", "archive"] 19 32 ``` 20 33 21 - If you want to move emails to that folder, or just move to it, that's currently not possible. You can always move through the tabs with `[]HL` or `space+1-10`, but you can't move emails to them yet. 34 + Once added this way, you can navigate to your custom folder with existing `[]HL` and `space+1-9`. If you added keyboard shortcuts in step 1, those will work too (e.g., gn / Mn). 22 35 23 36 ## Does the signature appear only in new messages, not in replies? 24 37
+2
docs/content/docs/keybindings.md
··· 40 40 | `gk` | go to ToScreen | 41 41 | `go` | go to ScreenedOut | 42 42 | `gw` | go to Waiting | 43 + | `gc` | go to Scheduled (calendar) | 43 44 | `gb` | go to Work (if configured) | 44 45 | `gm` | go to Someday | 45 46 | `gd` | go to Drafts | ··· 72 73 | `Mt` | move to Trash | 73 74 | `Mo` | move to ScreenedOut | 74 75 | `Mw` | move to Waiting | 76 + | `Mc` | move to Scheduled | 75 77 | `Mb` | move to Work (if configured) | 76 78 | `Mm` | move to Someday | 77 79 | `Mk` | move to ToScreen |
+2
internal/ui/keys.go
··· 31 31 {"gk", "go to ToScreen"}, 32 32 {"go", "go to ScreenedOut"}, 33 33 {"gw", "go to Waiting"}, 34 + {"gc", "go to Scheduled (calendar)"}, 34 35 {"gb", "go to Work (if configured)"}, 35 36 {"gm", "go to Someday"}, 36 37 {"gd", "go to Drafts"}, ··· 55 56 {"Mt", "move to Trash"}, 56 57 {"Mo", "move to ScreenedOut"}, 57 58 {"Mw", "move to Waiting"}, 59 + {"Mc", "move to Scheduled"}, 58 60 {"Mb", "move to Work (if configured)"}, 59 61 {"Mm", "move to Someday"}, 60 62 {"Mk", "move to ToScreen"},
+4 -2
internal/ui/model.go
··· 2194 2194 // ── Chord prefixes ────────────────────────────────────────────── 2195 2195 case "g": 2196 2196 m.pendingKey = "g" 2197 - m.status = "go to: gi inbox ga archive gf feed gp papertrail gt trash gs sent gk toscreen go screened-out gw waiting gm someday gd drafts gS spam ge everything gg top" 2197 + m.status = "go to: gi inbox ga archive gf feed gp papertrail gt trash gs sent gk toscreen go screened-out gw waiting gc scheduled gm someday gd drafts gS spam ge everything gg top" 2198 2198 return m, nil 2199 2199 2200 2200 case " ": // leader key — wait for digit or shortcut ··· 2204 2204 2205 2205 case "M": 2206 2206 m.pendingKey = "M" 2207 - m.status = "move to: Mi inbox Ma archive Mf feed Mp papertrail Mt trash Mo screened-out Mw waiting Mm someday" 2207 + m.status = "move to: Mi inbox Ma archive Mf feed Mp papertrail Mt trash Mo screened-out Mw waiting Mc scheduled Mm someday" 2208 2208 return m, nil 2209 2209 2210 2210 case ",": ··· 2660 2660 "a": "Archive", 2661 2661 "w": "Waiting", 2662 2662 "b": "Work", 2663 + "c": "Scheduled", 2663 2664 "m": "Someday", 2664 2665 "o": "ScreenedOut", 2665 2666 } ··· 2692 2693 "t": m.cfg.Folders.Trash, 2693 2694 "o": m.cfg.Folders.ScreenedOut, 2694 2695 "w": m.cfg.Folders.Waiting, 2696 + "c": m.cfg.Folders.Scheduled, 2695 2697 "m": m.cfg.Folders.Someday, 2696 2698 "k": m.cfg.Folders.ToScreen, 2697 2699 }