···11+# Binary
22+neomd
33+44+# Go build cache
55+*.test
66+*.out
77+88+# Config with real credentials (use config.toml.example instead)
99+config.toml
1010+1111+# Editor temp files (compose buffers)
1212+neomd-*.md
1313+1414+# OS
1515+.DS_Store
+42
Makefile
···11+BINARY := neomd
22+CMD := ./cmd/neomd
33+INSTALL := $(HOME)/.local/bin
44+55+.PHONY: build run install clean test vet fmt lint tidy
66+77+## build: compile the binary into ./neomd
88+build:
99+ go build -o $(BINARY) $(CMD)
1010+1111+## run: build and run (pass ARGS="--config /path/to/config.toml" to override)
1212+run: build
1313+ ./$(BINARY) $(ARGS)
1414+1515+## install: install the binary to ~/.local/bin
1616+install: build
1717+ install -Dm755 $(BINARY) $(INSTALL)/$(BINARY)
1818+ @echo "Installed to $(INSTALL)/$(BINARY)"
1919+2020+## test: run all tests
2121+test:
2222+ go test ./...
2323+2424+## vet: run go vet
2525+vet:
2626+ go vet ./...
2727+2828+## fmt: format all Go source files
2929+fmt:
3030+ gofmt -w .
3131+3232+## tidy: tidy go.mod and go.sum
3333+tidy:
3434+ go mod tidy
3535+3636+## clean: remove the compiled binary
3737+clean:
3838+ rm -f $(BINARY)
3939+4040+## help: print this help
4141+help:
4242+ @grep -E '^## ' Makefile | sed 's/^## //'
+137
README.md
···11+# neomd
22+33+A minimal terminal email client for people who write in Markdown and live in Neovim.
44+55+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.
66+77+## Features
88+99+- **Write in Markdown, send beautifully** — compose in `$EDITOR` (defaults to `nvim`), send as `multipart/alternative`: raw Markdown as plain text + goldmark-rendered HTML so recipients get clickable links and formatting
1010+- **Glamour reading** — incoming emails rendered as styled Markdown in the terminal
1111+- **HEY-style screener** — unknown senders land in `ToScreen`; press `I/O/F/P` to approve, block, mark as Feed, or mark as PaperTrail; reuses your existing `screened_in.txt` lists from neomutt
1212+- **Folder tabs** — switch between Inbox, ToScreen, Feed, and PaperTrail with `Tab`
1313+- **IMAP + SMTP** — direct connection, no local sync daemon required
1414+1515+## Install
1616+1717+```sh
1818+git clone https://github.com/sspaeti/neomd
1919+cd neomd
2020+make install # installs to ~/.local/bin/neomd
2121+```
2222+2323+Or just build locally:
2424+2525+```sh
2626+make build
2727+./neomd
2828+```
2929+3030+## Configuration
3131+3232+On first run, neomd creates `~/.config/neomd/config.toml` with placeholders:
3333+3434+```toml
3535+[account]
3636+name = "Personal"
3737+imap = "imap.example.com:993" # :993 = TLS, :143 = STARTTLS
3838+smtp = "smtp.example.com:587"
3939+user = "me@example.com"
4040+password = "app-password"
4141+from = "Me <me@example.com>"
4242+4343+[screener]
4444+# reuse your existing neomutt allowlist files
4545+screened_in = "~/.config/mutt/screened_in.txt"
4646+screened_out = "~/.config/mutt/screened_out.txt"
4747+feed = "~/.config/mutt/feed.txt"
4848+papertrail = "~/.config/mutt/papertrail.txt"
4949+5050+[folders]
5151+inbox = "INBOX"
5252+sent = "Sent"
5353+trash = "Trash"
5454+to_screen = "ToScreen"
5555+feed = "Feed"
5656+papertrail = "PaperTrail"
5757+screened_out = "ScreenedOut"
5858+5959+[ui]
6060+theme = "dark" # dark | light | auto
6161+inbox_count = 50
6262+```
6363+6464+Use an app-specific password (Gmail, Fastmail, etc.) rather than your main account password.
6565+6666+## Keybindings
6767+6868+### Inbox
6969+7070+| Key | Action |
7171+|-----|--------|
7272+| `j` / `k` | Navigate up/down |
7373+| `Enter` | Open email |
7474+| `c` | Compose new email |
7575+| `Tab` | Switch folder (Inbox → ToScreen → Feed → PaperTrail) |
7676+| `r` | Refresh current folder |
7777+| `/` | Filter emails |
7878+| `q` | Quit |
7979+8080+### ToScreen folder
8181+8282+| Key | Action |
8383+|-----|--------|
8484+| `I` | Approve sender → move to Inbox, add to `screened_in.txt` |
8585+| `O` | Block sender → move to ScreenedOut, add to `screened_out.txt` |
8686+| `F` | Mark as Feed → move to Feed folder, add to `feed.txt` |
8787+| `P` | Mark as PaperTrail → move to PaperTrail, add to `papertrail.txt` |
8888+8989+### Reading
9090+9191+| Key | Action |
9292+|-----|--------|
9393+| `j` / `k` / `Space` | Scroll |
9494+| `q` / `Esc` | Back to inbox |
9595+9696+### Composing
9797+9898+| Key | Action |
9999+|-----|--------|
100100+| `Tab` / `Enter` | Move to next field |
101101+| `Enter` (on Subject) | Open `$EDITOR` with a `.md` temp file |
102102+| `Esc` | Cancel |
103103+104104+After saving and closing the editor, the email is sent automatically.
105105+106106+## How Sending Works
107107+108108+neomd sends every email as `multipart/alternative`:
109109+110110+- **`text/plain`** — the raw Markdown you wrote (readable as-is in any client)
111111+- **`text/html`** — rendered by [goldmark](https://github.com/yuin/goldmark) with a clean CSS wrapper
112112+113113+This means recipients using Gmail, Apple Mail, Outlook, etc. see properly formatted links, bold, headers, and code blocks — while you write nothing but Markdown.
114114+115115+## Make Targets
116116+117117+```
118118+make build compile ./neomd
119119+make run build and run
120120+make install install to ~/.local/bin
121121+make test run tests
122122+make vet go vet
123123+make fmt gofmt -w .
124124+make tidy go mod tidy
125125+make clean remove compiled binary
126126+make help print this list
127127+```
128128+129129+## Stack
130130+131131+- [Bubble Tea](https://github.com/charmbracelet/bubbletea) — TUI framework
132132+- [Bubbles](https://github.com/charmbracelet/bubbles) — list, viewport, textinput components
133133+- [Glamour](https://github.com/charmbracelet/glamour) — Markdown → terminal rendering
134134+- [Lipgloss](https://github.com/charmbracelet/lipgloss) — styling
135135+- [go-imap/v2](https://github.com/emersion/go-imap) — IMAP client
136136+- [go-message](https://github.com/emersion/go-message) — MIME parsing
137137+- [goldmark](https://github.com/yuin/goldmark) — Markdown → HTML for sending
+329
_prompts/prompt-plan.md
···11+# Plan: neomd — Minimal Neovim-flavored Markdown Email Client
22+33+## Context
44+55+The user wants a small, beautiful terminal email client that feels like neomutt but is built from scratch with a simpler codebase. Key motivations:
66+- Write and read emails in Markdown (composed in neovim, rendered with glamour)
77+- HEY-style screener: folder/tag-based inbox gating (allowlist already exists)
88+- Send as multipart/alternative (plain text + minimal HTML) so links and formatting render nicely for recipients
99+- Charmbracelet aesthetic (bubbletea TUI, glamour, lipgloss)
1010+- Go (preferred, already used in msgvault and hey-cli)
1111+1212+MVP scope: **Inbox list → Read email → Compose in neovim → Send via SMTP**
1313+1414+---
1515+1616+## Architecture
1717+1818+```
1919+neomd/
2020+├── cmd/neomd/
2121+│ └── main.go # entry point: load config, start bubbletea
2222+├── internal/
2323+│ ├── config/
2424+│ │ └── config.go # TOML reader → ~/.config/neomd/config.toml
2525+│ ├── imap/
2626+│ │ └── client.go # go-imap/v2: connect, list folders, fetch, move
2727+│ ├── smtp/
2828+│ │ └── sender.go # net/smtp TLS: build multipart/alt MIME, send
2929+│ ├── screener/
3030+│ │ ├── screener.go # load/save allowlists; classify incoming email
3131+│ │ └── lists.go # read screened_in.txt, screened_out.txt, feed.txt, papertrail.txt
3232+│ ├── editor/
3333+│ │ └── editor.go # spawn $EDITOR (nvim), return tmp file content
3434+│ ├── render/
3535+│ │ ├── markdown.go # glamour: markdown → ANSI for viewport
3636+│ │ └── html.go # goldmark: markdown → HTML (for sending)
3737+│ └── ui/
3838+│ ├── model.go # root bubbletea Model, viewState enum, Update, View
3939+│ ├── inbox.go # bubbles/list for inbox, folder switcher
4040+│ ├── reader.go # bubbles/viewport for reading email
4141+│ ├── compose.go # bubbles/textinput (To, Subject), then nvim
4242+│ └── styles.go # lipgloss palette and layout
4343+├── go.mod
4444+└── go.sum
4545+```
4646+4747+---
4848+4949+## Key Dependencies
5050+5151+```
5252+github.com/charmbracelet/bubbletea v1.3.x # TUI (same as msgvault)
5353+github.com/charmbracelet/bubbles v1.x # list, viewport, textinput, spinner
5454+github.com/charmbracelet/glamour v0.x # markdown → ANSI rendering
5555+github.com/charmbracelet/lipgloss v1.x # styling
5656+github.com/emersion/go-imap/v2 v2.x # IMAP (already proven in msgvault)
5757+github.com/emersion/go-message v0.18.x # MIME/header parsing
5858+github.com/yuin/goldmark v1.x # Markdown → HTML for sending
5959+github.com/BurntSushi/toml v1.x # config (same as msgvault)
6060+```
6161+6262+---
6363+6464+## Config File
6565+6666+`~/.config/neomd/config.toml` (auto-created with placeholder on first run):
6767+6868+```toml
6969+[account]
7070+name = "Personal"
7171+imap = "imap.example.com:993" # TLS; :143 + starttls = true for STARTTLS
7272+smtp = "smtp.example.com:587"
7373+user = "me@example.com"
7474+password = "app-password"
7575+from = "Me <me@example.com>"
7676+7777+[screener]
7878+# paths to existing allowlist files (reuse from neomutt setup)
7979+screened_in = "~/.config/mutt/screened_in.txt"
8080+screened_out = "~/.config/mutt/screened_out.txt"
8181+feed = "~/.config/mutt/feed.txt"
8282+papertrail = "~/.config/mutt/papertrail.txt"
8383+8484+[folders]
8585+inbox = "INBOX"
8686+sent = "Sent"
8787+trash = "Trash"
8888+drafts = "Drafts"
8989+to_screen = "ToScreen"
9090+feed = "Feed"
9191+papertrail = "PaperTrail"
9292+screened_out = "ScreenedOut"
9393+9494+[ui]
9595+theme = "dark" # dark | light | auto
9696+inbox_count = 50
9797+```
9898+9999+---
100100+101101+## TUI State Machine
102102+103103+```
104104+viewState enum:
105105+ stateInbox → bubbles/list of email summaries
106106+ stateReading → bubbles/viewport with glamour-rendered body
107107+ stateCompose → textinput for To/Subject, then hands off to $EDITOR
108108+ stateToScreen → list of unscreened senders awaiting decision
109109+110110+Transitions:
111111+ Inbox →[Enter]→ Reading
112112+ Inbox →[c]→ Compose
113113+ Inbox →[Tab]→ cycle folders (Inbox / ToScreen / Feed / PaperTrail)
114114+ ToScreen →[I]→ approve sender → add to screened_in.txt, move to INBOX
115115+ ToScreen →[O]→ block sender → add to screened_out.txt, move to ScreenedOut
116116+ ToScreen →[F]→ mark as Feed → add to feed.txt, move to Feed
117117+ ToScreen →[P]→ mark PaperTrail → add to papertrail.txt, move to PaperTrail
118118+ Reading →[q]→ Inbox
119119+ Compose →[Enter after Subject]→ suspend TUI → nvim → resume → send → Inbox
120120+```
121121+122122+---
123123+124124+## IMAP Flow (internal/imap/client.go)
125125+126126+Adapted from `/home/sspaeti/git/email/msgvault/internal/imap/client.go`:
127127+128128+- `Connect()` → `imapclient.DialTLS` or `DialStartTLS`
129129+- `FetchHeaders(folder string, n int) []EmailSummary` → SELECT folder, UID FETCH last N with ENVELOPE
130130+- `FetchBody(uid uint32) string` → UID FETCH BODY[], parse with go-message:
131131+ - Prefer `text/plain` part
132132+ - Fall back to stripping `text/html` if no plain part
133133+- `MoveMessage(uid, from, to string)` → UID COPY + UID STORE \Deleted + EXPUNGE
134134+135135+Async pattern: bubbletea `tea.Cmd` functions emit typed messages (`inboxLoadedMsg`, `bodyLoadedMsg`, `errMsg`).
136136+137137+**Offline support (future):** Architecture leaves room to swap the IMAP client for a Maildir reader (mbsync-synced local Maildir). The `imap.Client` interface can be backed by either live IMAP or local Maildir — same interface, swap implementation. For now: live IMAP only.
138138+139139+---
140140+141141+## Screener (internal/screener/)
142142+143143+Reuses the four existing plain-text lists from the neomutt setup:
144144+```
145145+screened_in.txt — approved senders (one email per line)
146146+screened_out.txt — blocked senders
147147+feed.txt — newsletter/feed senders
148148+papertrail.txt — receipt/notification senders
149149+```
150150+151151+```go
152152+type Screener struct {
153153+ screenedIn []string // loaded at startup
154154+ screenedOut []string
155155+ feed []string
156156+ papertrail []string
157157+}
158158+159159+func (s *Screener) Classify(from string) Category
160160+// Category: Inbox | ToScreen | ScreenedOut | Feed | PaperTrail
161161+162162+func (s *Screener) Approve(email string) error // append to screened_in.txt
163163+func (s *Screener) Block(email string) error // append to screened_out.txt
164164+func (s *Screener) MarkFeed(email string) error // append to feed.txt
165165+func (s *Screener) MarkPaperTrail(email string) // append to papertrail.txt
166166+```
167167+168168+On startup, neomd can optionally run a screening pass on INBOX: any unrecognized sender is moved to `ToScreen` (same logic as `initial_screening.sh`).
169169+170170+---
171171+172172+## Sending: Multipart/Alternative (plain text + HTML)
173173+174174+**The problem with plain text only:** markdown syntax like `[link](url)` shows as literal text. Links are unclickable. Bold `**text**` shows with asterisks.
175175+176176+**Solution:** Send as `multipart/alternative` — every mail client picks the best part:
177177+- `text/plain` — the raw markdown as typed (readable, no rendering needed)
178178+- `text/html` — goldmark-converted HTML wrapped in a minimal CSS template
179179+180180+```go
181181+// internal/render/html.go
182182+func MarkdownToHTML(md string) (string, error) {
183183+ // Use goldmark to convert markdown → HTML fragment
184184+ // Wrap in minimal template (derived from listmonk template):
185185+ // max-width 650px, system fonts, styled links, <pre> for code
186186+ // No tracking pixels, no complex layout
187187+}
188188+189189+// internal/smtp/sender.go
190190+func Send(cfg Config, to, subject, markdownBody string) error {
191191+ plainText := markdownBody // raw markdown = readable plain text
192192+ htmlBody, _ := render.MarkdownToHTML(markdownBody)
193193+194194+ // Build multipart/alternative MIME message
195195+ // Part 1: text/plain; charset=utf-8
196196+ // Part 2: text/html; charset=utf-8
197197+ // Headers: From, To, Subject, Date, Message-ID
198198+ // Send via net/smtp with STARTTLS
199199+}
200200+```
201201+202202+**Minimal HTML wrapper** (inlined from listmonk template, stripped to essentials):
203203+```html
204204+<html><body style="font-family:system-ui,sans-serif;max-width:650px;
205205+ margin:0 auto;padding:20px;color:#333;line-height:1.6">
206206+ {{ BODY }}
207207+</body></html>
208208+```
209209+210210+This gives recipients proper link rendering, bold/italic, code blocks — while the sender still writes pure markdown in neovim.
211211+212212+Reference template: `/home/sspaeti/git/sspaeti.com/listmonk/misc/email-template.html`
213213+Pandoc template (for design reference): `/home/sspaeti/git/general/dotfiles/mutt/.config/mutt/templates/email.html`
214214+215215+---
216216+217217+## Editor Flow (internal/editor/editor.go)
218218+219219+```go
220220+func Compose(prelude string) (string, error) {
221221+ // prelude = "To: ...\nSubject: ...\n\n---\n\n" for context
222222+ f, _ := os.CreateTemp("", "neomd-*.md")
223223+ f.WriteString(prelude)
224224+ f.Close()
225225+226226+ editor := os.Getenv("EDITOR")
227227+ if editor == "" { editor = "nvim" }
228228+229229+ cmd := exec.Command(editor, f.Name())
230230+ cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
231231+ cmd.Run()
232232+233233+ content, _ := os.ReadFile(f.Name())
234234+ os.Remove(f.Name())
235235+ return string(content), nil
236236+}
237237+```
238238+239239+The bubbletea program calls `tea.Suspend` before spawning nvim, then `tea.Resume` after — same pattern hey-cli uses for external processes.
240240+241241+---
242242+243243+## Inbox View (ui/inbox.go)
244244+245245+- `bubbles/list` with custom `ItemDelegate`
246246+- Each row: `● From │ Subject │ Date` (● = unread indicator)
247247+- Tab key cycles folders: `Inbox` → `ToScreen` → `Feed` → `PaperTrail`
248248+- Folder name shown in header via lipgloss
249249+- Spinner while fetching via `bubbles/spinner`
250250+251251+## Reader View (ui/reader.go)
252252+253253+- `bubbles/viewport` with glamour-rendered body
254254+- Lipgloss bordered header block: From / To / Subject / Date
255255+- `j/k/Space/PgDn` scroll, `q` back to inbox
256256+257257+## Compose View (ui/compose.go)
258258+259259+- Two `bubbles/textinput` fields: **To** and **Subject**
260260+- Tab moves between fields; Enter on Subject → suspend → nvim → resume → send
261261+- Status message in inbox after send
262262+263263+---
264264+265265+## Files to Create (all new in /home/sspaeti/git/email/neomd/)
266266+267267+```
268268+go.mod
269269+go.sum (after go mod tidy)
270270+cmd/neomd/main.go
271271+internal/config/config.go
272272+internal/imap/client.go ← adapt from msgvault
273273+internal/smtp/sender.go
274274+internal/screener/screener.go
275275+internal/screener/lists.go
276276+internal/editor/editor.go
277277+internal/render/markdown.go
278278+internal/render/html.go
279279+internal/ui/model.go
280280+internal/ui/inbox.go
281281+internal/ui/reader.go
282282+internal/ui/compose.go
283283+internal/ui/styles.go
284284+```
285285+286286+---
287287+288288+## Reference Files
289289+290290+| Purpose | File |
291291+|---------|------|
292292+| IMAP client pattern | `/home/sspaeti/git/email/msgvault/internal/imap/client.go` |
293293+| TUI state machine | `/home/sspaeti/git/email/hey-cli/internal/tui/tui.go` |
294294+| Config parsing | `/home/sspaeti/git/email/msgvault/internal/config/config.go` |
295295+| Screener lists (reuse) | `/home/sspaeti/git/general/dotfiles/mutt/.config/mutt/screened_in.txt` etc. |
296296+| Screener bash logic | `/home/sspaeti/git/general/dotfiles/mutt/.config/mutt/initial_screening.sh` |
297297+| HTML email template | `/home/sspaeti/git/sspaeti.com/listmonk/misc/email-template.html` |
298298+| Pandoc email template | `/home/sspaeti/git/general/dotfiles/mutt/.config/mutt/templates/email.html` |
299299+| SMTP config reference | `/home/sspaeti/git/general/dotfiles/mutt/.msmtprc` |
300300+| Neomutt C source | `/home/sspaeti/git/email/neomutt/` (reference for edge cases: imap/, notmuch/) |
301301+302302+---
303303+304304+## Offline Support (Future, not MVP)
305305+306306+Architecture is designed for this. The IMAP layer will expose an interface:
307307+308308+```go
309309+type MailStore interface {
310310+ FetchHeaders(folder string, n int) ([]EmailSummary, error)
311311+ FetchBody(folder string, uid uint32) (string, error)
312312+ MoveMessage(uid uint32, from, to string) error
313313+}
314314+```
315315+316316+MVP: `ImapStore` (live connection via go-imap/v2).
317317+Future: `MaildirStore` (local sync via mbsync → reads Maildir directly, no network needed).
318318+319319+---
320320+321321+## Verification
322322+323323+1. `go build ./cmd/neomd` — compiles cleanly
324324+2. Fill `~/.config/neomd/config.toml` with real IMAP/SMTP credentials
325325+3. `./neomd` → inbox loads, emails listed with sender/subject/date
326326+4. Tab → switch to ToScreen folder; press `I` on an email → sender added to screened_in.txt
327327+5. Enter on inbox email → glamour-rendered body in viewport
328328+6. Press `c` → fill To/Subject → nvim opens `neomd-*.md` → write markdown → save → email sent
329329+7. Recipient receives email with properly rendered HTML (links clickable, bold/italic work) and plain text fallback
+49
_prompts/prompt.md
···11+# neomd
22+I love neovim! I love RSS reader like newsboat (dotfiles...
33+44+and general TUIs, I use a lot of them.
55+66+See my configs in dotfiles (its with stow, so there hidden files) - e.g. check out my customization and shortcuts for neomutt in) - e.g. check out my customization and shortcuts for neomutt in /home/sspaeti/git/general/dotfiles/mutt - I even built a screener that was in HEY.com/ which i like a lot and which is my client I use: https://www.hey.com/features/the-screener/ - there's also a CLI now see /home/sspaeti/git/email/hey-cli
77+88+99+On hackernews I just saw this: https://www.emailmd.dev/, sending email as markdown.
1010+1111+1212+That made me thinking, how hard would it be, to have similar experience with neomutt, but much simpler for some key features - to send and view emails that are configured via IMAP or similar?
1313+1414+1515+With all the dotfiles available and code from HEY cli, newsboat or neomutt, how would I build something similar to send email with neovim and read too, everything based on Markdown?
1616+1717+Maybe we can also use https://github.com/kepano/defuddle (code here: /home/sspaeti/git/email/defuddle) that converts any HTML into Markdown and then we have emailmd.dev to convert MD to HTML.
1818+1919+2020+TO be hontest, I don't even want to send HTML, i just want to send simple text. E.g. in my newsletter I have this template which is simple and I like (/home/sspaeti/git/sspaeti.com/listmonk/misc/email-template.html) so maybe we can make a very simple template, or none at all, just plain markdown converted to plain text.
2121+2222+but having links and headers would be nice still, or bold, italic etc. some basic fomrattings.
2323+2424+2525+Please research what's the easiest way to build a terminal based email client that works with neovim and markdown similar to neomutt, but simple, built from scratch - use any library that's useful such as crush to make beautiful, or Ratatui to create terminal UIs (don't create everything from scratch, just the summarized tool).
2626+2727+I guess prefered languages are Rust or Go (e.g. /home/sspaeti/git/email/msgvault was recently built with Go and is also to do with email, also hey-cli is written in go).
2828+2929+Also use https://github.com/charmbracelet/gum for making the CLI or TUI nice, similar to or https://github.com/charmbracelet/glamour to make render Markdown in the terminal.
3030+3131+Speaking of aestetics, there's also pop email for go: https://github.com/charmbracelet/pop
3232+3333+3434+3535+## Updates/additions #1
3636+3737+1. i added neomutt code /home/sspaeti/git/email/neomutt, it's in C but it can help if we need to solve something complex or as they probably have solved all ways of email.
3838+3939+2. for offline availablility neomutt used /home/sspaeti/git/general/dotfiles/mutt/.msmtprc (i blieve??) which could be used, but don't have too, at least it seems to work. but if there's a simpler or direct go implementation, even better. but offline support is something that would be great too, at some point. But IMAP is also ok to start without offline.
4040+4141+3. can you prepare the architecture to have the HEY Screener that only allows emails in inbox that are approved in a screened_in.txt list e.g. all the code in bash and for different folder such as inbox (screened in only) screened out, papertrail for receipts etc and feed for newsletter etc. all code is in /home/sspaeti/git/general/dotfiles/mutt/.config/mutt. can we if not yet implement, at least
4242+4343+4444+## Created Claude Plan
4545+/home/sspaeti/.claude/plans/giggly-juggling-hinton.md
4646+[plan](prompt-plan.md)
4747+4848+4949+