mrkeyoor.com_
Wed 16 Sept 07:06 UTC
Self-Hostedevaluationupdated 26 Aug 2026

listmonk review

listmonk is a self-hosted newsletter, mailing-list, and transactional messaging application backed by PostgreSQL. It gives operators subscriber lists, segmentation, templates, campaigns, analytics, and multiple delivery channels in one Go service.

+96stars / 7d
Verdict

Our listmonk build finished in 73 seconds after installing 85 packages, but go test found 0 tests, so the clean compile is stronger evidence than the test count. Use listmonk when subscriber ownership, a compact deployment, and API access outweigh the work of operating mail infrastructure. Choose a hosted newsletter service if nobody on the team owns PostgreSQL, deliverability, bounces, backups, and upgrades.

We ran it

Lab card: what happened when we ran listmonkScreenshot of listmonk (listmonk.app)
Install✓ · 39s85 packages
Build✓ · 73s
Tests✓ · 31s0 passed · 0 failed of 0 (go test)
Repo508 files~44,814 lines of source · 9.1 MB · 6 CI workflows · Dockerfile

Answers from our run

Does listmonk build from source?

Dependencies installed in 39 seconds (85 packages), and the build succeeded in 73 seconds. We cloned commit 670c017 into a clean Debian container with 3 CPUs and no project-specific setup.

Do listmonk's tests pass?

Yes: 0 of 0 passed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use listmonk?

Teams that want a hosted service to own sending reputation, bounce operations, upgrades, and database backups: listmonk is self-hosted and still needs SMTP or another delivery provider.

What are the alternatives to listmonk?

Mautic, Ghost, Buttondown. Our listmonk build finished in 73 seconds after installing 85 packages, but go test found 0 tests, so the clean compile is stronger evidence than the test count.

Setup4/5Compose is direct, but production still needs Postgres and SMTP
Docs4/5Good install, config, templating, API, and upgrade references
Community5/523,130 stars, fresh pushes, releases, and active issue work
Maturity4/5Established feature set, though our Go run discovered 0 tests

Discussed on

  1. hnShow HN: Listmonk – Fast self-hosted newsletter and mailing list manager343 points
  2. hnListMonk – High performance, self-hosted newsletter and mailing list manager145 points
  3. hnShow HN: Listmonk – self-hosted mailing list manager in Go and React11 points

Who it’s for

Organizations that want to own subscriber data and already operate PostgreSQL.
Newsletter teams with an SMTP provider but no desire to pay a platform fee per contact.
Developers who need an API for transactional messages or custom messenger webhooks.
Operators comfortable managing deliverability, backups, upgrades, and compliance themselves.

Who it’s NOT for

Teams that want a hosted service to own sending reputation, bounce operations, upgrades, and database backups: listmonk is self-hosted and still needs SMTP or another delivery provider.
Operators without PostgreSQL: the installation guide requires PostgreSQL 12 or newer, even though the application itself is a single binary.
Users who need a richly tested result from a generic Go command: our run succeeded, but go test discovered 0 tests and the repository has no top-level tests directory.
Organizations that cannot accept AGPL-3.0 obligations for a modified network service.
Marketers who expect every campaign segmentation rule to be built through a no-code interface: the project advertises SQL expressions for advanced subscriber queries.

Setup reality

In our sandbox, installing 85 Go packages took 39 seconds and the build succeeded in 73 seconds. go test completed in 31 seconds but reported 0 passed and 0 failed out of 0, so the run proves compilation, not exercised test coverage. The checkout had 508 files, about 44,814 source lines, and occupied 9.1 MB.

Running the application needs PostgreSQL 12 or newer plus SMTP credentials or a configured messenger. The Docker Compose route supplies the app and database, while the binary route requires generating a config, installing database tables, and creating the first administrator. Production also needs a public URL, TLS, backups, bounce handling, and sender-domain configuration.

The repository includes a Dockerfile, Compose file, and 6 CI workflows. Upgrades have an explicit database command, and configuration can come from config.toml or LISTMONK_* environment variables. Email delivery capacity and reputation remain properties of the SMTP services you connect.

listmonk owns the campaign layer, not mail delivery

listmonk manages subscribers, lists, campaigns, templates, transactional messages, and reporting. It does not replace the server or provider that accepts and delivers outgoing mail. Operators connect one or more SMTP services, then use listmonk to decide who receives what, render the message, queue sends, and record campaign results. That boundary is useful because it keeps subscriber data and workflow under your control without asking a small Go application to become a global mail network.

The project supports one-way lists with single or double opt-in, SQL-expression segmentation, campaign analytics, bounce views, and top-link reporting. Templates use Go's templating language with more than 100 functions, while editors cover visual layouts, WYSIWYG, Markdown, HTML, and plain text. GitHub reported 23,130 stars and 110 issues and pull requests combined. This is a broad, established product rather than a basic bulk-send script.

One binary still depends on PostgreSQL and SMTP

The application is distributed as a single binary, but a useful installation is at least 3 systems: listmonk, PostgreSQL, and an SMTP or messenger provider. The official binary path generates config.toml, installs database tables, and opens the web interface on port 9000. Docker Compose packages the first 2 pieces together. Neither route configures DNS authentication, warms a sending domain, negotiates provider limits, or creates a backup policy.

PostgreSQL 12 or newer is required. Configuration can live in a file or LISTMONK_* environment variables, and the first administrator can be created interactively or supplied during installation. That is a clean setup for an operator who already knows containers and databases. A marketer expecting a sign-up page and immediate delivery will discover that self-hosting moves infrastructure decisions onto the team, even when the application command itself takes minutes.

Segmentation is powerful because it exposes SQL

Subscriber attributes can be queried with SQL expressions, which allows precise segments without waiting for listmonk to add a visual rule for every field. A team can target customers by custom JSON attributes, list membership, or stored profile data. The same power raises the cost of mistakes. A broad condition can select too many recipients, and a malformed one can block a campaign. Important segments deserve a preview and peer review before a large send.

The queue supports multiple SMTP connections, throughput controls, and sliding-window rate limits. Recent issue activity includes a request for per-SMTP throttling rather than global settings, which shows a current boundary for operators mixing providers with different limits. The latest release was v6.2.0, published on 2026-06-26. Read upgrade notes before changing versions because the database is the durable center of the system.

Transactional messages broaden the use case

An API can send arbitrary transactional messages to subscribers through predefined templates. Messenger HTTP webhooks extend delivery beyond email to SMS, WhatsApp, push notifications, or another medium implemented by the operator. Granular API tokens and role-based access make this more credible as an internal messaging service than a dashboard-only newsletter app. S3-compatible storage can hold media outside the local filesystem.

That breadth should not collapse all company messaging into one unexamined service. Password resets and receipts have different urgency, retention, and failure rules from weekly newsletters. If listmonk handles both, use separate templates, credentials, rate expectations, and monitoring. A stalled campaign should not delay account mail. The repository's 110-item combined issue and PR count also includes active discussion around analytics consistency and multi-SMTP behavior, both relevant to operational trust.

What happened when we ran it

Our sandbox installed 85 Go packages in 39 seconds, then built listmonk successfully in 73 seconds. The run used 3 CPUs and 8 GB of RAM in a golang:1.24-bookworm container. The checkout at commit 670c017 held 508 files, about 44,814 lines of source, and occupied 9.1 MB. These figures cover a source build, not database setup or sending a campaign.

go test also exited successfully after 31 seconds, but it reported 0 passed and 0 failed out of 0. The repository has no top-level tests directory. That outcome is not evidence that campaigns, migrations, bounces, or templates passed a test suite in our environment. It only says the test command returned cleanly without discovering tests under the harness's reporting method. Six CI workflow files provide upstream automation signals, but they do not change our measured 0-test result.

Current activity supports a serious deployment

The last push was 2026-08-25, and v6.2.0 had shipped about 2 months earlier. Recently updated issues covered analytics granularity, SMTP throttling, list changes affecting recipient counts, settings failures with null JSON values, and an idempotent-install edge case. That is healthy product maintenance around real operational paths, not a repository kept warm by automated dependency updates alone.

Documentation is spread sensibly between a short README and the official site. Installation, configuration, templating, developer setup, and upgrade steps have dedicated pages. The homepage also describes OIDC single sign-on, permissions, API tokens, media storage, and messenger interfaces. AGPL-3.0 is the final deployment check: internal use is straightforward, while organizations modifying and serving the software over a network should have counsel review their obligations.

Choose it when data ownership pays for operations

listmonk is a strong fit for a technical organization that already has PostgreSQL, an SMTP relationship, and someone responsible for backups and delivery health. It consolidates subscriber management and campaigns without charging by contact, and its API keeps it useful beyond a marketing dashboard. The compact binary is a genuine operational advantage once the surrounding services exist.

A small publication with no infrastructure owner should price the human work before celebrating zero software fees. Managed services absorb abuse handling, provider changes, compliance tooling, and support. listmonk gives you control over 1 subscriber database and many delivery paths, but that control is an ongoing job. Adopt it when ownership is a requirement, not merely because Docker Compose starts successfully.

Alternatives

ProjectWhat it isPick it when
MauticA larger self-hosted marketing automation platform with campaigns, contacts, and integrations.pick this instead when lead scoring and multi-step marketing automation matter more than a compact mailing tool.
Ghost gh↗A publishing platform with memberships and email newsletters built around a website CMS.pick this instead when the newsletter is attached to a public publication and paid membership workflow.
ButtondownA hosted newsletter service with a developer-friendly API and less infrastructure to manage.pick this instead when you want to pay for operations rather than run PostgreSQL and mail delivery.

What people are saying

  1. [github-trending] knadh/listmonk

Sources

  1. listmonk README
  2. listmonk installation documentation
  3. listmonk product and feature overview
  4. listmonk v6.2.0 release
  5. listmonk issues and pull requests

More self-hosted reviews

newsnow · forem · octo-server · runtime · openfang · SparkyFitness · the whole board →