Is Bulwark the mail server, or just the front?
Just the front. Stalwart is the server: it stores mail, speaks SMTP, runs spam, holds auth. Bulwark is the JMAP client you point your browser at. You run both, but the heavy lifting lives a layer down.
Email turned fifty in 2021. Webmail has been frozen in place since Gmail and Outlook drew the map. Bulwark is what mail looks like when someone finally writes it for the decade we're in: open protocol, instant push, your hardware.
Backed by


Most self-hosted webmail still feels like 2008 because most of it was written then. The protocols caught up in 2019. The web caught up before that. Mail was the last surface waiting; Bulwark is what catching up looks like.
Everything Stalwart already serves, surfaced through a single window with the fit and finish you stopped expecting from self-hosted software a long time ago.












The wizard handles the parts that would otherwise be in a config file. You'll probably spend longer picking a logo on the branding screen than configuring the mail server.
“We're writing the webmail we wanted in 2026 and didn't find. Modern protocol, modern tooling, modern UI. Not a SaaS. Not a startup. Not for sale.”
bulwark legacy proxy is a translation layer that puts a JMAP for Mail server in front of a classic IMAP / SMTP / ManageSieve / CardDAV stack. It speaks RFC 8620 + RFC 8621 to clients, and standard mailbox protocols to whatever server already holds the user's mail. No new mail store, no migration: the mail keeps living in the existing IMAP server, and a modern JMAP client sees the account as if it were native.
Bulwark Mobile is a React Native (Expo SDK 54) client for Bulwark Webmail - a JMAP-based mail, calendar, contacts and Files app, with built-in FCM notifications.
The Android build is on GitHub today. An iOS release will follow once we have the hardware to sign and ship it properly.
Bulwark Relay is a push notification relay for Bulwark Webmail. It terminates JMAP PushSubscription pushes from the user's mail server and forwards them to Firebase Cloud Messaging, so the mobile app wakes up and fetches new mail over its own JMAP connection.
Designed so self-hosters don't need their own Firebase project: a single hosted instance serves every Bulwark client that opts in. The relay never sees mail content - only opaque FCM tokens, state-id hashes, and timing.
Bulwark Webmail can be extended with two kinds of third-party add-ons. Plugins add hooks, UI buttons, sidebar apps, keyboard shortcuts, and whole new workflows that integrate with the JMAP client. Themes customize fonts, colors, and layouts to reshape the look and feel of the inbox.
Both are published on the Bulwark Extensions directory, which hosts free and open-source extensions that have passed review.
Just the front. Stalwart is the server: it stores mail, speaks SMTP, runs spam, holds auth. Bulwark is the JMAP client you point your browser at. You run both, but the heavy lifting lives a layer down.
JMAP was designed for the modern web. One TLS connection, push instead of polling, batched mutations, threading on the server. The result is a webmail that feels like a native app instead of a Gmail polyfill.
Bulwark is built fresh for Stalwart and JMAP - no PHP, no plugin-of-plugins archaeology. The codebase is TypeScript and Next.js, the protocol is open, and the surface area is small enough to read in an afternoon.
A docker-compose file with two services - Stalwart and Bulwark - sitting behind your reverse proxy of choice. Caddy, Traefik, nginx; we have working examples for each. Manual install is documented if you prefer.
Yes. Point Bulwark at the JMAP endpoint, set up OAuth or basic auth, and you're done. No data migration, no reformatting of mailboxes; Stalwart stays the source of truth and Bulwark is just another client talking to it.
There's a limited demo at demo.bulwarkmail.org - read-only-ish, shared mailbox, reset every hour, kept up to honestly look like the real thing. Beyond that, no hosted tier we run. The project is for people who would rather host their own; a hosted plan would quietly become the thing we're funded by, and we'd rather not. If the demo isn't enough, the container runs locally in ten minutes.