listmonk is a self-hosted newsletter and mailing list management platform designed for developers and businesses seeking full control over their email and messaging infrastructure. It eliminates reliance on third-party services by providing a complete, standalone solution with built-in analytics, templating, and multi-channel delivery. Built for scalability, it handles millions of subscribers with minimal resource usage and supports both SMTP and custom messenger integrations.
The application is written in Go with a Vue.js frontend using Buefy, stores data in PostgreSQL, and deploys via a single binary or Docker. It includes an API for automation, supports OIDC SSO, and integrates with S3-compatible storage for media assets, making it ideal for privacy-conscious organizations and technical teams managing large-scale communication campaigns.
What You Get
- Single Binary Deployment - listmonk ships as a standalone binary with no external dependencies, simplifying installation and deployment on any system without containerization or complex setups.
- PostgreSQL Data Store - Uses PostgreSQL for robust, scalable storage of subscribers, campaigns, and analytics data with full SQL query support for segmentation and reporting.
- Go Template Engine for Emails - Supports dynamic email templates using Go’s templating language with 100+ functions for personalized subject lines and content logic.
- WYSIWYG & Markdown Email Editor - Build HTML emails using a visual drag-and-drop editor, Markdown, raw HTML with syntax highlighting, or plain text—all within the dashboard.
- Built-in Campaign Analytics - Track open rates, click-throughs, bounce rates, top links, and subscriber behavior with real-time visual dashboards and exportable reports.
- Transactional Email & Multi-Channel API - Send personalized messages via email, SMS, WhatsApp, or FCM using pre-defined templates through a RESTful API with webhook support for custom messengers.
- OIDC SSO & Granular Permissions - Secure access with OpenID Connect single sign-on and fine-grained role-based permissions for teams and external contributors.
- S3-Compatible Media Library - Store and manage images and attachments using any S3-compatible storage backend like MinIO, AWS S3, or Cloudflare R2.
Common Use Cases
- Running a paid membership newsletter - A journalist uses listmonk to publish subscriber-only articles behind a paywall, leveraging SQL-based segmentation to target paying members and track engagement without relying on Mailchimp or Substack.
- Managing a large open-source community mailing list - An open-source project maintainer uses listmonk to send updates to 500k+ subscribers with high throughput and low server costs, using Go templates to personalize announcements per project version.
- Sending transactional alerts via SMS and email - A SaaS company uses listmonk’s API to trigger password reset emails and SMS alerts using the same template system, unifying communication channels without third-party APIs.
- Privacy-focused email marketing for NGOs - A nonprofit organization deploys listmonk on-premises to ensure subscriber data never leaves their infrastructure, using OIDC SSO to manage team access and S3 storage for campaign media.
Under The Hood
Architecture
- Monolithic Go application centered around a single App struct that tightly couples HTTP handlers with core business logic and database access, lacking clear layering between presentation, service, and data layers
- HTTP routing directly references internal packages, mixing route definitions with validation and data access, violating separation of concerns
- Dependencies such as database connections and configuration are passed implicitly via constructor injection, creating hard-to-test, opaque dependencies
- Frontend assets are statically bundled into the binary, achieving clean backend-frontend decoupling but without API contract enforcement or dedicated frontend service layers
- Configuration uses environment variables with TOML fallback, and database schema is versioned via SQL files, enabling repeatable deployments without migration orchestration
Tech Stack
- Go backend leveraging the standard library HTTP server, compiled as a static binary without CGO for portability
- PostgreSQL with connection pooling and environment-driven configuration, paired with SQL-based schema migrations
- Docker-based deployment with multi-arch builds, OCI-compliant labels, and automated health checks
- Vite + Vue.js frontend with TypeScript, bundled and embedded into the binary via build tooling
- GoReleaser automates cross-platform binary packaging and Docker image generation across multiple architectures
- Internationalization powered by inlang with JSON locale files and linting for consistent multilingual support
Code Quality
- Comprehensive test suite spanning unit, integration, and end-to-end scenarios with clear separation between API and service-level tests
- Consistent error handling using standardized HTTP responses, though custom error types are underutilized
- Well-structured codebase with logical separation of handlers, services, and models, following clean architecture principles
- Strong type safety enforced via TypeScript with robust interfaces and type guards across data boundaries
- Strict linting and formatting rules applied via ESLint and Prettier, ensuring uniform style and reducing anti-patterns
- Descriptive naming conventions with verb-noun patterns for functions and PascalCase for types, enhancing readability
What Makes It Unique
- Native server-side email template engine with real-time visual and HTML editing rendered directly in-browser
- Granular role-based permissions system controlling access to lists, campaigns, and media at both API and UI levels
- Built-in multi-format subscriber import with ZIP support and live progress tracking, eliminating external tool dependencies
- Privacy-first design with configurable tracking opt-outs and anonymized analytics as the default
- Unified admin dashboard combining live metrics, campaign analytics, and media library—all served from a single binary
- Extensible messenger integrations via pluggable interfaces, enabling custom notification channels without forking code