Introduction

A self-hosted email marketing tool: your list, your templates, your sending infrastructure. No per-contact pricing, no lock-in on the data.

What it does

Own the audience
  • Lists, contacts and tags, scoped per organization
  • Import an existing Mailchimp export (CSV) without losing tags or unsubscribe status
  • Add contacts through an authenticated API, so funnels and lead magnets feed the list directly
  • Double opt-in confirmation
Author the email
  • A template is an HTML file — paste one from anywhere, the design lives in the template
  • Live rendering next to the code while you edit
  • Merge tags resolved per recipient
Send it
  • Campaigns targeting a list, optionally narrowed by tag
  • Scheduled sending
  • Automated sequences triggered by a tag or a signup
  • Bulk delivery through Amazon SES, batched against the sending quota
Know what happened
  • Per-recipient send log, opens and unique clicks
  • Bounces and complaints handled automatically, with a suppression list
  • One-click unsubscribe, honoured everywhere

What it deliberately does not do

No drag-and-drop builder. Templates are HTML, edited as code. The tradeoff is deliberate: every template can look completely different, and nothing in the application constrains the design.
  • No conditional or looping template engine. Merge tags substitute a value; they do not format, branch or iterate.
  • No custom contact fields. The merge tag vocabulary is closed — see Merge Tags Cheat Sheet.

How it is built

Next.js with React Server Components, PostgreSQL through Drizzle, Better Auth for multi-tenant authentication, Inngest for anything asynchronous, and Amazon SES for bulk delivery. Business state lives in Postgres — never in the queue. Every business table is scoped to an organization, and every read passes an authorization check before reaching the database.