{
  "schema_version": 1,
  "generated_at": "2026-10-22T00:00:00.000Z",
  "canonical_url": "https://openlogs.fyi/tools/listmonk",
  "slug": "listmonk",
  "name": "Listmonk",
  "tagline": "Newsletter and mailing list manager written in Go, shipped as a single binary with a web dashboard.",
  "replaces": {
    "summary": "Paid email newsletter services, such as Mailchimp.",
    "products": [
      {
        "slug": "mailchimp",
        "name": "Mailchimp",
        "vendor": "Intuit",
        "url": "https://openlogs.fyi/alternatives/mailchimp"
      }
    ]
  },
  "stack": [
    {
      "kind": "language",
      "name": "Go"
    },
    {
      "kind": "database",
      "name": "PostgreSQL"
    }
  ],
  "deployment_methods": [
    "docker_compose"
  ],
  "requirements": {
    "min_ram_mb": null,
    "min_cpu_cores": null,
    "source_url": null
  },
  "license": {
    "spdx": "AGPL-3.0",
    "class": "osi",
    "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/LICENSE"
  },
  "business_model": {
    "value": "unknown",
    "notes": "The README at the pinned commit does not state a business model, so it stays unknown.",
    "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/README.md",
    "checked_at": "2026-10-22"
  },
  "difficulty": {
    "value": "medium",
    "reason": "2 services (1 database or broker: postgres), 2 volume mounts, no env values to set, no elevated host access. Heuristic score 3 of 11: medium."
  },
  "repository": {
    "owner": "knadh",
    "name": "listmonk",
    "url": "https://github.com/knadh/listmonk"
  },
  "compose_check": {
    "status": "config_ok",
    "validated_at": "2026-10-22",
    "summary": "config_ok on 2026-10-22"
  },
  "recipe": {
    "version": 1,
    "source_path": "docker-compose.yml",
    "source_repo": "knadh/listmonk",
    "source_commit_sha": "9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e",
    "source_kind": "app_repo",
    "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml"
  },
  "install_steps": [
    {
      "order": 1,
      "kind": "prerequisite",
      "language": "text",
      "label": "Docker with the Compose plugin",
      "body": "A host with Docker and the Docker Compose plugin. This entry runs from a compose file.",
      "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 2,
      "kind": "compose",
      "language": "yaml",
      "label": "Save the compose file as docker-compose.yml",
      "body": "# All LISTMONK_* env variables also support the LISTMONK_*_FILE pattern for loading secrets from files with Docker secrets and Podman\n# eg: LISTMONK_ADMIN_USER -> LISTMONK_ADMIN_USER_FILE=/path/to/file_with_value\n\nx-db-credentials: &db-credentials                             # Use the default POSTGRES_ credentials if they're available or simply default to \"listmonk\"\n  POSTGRES_USER: &db-user listmonk                            # for database user, password, and database name\n  POSTGRES_PASSWORD: &db-password listmonk\n  POSTGRES_DB: &db-name listmonk\n\nservices:\n  # listmonk app\n  app:\n    image: listmonk/listmonk:latest\n    container_name: listmonk_app\n    restart: unless-stopped\n    ports:\n      - \"9000:9000\"                                           # To change the externally exposed port, change to: $custom_port:9000\n    networks:\n      - listmonk\n    hostname: listmonk.example.com                            # Recommend using FQDN for hostname\n    depends_on:\n      - db\n    command: [sh, -c, \"./listmonk --install --idempotent --yes --config '' && ./listmonk --upgrade --yes --config '' && ./listmonk --config ''\"]\n                                                              # --config (file) param is set to empty so that listmonk only uses the env vars (below) for config.\n                                                              # --install --idempotent ensures that DB installation happens only once on an empty DB, on the first ever start.\n                                                              # --upgrade automatically runs any DB migrations when a new image is pulled.\n\n    environment:                                              # The same params as in config.toml are passed as env vars here.\n      LISTMONK_app__address: 0.0.0.0:9000\n      LISTMONK_db__user: *db-user\n      LISTMONK_db__password: *db-password\n      LISTMONK_db__database: *db-name\n      LISTMONK_db__host: db\n      LISTMONK_db__port: 5432\n      LISTMONK_db__ssl_mode: disable\n      LISTMONK_db__max_open: 25\n      LISTMONK_db__max_idle: 25\n      LISTMONK_db__max_lifetime: 300s\n      TZ: Etc/UTC\n      LISTMONK_ADMIN_USER: ${LISTMONK_ADMIN_USER:-}           # If these (optional) are set during the first `docker compose up`, then the Super Admin user is automatically created.\n      LISTMONK_ADMIN_PASSWORD: ${LISTMONK_ADMIN_PASSWORD:-}   # Otherwise, the user can be setup on the web app after the first visit to http://localhost:9000\n    volumes:\n      - ./uploads:/listmonk/uploads:rw                        # Mount an uploads directory on the host to /listmonk/uploads inside the container.\n                                                              # To use this, change directory path in Admin -> Settings -> Media to /listmonk/uploads\n\n  # Postgres database\n  db:\n    image: postgres:17-alpine\n    container_name: listmonk_db\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:5432:5432\"                                 # Only bind on the local interface. To connect to Postgres externally, change this to 0.0.0.0\n    networks:\n      - listmonk\n    environment:\n      <<: *db-credentials\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U listmonk\"]\n      interval: 10s\n      timeout: 5s\n      retries: 6\n    volumes:\n      - type: volume\n        source: listmonk-data\n        target: /var/lib/postgresql/data\n\nnetworks:\n  listmonk:\n\nvolumes:\n  listmonk-data:\n",
      "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml",
      "validation_status": "config_ok"
    },
    {
      "order": 3,
      "kind": "shell",
      "language": "bash",
      "label": "Start it",
      "body": "docker compose up -d",
      "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 4,
      "kind": "verify",
      "language": "text",
      "label": "Open the app",
      "body": "Open http://localhost:9000. The compose file publishes host port 9000 for the app service.",
      "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml",
      "validation_status": "unvalidated"
    }
  ],
  "notes": [
    {
      "kind": "gotcha",
      "title": "Some images use the latest tag or no tag",
      "body": "Images without a pinned version: app: listmonk/listmonk:latest. A later pull can get a different version.",
      "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file publishes host ports",
      "body": "Host ports: 9000 (app), 127.0.0.1:5432 (db). A port without a host address listens on all host network interfaces.",
      "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file mounts host folders",
      "body": "Host paths mounted into containers: ./uploads at /listmonk/uploads (app).",
      "source_url": "https://github.com/knadh/listmonk/blob/9351a3ef86e2c06aacdd98ca5ae839ef888f0f9e/docker-compose.yml",
      "checked_at": "2026-10-22"
    }
  ],
  "signals": {
    "captured_at": "2026-10-22",
    "stars": 23908,
    "forks": 2711,
    "open_issues": 59,
    "last_push": "2026-10-22",
    "days_since_push": 0,
    "latest_release": "v7.0.0-beta.1",
    "latest_release_date": "2026-10-20",
    "days_since_release": 1
  },
  "links": {
    "html": "https://openlogs.fyi/tools/listmonk",
    "markdown": "https://openlogs.fyi/tools/listmonk.md",
    "json": "https://openlogs.fyi/tools/listmonk.json"
  },
  "updated_at": "2026-10-22"
}
