Inboxr ran on Stalwart for the first six months. It's a great single-binary mail server, and the config-as-toml story sold us. What we didn't notice until late was that Stalwart's embedded DB silently shadows whatever you put in config.toml. Edit a spam-filter setting in the file, restart, ship — only to find the old DB value still wins.
We hit it three times in two weeks. SES auth, queue routing, and the spam filter that was funnelling every catch-all message into Junk Mail — all caused by stale DB keys our config file had no power over.
The replacement
We swapped Stalwart for Postfix + a thin Node SMTP shim that writes directly into our SQLite cache. One image. No DB-vs-file ambiguity. We can read every line of the config in a text editor and trust it.
# core docker-compose excerpt
services:
engine:
image: jassra/inboxr-next:latest
ports: ["25:25", "3000:3000"]
volumes: ["./data:/data"]What we'd do differently
Audit the config story before adopting any infrastructure piece. The Stalwart docs don't hide that the DB takes precedence — but it's in a single sentence on a single page. If your team values read the file, see the config as much as we do, push on it before you commit.
Six months in, we run lighter, simpler, and with one less moving part. Worth the weekend.