Buttondown

buttondown.comcontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

A small newsletter tool: write in Markdown, send to a list, and let people subscribe from a form. Deliberately plain, with an API and no visual builder.

Promptfree, for everyone, and the only version there is
Build me a plain newsletter tool that replaces Buttondown — and be clear about why this is ALMOST.

The application is small: Markdown in, email out, a signup form. **Deliverability is the whole difficulty.** Buttondown's price buys a warmed sending reputation and somebody watching complaint rates. You will still need a sending provider, and you will have to warm your own domain. If that sentence sounds like a chore rather than a project, keep paying.

STACK
- Node 20+ with Fastify, server-rendered HTML
- SQLite through better-sqlite3, WAL mode
- A sending provider through SMTP or its API
- A worker for sending, separate from the web process
- Caddy in front

THE DATA MODEL
- subscribers: id, email, name, status, confirmed_at, unsubscribed_at, bounced_at, complained_at, source, tags_json, consent_text, consent_at, ip_hash, created_at
- emails: id, subject, preheader, body_md, body_html, body_text, status, scheduled_for, sent_at, recipient_count, web_slug, is_public
- deliveries: id, email_id, subscriber_id, sent_at, opened_at, bounced_at, bounce_kind, complained_at — one row per person per email, written before sending, which makes a resume exact and a duplicate impossible
- clicks and links, if you track them
- automations: a welcome sequence, and nothing more elaborate until you need it
- suppression: email_hash, reason, at — global and permanent

WRITING AND SENDING
- Markdown with a live preview, images stored locally with dimensions recorded
- The HTML built from tables and inline styles because that is what mail clients render, and the plain text generated from the same Markdown rather than written twice
- A test send to yourself required before any send, enforced
- Batched with a lease, resumable, rate-limited to what the provider accepts
- A confirmation showing the recipient count before it goes

DELIVERABILITY, THE PART THAT MATTERS
- SPF, DKIM and DMARC on your own sending subdomain, with the records written out in the README
- Warm slowly: hundreds at first, doubling over weeks. A new domain sending ten thousand on day one lands in spam and stays there
- Bounces and complaints consumed from the provider's webhook: a hard bounce unsubscribes, a complaint unsubscribes permanently and is never mailed again
- Watch the complaint rate; above a fraction of a percent the provider suspends the account
- One-click unsubscribe with no login, plus the List-Unsubscribe and List-Unsubscribe-Post headers, which the large providers now effectively require

THE LIST
- Double opt-in, a signup form and an embeddable one, a honeypot, a rate limit per address hash
- The consent sentence stored with its timestamp exactly as the person saw it
- Import from CSV with a dry run and a declaration of where the addresses came from. Importing a purchased list is how a sending account is closed in a week
- Export complete, in one command

THE ARCHIVE AND THE API
- Every sent issue at a permanent public URL if you want one, with an RSS feed, Open Graph tags and a generated share image
- A small REST API for subscribers and emails, with a token — Buttondown's own appeal is partly that it is scriptable, and that is a few endpoints

REPORTS
- Sent, delivered, opened, clicked, bounced, unsubscribed, per email and over time, computed at query time
- Open rate labelled as unreliable, because proxies pre-fetch images

OPERATIONS
- .env: DATABASE_PATH, BASE_URL, PROVIDER credentials, FROM_ADDRESS, SESSION_SECRET, HASH_SALT
- Migrations on boot, each once; nightly backup off the machine — the list is the asset
- Health endpoint checking the provider and the bounce feed

WHAT MATTERS MOST
Per-subscriber delivery rows and bounce handling. Build the resumable send and automatic suppression first, then warm the domain patiently. Everything else here is an editor.

What you lose

  • Deliverability — a warmed sending domain and someone watching complaint rates so your mail reaches inboxes rather than spam folders
  • Bounce and complaint handling wired to the list, so a dead address stops being retried automatically
  • A hosted archive, an RSS feed and a subscribe page you did not have to build

If you would rather not build

  • Ghost, if you want a site with the list
  • A plain SES script, for very small lists

What it costs

read from their page 15 Aug 2026

PlanBilled monthlyBilled yearlyLast read
—$9/mo—15 Aug 2026

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Listmonk

$0

One Go binary and Postgres; handles large lists comfortably.

knadh/listmonkfree · open source

Keila

$0

Self-hosted newsletter tool with double opt-in already built.

pentacent/keilafree · open source

Why this verdict

our own opinion · changed only by a person

58/100

Verdict kinda at 58. The application is a weekend; deliverability is the part that decides whether it works, and it is not code.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 2/day
views01230 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Buttondown

answered from the record above

Is Buttondown free?

No — the plan we track is $9 a month. Basic at $9/month billed monthly for 1,000 subscribers; the price steps up with the list.

Can you replace Buttondown by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 58 out of 100, build time a weekend. Read what you lose before you decide.

How much does Buttondown cost?

$9 a month on Basic — $108 a year. Recorded 9 Aug 2026.

What do you lose by replacing Buttondown?

Deliverability — a warmed sending domain and someone watching complaint rates so your mail reaches inboxes rather than spam folders; Bounce and complaint handling wired to the list, so a dead address stops being retried automatically; A hosted archive, an RSS feed and a subscribe page you did not have to build. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Buttondown?

Yes: Listmonk, Keila. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 33 in Email & newsletters

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc