Built on top of Mailspring (GitHub). This project is a fork of the Mailspring sync engine — we wrote a new frontend, but the C++
mailsyncbinary that handles IMAP/SMTP sync, threading, and search indexing is entirely their work. A massive thank you to the Mailspring team for building and maintaining that foundation. Without it, this project wouldn't exist.
We hate email. Not the concept — the experience. Every client feels like it was designed for 2005 and then duct-taped into the modern era. We used Spark on macOS and loved it, but after switching to Linux the options were limited. Mailspring was the closest thing to good, but it was far from the email experience we actually wanted.
This started as a hack to see if we could get the email workflow we'd been wanting for years — conversations that feel like chat, newsletters that don't clog the inbox, AI that actually helps with drafts, and a UI that gets out of the way. With improvements in AI tooling, we decided to take a shot and see how far we could get.
This is the result. It's early, it's rough in places, and it's very much a side project. But we're genuinely happy with the functionality and it's become our daily driver. We hope to keep building on it as bandwidth allows.
No roadmap. No heavy structure. We're just working through what works for us. If you find it useful — use it, fork it, hack away. Feel free to open an issue or suggestion and we'll review when we can. Pardon any terrible code.
Conversations, not message lists
- Slack-style threaded conversations with content extraction (strips quoted text, signatures, attribution lines)
- Inline replies at the bottom of the thread
- Prev/next thread navigation
- Pin threads to top
- After-action navigation — go to next email or back to inbox (configurable)
Smart email classification
- Automatic categorization: Conversations, Newsletters, Updates, Receipts, Promos
- Conservative heuristic classifier (defaults to conversation, only classifies when signals are strong)
- Instagram-style newsletter feed with sender filter chips
- Structured notification cards with service badges and action summaries
- Structured receipt cards with amounts, order numbers, tracking, and line items extracted from email body
- Manual override — reclassify any thread with one click + undo toast
- Bulk reclassify — "Move all from @domain" reclassifies every thread from a domain at once
- Sender rules — learned automatically when you reclassify (per-sender and per-domain)
- Domain auto-promotion — after 2+ senders from the same domain get the same type, a domain rule is created
- Mark all as read per category
- Unsubscribe button for newsletters (opens List-Unsubscribe URL)
- View and manage learned rules in Settings > Troubleshooting
AI-powered
- Thread summaries and sentiment analysis
- Draft replies and new emails with AI (tone selection, custom instructions)
- Rewrite mode — type a draft, then ask AI to polish it
- AI gets full thread context + your current draft
- Multi-provider: OpenAI, Anthropic, Ollama, Open WebUI
CRM plugin
- Lightweight contact management built as the first internal plugin
- Opt-in contacts organized by tags (per-business/project)
- Auto-extracts name, title, company, phone, website, LinkedIn from email signatures
- Editable fields, tags, notes, interaction history
- Collapsible contact panel alongside message view
- Toggle on/off in settings
Search
- Unified fuzzy search across threads, contacts, and email content (Cmd/Ctrl+K)
- FTS5 full-text search powered by mailsync's search index
- Command palette with working navigation, compose, and AI commands
- Results grouped by type (Contacts, Threads, Commands)
Multi-account
- Gmail and Outlook (O365) via OAuth
- IMAP/SMTP for any provider
- Per-account activity bar with unread counts
- Alias detection and send-as support
- From picker filtered by active account (shows all accounts in aggregated inbox)
Compose
- Rich text editor (TipTap v2) with formatting toolbar
- Markdown support (bold, italic, code, links, lists, quotes)
- Undo send with configurable delay (5-30 seconds)
- AI draft generation with thread context
- Per-address email signatures (HTML, with templates)
- Contact autocomplete
Theming
- 4 theme modes (light, dark, system, auto)
- 6 accent colors with 5 saturation levels
- 3 density modes (compact, default, relaxed)
- Smart contrast text (luminance-based)
- Configurable animation speed (off, fast, default, slow)
- View transitions between categories and threads
Other
- Right-click context menus with spellcheck and link handling
- Inline attachment previews (images, PDFs)
- Toast notifications with undo actions
- Keyboard shortcuts
- Plugin architecture (slot-based, internal)
- Single instance lock
- Sync retry with exponential backoff
- Troubleshooting panel with log access and rule management
Electron + Vite + React 18 + TypeScript + Tailwind CSS v4 + Jotai
- Node.js 20+
- The
mailsyncbinary from Mailspring
This project depends on the mailsync C++ binary from upstream Mailspring. Either:
- Extract from a Mailspring release — download a Mailspring release, grab
mailsync.binand thelib*.sofiles from the app bundle - Build from source — clone Foundry376/Mailspring and build the mailsync target
Place the binary and shared libraries in resources/mailsync/, or set the MAILSYNC_DIR environment variable.
npm installOAuth credentials are required for Gmail/Outlook sign-in. Create your own:
- Gmail: Google Cloud Console — create a project, enable Gmail API, create OAuth 2.0 credentials (Desktop app type), add
http://127.0.0.1:12141as authorized redirect URI - Outlook: Azure Portal — register an app, add
http://localhost:12141/desktopas redirect URI
# Required for OAuth sign-in
MS_GMAIL_CLIENT_ID=your-google-oauth-client-id
MS_GMAIL_CLIENT_SECRET=your-google-oauth-client-secret
MS_O365_CLIENT_ID=your-microsoft-oauth-client-id
# Custom mailsync path (optional — defaults to resources/mailsync/)
MAILSYNC_DIR=/path/to/mailsyncnpm run devnpm run build # Vite bundles only
npm run dist:linux # AppImage + .debnpm run typecheckThings we'd like to get to when bandwidth allows. No promises, no timelines.
- AI-first email classification (classify every thread via LLM, cache results)
- Newsletter dark mode rendering (render as-is works, dark adaptation needs CSS parser)
- Search within a conversation thread
- Block sender by email or domain
- Signature editor with WYSIWYG (currently raw HTML textarea)
- Focus/Zen modes with desaturation
- The Screener (triage unknown senders)
- Calendar integration
- Snooze
- Thread pagination / infinite scroll (currently loads 500)
- Plugin API for external plugins
- macOS and Windows builds
- Desktop notification system
- Contacts sidebar view (browse CRM tags)
- Thread-level CRM tags in thread list
- Import/export CRM data
Electron Main Process
├── mailsync.bin (C++) ←→ SQLite (edgehill.db)
│ └── JSON over stdio └── read-only from Electron
├── accounts.ts — credential storage (safeStorage)
├── oauth.ts — Gmail/O365 OAuth flow
├── ai-api.ts — shared AI calling layer
├── crm-db.ts — CRM tables in shared DB
└── ipc-handlers.ts — bridges main ↔ renderer
Renderer (React + Jotai)
├── App.tsx — routing, delta listener
├── atoms/app.ts — all state + actions
├── components/ — UI components
├── plugins/ — plugin registry + CRM plugin
│ └── crm/ — contact panel, signature parser
└── lib/ — content extractor, classifier, theme
GPL-3.0 — same as Mailspring. See LICENSE.