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.
The member self-service page showing subscriptions and delivery preferences
Your subscriptions and delivery, in one place.
The threaded, searchable archive of a mailing list
Threaded, full-text searchable archives — members only.
The moderation view of held messages awaiting approval
Held messages, reviewed from email, the CLI, or the web.

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.

Read the MTA integration guide →

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.0

Own your mailing list.

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