If you want to know how to self-host a newsletter, the short version is that Listmonk turns the whole job into a single binary and a Postgres database that run on hardware you control. No SaaS lock-in, no per-subscriber pricing creep, no third party holding your subscriber list hostage. That tradeoff is the entire appeal, and it’s why this guide exists.
Listmonk’s official documentation describes it as a self-hosted, high-performance one-way mailing list and newsletter manager that ships as a standalone binary with PostgreSQL as its only data-store dependency, licensed under AGPLv3. The project has been around since 2019, sits at more than 22,000 stars on GitHub, and its production claims are the kind that make you check the math twice: a campaign of 7 million emails running on a fraction of a single CPU core with peak RAM around 57 MB.
The project’s documentation also positions Listmonk as one-way newsletter and mailing-list management, separate from two-way transactional email systems, with subscriber and campaign management running on your own infrastructure. In plain English: this is the tool for sending a newsletter to a list, not for building a customer-support inbox.
Most of the questions I get about how to self-host a newsletter start with the same assumption: it must be complicated, because email is complicated. The truth is the app is the easy part. Listmonk gets out of the way quickly, and the hard work is the infrastructure around it, which this guide covers in order.
Learning how to self-host a newsletter properly breaks into five jobs. Install the app, create a subscriber list, import the people who asked to be on it, build and send a campaign, then verify the results. I’ll also cover link tracking and public archives, because those are the two features that make a self-hosted newsletter feel like a real publishing operation instead of a hobby script.
How to Self-Host a Newsletter: Pick the Install Path
Listmonk gives you two supported ways in, and both are documented in the official repository. The first is the release binary. The second is Docker, which bundles the app and its Postgres database so you can start everything with one command.
The repository documents the install flow as downloading a release binary, running ./listmonk --new-config to generate config.toml, running ./listmonk --install to set up the Postgres database, and then running ./listmonk and visiting http://localhost:9000.
The binary path is the honest default for a single server. You download one file, you run three commands, and you have a newsletter system. No container runtime required, no orchestration to babysit. If you already run Docker on the box, the compose path is even faster, and it’s the one I’d use for a quick test instance.
What You Need Before You Start
A self-hosted newsletter is a server problem before it’s an email problem, so gather these before you install.
A Linux VPS with at least 1 GB of RAM and a couple of GB of disk is plenty for a small-to-mid list. Listmonk’s own production numbers suggest you don’t need to overspend here. PostgreSQL, which is the only data store Listmonk needs. A domain name, because you should send email from a domain you control and verify, not from a rented IP with no reputation. SMTP credentials, either from your VPS provider, a transactional relay, or a mail server you already run.
You also need a sending reputation plan. This is the part every first-time self-hoster underestimates. Email providers check SPF, DKIM, and DMARC records on your domain, and they look at your IP history. If you skip DNS setup and fire 10,000 emails from a brand-new domain, a large chunk lands in spam. Configure SPF and DKIM before your first real campaign, not after the bounces teach you why they exist. Get this part right, and the rest of how to self-host a newsletter is mostly following steps.
Install Listmonk With Docker
The repository publishes a Docker image (listmonk/listmonk:latest) and a sample docker-compose.yml so the app and its Postgres database can be started with docker compose up -d. This is the fastest route when you want to self-host a newsletter on a machine that already runs containers.
Download the compose file and start the stack:
curl -LO https://github.com/knadh/listmonk/raw/master/docker-compose.yml
docker compose up -dThen visit http://localhost:9000 in a browser. The first run walks you through creating the admin account and connecting the app to the database. Docker Compose handles the Postgres container for you, which is the fastest way to get a working instance and the easiest way to learn how to self-host a newsletter without fighting database setup first.
One operational note on the compose path: the default compose file is tuned for a quick start, and the database credentials live in the file. If this box is going to hold a real list, change those credentials and put the compose file behind proper secrets before you point a domain at it.
Install Listmonk From the Binary
The binary path is the same install flow the repository documents, and it maps cleanly onto a plain VPS. Download the latest release from the GitHub releases page, extract it, then run the three setup commands in order.
Generate the config file:
./listmonk --new-configThat writes a config.toml you need to edit with your Postgres connection string, your app address, and your SMTP settings. Then initialize the database:
./listmonk --installThat command creates the schema and prompts for the admin account. Finally, run the app:
./listmonkYou now have a newsletter manager listening on http://localhost:9000. If you want it to survive reboots, run it under systemd or your process supervisor of choice. That part is not Listmonk-specific, but it’s the difference between a tool and a service. Knowing how to self-host a newsletter includes knowing how to keep it running.
Create Your First Subscriber List
Inside the dashboard, the Lists section is where your audience lives. A list is exactly what it sounds like: a named group of subscribers who opted into a specific stream of email.
Create one list per distinct newsletter you plan to send. If you have a weekly tech newsletter and a monthly product update, those are two lists, because you want the ability to send to one without spamming the other. Listmonk supports both single and double opt-in flows, and for a list you actually want to grow, double opt-in is the defensible default. The confirmation email is the proof that the address belongs to the person who claimed it.
Import Subscribers the Right Way
Importing is where people get lazy and it comes back to bite them. The dashboard’s import tool accepts subscriber data, but the quality of that data decides your deliverability.
Only import addresses you have explicit consent to email. If you’re migrating from another tool, bring the subscription timestamps and the opt-in records with you, not just the bare addresses. A list full of addresses that never opted in is a spam complaint machine, and complaints are the fastest way to poison a fresh domain.
Listmonk lets you segment subscribers with SQL expressions, which is a genuinely underrated feature. You can target a campaign at subscribers who joined after a date, who opened a previous campaign, or who match fields you collected at signup. That kind of segmentation is normally a premium feature in hosted tools. Here it’s a query box.
Build and Send Your First Campaign
Campaigns are the heart of the system. Listmonk’s official documentation describes the product as a one-way newsletter and mailing-list manager, and the campaign flow reflects that: you pick a list, you write an email, you send it, and you measure what happened.
The editor supports several modes, which the project’s site lists as a visual drag-and-drop builder, a WYSIWYG editor, Markdown, raw syntax-highlighted HTML, or plain text. If you’re comfortable writing HTML email by hand, the raw mode gives you full control over the layout. If you’d rather not, Markdown gets you a decent email without touching a table-based layout.
Before you send to the whole list, use the test-send option to fire the campaign at your own address. Check it in a desktop client and on a phone, because email rendering is still a minefield and the fancy layout that looks perfect in one client can fall apart in another. When the test looks right, schedule the send for a time your audience actually reads email. This is the moment where all the setup work pays off, and it’s the real reason people learn how to self-host a newsletter instead of renting one.
Track Clicks and Publish Archives
Here’s where self-hosting stops feeling like a compromise and starts feeling like an upgrade. Listmonk’s documentation covers per-subscriber link-click tracking (TrackLink) and public campaign archives, giving self-hosted newsletter owners engagement data beyond simple pageviews.
TrackLink rewrites the links in your campaign so the app records which subscriber clicked which link. You get per-campaign click maps and per-subscriber behavior without shipping any reader data to a third-party analytics vendor. That’s a meaningful privacy story for a newsletter that promises subscribers their data stays with you.
Public archives are the quieter killer feature. Every campaign can get a permanent public URL, which means you have an evergreen archive of everything you’ve sent. That archive is also a content asset: it gives search engines a stable page per issue, and it gives new subscribers a way to read the back catalog before they commit. The documentation for archives is one of the first places I’d point someone who wants to know how to self-host a newsletter professionally rather than just functionally.
Run It for Real: DNS, SMTP, and Deliverability
The install is the easy 20 percent. The remaining 80 percent is the boring infrastructure that decides whether your email arrives.
Set SPF, DKIM, and DMARC on your sending domain. SPF tells receiving servers which hosts are allowed to send for your domain. DKIM cryptographically signs your messages so tampering is detectable. DMARC tells receivers what to do with mail that fails both. Listmonk handles the mechanics of sending through your SMTP relay, but DNS records are yours to configure, and they’re non-negotiable for a real list. Anyone serious about how to self-host a newsletter treats this section as the actual product.
Choose your SMTP path deliberately. A transactional relay that you already use for other email is a reasonable start. A dedicated sending subdomain (like news.yourdomain.com) is better, because it isolates your newsletter reputation from your main domain. Warm up a new domain slowly: start with small sends to engaged subscribers, watch the open and bounce rates, and scale as the numbers stay healthy.
Bounces and complaints need a response plan. Every hard bounce should be removed from the list automatically, and Listmonk’s analytics give you the bounce view to act on. A list that prunes itself is a list that stays out of spam folders. These habits are what separate people who know how to self-host a newsletter from people who set one up and walked away.
When Self-Hosting a Newsletter Is the Right Call
Self-hosting is a system decision, not a virtue. It wins when you have the audience, the technical comfort, and the privacy requirements to justify it. You own the list, you control the code (it’s AGPLv3, so the source is open), and your subscriber data never touches a third-party platform.
It loses when you just want to send a monthly update and never think about infrastructure again. If you don’t want to patch a server, watch deliverability, or maintain Postgres, a hosted service is the honest choice, and there’s no shame in that. The math changes at scale and with privacy requirements, not with newsletter enthusiasm. When the hosted option keeps winning, keep using it, and skip the self-hosted path entirely.
I’ve been running my own publishing pipeline for a while now, and the same philosophy shows up all over it. My breakdown of how I automate creator distribution covers the loop I use to push content out, and my guide to scheduling X posts with Typefully walks through the social side of that loop. A self-hosted newsletter with Listmonk slots into that stack as the email channel you fully control, and that’s exactly the kind of tool worth learning how to self-host.




