listmonk is a standalone high performance, self-hosted newsletter and mailing list manager with a modern dashboard. Single binary app.

listmonk

listmonk is a standalone, self-hosted, newsletter and mailing list manager. It is fast, feature-rich, and packed into a single binary. It uses a PostgreSQL database as its data store.

listmonk-dashboard Visit listmonk.app

Installation

Docker

The latest image is available on DockerHub at listmonk/listmonk:latest. Use the sample docker-compose.yml to run listmonk and Postgres DB with docker-compose as follows:

Demo

mkdir listmonk-demo
sh -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-demo.sh)"

The demo does not persist Postgres after the containers are removed. DO NOT use this demo setup in production.

Production

Easy Docker install

This setup is recommended if you want to quickly setup listmonk in production.

mkdir listmonk
sh -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-prod.sh)"

The above shell script performs the following actions:

  • Downloads docker-compose.yml and generates a config.toml.
  • Runs a Postgres container and installs the database schema.
  • Runs the listmonk container.

NOTE: It's recommended to examine the contents of the shell script, before running in your environment.

Manual Docker install

The following workflow is recommended to setup listmonk manually using docker-compose. You are encouraged to customise the contents of docker-compose.yml to your needs. The overall setup looks like:

  • docker-compose up db to run the Postgres DB.
  • docker-compose run --rm app ./listmonk --install to setup the DB (or --upgrade to upgrade an existing DB).
  • Copy config.toml.sample to your directory and make the following changes:
    • app.address => 0.0.0.0:9000 (Port forwarding on Docker will work only if the app is advertising on all interfaces.)
    • db.host => listmonk_db (Container Name of the DB container)
  • Run docker-compose up app and visit http://localhost:9000.

More information on docs.


Binary

  • Download the latest release and extract the listmonk binary.
  • ./listmonk --new-config to generate config.toml. Then, edit the file.
  • ./listmonk --install to setup the Postgres DB (or --upgrade to upgrade an existing DB. Upgrades are idempotent and running them multiple times have no side effects).
  • Run ./listmonk and visit http://localhost:9000.

Heroku

Deploy

Developers

listmonk is a free and open source software licensed under AGPLv3. If you are interested in contributing, refer to the developer setup. The backend is written in Go and the frontend is Vue with Buefy for UI.

License

listmonk is licensed under the AGPL v3 license.

Owner
Kailash Nadh
Hobbyist developer | CTO @zerodha | Volunteer @fossunited
Kailash Nadh
Comments
  • Problems running on Docker

    Problems running on Docker

    Version:

    • listmonk: [eg: v1.0.0]
    • OS: Mac Big Sur 11.04

    Description of the bug and steps to reproduce: I've installed Listmonk on my Mac around two months ago, and after some back and forth, it has worked well. Today I tried to run it again, but a weird thing happened. First, it ran normally, but the DB was a different one, without any history, campaigns, subscribers, nothing. After re-starting, when I launched it via Terminal, the response was an error message:

    [MACHINE NAME] com.docker.docker >> docker compose up
    [+] Running 4/0
     ⠿ Container comdockerdocker_demo-db_1   Running                                                                    0.0s
     ⠿ Container comdockerdocker_demo-app_1  Running                                                                    0.0s
     ⠿ Container comdockerdocker_db_1        Created                                                                    0.0s
     ⠿ Container comdockerdocker_app_1       Created                                                                    0.0s
    Attaching to app_1, db_1, demo-app_1, demo-db_1
    Error response from daemon: driver failed programming external connectivity on endpoint comdockerdocker_db_1 (e2dcf5fd40f60311c43f2f5ca5177bc474eb0b69afd3805e942c5082af0ceb52): Bind for 0.0.0.0:9432 failed: port is already allocated
    

    When I checked on Docker, I saw that there were duplicated instances of Listmonk and Postgres, which I could not remove anyhow:

    Screenshot 2021-06-10 at 14 50 11

    Could you help me to understand what am I doing wrong? Losing the history of the campaigns would be such a pain.

    @mr-karan , I am adding you here following a conversation with Kailash.

    Thanks in advance

  • Bounce processing

    Bounce processing

    I see a lot of you guys have Listmonk implemented in a production env. I was wondering how you guys process the soft and hard bounces and also the complaints.

  • Could you provide a step-by-step install guide?

    Could you provide a step-by-step install guide?

    For some reason, I got stuck on how to properly configure config.toml file. It will be so helpful if you can provide a step-by-step guide on how to install Listmonk. Also, there is no demo for a quick look!

    Please help!

  • packaging needs

    packaging needs

    Is your feature request related to a problem? Please describe.

    There are a few issues I’ve bumped into while packaging listmonk for debian(-based) systems. I adressed some of those in this PR. Maybe we can use this issue to explore some of the remaining stumbling blocks.

    Describe the solution you'd like

    • The LAST_COMMIT and VERSION make variables are currently hardcoded to use git for determining their respective values. Package builds often use release tarballs which do not contain any git metadata. The easiest solution is to make the caller determine these values by using the ?= instead of the := assignment in Makefile. This is what I do in my deb packaging. The downside is that every packager has to do that manually. A lot of other projects store release metadata in the repository.
    • --new-config should respect the --config option. Pratically speaking: calling listmonk --config /etc/listmonk/mysite.toml --new-config should create the config in /etc/listmonk/mysite.toml instead of storing it as config.toml in the current working directory.
    • I know that #326 and #344 already pointed this out, but I want to emphasize it again: I think it would be nice if update checks could be disabled either via the application configuration file or – even better – during build time. It is very common for packagers to disable these checks. There shouldn’t be a need to even render the update-check switch in the frontend in both of these cases.
    • I’d be nice to have a default systemd unit file as part of the project that can serve as a basis for package maintainers. systemd provides a lot of options that reduce the attack surface of an application and it would be nice if we could document any practical and applicable options right here, so they’re discoverable for everyone.

    As @alerque seems to be packaging listmonk for ArchLinux he can probably weigh in on this discussion as well. Consider it a friendly request for comments :).

    I’d be happy to submit pull requests if we reach consensus on solutions for any of the raised issues. Thank you for your time!

    Cheers,

    Konrad

  • How can I validate that SMTP is working correctly ?

    How can I validate that SMTP is working correctly ?

    Hi I am trying listmonk. I see a SMTP connection attempt on my mail server, but nothing after that. How can I debug what's going on on listmonk side, regarding SMTP ? Thank you

  • Public Archive of Previous Campaigns

    Public Archive of Previous Campaigns

    As described in #540 it would be great to have a pages for public archives of previous campaigns. #540 was closed when the other part of the feature request was addressed, so I'm opening this issue to keep this part alive :)

  • Work in progress (v0.7.0-alpha)

    Work in progress (v0.7.0-alpha)

    I've been spending time on and off on:

    • A tiny auth lib to add users and auth after not being able to find a simple enough package. AuthBoss is complex and large.
    • A new settings dashboard.
    • Scrapping React + AntDesign UI. This was a hard decision, but React + Ant is a mess. Despite having written the frontend, I've been unable to internalise or intuitively navigate the mess that is logic interspersed JSX of Ant Design components. I'm considering VueJS + Buefy (10x smaller than Ant). At least templates will look like templates. Would rather do this now when it's alpha than be locked-in. I am unable to recollect the exact reasons for having made this choice in the first place.
  • Add Prometheus metrics

    Add Prometheus metrics

    This pull request implements #627 .

    The goal here is to expose some basic metrics over a Prometheus endpoint.

    ~This is very much a draft PR for now. I would expect this to get rebased into something cleaner before it's taken out of draft state.~ Undrafted, yay! \o/

  • Basic Questions wrt Listmonk

    Basic Questions wrt Listmonk

    Creating a new issue as was asked for earlier :) I am trying to send out a test mail from campaign screen, it says email sent but does not land in my mail (SES dashboard also says 0 emails sent). SMTP settings are done for the same region the destination email ID belongs to (Mumbai). listmonk dashboard also says 0 msg sent.

    Few call outs: I have only 1 SMTP setting enabled (single port) - Do I need to add SMTP settings for all 3 ports? SES account is in sandbox (allows 200 emails to be sent) - can this be the reason? msg rate x concurrency = email rate of SES

  • Return-Path and thus bounce handling not working

    Return-Path and thus bounce handling not working

    Version:

    • listmonk: 2.2.0
    • OS: Debian 11
    • Installation: Single binary started with custom systemd service

    Some configuration infos: Bounce handling is listmonk is on and listmonk expects bounces in a pop3 mailbox.

    Description of the bug: For all outgoing e-mails sent from listmonk, the "Return-Path" header is always exactly the same as the "From" header. Changing the "Return-Path" via custom headers in the campaign settings does not seem to do anything. Changing other headers such as "Errors-To" works. For us, this means, that currently bounces are not sent back to the correct mailbox. It has to be possible in listmonk to set "Return-Path" to a custom mail address, especially considering that our installation will use many different "From" addresses.

    Steps to reproduce:

    1. Set global SMTP custom headers [{"Return-Path": "[email protected]"}] according to documentation on https://listmonk.app/docs/bounces/
    2. Create a campaign.
    3. Set From to [email protected].
    4. Send test mail or start campaign.
    5. Verify headers in our smtp gateway or in Thunderbird on the receiving end.
    6. Header Return-Path is [email protected], which is wrong.
  • POP3 bounce

    POP3 bounce

    Version:

    • listmonk: [eg: v2.0.0]
    • OS: [Docker]

    Hello

    I wanted to set up a pop3 account to handle bounces. The account is running on a mail server, but unfortunately listmonk indicates an error in the log : bounce.go:139: error scanning bounce mailbox: unknown response. Neither -ERR, nor +OK

    Any idea what the solution might be? thx for help !

  • TrackView is not working

    TrackView is not working

    I am using TrackView for tracking views in emails sent via listmonk, as suggested i used TrackView only once in the template also within two curly braces ( {{ TrackView }} ) but I am testing everything in the development environment. How can I resolve this any kind of help will be appreciated

  • bad character U+003D '=' when submitting text containing @TrackLink from the API

    bad character U+003D '=' when submitting text containing @TrackLink from the API

    • listmonk: v2.3.0
    • OS: Debian

    I have been using python requests to submit campaigns to listmonk's API. Everything has been working fine until I decided to include the @TrackLink shorthand appended to each link href in the content body. The full error I am seeing when attempting to preview or edit a campaign that has been created through the API is: {"message":"Error compiling template: error compiling message: template: content:2: bad character U+003D '='"}

    The error is also showing up in the listmonk logs and the campaign will not send.

    If I open the API generated campaign in listmonk, select "Content", view the HTML source in the editor, click "Format HTML", "Save", then "Save Changes" to the campaign the issue is resolved. The campaign becomes fully functional.

    Attached is the "body" value that is returned by the API when the campaign is created. If I remove "@TrackLink" from the hrefs the error goes away. body.txt

  • Accepting AWS SNS notifications (Delivery, Send, ...) as Bounce

    Accepting AWS SNS notifications (Delivery, Send, ...) as Bounce

    Version:

    • listmonk: v2.3.0
    • OS: Docker Image

    Description of the bug and steps to reproduce: I initially setup in AWS SNS to send all even types (Delivery, Send, ...) and I noticed in listmonk Bounces list that emails with delivery status were also marked as bounce. I then changed to only send notification for Bounces.

    In the code I don't see any checks for eventType, I think we should add check in code to make sure the eventType is Bounce (and maybe also Complaint?) In sesMail struct, I see notificationType but not eventType where I noticed the Bounce event type.

    Payload for notificationType = Delivery

    {
      "mail": { ... },
      "delivery": { ... },
      "notificationType": "Delivery"
    }
    

    Payload for eventType = Bounce

    {
      "mail": { ... },
      "bounce": { ... },
      "eventType": "Bounce"
    }
    
  • Default

    Default "From" field generates 5.6.7 SMTP bounce on Google Workspace MX servers

    Version:

    • listmonk: v2.3.0
    • OS: Debian 11u5

    Description of the bug and steps to reproduce: I sent myself an e-mail using the SMTP connection test tool (to a Google Workspace mailbox). I get a 5.6.7 SMTP bounce from the Google Workspace servers.

    So given the nature of the 5.6.7 error, it's most likely related to the quotes between the sender name, like Listmonk does: "Name" <[email protected]>, since I tried exactly the same e-mail from another client (Evolution) that builds the From: field in the following way: Name <[email protected]> (without any quotes around the sender name) and the e-mail gets through without any issue.

    How can I proceed from there? Write a patch?

    Thank you in advance.

GoatCounter is an open source web analytics platform available as a hosted service or self-hosted app

GoatCounter is an open source web analytics platform available as a hosted service (free for non-commercial use) or self-hosted app. It aims to offer easy to use and meaningful privacy-friendly web analytics as an alternative to Google Analytics or Matomo.

Dec 29, 2022
Self-hosted video-hosting website and video archival manager for Niconico, Bilibili, and Youtube
Self-hosted video-hosting website and video archival manager for Niconico, Bilibili, and Youtube

Self-hosted video-hosting website and video archival manager for Niconico, Bilibili, and Youtube

Jan 1, 2023
Remark42 is a self-hosted, lightweight, and simple comment engine
Remark42 is a self-hosted, lightweight, and simple comment engine

Remark42 is a self-hosted, lightweight, and simple (yet functional) comment engine, which doesn't spy on users. It can be embedded into blogs, articles or any other place where readers add comments.

Dec 28, 2022
Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles.
Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles.

Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles. It supports multiple users sharing multiple vehicles. It is the logical successor to Clarkson which has not been updated for quite some time now.

Jan 2, 2023
Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana.
Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana.

Focalboard Like what you see? ?? Give us a GitHub Star! ⭐ Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana. It helps

Jan 9, 2023
Mouthful is a self-hosted alternative to Disqus.

Mouthful is a lightweight commenting server written in GO and Preact. It's a self hosted alternative

Dec 20, 2022
longurl is a self-hosted short url service.

longurl Introduction longurl is a self-hosted short url service. Try It Out curl -H "Content-Type:application/json" -X POST --data '{"url": "https://g

Oct 24, 2022
🖖🏻 A self-hosted Quora like web application written in Go
🖖🏻 A self-hosted Quora like web application written in Go

Guora ???? A self-hosted Quora like web application written in Go 基于 Golang 类似知乎的私有部署问答应用 包含问答、评论、点赞、管理后台等功能 Quick Start (Docker Deploy) $ docker-comp

Dec 27, 2022
A self-hosted golang application that listens for Terraform pull request events via webhooks.
A self-hosted golang application that listens for Terraform pull request events via webhooks.

Atlantis Terraform Pull Request Automation Resources What is Atlantis? What does it do? Why should you use it? Stargazers over time Resources How to g

Dec 9, 2021
A cross platform single binary tool to work with draw io files

SNIPO SNIPIO is a cross platform single binary tool to work with draw io files With snipio you can do the following operations: list all layers in a d

Jan 7, 2023
Tiny to-do list web app written in Go

Simple Lists Simple Lists is a tiny to-do list web app. It's written in Go in an old-school way with no JavaScript, plain old HTTP GET and POST, and a

Oct 19, 2022
A Standalone MPQUIC implementation in pure Go

A Standalone MPQUIC implementation in pure Go Inspired and based on: https://multipath-quic.org/2017/12/09/artifacts-available.html mpquic_actor_criti

Nov 24, 2021
Hajimari is a beautiful & customizable browser startpage/dashboard with Kubernetes application discovery.
Hajimari is a beautiful & customizable browser startpage/dashboard with Kubernetes application discovery.

Hajimari ?? ...The beginning of a pleasant experience Features Web search bar Dynamically list apps discovered from Kubernetes ingresses Support for n

Jan 4, 2023
📚 Task Manager App for CVWO Application (Backend)
📚 Task Manager App for CVWO Application (Backend)

Task Manager App for CVWO Application 2022 Task The task for this project is to build a fullstack task manager app, and was done over the winter break

Jan 3, 2023
High performance Copy-on-write gop cache code

PLEASE USE joy5 INSTEAD joy5 High performance Copy-on-write gop cache code Better av.Packet design code JOY4 Golang audio/video library and streaming

Jun 24, 2022
記帳-PWA-web-app (Bookkeeping-PWA-web-app)
記帳-PWA-web-app (Bookkeeping-PWA-web-app)

GoKeep (bookkeeping web app) 記帳-PWA-web-app (Bookkeeping-PWA-web-app) demo link : https://bookkepping.herokuapp.com/ 測試用帳密 : tester002 , tester002 (亦可

Jan 31, 2022
This is my personal website, hosted on GitHub Pages

astrophena.name This is my personal website, hosted on GitHub Pages. Serving locally You need the latest Go and Node.js installed.

Nov 16, 2022
Okta Golang Gin & Okta-Hosted Login Page Example

Okta Golang Gin & Okta-Hosted Login Page Example This example shows you how to use the Okta JWT verifier library to login a user to a Golang Gin appli

Oct 31, 2022
Generate a modern Web project with Go and Angular, React or Vue in seconds 🚀
Generate a modern Web project with Go and Angular, React or Vue in seconds 🚀

Goxygen Generate a Web project with Go and Angular, React or Vue. Goxygen aims at saving your time while setting up a new project. It creates a skelet

Jan 5, 2023