A one-binary, self-hosted mailing list manager.

Manage lists, subscriptions, archives, and moderation from a single static binary. No separate database, cache, or frontend.

The moderation view of held messages awaiting approval in xMailman
Held messages, reviewed from the web, the CLI, or by email.

Mailing lists are the discussion medium that is durable, protocol-native, and yours.

Every post is archived, threaded, and searchable. Plain email, with no account to create. Run by the people on the list, not a platform.

Durable

A record your community keeps, not a feed that scrolls away.

Protocol-native

Plain email, end to end. No app, no account, no platform.

Yours

Self-hosted, so the archive and the decisions stay with the list.

One binary. No services.

xMailman is a single Go daemon with an embedded web UI and SQLite storage. Drop it on a VPS or run the container. Nothing else to install, tune, or keep alive.

One process speaks mail and serves the web UI. One SQLite file holds the lists, subscriptions, archive, and queue.

See how it deploys →

You get

  • One static binary with the UI embedded
  • SQLite, a single file
  • LMTP and a pipe socket for inbound mail
  • A retrying outbound queue

You don’t need

  • A separate database server
  • A cache
  • A frontend server or Node runtime
  • A job runner for digests or bounces

A web UI that doesn’t feel like 2003.

Passwordless by design: sign in with a magic link emailed to you, then manage everything from a web console or the CLI.

The threaded, searchable archive of a mailing list
Threaded, full-text searchable archives. Members only.
The member self-service page showing subscriptions and delivery preferences
Your subscriptions and delivery, in one place.

The housekeeping is built in.

Digests, held-message moderation, bounce handling, and an immutable audit trail.

Mailman, without the pain

If you run GNU Mailman today, you know the friction.

xMailman answers the recurring pains directly, without a feature war. The differences that actually matter:

Deployment

Mailman runs two processes on a Python web stack. xMailman is one static binary with the UI embedded. Drop it on a VPS or run the container.

Sign-in

No admin-managed passwords. Members sign in with a passwordless magic link; sessions are short-lived and self-expiring.

The web UI

A console from another era is the product. xMailman ships a modern UI for members, moderators, and administrators, plus a CLI for everything else.

Mail integration

LMTP with Postfix and exim, validated end to end, or a pipe-mode Unix socket when you don’t want LMTP.

It plugs into the mail server you already run.

xMailman integrates with an existing MTA instead of replacing it. Postfix and exim are validated against the full loop.

Read the MTA integration guide →

# inbound

MTA → LMTP / pipe socket → xMailman

# outbound

xMailman → retrying queue → SMTP relay

# bounces

VERP envelope → right subscription

Quickstart

Run it in one command.

docker run -d --name xmailman \
  -p 8080:8080 -p 127.0.0.1:8024:8024 \
  -v xmailman-data:/data \
  -e XMAILMAN_WEB_BASE_URL=http://localhost:8080 \
  ghcr.io/barats/xmailman:latest

Own your mailing list.

Run xMailman on your own server and keep your community’s discussion where it belongs, with you.