{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "pentacent--keila",
    "name": "Keila",
    "tagline": "Self-hosted newsletter tool with campaigns, forms, and segments behind an official JSON API.",
    "shortTagline": "Self-hosted newsletter tool",
    "description": "Keila is an Elixir newsletter platform, an open alternative to Mailchimp: campaigns with a WYSIWYG or Markdown editor, sign-up forms, contact segments, and sending through SMTP, SES, Sendgrid, Mailgun, or Postmark. It runs from the official Docker image with a handful of env vars. The Builder documents a JSON API covering campaigns, contacts, segments, forms, templates, and transactional messages, which also works on self-hosted instances.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "content-publishing",
    "alternativeTo": [
      "Mailchimp",
      "Kit"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "human-written",
    "codeStack": {
      "languages": [
        "Elixir",
        "JavaScript"
      ],
      "frameworks": [
        "Phoenix",
        "Phoenix LiveView"
      ],
      "packageManager": "mix",
      "database": [
        "PostgreSQL"
      ],
      "hostingTarget": [
        "Docker (pentacent/keila)",
        "docker-compose"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/pentacent/keila",
        "owner": "pentacent",
        "name": "keila",
        "license": "AGPL-3.0",
        "stars": 2203,
        "lastCommit": "2026-09-02"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://www.keila.io/docs/api",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Create, schedule, and deliver newsletter campaigns",
        "reachable": true,
        "evidence": "keila.io/docs/api: Campaigns create, update, schedule, deliver"
      },
      {
        "job": "Manage contacts and custom data",
        "reachable": true,
        "evidence": "API Contacts CRUD with custom data fields"
      },
      {
        "job": "Segment the audience",
        "reachable": true,
        "evidence": "API Segments"
      },
      {
        "job": "Build sign-up forms",
        "reachable": true,
        "evidence": "API Forms create and submissions"
      },
      {
        "job": "Manage email templates",
        "reachable": true,
        "evidence": "API Templates"
      },
      {
        "job": "Send transactional messages",
        "reachable": true,
        "evidence": "API Transactional Messages send and render"
      },
      {
        "job": "Configure senders (SMTP, SES, Sendgrid, Mailgun, Postmark)",
        "reachable": false,
        "evidence": "API Senders is read access; sender setup is in the UI"
      },
      {
        "job": "Read campaign open and click statistics",
        "reachable": null,
        "evidence": "not listed among API resources on the docs page"
      },
      {
        "job": "Double opt-in flows",
        "reachable": null,
        "evidence": "form setting; API exposure not stated"
      }
    ],
    "editions": [
      {
        "name": "Self-hosted",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/pentacent/keila"
          },
          {
            "kind": "container",
            "url": "https://hub.docker.com/r/pentacent/keila",
            "command": "docker compose -f ops/docker-compose.yml up -d"
          }
        ]
      },
      {
        "name": "Keila Cloud XS",
        "price": {
          "amount": 8,
          "currency": "EUR",
          "period": "month"
        },
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://www.keila.io/pricing"
          }
        ]
      },
      {
        "name": "Keila Cloud S to XXL",
        "price": {
          "amount": 16,
          "currency": "EUR",
          "period": "month"
        },
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://www.keila.io/pricing"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or published skill found in the repo."
    },
    "customization": {
      "summary": "Copy ops/docker-compose.yml, set SECRET_KEY_BASE, DB_URL, URL_HOST, and the MAILER_SMTP_* vars for system mail, and start it. Campaign senders are added in the UI. Anything deeper (templates beyond the built-in editor, auth providers) is Elixir in config/runtime.exs and lib/.",
      "envVars": [
        "SECRET_KEY_BASE",
        "DB_URL",
        "URL_HOST",
        "MAILER_SMTP_HOST",
        "MAILER_SMTP_USER",
        "MAILER_SMTP_PASSWORD"
      ],
      "configFiles": [
        "ops/docker-compose.yml",
        "config/runtime.exs"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 8
    },
    "useWhen": [
      "I send a monthly newsletter and want to stop paying per contact",
      "I want my agent to add subscribers from other systems and schedule campaigns over an API on a box I control"
    ],
    "accounts": [
      "email delivery provider (SMTP inbox, AWS SES, Sendgrid, Mailgun, or Postmark)"
    ],
    "active": true,
    "lastActivity": "2026-09-02",
    "gotchas": [
      "AGPL-3.0",
      "Elixir stack: fewer Adopters can make light edits than with a PHP or Node app",
      "API key must be generated in account settings before the API answers",
      "Sender configuration is not writable through the API"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: web app deployed from the official Docker image",
      "executionModel": "no model at runtime",
      "operability": "keila.io/docs/api (Builder domain): Bearer API key, JSON API for campaigns, contacts, forms, segments, senders, templates, transactional messages; works on self-hosted",
      "effort": "ops/docker-compose.yml names SECRET_KEY_BASE, DB_URL, URL_HOST, MAILER_SMTP_*",
      "editions": "keila.io/pricing: XS EUR 8 to XXL EUR 256 per month; self-hosting free under AGPL",
      "active": "pushedAt 2026-09-02; 74 open issues",
      "provenance": "pentacent-built since 2020; no vibe-coded claim"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.95,
      "operability": 0.9,
      "effort": 0.9,
      "reach": 0.8,
      "editions": 0.85,
      "provenance": 0.85
    },
    "openQuestions": [
      "Does the API expose campaign statistics?",
      "Full list of supported env vars from keila.io/docs/installation (only the compose sample was read)"
    ],
    "sources": [
      {
        "url": "https://github.com/pentacent/keila",
        "foundBy": "sourcing:content-publishing:github"
      },
      {
        "url": "https://www.keila.io/docs/api",
        "foundBy": "analysis:content-publishing"
      },
      {
        "url": "https://www.keila.io/pricing",
        "foundBy": "analysis:content-publishing"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Official API with near-complete Reach over the newsletter job, six named env vars, AGPL caps adaptable at 2.",
      "disputed": []
    },
    "url": "apps/pentacent--keila.html",
    "coverage": "partial",
    "paid": true,
    "source": "research/verified/pentacent--keila.json"
  }
}
