A modern, cross-platform desktop email client built with Tauri and React. Save your emails locally forever, even after they're deleted from the server.
- Connect multiple email accounts (Gmail, Outlook, Yahoo, iCloud, or custom IMAP)
- Google OAuth2 β Sign in with Google for Gmail accounts (no app password needed)
- Microsoft 365 OAuth2 β Sign in with Microsoft for Outlook/Hotmail/Live accounts (no app password needed)
- View all mailboxes and folders
- Read, send, and manage emails with From account selector
- Full attachment support
- Maildir format - Emails stored as individual
.emlfiles on disk, one file per message - Standard EML files - Industry-standard format readable by any email client
- Full fidelity - Headers, body, inline images, and attachments all preserved in a single file
- Visual indicators - Easily distinguish between server-only and locally saved emails
- Local-only display - View emails deleted from server but saved locally
- Bulk save - Select multiple emails and archive them all at once
- Portable - Back up, move, or open your
.emlfiles with any tool
- All - See both server and local emails combined
- Server - Show only emails currently on the server
- Local - Show only locally saved emails
- Light and dark themes with accent colors
- Collapsible sidebar (full or icon-only mode)
- Default or compact email list layout
- Per-account avatar colors (auto-assigned or custom)
- Smooth animations and transitions
- Desktop: Tauri v2 (Rust-based native wrapper)
- Frontend: React 18, Zustand (state management), Framer Motion (animations)
- IMAP/SMTP: Native Rust β
async-imapfor IMAP,lettrefor SMTP, custom OAuth2 PKCE flow β all running in-process via Tauriinvoke()commands - Storage: Maildir format (
.emlfiles on disk), OS keychain for credentials (viakeyringcrate), JSON file cache for email headers - Styling: Tailwind CSS
- Build: Vite
- Node.js 18+
- Rust (for Tauri)
- npm or yarn
- Clone the project:
git clone <repo-url>
cd mail-vault-app- Install dependencies:
npm install- Run in development mode:
npm run tauri dev- Build for production:
npm run tauri build- Click "Add Your First Account" or the "Add Account" button
- Select your email provider (Gmail, Outlook, Yahoo, iCloud, or Custom)
- Authenticate:
- Gmail: Click "Sign in with Google" (recommended) β opens your browser for secure OAuth2 login. No app password needed, works with 2FA/MFA.
- Outlook / Microsoft 365: Click "Sign in with Microsoft" (recommended) β opens your browser for secure OAuth2 login. No app password needed, works with 2FA/MFA.
- Other providers: Enter your email address and password/app password.
Gmail fallback (if not using OAuth2):
- If you have 2-Factor Authentication enabled, you need to use an App Password
- Go to Google Account β Security β 2-Step Verification β App passwords
- Generate a new app password for "Mail" and use it instead of your regular password
Important for other providers:
- Most providers require app-specific passwords when 2FA is enabled
- Check your provider's documentation for IMAP access settings
Emails are saved as .eml files in Maildir format on your disk.
Single email:
- Hover over an email in the list and click the archive icon
- Or open an email and click "Archive" button
Multiple emails:
- Check the boxes next to emails you want to archive
- Click "Archive All" in the toolbar
| Icon | Meaning |
|---|---|
| π₯οΈ (green HDD) | Email is archived locally |
| βοΈ (blue cloud) | Email exists only on server |
| π₯οΈ (yellow HDD) | Email is local-only (deleted from server) |
Use the view mode toggle in the sidebar:
- All: Combined view - shows server emails plus any local-only emails
- Server: Only emails currently on the server
- Local: Only your locally saved emails
Archived emails are already stored as .eml files. You can:
- Open an archived email and click "Show in Finder" / "Open File" to access the
.emldirectly - Copy
.emlfiles from the Maildir directory for backup or transfer - Open any
.emlfile with other email clients (Thunderbird, Apple Mail, etc.)
mail-vault-app/
βββ app.html # Tauri window entry point
βββ package.json
βββ vite.config.js
βββ tailwind.config.js
βββ src/
β βββ main.jsx # App entry point
β βββ App.jsx # Main app component
β βββ components/
β β βββ Sidebar.jsx # Account & folder navigation
β β βββ EmailList.jsx # Email list with local indicators
β β βββ EmailViewer.jsx # Email content viewer
β β βββ AccountModal.jsx # Add account modal
β β βββ Toast.jsx # Notification toasts
β βββ services/
β β βββ api.js # Tauri invoke() API client
β β βββ db.js # Maildir + keychain operations
β βββ stores/
β β βββ mailStore.js # Zustand state management
β βββ styles/
β βββ index.css # Tailwind + custom styles
βββ src-tauri/
βββ Cargo.toml # Rust dependencies
βββ tauri.conf.json # Tauri configuration
βββ src/
βββ main.rs # Tauri commands (keychain, Maildir, EML parsing)
βββ imap/
β βββ mod.rs # IMAP operations (connect, fetch, search, flags)
β βββ pool.rs # Two-pool connection manager (background + priority)
βββ smtp.rs # SMTP send via lettre
βββ oauth2.rs # Microsoft OAuth2 PKCE flow
βββ commands.rs # Tauri command wrappers for IMAP/SMTP/OAuth2
βββ archive.rs # Bulk email archiving (concurrent, cancellable)
All data is stored locally on your device β nothing is sent to third-party servers.
- Credentials: Stored securely in your operating system's native keychain
- macOS: Keychain Access
- Windows: Credential Manager
- Linux: Secret Service (GNOME Keyring, KWallet)
- Account Settings: Saved as JSON in the app's data directory
- Emails: Stored as individual
.emlfiles using Maildir format- Each email is a self-contained
.emlfile with headers, body, inline images, and attachments - Organized by account and mailbox:
Maildir/<account-id>/<mailbox>/cur/<uid>.eml - Flags (read, archived, etc.) encoded in the filename per Maildir convention
- Files are standard RFC 5322 format β portable and readable by any email client
- Each email is a self-contained
- Email Header Cache: JSON files for fast inbox loading without re-fetching from server
-
Secure Credential Storage: Passwords and OAuth2 tokens are stored in your operating system's native keychain, protected by your system's security mechanisms.
-
OAuth2 for Microsoft: Outlook/Microsoft 365 accounts use secure OAuth2 (XOAUTH2) authentication with PKCE. Your Microsoft password is never stored β only short-lived access tokens and refresh tokens, encrypted in the system keychain.
-
App Passwords: For other providers, use app-specific passwords instead of your main account password when available.
-
Native IMAP/SMTP: All email operations run natively in Rust within the Tauri process β no intermediate HTTP server, no sidecar binary, no localhost networking. Your credentials never leave the app process.
-
Local Storage: Emails saved locally include all content and attachments. Be mindful of what you save on shared computers.
- Verify your email and password are correct
- For Gmail/Yahoo/iCloud, make sure you're using an App Password
- Check that IMAP is enabled in your email provider's settings
- Click the refresh button to reload emails
- Check the browser console for error messages
- Verify your internet connection
- Make sure you're in "All" or "Local" view mode
- The email may not have been fully archived β try archiving it again
- Check the Maildir directory in your app data folder for the
.emlfiles
Contributions are welcome! Please feel free to submit issues and pull requests.