# zidan44/mailcraft architecture

> Architecture diagram of the GitHub repository zidan44/mailcraft, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/zidan44/mailcraft
- Repository: https://github.com/zidan44/mailcraft

## Overview

MailCraft is a local-first email client for desktop, CLI, and browser, with offline mail, calendar and people features, and command-driven actions. The main workflow runs from user commands or the UI through an engine session, which queues account work for network workers; synchronized mail is kept in the local store and rendered by the UI. The README documents broad protocol and product capabilities; source excerpts and the index support selected internal links. Some feature implementations were not sampled, so those links are documentation-based rather than claims of inspected call sites.

Main entry points: [`crates/engine/src/session.rs`](https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/session.rs) (Engine session), [`apps/mailcraft-web/src/main.rs`](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/main.rs) (Browser app), [`crates/net/src/worker.rs`](https://github.com/zidan44/mailcraft/blob/main/crates/net/src/worker.rs) (Account workers), [`crates/ui-egui/src/app/actions.rs`](https://github.com/zidan44/mailcraft/blob/main/crates/ui-egui/src/app/actions.rs) (Mail UI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["User experience"]
  node_desktop["Desktop app<br/>[main.rs]"]
  node_web["Browser app<br/>[main.rs]"]
  node_cli["CLI<br/>[main.rs]"]
  node_ui["Mail UI<br/>[actions.rs]"]
  node_ribbon["Ribbon<br/>[ribbon.rs]"]
  node_tray["Desktop tray<br/>[tray.rs]"]
end

subgraph group_engine["Commands and session"]
  node_commands["Command registry<br/>[cmd.rs]"]
  node_session["Engine session<br/>[session.rs]"]
  node_pim["Calendar and people<br/>[pim.rs]"]
  node_reminders["Task reminders<br/>[reminders.rs]"]
end

subgraph group_mail["Mail data and search"]
  node_store[("Local mail store<br/>[lib.rs]")]
  node_search[("Offline search<br/>[format.rs]")]
  node_search_model["Search language<br/>[search.rs]"]
  node_mime["Message reading and writing<br/>[html.rs]"]
  node_web_cache[("Browser cache<br/>[idb.rs]")]
end

subgraph group_connectivity["Sync and accounts"]
  node_workers["Account workers<br/>[worker.rs]"]
  node_sync["Mail sync<br/>[sync.rs]"]
  node_imports["Mail import<br/>[imports.rs]"]
  node_protocols["Mail protocols<br/>[protocols.rs]"]
  node_jmap["JMAP transport<br/>[lib.rs]"]
  node_web_backend["Browser backend<br/>[backend.rs]"]
  node_web_fetch["Browser fetch<br/>[fetch.rs]"]
end

subgraph group_extended["Extended capabilities"]
  node_pst["PST support<br/>[lib.rs]"]
  node_security["Message security<br/>[lib.rs]"]
  node_printing["Print and PDF<br/>[lib.rs]"]
end

node_user(("User"))

node_user -->|"opens"| node_desktop
node_user -->|"runs commands"| node_cli
node_user -->|"opens"| node_web
node_desktop -.->|"starts"| node_ui
node_web -->|"runs same UI"| node_ui
node_user -.->|"uses"| node_ui
node_ribbon -->|"runs actions"| node_commands
node_cli -->|"runs actions"| node_commands
node_commands -->|"dispatches"| node_session
node_session -->|"queues jobs"| node_workers
node_workers -->|"dispatches sync"| node_sync
node_workers -->|"dispatches imports"| node_imports
node_sync -.->|"syncs accounts"| node_protocols
node_sync -.->|"uses JMAP"| node_jmap
node_workers -.->|"updates local mail"| node_store
node_session -.->|"reads cached mail"| node_store
node_session -->|"searches offline"| node_search
node_search -.->|"indexes queries"| node_search_model
node_session -->|"reads and builds messages"| node_mime
node_session -->|"manages PIM"| node_pim
node_pim -->|"handles reminders"| node_reminders
node_web -->|"starts backend"| node_web_backend
node_web_backend -->|"fetches requests"| node_web_fetch
node_web_backend -->|"persists browser data"| node_web_cache
node_web -->|"keeps cache"| node_web_cache
node_session -.->|"opens and exports PST"| node_pst
node_session -.->|"signs and encrypts"| node_security
node_ui -.->|"prints and saves PDF"| node_printing
node_desktop -.->|"uses tray"| node_tray

click node_desktop "https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft/src/main.rs"
click node_web "https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/main.rs"
click node_cli "https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-cli/src/main.rs"
click node_ui "https://github.com/zidan44/mailcraft/blob/main/crates/ui-egui/src/app/actions.rs"
click node_ribbon "https://github.com/zidan44/mailcraft/blob/main/crates/ui-egui/src/app/ribbon.rs"
click node_commands "https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/cmd.rs"
click node_session "https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/session.rs"
click node_pim "https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/session/pim.rs"
click node_reminders "https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/session/pim/reminders.rs"
click node_workers "https://github.com/zidan44/mailcraft/blob/main/crates/net/src/worker.rs"
click node_sync "https://github.com/zidan44/mailcraft/blob/main/crates/net/src/worker/sync.rs"
click node_imports "https://github.com/zidan44/mailcraft/blob/main/crates/net/src/worker/imports.rs"
click node_protocols "https://github.com/zidan44/mailcraft/blob/main/crates/net/src/protocols.rs"
click node_jmap "https://github.com/zidan44/mailcraft/blob/main/crates/jmap/src/lib.rs"
click node_store "https://github.com/zidan44/mailcraft/blob/main/crates/store/src/lib.rs"
click node_search "https://github.com/zidan44/mailcraft/blob/main/crates/store/src/search/format.rs"
click node_search_model "https://github.com/zidan44/mailcraft/blob/main/crates/model/src/search.rs"
click node_mime "https://github.com/zidan44/mailcraft/blob/main/crates/mime/src/html.rs"
click node_pst "https://github.com/zidan44/mailcraft/blob/main/crates/pst/src/lib.rs"
click node_security "https://github.com/zidan44/mailcraft/blob/main/crates/smime/src/lib.rs"
click node_printing "https://github.com/zidan44/mailcraft/blob/main/crates/print/src/lib.rs"
click node_web_backend "https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/backend.rs"
click node_web_fetch "https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/fetch.rs"
click node_web_cache "https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/idb.rs"
click node_tray "https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft/src/desktop/tray.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_desktop,node_web,node_cli,node_ui,node_ribbon,node_tray,node_user toneBlue
class node_commands,node_session,node_pim,node_reminders toneAmber
class node_store,node_search,node_search_model,node_mime,node_web_cache toneMint
class node_workers,node_sync,node_imports,node_protocols,node_jmap,node_web_backend,node_web_fetch toneRose
class node_pst,node_security,node_printing toneIndigo
```

## Components

### User experience

- [Desktop app](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft/src/main.rs): `apps/mailcraft/src/main.rs`
- [Browser app](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/main.rs): `apps/mailcraft-web/src/main.rs`
- [CLI](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-cli/src/main.rs): `apps/mailcraft-cli/src/main.rs`
- [Mail UI](https://github.com/zidan44/mailcraft/blob/main/crates/ui-egui/src/app/actions.rs): `crates/ui-egui/src/app/actions.rs`
- [Ribbon](https://github.com/zidan44/mailcraft/blob/main/crates/ui-egui/src/app/ribbon.rs): `crates/ui-egui/src/app/ribbon.rs`
- [Desktop tray](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft/src/desktop/tray.rs): `apps/mailcraft/src/desktop/tray.rs`

### Commands and session

- [Command registry](https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/cmd.rs): `crates/engine/src/cmd.rs`
- [Engine session](https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/session.rs): `crates/engine/src/session.rs`
- [Calendar and people](https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/session/pim.rs): `crates/engine/src/session/pim.rs`
- [Task reminders](https://github.com/zidan44/mailcraft/blob/main/crates/engine/src/session/pim/reminders.rs): `crates/engine/src/session/pim/reminders.rs`

### Mail data and search

- [Local mail store](https://github.com/zidan44/mailcraft/blob/main/crates/store/src/lib.rs): `crates/store/src/lib.rs`
- [Offline search](https://github.com/zidan44/mailcraft/blob/main/crates/store/src/search/format.rs): `crates/store/src/search/format.rs`
- [Search language](https://github.com/zidan44/mailcraft/blob/main/crates/model/src/search.rs): `crates/model/src/search.rs`
- [Message reading and writing](https://github.com/zidan44/mailcraft/blob/main/crates/mime/src/html.rs): `crates/mime/src/html.rs`
- [Browser cache](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/idb.rs): `apps/mailcraft-web/src/idb.rs`

### Sync and accounts

- [Account workers](https://github.com/zidan44/mailcraft/blob/main/crates/net/src/worker.rs): `crates/net/src/worker.rs`
- [Mail sync](https://github.com/zidan44/mailcraft/blob/main/crates/net/src/worker/sync.rs): `crates/net/src/worker/sync.rs`
- [Mail import](https://github.com/zidan44/mailcraft/blob/main/crates/net/src/worker/imports.rs): `crates/net/src/worker/imports.rs`
- [Mail protocols](https://github.com/zidan44/mailcraft/blob/main/crates/net/src/protocols.rs): `crates/net/src/protocols.rs`
- [JMAP transport](https://github.com/zidan44/mailcraft/blob/main/crates/jmap/src/lib.rs): `crates/jmap/src/lib.rs`
- [Browser backend](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/backend.rs): `apps/mailcraft-web/src/backend.rs`
- [Browser fetch](https://github.com/zidan44/mailcraft/blob/main/apps/mailcraft-web/src/fetch.rs): `apps/mailcraft-web/src/fetch.rs`

### Extended capabilities

- [PST support](https://github.com/zidan44/mailcraft/blob/main/crates/pst/src/lib.rs): `crates/pst/src/lib.rs`
- [Message security](https://github.com/zidan44/mailcraft/blob/main/crates/smime/src/lib.rs): `crates/smime/src/lib.rs`
- [Print and PDF](https://github.com/zidan44/mailcraft/blob/main/crates/print/src/lib.rs): `crates/print/src/lib.rs`

### Other components

- **User**

## Connections

- User → Desktop app: opens
- User → CLI: runs commands
- User → Browser app: opens
- Desktop app → Mail UI: starts
- Browser app → Mail UI: runs same UI (evidence: `apps/mailcraft-web/src/main.rs`)
- User → Mail UI: uses
- Ribbon → Command registry: runs actions
- CLI → Command registry: runs actions
- Command registry → Engine session: dispatches (evidence: `crates/engine/src/session.rs`)
- Engine session → Account workers: queues jobs (evidence: `crates/engine/src/session.rs`)
- Account workers → Mail sync: dispatches sync (evidence: `crates/net/src/worker.rs`)
- Account workers → Mail import: dispatches imports (evidence: `crates/net/src/worker.rs`)
- Mail sync → Mail protocols: syncs accounts
- Mail sync → JMAP transport: uses JMAP
- Account workers → Local mail store: updates local mail
- Engine session → Local mail store: reads cached mail
- Engine session → Offline search: searches offline
- Offline search → Search language: indexes queries
- Engine session → Message reading and writing: reads and builds messages (evidence: `crates/engine/src/session.rs`)
- Engine session → Calendar and people: manages PIM (evidence: `crates/engine/src/session/pim.rs`)
- Calendar and people → Task reminders: handles reminders (evidence: `crates/engine/src/session/pim.rs`)
- Browser app → Browser backend: starts backend (evidence: `apps/mailcraft-web/src/main.rs`)
- Browser backend → Browser fetch: fetches requests (evidence: `apps/mailcraft-web/src/backend.rs`)
- Browser backend → Browser cache: persists browser data (evidence: `apps/mailcraft-web/src/backend.rs`)
- Browser app → Browser cache: keeps cache (evidence: `apps/mailcraft-web/src/main.rs`)
- Engine session → PST support: opens and exports PST
- Engine session → Message security: signs and encrypts
- Mail UI → Print and PDF: prints and saves PDF
- Desktop app → Desktop tray: uses tray
