← Back to all sparks
M

Maddy

COMMS
Velocity0.0

All-in-one composable mail server

A one-binary mail server learning to behave like production infrastructure.

mail-serverself-hostedgolangzero-downtime-reloaddeprecation-cleanupobservability
Current state
maddy is an all-in-one SMTP and IMAP server written in Go, aimed at people who want a working mail host without assembling Postfix, Dovecot and a policy daemon themselves. The 0.9 line moved quickly — 0.9.0 through 0.9.5 between late March and late May — with the sequence following a recognisable shape: a feature release, an immediate patch for a broken integration, a security release, then cleanup. Configuration is directive-based, and much of the changelog concerns the behaviour of individual modules like auth.ldap, check.rspamd and check.dnsbl.
Where it's heading
The project is systematically removing the compromises that made early versions convenient. Obsolete SASL LOGIN was disabled by default, the STARTTLS plaintext fallback was dropped, the maddyctl symlink behaviour and the implicit run command were deleted after four years of deprecation warnings, and libdns providers that have not kept up with 1.x are being cut. Running the other way is operational maturity: no-downtime config reload, queue-length metrics, OpenMetrics fixes, systemd readiness reporting, and SLSA build attestations on release artifacts. This is a project moving from hobbyist-friendly to operator-friendly, and accepting breakage to get there.
Prediction
0.10.0 is already scoped by the deprecations announced in 0.9.1 — expect the flagged libdns providers to be removed and gandi to require Bearer tokens. Given the 0.9.x pattern, a feature release followed quickly by an integration fix is the likely shape.

Recent moves

  1. 2mo ago

    maddy 0.9.5 fixes nested pipeline logging and systemd reload reporting

    Cleanup after the logger tree refactor in 0.9.4: the message pipeline now always initialises its logger for nested pipelines, and a nil check was added on logger close. A dangling destination limiter on first RCPT error was fixed, arm64 Docker builds re-enabled, and systemd now reports READY=1 after reload — the last of these tying off the no-downtime reload work from 0.9.0.

    View source ↗
  2. 3mo ago

    maddy 0.9.4 removes the maddyctl symlink and implicit run command

    Two long-deprecated conveniences are gone: the binary no longer changes behaviour when invoked as maddyctl, and running maddy with no command no longer defaults to run — a warning that had been in place since 0.6, four years earlier. The stated reason is that the CLI hacks made --log handling inconsistent, which fits the wider pattern of trading convenience for predictable behaviour. A LOGIN SASL auth directive was added and the logger tree properly restructured.

    View source ↗
  3. 3mo ago

    maddy 0.9.3 patches an LDAP injection flaw in auth.ldap

    A security release fixing an LDAP injection vulnerability in the auth.ldap module, tracked as CVE-2026-40193, which could be used to extract directory information including password hashes and authorization data. Anyone authenticating against LDAP needs this one; the release also fixes dependency cycles when loading config.

    View source ↗
  4. 4mo ago

    maddy 0.9.2 fixes an rspamd panic on unspecified tls_client

    A single-fix release issued two minutes after 0.9.1 to repair the rspamd integration that release broke. It changes nothing else, and exists only because the tls_client directive definition landed wrong.

    View source ↗
  5. 4mo ago

    maddy 0.9.1 flags libdns providers for removal in 0.10.0

    Mostly a deprecation notice with teeth: vultr, namedotcom and leaseweb are probably losing ACME DNS-challenge support, and gandi will require Bearer-type tokens from 0.10.0 rather than API tokens. Operators using any of those need to plan now. The release also ships OpenMetrics initialisation and tls_client fixes — and shipped broken rspamd support, corrected minutes later in 0.9.2.

    View source ↗
  6. 4mo ago

    maddy 0.9.0 adds no-downtime configuration reloading

    ⚡ SPARK

    The release that makes maddy plausible for hosts that cannot drop mail during a config change: SIGUSR2 now starts a server with the new configuration while gracefully shutting the old one down, preserving listener sockets so there is no window without an acceptor. Per-response DNSBL scoring lands alongside it, and the following five releases are largely consequences of this one.

    View source ↗