xListman
A one-binary, self-hosted mailing list manager.
Manage mailing lists, subscriptions, archives, and moderation from a single static binary — no separate database, cache, or frontend server. A modern, self-contained alternative to GNU Mailman.
Free and open source · MIT license
Why mailing lists
Some conversations are worth keeping.
Mailing lists are the one discussion medium that is durable — every post archived, threaded, and searchable — protocol-native — plain email, no account required — and owned by the community that runs it. No platform decides your list’s future.
Durable
Every post is archived, threaded, and full-text searchable — a record your community keeps, not a feed that scrolls away.
Protocol-native
It runs on plain email. No app to install, no account to create, no platform to log into.
Yours
You run the server. The archive, the membership, and the decisions belong to the people on the list.
Deployment
One binary. No services.
xListman is a single Go daemon with an embedded web UI and SQLite storage. Drop it on a VPS or run the container — there is nothing else to install, tune, or keep alive.
A mailing list manager shouldn’t need a fleet. 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 (Go + embedded SvelteKit UI)
- SQLite — a single file
- LMTP and a pipe socket for incoming mail
- A persistent, 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
The experience
A web UI that doesn’t feel like 2003.
Passwordless by design: sign in with a magic link emailed to you — no passwords, no password database. Then manage everything from a web console or the CLI.
- Passwordless sign-in. One-time magic links and short-lived sessions. Nothing to reset.
- Consoles for every role. Members, moderators, and administrators each get a console that shows what they can do.
- 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.
xListman answers the recurring pains directly — honestly, and without a feature war. The differences that actually matter:
Deployment
Mailman runs two processes on a Python web stack. xListman 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. xListman ships a modern UI for members, moderators, and administrators — and a CLI for everything else.
Mail integration
LMTP with Postfix and exim, validated end to end — including the VERP bounce reverse leg — or a pipe-mode Unix socket when you don’t want LMTP.
Mail-native
It plugs into the mail server you already run.
xListman integrates with an existing MTA instead of replacing it. Postfix and exim are validated against the full loop, and a pipe-mode Unix socket is there when you don’t want LMTP.
Incoming
Your MTA delivers the list domain over LMTP (or a pipe-mode socket); VERP envelope senders route bounces back to the right subscription.
Outgoing
All outbound mail flows through a persistent queue with exponential backoff; after max retries, the message bounces to the sender.
Validated
Both Postfix and exim are exercised end to end against live local instances, including the bounce reverse leg.
Quickstart
Run it in one command.
docker run -d --name xlistman \
-p 8080:8080 -p 127.0.0.1:8024:8024 \
-v xlistman-data:/data \
-e XLISTMAN_WEB_BASE_URL=http://localhost:8080 \
ghcr.io/barats/xlistman:0.1.0Own your mailing list.
Run xListman on your own server and keep your community’s discussion where it belongs — with you.