High performance, self-hosted, newsletter and mailing list manager with a modern dashboard. Single binary app.
Find a file
Kailash Nadh 942eb7c3d8 Add settings UI and "hot reload" support to the app.
This is a major breaking change that moves away from having the
entire app configuration in external TOML files to settings being
in the database with a UI to update them dynamically.

The app loads all config into memory (app settings, SMTP conf)
on boot. "Hot" replacing them is complex and it's a fair tradeoff
to instead just restart the application as it is practically
instant.

A new `settings` table stores arbitrary string keys with a JSONB
value field which happens to support arbitrary types. After every
settings update, the app gracefully releases all resources
(HTTP server, DB pool, SMTP pool etc.) and restarts itself,
occupying the same PID. If there are any running campaigns, the
auto-restart doesn't happen and the user is prompted to invoke
it manually with a one-click button once all running campaigns
have been paused.
2020-07-21 00:23:57 +05:30
frontend Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
internal Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
models Add {{ templating }} support to e-mail subjects 2020-07-05 18:39:24 +05:30
static Add support for hosted messages and {{ MessageURL }} tpl tag. 2020-04-26 15:51:43 +05:30
.dockerignore feat: Add blobstore package 2019-10-31 11:25:31 +05:30
.gitattributes Add .gitattributes for github-linguist 2019-07-15 09:34:56 +05:30
.gitignore feat: Add separate config for demo setup, tweak docs 2020-07-08 22:38:31 +05:30
.goreleaser.yml feat: Add separate config for demo setup, tweak docs 2020-07-08 22:38:31 +05:30
admin.go Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
campaigns.go Add {{ templating }} support to e-mail subjects 2020-07-05 18:39:24 +05:30
config-demo.toml feat: Add separate config for demo setup, tweak docs 2020-07-08 22:38:31 +05:30
config.toml.sample Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
docker-compose.yml feat: Add separate config for demo setup, tweak docs 2020-07-08 22:38:31 +05:30
Dockerfile feat: Add separate config for demo setup, tweak docs 2020-07-08 22:38:31 +05:30
go.mod Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
go.sum Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
handlers.go Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
import.go Add 'overwrite?' option to bulk import. 2020-07-05 21:35:17 +05:30
init.go Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
install.go Add 'overwrite?' option to bulk import. 2020-07-05 21:35:17 +05:30
INSTALL.md feat: Add separate config for demo setup, tweak docs 2020-07-08 22:38:31 +05:30
LICENSE Refactor and add new build routines 2019-07-09 15:57:04 +05:30
lists.go Fix incorrect param read bug in list deletion handler 2020-05-23 12:03:04 +05:30
main.go Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
Makefile Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
manager_db.go Refactor get-campaign to accept uuid + get body 2020-04-26 15:51:26 +05:30
media.go Refactor and fix media uploads. 2020-07-05 17:35:05 +05:30
notifications.go Add support for pushing non-campaign message with workers. 2020-03-08 12:27:41 +05:30
public.go Fix incorrect config check in subscriber data wipe 2020-06-05 09:25:45 +05:30
queries.go Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
queries.sql Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
README.md feat: Add separate config for demo setup, tweak docs 2020-07-08 22:38:31 +05:30
schema.sql Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
settings.go Add settings UI and "hot reload" support to the app. 2020-07-21 00:23:57 +05:30
stats.sql Add support for campaign view tracking with {{ TrackView }} pixel tag 2018-11-02 13:20:32 +05:30
subscribers.go Fix missing API response data{} envelope 2020-07-09 23:29:55 +05:30
templates.go Fix template preview sending invalid view requests 2020-03-08 15:10:51 +05:30
TODO.md Remove completed items 2020-05-25 11:55:02 +05:30
utils.go Remove 'govalidator' package dependecy 2020-03-08 13:03:38 +05:30

listmonk

listmonk is alpha software and may change and break. Use with caution. That said, it has been in active use at zerodha.com for several months where it has processed hundreds of campaigns and tens of millions of e-mails.

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-splash

Installation and use

  • Download the latest release for your platform and extract the listmonk binary. For example: tar -C $HOME/listmonk -xzf listmonk_$VERSION_$OS_$ARCH.tar.gz
  • Navigate to the directory containing the binary (cd $HOME/listmonk) and run ./listmonk --new-config to generate a sample config.toml and add your configuration (SMTP and Postgres DB credentials primarily).
  • ./listmonk --install to setup the DB.
  • Run ./listmonk and visit http://localhost:9000.
  • Since there is no user auth yet, it's best to put listmonk behind a proxy like Nginx and setup basicauth on all endpoints except for the few endpoints that need to be public. Here is a sample nginx config for production use.

Configuration and customization

See the configuration Wiki page.

Running on Docker

You can pull the official Docker Image from Docker Hub.

You can checkout the docker-compose.yml to get an idea of how to run listmonk with PostgreSQL together using Docker (also see configuring with environment variables). Please visit INSTALL.md for detailed instructions on how to setup Listmonk with Docker.

Alternatively, to run a demo of listmonk, you can quickly spin up a local setup with:

docker-compose up -d demo-db demo-app.

NOTE: This doesn't persist Postgres data after you stop and remove the container, this setup is intended only for demo. DO NOT use the demo setup in production.

Other deployments

Heroku

Using the Nginx buildpack can be used to deploy listmonk on Heroku and use Nginx as a proxy to setup basicauth. This one-click Heroku deploy button provides an automated default deployment.

Deploy

Please note that configuration options must be set using environment configruation variables.

Help and docs

Help and documentation (work in progress).

Current features

  • Admin dashboard
  • Public, private, single and double optin lists (with optin campaigns)
  • Fast bulk subscriber import
  • Custom subscriber attributes
  • Subscriber querying and segmentation with ad-hoc SQL expressions
  • Subscriber data wipe / export privacy features
  • Rich programmable Go HTML templates and WYSIWYG editor
  • Media gallery (disk and S3 storage)
  • Multi-threaded multi-SMTP e-mail queues for fast campaign delivery
  • HTTP/JSON APIs for everything
  • Clicks and view tracking
  • and more ...

Todo

  • DB migrations
  • Bounce tracking
  • User auth, management, permissions
  • Ability to write raw campaign logs to a target
  • Analytics views and reports
  • Better widgets on dashboard
  • Tests!

Developers

listmonk is free, open source software licensed under AGPLv3. There are several essential features such as user auth/management and bounce tracking that are currently missing. Contributions are welcome.

The backend is written in Go and the frontend is in React with Ant Design for UI. See developer setup to get started.

License

listmonk is licensed under the AGPL v3 license.