{"id":51034504,"url":"https://github.com/antono/mailbrus","last_synced_at":"2026-06-22T04:00:57.665Z","repository":{"id":359508141,"uuid":"1245381731","full_name":"antono/mailbrus","owner":"antono","description":"Keyboard oriented email client","archived":false,"fork":false,"pushed_at":"2026-06-14T10:49:56.000Z","size":1867,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T12:22:43.209Z","etag":null,"topics":["email","himalaya","maildir","mutt","notmuch","pimalaya","rust","svelte","tauri-app"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/antono.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-21T07:05:45.000Z","updated_at":"2026-06-14T10:46:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/antono/mailbrus","commit_stats":null,"previous_names":["antono/mailbrus"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/antono/mailbrus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antono%2Fmailbrus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antono%2Fmailbrus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antono%2Fmailbrus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antono%2Fmailbrus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/antono","download_url":"https://codeload.github.com/antono/mailbrus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antono%2Fmailbrus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34633796,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["email","himalaya","maildir","mutt","notmuch","pimalaya","rust","svelte","tauri-app"],"created_at":"2026-06-22T04:00:56.712Z","updated_at":"2026-06-22T04:00:57.655Z","avatar_url":"https://github.com/antono.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mailbrus\n\nFast mail client with Vim-inspired hotkeys, plain-text-first reading, and offline-capable PWA support.\n\n\u003e 🚧 **WIP** — This is early-stage software. Mail sync and sending are **not yet implemented**.\n\n## Screenshots\n\n![About over list](docs/screenshots/about-over-list.png)\n\n\u003cdiv style=\"display: flex; flex-wrap: wrap; gap: 8px;\"\u003e\n  \u003ca href=\"docs/screenshots/message-list.png\"\u003e\u003cimg src=\"docs/screenshots/message-list.png\" width=\"180\" alt=\"Message list\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/screenshots/reader.png\"\u003e\u003cimg src=\"docs/screenshots/reader.png\" width=\"180\" alt=\"Reader\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/screenshots/accounts.png\"\u003e\u003cimg src=\"docs/screenshots/accounts.png\" width=\"180\" alt=\"Accounts\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/screenshots/compose.png\"\u003e\u003cimg src=\"docs/screenshots/compose.png\" width=\"180\" alt=\"Compose\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n## Features\n\n- **Keyboard-first UI** — global hotkeys, leader-key sequences, an `Esc` back-stack, and a `⌘K` command palette.\n- **Vimium-style link hints** — `f` overlays single-letter badges on visible rows; press a letter to jump.\n- **Fast notmuch-backed search** — full notmuch query syntax with paginated results.\n- **Reader + paginated list** — deep-linkable URLs (`/folder/:id`, `/folder/:id/message/:id`, `/search?q=…`), browser back/forward, reload-safe.\n- **Attachments** — HTML body parts and binary attachments surfaced uniformly.\n- **PWA** — installable manifest, offline app shell, Background Sync outbox for offline send, Web Push for new mail, app-icon unread badge.\n- **CLI** — `mailbrus message search` / `message read` with `text`, `json`, and `toon` output formats.\n- **Desktop shell** — same SPA wrapped in a Tauri window with a bundled `mailbrus-server` sidecar.\n\n## Architecture\n\n```mermaid\nflowchart LR\n  user([\"User\"])\n\n  subgraph frontend[\"Frontend (TypeScript)\"]\n    spa[\"SvelteKit SPA\u003cbr/\u003e+ Service Worker (PWA)\"]\n  end\n\n  tauri[\"src-tauri\u003cbr/\u003edesktop shell\"]\n  cli[\"mailbrus-cli\"]\n\n  subgraph rust[\"Rust workspace\"]\n    server[\"mailbrus-server\u003cbr/\u003eaxum HTTP + JSON API\"]\n    core[\"mailbrus-core\u003cbr/\u003eMaildir / notmuch / SMTP\"]\n  end\n\n  store[(\"Maildir + notmuch\u003cbr/\u003eon disk\")]\n\n  user --\u003e spa\n  user --\u003e tauri\n  user --\u003e cli\n  tauri -- embeds --\u003e spa\n  tauri -. spawns sidecar .-\u003e server\n  spa -- HTTP/JSON --\u003e server\n  server --\u003e core\n  cli --\u003e core\n  core --\u003e store\n```\n\nThe 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.\n\n## Dependencies\n\n- **[Pimalaya](https://github.com/pimalaya)** — the heart of the mail stack. `mailbrus-core` builds on the excellent [`io-email`](https://github.com/pimalaya/io-email) and [`io-maildir`](https://github.com/pimalaya/io-maildir) coroutine libraries; SMTP sending is planned on `io-smtp`. Huge thanks to the Pimalaya project.\n- **[notmuch](https://notmuchmail.org/)** — fast, read-only indexed message search via the `notmuch` Rust crate.\n- **[Rust](https://www.rust-lang.org/)** — workspace of `mailbrus-core`, `mailbrus-cli`, `mailbrus-server`, and `src-tauri`. Server uses [axum](https://github.com/tokio-rs/axum) on [tokio](https://tokio.rs/); messages are parsed with [`mail-parser`](https://crates.io/crates/mail-parser).\n- **[Svelte 5](https://svelte.dev/) + [SvelteKit](https://kit.svelte.dev/)** — the SPA, styled with [Tailwind CSS v4](https://tailwindcss.com/) and [bits-ui](https://bits-ui.com/) primitives.\n- **[Tauri 2](https://tauri.app/)** — the desktop shell.\n- **[Playwright](https://playwright.dev/)** — end-to-end test runner; tests run inside a [Nix](https://nixos.org/) devShell.\n\n## End-to-End Tests\n\nMailbrus 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.\n\n```sh\nnix develop          # notmuch + Playwright browsers\ndeno install         # hydrate node_modules\ndeno task test:e2e   # headless run\ndeno task e2e:ui     # interactive UI mode\n```\n\nSee [docs/e2e-testing.md](docs/e2e-testing.md) for the full architecture, fixture model, and trace-debugging workflow.\n\n## Installation\n\nRequires [Nix](https://nixos.org/download) with flakes enabled.\n\n```sh\n# Run directly (ephemeral)\nnix run github:antono/mailbrus\n\n# Install to your profile\nnix profile install github:antono/mailbrus\nmailbrus --help\n```\n\nSee [docs/development.md](docs/development.md) for server usage, CLI flags, and debug logging.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantono%2Fmailbrus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fantono%2Fmailbrus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantono%2Fmailbrus/lists"}