Fast mail client with Vim-inspired hotkeys, plain-text-first reading, and offline-capable PWA support.
🚧 WIP — This is early-stage software. Mail sync and sending are not yet implemented.
- Keyboard-first UI — global hotkeys, leader-key sequences, an
Escback-stack, and a⌘Kcommand palette. - Vimium-style link hints —
foverlays single-letter badges on visible rows; press a letter to jump. - Fast notmuch-backed search — full notmuch query syntax with paginated results.
- Reader + paginated list — deep-linkable URLs (
/folder/:id,/folder/:id/message/:id,/search?q=…), browser back/forward, reload-safe. - Attachments — HTML body parts and binary attachments surfaced uniformly.
- PWA — installable manifest, offline app shell, Background Sync outbox for offline send, Web Push for new mail, app-icon unread badge.
- CLI —
mailbrus message search/message readwithtext,json, andtoonoutput formats. - Desktop shell — same SPA wrapped in a Tauri window with a bundled
mailbrus-serversidecar.
flowchart LR
user(["User"])
subgraph frontend["Frontend (TypeScript)"]
spa["SvelteKit SPA<br/>+ Service Worker (PWA)"]
end
tauri["src-tauri<br/>desktop shell"]
cli["mailbrus-cli"]
subgraph rust["Rust workspace"]
server["mailbrus-server<br/>axum HTTP + JSON API"]
core["mailbrus-core<br/>Maildir / notmuch / SMTP"]
end
store[("Maildir + notmuch<br/>on disk")]
user --> spa
user --> tauri
user --> cli
tauri -- embeds --> spa
tauri -. spawns sidecar .-> server
spa -- HTTP/JSON --> server
server --> core
cli --> core
core --> store
The SPA is the only UI; it runs either in a browser as a PWA or inside a Tauri window where the desktop shell spawns mailbrus-server as a sidecar. The server and CLI both go through mailbrus-core, which talks to a local Maildir indexed by notmuch.
- Pimalaya — the heart of the mail stack.
mailbrus-corebuilds on the excellentio-emailandio-maildircoroutine libraries; SMTP sending is planned onio-smtp. Huge thanks to the Pimalaya project. - notmuch — fast, read-only indexed message search via the
notmuchRust crate. - Rust — workspace of
mailbrus-core,mailbrus-cli,mailbrus-server, andsrc-tauri. Server uses axum on tokio; messages are parsed withmail-parser. - Svelte 5 + SvelteKit — the SPA, styled with Tailwind CSS v4 and bits-ui primitives.
- Tauri 2 — the desktop shell.
- Playwright — end-to-end test runner; tests run inside a Nix devShell.
Mailbrus ships a hermetic Playwright suite that drives the real SPA against a real mailbrus-server backed by a real notmuch index — one freshly cloned mailbox and its own server per test, with guaranteed teardown. Nothing is mocked: every test exercises the browser → HTTP → notmuch → Maildir path end to end.
nix develop # notmuch + Playwright browsers
deno install # hydrate node_modules
deno task test:e2e # headless run
deno task e2e:ui # interactive UI modeSee docs/e2e-testing.md for the full architecture, fixture model, and trace-debugging workflow.
Requires Nix with flakes enabled.
# Run directly (ephemeral)
nix run github:antono/mailbrus
# Install to your profile
nix profile install github:antono/mailbrus
mailbrus --helpSee docs/development.md for server usage, CLI flags, and debug logging.




