mirror of
https://github.com/root-fr/jmap-webmail.git
synced 2026-10-13 00:00:57 +00:00
9978b1d407cae8c3f0be10ae20e53b5283d2caa4
DuckDuckGo responds with a 48x48 "no favicon" placeholder (HTTP 404 with an image body) for domains it doesn't have an icon for, and both Chromium and Firefox fire the img load event for that response and ignore the status code — so the placeholder was being rendered as if it were the real favicon. Route the lookup through a new /api/favicon edge route that fetches the upstream, checks the status, and returns either the image body on 200 or a status-only 404 on miss. Now the img element's error event fires correctly for unknown domains and the avatar falls back to the initials. The route validates the domain shape and caches successful responses for a week on the client. Domain-only lookup preserves the same privacy posture — the email address never leaves the browser.
JMAP Webmail
A modern, privacy-focused webmail client built with Next.js and the JMAP protocol.
Screenshots
Login
Inbox
Email Viewer
Compose
Dark Mode
Settings
Features
Core Email
- Modern UI - Clean, minimalist three-pane layout
- Email Threading - Gmail-style conversation view with inline expansion
- Real-time Updates - Push notifications for new emails via EventSource
- Attachments - Upload and download file attachments
- Search - Full-text email search with pagination
- Draft Auto-save - Never lose your work while composing
Identity & Privacy
- Identity Management - Multiple email identities with custom signatures
- Sub-Addressing - Generate tagged email addresses (user+tag@domain.com) for better organization
- Newsletter Management - RFC 2369 one-click unsubscribe with security validation
- Spam Reporting - Mark emails as spam with bidirectional handling and batch operations
- External Content Blocking - Privacy protection with user-controlled image loading
- Shared Folders - Multi-account access with proper ID namespacing
User Experience
- Keyboard Shortcuts - Navigate efficiently with vim-style hotkeys (j/k, r, f, etc.)
- Context Menus - Right-click for quick actions on emails
- Drag & Drop - Move emails between folders with native HTML5 DnD
- Color Tags - Organize emails with color labels
- Dark Mode - Full dark theme with intelligent email color transformation for readability
- i18n - English, French, Japanese, Spanish, Italian, German, Dutch, and Portuguese language support with auto-detection
- Mobile Responsive - Adaptive single/multi-pane layout for all screen sizes
Tech Stack
- Framework: Next.js 16 with Turbopack
- Styling: Tailwind CSS v4
- State: Zustand
- Protocol: JMAP (RFC 8620)
- i18n: next-intl
Getting Started
# Install dependencies
npm install
# Run development server
npm run dev
Open http://localhost:3000 and connect to your JMAP server.
Configuration
Create a .env.local file:
APP_NAME=Your Webmail
JMAP_SERVER_URL=https://your-jmap-server.com
Runtime vs Build-time Configuration
| Variable | Type | Description |
|---|---|---|
APP_NAME |
Runtime | App name displayed in the UI |
JMAP_SERVER_URL |
Runtime | JMAP server URL (required) |
NEXT_PUBLIC_APP_NAME |
Build-time | Legacy fallback for app name |
NEXT_PUBLIC_JMAP_SERVER_URL |
Build-time | Legacy fallback for server URL |
Runtime variables are read at request time, enabling post-build configuration (ideal for Docker).
Build-time variables are baked into the bundle and require a rebuild to change.
License
MIT
Languages
TypeScript
99.1%
CSS
0.7%
JavaScript
0.1%





