Website · Documentation · Live demo · Releases · Discord
Bulwark Webmail is a self-hosted webmail client for Stalwart Mail Server, built with Next.js on the JMAP protocol. Mail, calendar, contacts and files share one login, one settings store and one admin dashboard.
Contents
- Screenshots
- Features
- Quick start
- Other ways to install
- Configuration
- Documentation
- Development
- Community and support
- License
Screenshots
Features
- Mail – threading, unified inbox, cross-account views, full-text search, Sieve filters, S/MIME, templates, scheduled send
- Calendar – month/week/day/agenda, recurring events, iMIP invitations, CalDAV subscriptions
- Contacts – multiple address books, groups, vCard import/export
- Files – Stalwart's JMAP FileNode storage with previews, sharing and folder upload
Across all four: single sign-on and 2FA, multiple accounts, 27 languages, PWA install and web push, themes, plugins and keyboard shortcuts.
The complete list is on All features.
Bulwark comes in two editions: the full edition, a Node.js server with the admin dashboard, OAuth, plugins and settings sync; and Bulwark Lite, the same client as static files that any web host, or Stalwart itself, can serve.
Quick start
docker run -d -p 3000:3000 ghcr.io/bulwarkmail/webmail:latest
Open http://localhost:3000 and the setup wizard walks you through connecting your Stalwart server. The installation guide covers the details, and Stalwart setup covers the mail server side.
Other ways to install
| Method | Guide |
|---|---|
| Docker Compose | Compose |
| Behind a reverse proxy or on a sub-path | Reverse proxy |
| From source, without Docker | Manual install |
| Lite on any static host | Static hosting |
| Lite as a container | Container image |
| Lite served by Stalwart | Install on Stalwart |
To move to a new version, see Updating.
Configuration
Most installs are configured in the setup wizard on first launch and then in the admin dashboard. Environment variables work too and suit immutable infrastructure better; a variable always wins over the admin-managed value.
JMAP_SERVER_URL=https://mail.example.com
APP_NAME=My Webmail
| Topic | Guide |
|---|---|
| Overview, config files and precedence | Configuration |
| Every variable | Environment reference |
| OAuth2 / OIDC and single sign-on | Authentication, Embedded SSO |
| Several JMAP servers, custom endpoints | Multi-server deployments, Custom endpoints |
| Branding, logos, per-domain branding | Customization |
| Anonymous telemetry (off by default) | Anonymous usage stats |
Documentation
Everything lives at bulwarkmail.org/docs:
- Getting started – Introduction, Installation, Editions, Bulwark Lite, Demo mode
- Deployment – Docker, Manual install, Static hosting, Install on Stalwart, Updating
- Guides – Admin dashboard, Account security, Impersonation, Plugins, Marketplace, Troubleshooting
- Extensions – Introduction, manifest.json, Publishing
- Development – Architecture, Contributing
- Legal – Privacy
The pages are Markdown in the website repository; corrections are welcome there.
Development
git clone https://github.com/bulwarkmail/webmail.git
cd webmail
npm install
cp .env.dev.example .env.local # built-in mock JMAP server, no mail server needed
npm run dev
npm run typecheck
npm run lint
npx vitest run # unit tests
npm run test:integration # Stalwart in Docker + Playwright
The contributing guide covers tests, translations, code style and pull requests; Architecture explains how the code fits together.
Built with Next.js 16 and React 19, TypeScript, Tailwind CSS v4, Zustand, Tiptap, next-intl, Tabler Icons, and a custom JMAP client (RFC 8620). Tests run on Vitest and Playwright.
Community and support
- Questions and help – Discord, or Troubleshooting first
- Bugs and feature requests – GitHub issues
- Security vulnerabilities – privately to dev@bulwarkmail.org or through a security advisory, never in a public issue
- Release notes – CHANGELOG.md and GitHub releases
License
GNU AGPL v3. This repository preserves the original MIT attribution for the fork lineage in NOTICE.
Acknowledgments
Thanks to root-fr/jmap-webmail and @ma2t for the groundwork this project builds upon.





