Configuration

Configuration is YAML, loaded from xlistman.yaml (or the file in $XLISTMAN_CONFIG). Every value can be overridden with an XLISTMAN_-prefixed environment variable, and ${ENV_VAR} syntax expands secrets from the environment. Unknown keys are rejected, so a typo fails loudly rather than silently.

Generate a fully commented config with:

./xlistman config init

and validate it with:

./xlistman config check

web.base_url and database.path are required. web.base_url must start with http:// or https:// — it’s the origin people see in emails.

Keys

KeyEnvironment variableDefaultMeaning
http.listenXLISTMAN_HTTP_LISTEN:8080HTTP listen address — web UI and API.
lmtp.listenXLISTMAN_LMTP_LISTEN:8024LMTP listen address for inbound mail. The LMTP server is unauthenticated — bind it to a private interface (127.0.0.1:8024) in production.
socket.pathXLISTMAN_SOCKET_PATH/tmp/xlistman.sockPipe-mode Unix socket path used by xlistman deliver.
database.pathXLISTMAN_DATABASE_PATH./xlistman.dbSQLite database file.
smtp.hostXLISTMAN_SMTP_HOSTlocalhostOutbound SMTP relay host.
smtp.portXLISTMAN_SMTP_PORT25Outbound SMTP relay port.
smtp.usernameXLISTMAN_SMTP_USERNAME(empty)SMTP auth username; auth is used only when set.
smtp.passwordXLISTMAN_SMTP_PASSWORD(empty)SMTP auth password — use ${ENV_VAR}.
smtp.modeXLISTMAN_SMTP_MODEsmtpsmtp (relay via the host above) or sink (write outbound mail to sink_dir — development only, no MTA needed).
smtp.sink_dirXLISTMAN_SMTP_SINK_DIR./mailDirectory for outbound mail in sink mode.
web.base_urlXLISTMAN_WEB_BASE_URL(required)Public origin used in emails (subscribe links, magic links).
rate_limits.subscribe_per_hourXLISTMAN_RATE_LIMITS_SUBSCRIBE_PER_HOUR5Subscribe requests per email per hour.
rate_limits.magic_link_per_hourXLISTMAN_RATE_LIMITS_MAGIC_LINK_PER_HOUR3Magic-link requests per email per hour.
rate_limits.magic_link_per_ip_per_hourXLISTMAN_RATE_LIMITS_MAGIC_LINK_PER_IP_PER_HOUR50Magic-link requests per client IP per hour.
rate_limits.posts_per_hourXLISTMAN_RATE_LIMITS_POSTS_PER_HOUR10Posts per sender per hour.
queue.max_retriesXLISTMAN_QUEUE_MAX_RETRIES8Delivery attempts before a post is bounced to its sender.

A minimal runnable example (this is what the Docker image ships):

http:
  listen: ":8080"
lmtp:
  listen: ":8024"
socket:
  path: "/tmp/xlistman.sock"
database:
  path: "./xlistman.db"
smtp:
  host: "localhost"
  port: 25
  mode: "smtp"
  sink_dir: "./mail"
web:
  base_url: "http://localhost:8080"
rate_limits:
  subscribe_per_hour: 5
  magic_link_per_hour: 3
  magic_link_per_ip_per_hour: 50
  posts_per_hour: 10
queue:
  max_retries: 8

Secrets

${ENV_VAR} in any string value is replaced from the environment at load time, so credentials never have to live in the file:

smtp:
  username: "relay"
  password: "${SMTP_PASSWORD}"

Per-list settings

List-level settings (moderation, digests, subscription policy, bounce threshold, attachment policy, and more) aren’t in this file — they’re set per list with xlistman list config <addr> <key>=<value> or in the list console. See The web UI and Command line.

Next: MTA integration.