# lazymail A TUI for the git mailing list. ## Status Early scaffold: a Lazygit-style TUI over in-memory mock data, with a real on-disk file picker for patch attachments. - **Browse** — three panes: threads, messages, preview. - **Participants** — filter threads and messages by participant (`f`), or narrow to the selected thread's author with one key (`F`). - **Preview** — shows the message body with any inline diff hidden; press `p` to open the patch in a wide overlay. - **Live** — threads and messages auto-refresh on a 2s tick while live (`t`). - **Sender** — a separate screen for composing and sending a patch series (`s`), with a yazi-like file picker rooted at `$HOME`. - **Help** — `?` separates global keybinds from context-local ones. The real backend will fetch each list's public-inbox archive (e.g. [`lore.kernel.org/git`](https://lore.kernel.org/git/)) or shell out to `b4`/`lei`. Sending is not implemented yet. ## Layout Browse: ``` ┌ lazymail · git.vger.kernel.org ● LIVE · ⌕ vdye@github.com 8 threads ┐ ├─ Threads (25%) ────┬─ Messages (35%) ──────────┬─ Preview ─────────────────────┤ │ ▍[PATCH v4 0/5]... │ ▍[PATCH v4 0/5] cover ... │ From: Victoria Dye │ │ author · date │ From ... · to git@... │ Date: ... │ │ [PATCH v2 0/2]... │ [PATCH v4 1/5] ... │ Subject: [PATCH v4 0/5] ... │ │ ... │ ... │ body (diff hidden) │ │ │ │ patch hidden · press p │ ├────────────────────┴───────────────────────────┴───────────────────────────────┤ │ 1-3 focus · Tab cycle · j/k move · / filter · f participants · p patch ... │ └─────────────────────────────────────────────────────────────────────────────────┘ ``` Sender (the right column is the file picker, active while the `Patches` field is focused): ``` ┌ lazymail · sender · git.vger.kernel.org ───────────────────────────────────────┐ ├─ Compose ──────────────────────────────────┬─ ~/patches/v4 ─────────────────────┤ │ ▸ To: git@vger.kernel.org │ ../ │ │ Cc: (none) │ ▍0001-refs-reftable.patch 3.2 KB │ │ Subject: [PATCH 0/2] ... │ 0002-tests.patch 1.1 KB │ │ Body: │ README.md │ │ Cover letter stub. │ │ ├────────────────────────────────────────────┴────────────────────────────────────┤ │ tab field · ←/→ cursor · j/k picker · enter attach · . hidden · ^S send ... │ └─────────────────────────────────────────────────────────────────────────────────┘ ``` ## Run ```sh cargo run ``` Keys: - **Browse**: `1`/`2`/`3` or `Tab`/`h`/`l` focus panes · `j`/`k` or arrows move · `enter` drill into the next pane (threads → messages → preview) · `PgUp`/`PgDn` scroll the preview · `/` text filter · `f` participant filter · `F` filter by the selected thread's author · `c` clear participant filter · `p` open the patch overlay (Preview focused) · `t` toggle live refresh · `r` refresh · `L` mailing lists · `s` sender · `?` help · `q` quit. - **Participants**: type to search · `j`/`k` move · `enter` apply · `esc` close. - **Patch overlay**: `j`/`k` scroll · `esc`/`p`/`enter` close. - **Lists**: `j`/`k` move · `enter` switch list · `esc` close. - **Sender**: `Tab` cycle fields · arrows/`Home`/`End` move the cursor · `Backspace`/`Delete` edit · in the `Patches` field `j`/`k` move the picker, `l`/`Right`/`enter` open a directory or attach a file, `h`/`Left`/`Backspace` go up, `.` toggle hidden files, `J`/`K` move the attached-patch selection, `a` add a stub patch, `d` remove · `Ctrl+S` send (stub) · `esc` back. - **Help**: `?` shows global bindings first, then the bindings local to the current screen, mode, and focused pane.