···1515- **`\Answered` flag on reply** — after sending a reply, the original email is automatically marked as `\Answered` on the IMAP server
1616- **Conversation thread view (`T` / `:thread`)** — press `T` from inbox list or reader to see the full conversation across folders (Inbox, Sent, Archive, Waiting, Work, etc.); searches by normalized subject + participant overlap; displays in a temporary "Thread" tab with `[Folder]` prefix and `│`/`╰` threading connectors; esc returns to previous view
1717- **Custom folder support (`work`)** — optional `work = "Work"` in `[folders]` config; add `"work"` to `tab_order` to show as a tab; `gb` to go, `Mb` to move; auto-created on first run if configured; included in Everything, Search, and conversation views
1818+- **Inline images in browser preview** — pressing `O` to open an email in the browser now shows inline images from other senders; `cid:` references are rewritten to temp files so the browser can display them; previously only your own sent emails rendered images correctly
1919+- **`compose_editor` config option** — optional `compose_editor` in `[ui]` to use a different editor for compose/reply/forward (e.g. `"nvim --appname nvim-wp"`); defaults to `$EDITOR` / `nvim`
18201921# 2026-04-05
2022- **OAuth2 authentication** ([#3](https://github.com/ssp-data/neomd/pull/3), thanks [@notthatjesus](https://github.com/notthatjesus)) — accounts can set `auth_type = "oauth2"` with `oauth2_client_id`, `oauth2_client_secret`, `oauth2_issuer_url`, and `oauth2_scopes` instead of a password; on first launch neomd opens the browser for the authorization code flow, persists the token to `~/.config/neomd/tokens/<account>.json`, and refreshes it automatically; works with Gmail, Office365, and any OIDC-discoverable provider via XOAUTH2 over IMAP and SMTP; password auth paths unchanged for existing accounts
+2
docs/reading.md
···27272828**Inline / attached images** (e.g. screenshots pasted into an email) are listed in the reader header: `Attach: [1] screenshot.png [2] report.pdf`. Press `1`–`9` to download to `~/Downloads/` and open with `xdg-open`. Inline images also show `[Image: filename.png]` placeholders at their position in the body text.
29293030+When you press `O` to open in the browser, inline images are extracted from the email and saved to temp files. The HTML `cid:` references are rewritten to `file://` paths so the browser renders them — including images sent by other people (not just your own).
3131+3032## Links
31333234Links in emails are automatically numbered inline where they appear in the body. A link like `Check out our blog` renders as `Check out our blog [1]` in the terminal.
+4-1
internal/imap/client.go
···2828type Attachment struct {
2929 Filename string // from Content-Disposition filename or Content-Type name param
3030 ContentType string // e.g. "application/pdf"
3131+ ContentID string // Content-ID without angle brackets (for inline cid: references)
3132 Data []byte
3233}
3334···986987 }
987988 }
988989 // Map Content-ID → filename so we can inject alt text into the HTML
989989- if cid := strings.Trim(h.Get("Content-ID"), "<>"); cid != "" {
990990+ cid := strings.Trim(h.Get("Content-ID"), "<>")
991991+ if cid != "" {
990992 cidToName[cid] = filename
991993 }
992994 data, _ := io.ReadAll(p.Body)
993995 attachments = append(attachments, Attachment{
994996 Filename: filename,
995997 ContentType: ct,
998998+ ContentID: cid,
996999 Data: data,
9971000 })
9981001 continue