Bulwark Mail · Bulwark Webmail

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.

Read the docs View source

Backed by

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.

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.

1102

“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

27

languages

Star on GitHub Read the source

Other projects.

The webmail is the main repo. These grew up around it.

Protocol bridge

Bulwark Legacy Proxy

JMAP in front · IMAP, SMTP, ManageSieve, CardDAV behind

A translation layer that lets JMAP clients read a classic IMAP account as if it were native. The proxy speaks JMAP on one side and the ordinary mailbox protocols on the other, and the mail never leaves the server that already holds it.

github.com/bulwarkmail/legacy-proxy

Mobile app · beta

Bulwark Mobile

React Native · Android on GitHub, iOS next

The same account in your pocket: mail, calendar, contacts and files, woken by push when something arrives. Android builds are on GitHub today; iOS follows once we have the hardware to sign it.

github.com/bulwarkmail/native

Hosted service

Bulwark Relay

JMAP push in, Firebase push out · one shared instance

Turns the mail server's push notifications into Firebase pushes, so the mobile app wakes without every self-hoster standing up their own Firebase project. All the relay ever sees is a device token and a hashed state id; message content never reaches it.

github.com/bulwarkmail/relay

Extension directory

Bulwark Extensions

Plugins and themes · installed from a ZIP

Plugins add toolbar buttons, sidebar apps, shortcuts and workflows the stock client doesn't have; themes change how it looks. The directory lists free and open-source extensions that have passed review.

extensions.bulwarkmail.org

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.

Read the original on bulwarkmail.org ↗