A desktop email client for all your accounts in one place. Built with Tauri, SvelteKit, Tailwind and Go.
- One unified inbox across every account, or one account at a time
- Two-way IMAP sync: read, star, archive and trash show up on your other devices
- New-mail notifications and a Dock badge
- Compose, reply, forward and drafts over SMTP
- HTML mail shown safely: no scripts, and remote images blocked until you load them
- Full-text search, light and dark themes
Early and macOS-only. Accounts connect over IMAP and SMTP with a password. Gmail, Yahoo and iCloud need an app password. Personal Outlook.com accounts can't connect, since Microsoft turned off password sign-in for them.
Your password is kept in the macOS keychain. Mail is stored in a local SQLite database in ~/Library/Application Support/dev.inboxed.app. Nothing goes anywhere except your mail servers.
Node, Rust, Go, and the Tauri prerequisites.
npm install
npm run tauri dev # run the app (builds the Go engine first)
npm run tauri build # production bundleTo work on the UI in a plain browser with demo mail, run the engine with seed data next to Vite:
npm run dev:engine # 127.0.0.1:4321, token "dev", demo data in .dev-data/
npm run devwith a .env.development.local containing:
VITE_ENGINE_URL=http://127.0.0.1:4321
VITE_ENGINE_TOKEN=devnpm run tauri dev doesn't rebuild the engine when Go files change; run npm run build:engine.
npm test # frontend (Vitest)
npm run test:engine # Go engine
npm run check # svelte-check / TypeScriptThree processes:
- UI (
src/): a static SvelteKit SPA (Svelte 5, Tailwind v4). - Shell (
src-tauri/): a thin Tauri v2 app that starts the engine and tells the UI how to reach it. - Engine (
engine/): a Go sidecar that owns all mail logic: IMAP sync, SMTP sending, storage and search.
The UI talks to the engine's HTTP API on 127.0.0.1. Every request carries a per-launch token, and only the app's own origin is allowed.