mrkeyoor.com_
Tue 01 Sept 17:44 UTC
Self-Hostedevaluationupdated 31 Aug 2026

stalwart review

Stalwart is a self-hosted mail and collaboration server that puts email, calendars, contacts, and file access in one Rust service. It replaces a stack of separate SMTP, IMAP, DAV, spam-filtering, and administration components, while leaving the operator responsible for domain reputation and reliable delivery.

+18 / 1dstars / 7d
Verdict

Our Stalwart build and test commands each hit the 900-second cap while still compiling, so source contributors need a serious Rust cache and more than 3 CPUs. The released binary or pinned Docker image is a strong candidate for operators who want mail and DAV protocols in one service and can own deliverability. Existing v0.15 users should treat v0.16 as a migration project, not a routine package update.

We ran it

Lab card: what happened when we ran stalwartScreenshot of stalwart (stalw.art)
Install✓ · 45s797 packages
Build✗ timed out · 900s
Tests✗ timed out · 900sran, no count parsed
Repo1710 files~444,830 lines of source · 23.7 MB · 8 CI workflows · Dockerfile · tests dir

Answers from our run

Does stalwart build from source?

Dependencies installed in 45 seconds (797 packages), and the build failed. We cloned commit 6d5c658 into a clean Debian container with 3 CPUs and no project-specific setup.

Do stalwart's tests pass?

We could not finish them: the suite was still running after 15 minutes in our container.

Who should not use stalwart?

Contributors whose CI must build and test from source inside 15 minutes: both commands were still compiling when our separate 900-second caps expired.

What are the alternatives to stalwart?

mailcow, Docker Mailserver, Mail-in-a-Box. Our Stalwart build and test commands each hit the 900-second cap while still compiling, so source contributors need a serious Rust cache and more than 3 CPUs.

Setup2/5Both source commands exceeded 900 seconds
Docs5/5Install, DNS, security, storage, and migration are explicit
Community5/514,439 stars, 69 open items, and a 2026-08-31 push
Maturity4/5v0.16.20 is active, though pre-1.0 migration is disruptive

Discussed on

  1. hnJMAP for Calendars, Contacts and Files Now in Stalwart391 points
  2. hnStalwart All-in-One Mail Server (IMAP, JMAP, SMTP)243 points
  3. hnThe Future of Stalwart: Webmail, Roadmap, and Beyond12 points
  4. hnStalwart SMTP Server3 points

Who it’s for

Mail administrators who want SMTP, IMAP, JMAP, CalDAV, CardDAV, and WebDAV in one service.
Self-hosters willing to manage DNS, TLS, backups, abuse controls, and deliverability.
Organizations that need several storage or identity backends and can test every upgrade.
Rust teams prepared for a 1,710-file workspace and long source builds.

Who it’s NOT for

Contributors whose CI must build and test from source inside 15 minutes: both commands were still compiling when our separate 900-second caps expired.
Operators upgrading from v0.15 or earlier without a maintenance window: the v0.16 guide calls the management layer completely incompatible and requires an offline, multi-step migration.
Locked-down hosts that cannot fetch the WebUI bundle from GitHub on first start: the requirements page says /admin and /account return 404 until that download succeeds.
Developers planning a new-feature pull request without prior approval: only vouched contributors may open PRs, and accepted work is mostly bug fixes and translations.
Teams that need SCIM v2 in the community build: the v0.16.20 release identifies it as an Enterprise feature.
Anyone who wants email hosting without DNS and abuse work: Stalwart generates records, but the operator still owns routing, reputation, monitoring, and recovery.

Setup reality

Our sandbox installed 797 Rust packages in 45 seconds. The build timed out after 900 seconds, and the test command separately timed out after 900 seconds. Neither log showed a compiler or assertion failure; the test tail was still compiling protocol crates. The 1,710-file checkout held about 444,830 source lines and 8 CI workflows.

The supported binary and Docker routes avoid local compilation. Docker uses configuration and data volumes, a temporary administrator password from logs, and a five-screen wizard. A working internet mail server still needs a public hostname, domain, DNS records, TLS, storage, account directory, firewall rules, and durable backups. Optional DNS, database, object-storage, and identity integrations add credentials.

Production containers should pin a v0.16 tag instead of latest. First startup also downloads the WebUI from GitHub. Upgrades from v0.15 and below require the dedicated migration guide, a datastore backup, all cluster nodes stopped, client URL changes for DAV accounts, and quota recalculation afterward.

Version 0.16.20 puts seven protocols in one server

Stalwart 0.16.20 handles SMTP, IMAP, JMAP, POP3, CalDAV, CardDAV, and WebDAV in one Rust codebase. It also has a spam filter, web administration, OAuth, OIDC, LDAP and SQL directories, several storage backends, metrics, tracing, queues, and clustering. Consolidation is the appeal: one configuration model can cover email, calendars, contacts, shared files, authentication, and delivery policy.

Consolidation also enlarges the failure domain. A bad storage choice can affect mail and calendars, while an authentication outage can reach every client protocol. The project offers RocksDB for a small node and external databases, object stores, search engines, caches, and cluster coordination for larger deployments. Each extra backend needs its own backup, credentials, monitoring, latency budget, and tested restoration path. One binary reduces package sprawl, not operational responsibility.

The 1,710-file workspace exceeded both 900-second caps

Our checkout contained 1,710 files, about 444,830 source lines, and 23.7 MB before compilation. Cargo installed 797 packages in 45 seconds. The repository has 8 CI workflow files, a Dockerfile, and a tests directory. This is a large multi-crate server rather than a small mail daemon, and a cold Rust build has to compile storage, protocol, cryptography, HTTP, and service layers.

For deployment, the published binary or container is the practical route. Source contributors still need a fast machine, persistent Cargo caches, and enough time to reproduce CI. Our 3-CPU, 12 GB sandbox did not run out of memory or print a compiler error. It simply did not finish either long command before the lab stopped it, which is different from a failed build and still important for planning.

What happened when we ran it

Our sandbox installed commit 6d5c658 in 45 seconds, resolving 797 Rust packages. The build then timed out at 900 seconds. A separate test command also timed out at 900 seconds. We used an unprivileged lab-rust:1 container with 3 CPUs, 12 GB of RAM, and no secrets. No completed binary, passed test count, or failed test count came out of those capped commands.

The final test lines were compiling email, http_proto, dav, smtp, imap, pop3, services, migration, jmap, scim, http, and managesieve, all at version 0.16.20. The tail contains no assertion failure and no compiler diagnostic. It supports one narrow conclusion: a clean source test run needs more than 15 minutes on this machine. It says nothing about runtime throughput or protocol correctness after a successful build.

Five setup screens do not finish the mail job

The Docker setup wizard has 5 screens for identity, storage, account directory, logging, and DNS management. The image exposes examples for 10 ports and persists configuration plus data in separate volumes. A one-time administrator password appears in the container logs, and the docs warn that it is shown only once. Bind-mounted directories must be writable by UID 2000.

A public deployment then needs MX, DKIM, SPF, DMARC, client-discovery, and optional MTA-STS or TLSA records. Port 25 must receive server mail; 443 carries administration, JMAP, OAuth, ACME, discovery, and MTA-STS. The security guide recommends disabling unused listeners, including plain IMAP on 143, optional POP3 ports, and bootstrap HTTP on 8080. Stalwart can publish DNS automatically, but the operator must verify the records and remote delivery.

The first WebUI bundle is downloaded from GitHub. If outbound HTTPS is blocked, the requirements page says /admin and /account return 404 until the bundle is staged elsewhere or the download succeeds. That detail matters in restricted networks. Certificate issuance also needs ACME access, and mail authentication performs public DNS lookups. An isolated server can run, but several advertised conveniences need explicit egress allowances.

The v0.16 migration can stop calendars and contacts

The v0.16 upgrade guide calls its management and configuration layer completely incompatible with earlier releases. Operators coming from v0.15 must export settings, stop the old server, back up the database, start v0.16 in recovery mode, apply converted configuration, and recalculate quotas. Every cluster node must stop before migration because an old node can write obsolete records and corrupt shared state.

User data stays in place, but account names become full email addresses and DAV URLs change with an encoded @. CalDAV, CardDAV, and WebDAV clients therefore need new paths. The guide also says the old REST management API is replaced by JMAP and warns against deleting migrated Account objects during partial recovery because deletion schedules stored mail, calendars, and contacts for removal. That is a migration to rehearse on a copy.

Two licenses and one contributor gate narrow adoption

The repository uses AGPL-3.0 plus the proprietary Stalwart Enterprise License v2, with file-level notices deciding which terms apply. Release v0.16.20 labels SCIM v2 as Enterprise. A business should map required features to the edition before building automation around them, then decide whether AGPL obligations or an enterprise agreement fit its distribution and modification model.

GitHub reported 14,439 stars, 69 combined open issues and pull requests, a release on 2026-08-30, and another push on 2026-08-31. That is current maintenance. Outside contributions face a tighter gate: pull requests require prior vouching, accepted work is mainly fixes and translations, and contributors must sign the stated fiduciary agreement. Operators get an active product; would-be feature authors should expect discussion before code.

Alternatives

ProjectWhat it isPick it when
mailcowA Docker-based mail suite that assembles several familiar mail and groupware services.pick this instead when you prefer an integrated container stack over one Rust server.
Docker MailserverA container mail stack centered on SMTP, IMAP, filtering, and directory integrations.pick this instead when email is the job and Stalwart's calendar, contact, and file protocols add unwanted scope.
Mail-in-a-BoxAn opinionated single-server mail setup intended to reduce configuration choices.pick this instead when one small domain needs a guided appliance more than backend flexibility.

What people are saying

  1. [github-trending] stalwartlabs/stalwart

Sources

  1. Stalwart README
  2. Stalwart repository metadata
  3. Stalwart v0.16.20 release notes
  4. Stalwart Docker installation
  5. Stalwart system requirements
  6. Stalwart DNS setup
  7. Stalwart v0.16 upgrade guide
  8. Stalwart contribution policy

More self-hosted reviews

v2 · OpenShell · wigolo · Mindwtr · club-3090 · reclip · the whole board →