Webmail built
for the 21st
century.

One interface for everything your mail server holds: messages, calendars, address books and files. Bulwark threads your mail, searches all of it, and installs as a PWA on your phone.

Mail · reading view
Bulwark mail reading viewBulwark mail reading view

Email is fifty-four. Webmail doesn't have to be.

Most self-hosted webmail still feels like 2008 because most of it was written then. The browser stopped being the limiting factor a long time ago, and JMAP took away the protocol excuse in 2019. We started Bulwark after both of those, which is honestly the only real advantage it has.

What 2019 changed
  • The server speaks firstStalwart announces a state change the moment it happens. The 30-second poll loop goes away, and so do the idle reconnects that came with it.
  • One round-trip per clickMark-read, move, and fetch-next travel as a single JMAP call.
  • Threading is server workStalwart stitches the conversation once. The browser renders what it's handed.
  • Typed across the wireJMAP pins down the exact response shapes, and the client is strict TypeScript, so any drift between them fails at compile time.
  • 1971
    first email sent
  • 1996
    Hotmail launches
  • 2008
    Roundcube 0.2
  • 2019
    JMAP standardised
  • 2026
    Bulwark v1

Four apps that behave
like one application.

Stalwart already stores all of it. What was missing was a front end that doesn't make you feel the seam between mail and calendar, and doesn't ask you to forgive it for being self-hosted.

Mail · reading view
Mail · reading viewMail · reading view
Calendar · month
Calendar · monthCalendar · month
Settings · accounts & signing
Settings · accounts & signingSettings · accounts & signing
Mail · drafting
Mail · draftingMail · drafting
Themes · pick one or write your own
Themes · pick one or write your ownThemes · pick one or write your own
A glimpse of dark mode
A glimpse of dark mode
A glimpse of light mode
A glimpse of light mode

Installing it takes less time
than uninstalling Outlook.

The wizard handles what would otherwise be a config file. You'll probably spend longer picking a logo on the branding screen than you will pointing Bulwark at your mail server.

What you get
Mail
threading, unified inbox, full-text search, Sieve filters, S/MIME, templates
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 and folder upload
Quick start
  1. Fetch the compose file
    $curl -O https://bulwarkmail.org/compose.yml
  2. Bring the container up
    $docker compose up -d
  3. Open the setup wizard
    $https://mail.example.com
  4. Click through a few screens
    server · auth · security · logging · branding

It's AGPL, which means
you can just fix it.

1143

“We're writing the webmail we wanted in 2026 and didn't find: a JMAP-native client with an interface built this decade. It's AGPL and self-hosted, run by the people who use it rather than sold to them.”

from our contributing guide

Before you install it.

Is Bulwark the mail server, or just the front?

The front. Stalwart is the mail server proper. It holds the messages, it's the thing SMTP talks to, and it owns the accounts and the spam filtering. Bulwark is a client that happens to run in a browser rather than on your desktop. You need both, and Stalwart is the one to install first.

Why JMAP and not IMAP?

IMAP is from 1986 and it shows. Every folder wants its own connection, the client has to keep asking whether anything changed, and threading is something you reassemble yourself after fetching more than you needed. JMAP moves that work to the server and sends back a diff. Concretely: marking twenty messages read is one request instead of twenty.

How is this different from running Roundcube or SOGo?

Both of those are IMAP clients carrying two decades of compatibility layers, and they carry it honestly. Bulwark started at JMAP, so there was never a layer to accumulate. It's TypeScript and Next.js, and small enough that you can read what it does with your credentials in an afternoon.

What does deployment look like?

Two services in a compose file, Stalwart and Bulwark, behind whatever reverse proxy you already run. There are working examples for Caddy, Traefik and nginx. If you'd rather not use Docker at all, the manual install is written up too.

Will it sit in front of an existing Stalwart deployment?

Yes, and that's the least disruptive way to try it. Point Bulwark at the JMAP endpoint and pick OAuth or basic auth. Nothing migrates and nothing gets reformatted. Stalwart stays the source of truth; Bulwark is one more client connecting to it, and you can turn it off again without consequences.

Is there a hosted version I can try first?

There's a demo at demo.bulwarkmail.org. Shared mailbox, mostly read-only, wiped every hour. Beyond that we don't run a hosted tier and don't intend to. The whole point is people running their own, and a paid tier would slowly become the thing we optimised for. If the demo doesn't answer your question, the container starts locally in about ten minutes.

Anything past this is in the documentation. If it isn't, that's a documentation bug, and the issue tracker is where to say so.