5d273e21091ccbfc0a468fcd8d0428ef836edddf
This release significantly expands internationalization support and adds comprehensive identity management features. Internationalization (i18n): - Add 5 new languages: Spanish, Italian, German, Dutch, Portuguese - Expand from 3 to 8 total supported languages - Redesign language switcher for better scalability (dropdown UI) - Complete translations for all features across all languages Identity Management: - Multiple sender identities with per-identity signatures - Sub-addressing support (user+tag@domain.com) - Context-aware tag suggestions for sub-addresses - Identity badges in email viewer and list - Full CRUD operations for managing identities Newsletter Management: - RFC 2369 List-Unsubscribe support (one-click unsubscribe) - HTTP and mailto unsubscribe methods - Security validation prevents XSS attacks - Two-step confirmation with persistent dismissal Security & Accessibility: - Dark mode email readability (intelligent color transformation) - WCAG 2.0 Level AA color contrast compliance - Comprehensive XSS prevention with validation utilities - Unit test coverage for security-critical code (57 validation tests) Testing: - Add unit tests for validation utilities - Add unit tests for email sanitization - Add unit tests for color transformation - Full test coverage for XSS attack vectors
JMAP Webmail
A modern, privacy-focused webmail client built with Next.js and the JMAP protocol.
Built for Stalwart
This webmail client is designed to work seamlessly with Stalwart Mail Server - a modern, secure, and blazingly fast mail server written in Rust.
Why Stalwart?
- Modern Architecture: Built from the ground up with Rust for performance and safety
- JMAP-Native: First-class support for the JMAP protocol (not just IMAP/SMTP bolted on)
- Privacy-Focused: Self-hosted, no third-party dependencies, full control over your data
- Feature-Rich: Supports JMAP, IMAP, SMTP, ManageSieve, and more
Stalwart GitHub | Documentation
Features
Core Email Operations
- Read, compose, reply, reply-all, and forward emails
- Full HTML email rendering with security sanitization
- Attachment upload and download
- Draft auto-save with discard confirmation
- Email threading with Gmail-style inline expansion
- Mark as read/unread, star/unstar
- Archive and delete with configurable behavior
- Color tags/labels for email organization
- Full-text search
User Interface
- Clean, minimalist three-pane layout
- Dark and light theme support
- Responsive design for mobile and desktop
- Keyboard shortcuts for power users
- Drag-and-drop email organization
- Right-click context menus
- Smooth animations and transitions
- Infinite scroll pagination
Real-time Updates
- Push notifications via JMAP EventSource
- Real-time unread counts
- Live email arrival notifications
- Connection status indicator
Security & Privacy
- External content blocked by default
- Trusted senders list for automatic image loading
- HTML sanitization with DOMPurify
- SPF/DKIM/DMARC status indicators
- No password storage (session-based auth)
- Shared folder support with proper permissions
Internationalization
- 8 language support: English, French, Japanese, Spanish, Italian, German, Dutch, Portuguese
- Automatic browser language detection
- Persistent language preference
Tech Stack
- Framework: Next.js 16 with App Router
- Language: TypeScript
- Styling: Tailwind CSS v4
- State Management: Zustand
- JMAP Client: jmap-jam
- i18n: next-intl
- Icons: Lucide React
Getting Started
Prerequisites
- Node.js 18+
- A JMAP-compatible mail server (we recommend Stalwart)
Installation
# Clone the repository
git clone https://github.com/root-fr/jmap-webmail.git
cd jmap-webmail
# Install dependencies
npm install
# Copy environment configuration
cp .env.example .env.local
Configuration
Edit .env.local with your settings:
# App name displayed in the UI
APP_NAME=My Webmail
# Your JMAP server URL (required)
JMAP_SERVER_URL=https://mail.example.com
Note: These are runtime environment variables, read at request time. This enables Docker deployments to be configured without rebuilding the image. Legacy NEXT_PUBLIC_* variables are still supported as fallbacks.
Development
# Start development server
npm run dev
# Type checking
npm run typecheck
# Linting
npm run lint
Production Build
# Build for production
npm run build
# Start production server
npm start
Keyboard Shortcuts
| Key | Action |
|---|---|
j / k |
Navigate between emails |
Enter / o |
Open selected email |
Esc |
Close viewer / deselect |
c |
Compose new email |
r |
Reply |
R / a |
Reply all |
f |
Forward |
s |
Toggle star |
e |
Archive |
# / Delete |
Delete |
u |
Mark as unread |
/ |
Focus search |
x |
Expand/collapse thread |
? |
Show shortcuts help |
Screenshots
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
Roadmap
See ROADMAP.md for planned features and development status.
Acknowledgments
- Stalwart Labs for creating an excellent JMAP mail server
- The JMAP working group for the protocol specification
- All contributors and users of this project
License
This project is licensed under the MIT License - see the LICENSE file for details.
Languages
TypeScript
96.3%
JavaScript
2.5%
Shell
0.8%
CSS
0.2%





