Ghost

ghost.orgcontributed by Samuele Ongaro

YES

Replaceable in one session with an AI coding agent.

A publishing platform with a newsletter and paid memberships built in. The software is open source; the paid plan is somebody hosting, updating and sending it for you.

Promptfree, for everyone, and the only version there is
Build me the publication I actually need instead of a hosted Ghost: posts, a newsletter, and paid memberships, on my own machine.

Read this first: Ghost itself is open source and self-hosting it is a real answer — the fee buys hosting, updates, a CDN and a warmed sending account. Build this when you want the publication to be exactly yours, and read the deliverability section twice, because that is the part that is genuinely hard.

STACK
- Astro with a Node adapter, or Fastify with server-rendered templates
- SQLite through better-sqlite3, WAL mode, with FTS5 for search
- SMTP through a provider set in .env
- Caddy in front

THE DATA MODEL
- posts: id, slug, title, excerpt, body_md, body_html, feature_image, status, visibility, published_at, updated_at, author_id, tags_json, canonical_url, meta_json — visibility is public, members-only or paid
- post_revisions: id, post_id, body_md, author_id, at
- members: id, email, name, status, tier_id, stripe_customer_id, subscribed_to_newsletter, labels_json, created_at, last_seen_at
- subscriptions: id, member_id, tier_id, external_id, status, current_period_end, cancel_at, amount_cents, currency
- tiers: id, name, monthly_cents, yearly_cents, benefits_json, is_active
- newsletters: id, post_id, subject, sent_at, segment_json, recipient_count
- deliveries: id, newsletter_id, member_id, sent_at, opened_at, clicked_at, bounced_at, complained_at
- magic_tokens: id, member_id, token_hash, kind, expires_at, used_at
- Every send recorded per member, so nobody is mailed twice and a resume after a crash is exact

WRITING AND PUBLISHING
- Markdown with a live preview, images uploaded locally and resized to a set of widths with the dimensions stored
- Draft, scheduled and published, with a worker that publishes on time and is idempotent
- Revisions kept for every save
- A permanent slug from the first publish; changing it writes a redirect rather than breaking every link that exists
- Tags with their own pages, an author page, and pagination

THE SITE
- Server-rendered HTML, no client-side framework, under 100KB for an article
- Open Graph tags and a share image generated at build or on demand with satori and resvg
- JSON-LD: Article with its author and dates, and BreadcrumbList
- RSS with full content, a sitemap, canonical URLs, and a 301 for every changed slug
- Full-text search over posts with FTS5, server-side, instant
- Dark and light, one accent, a self-hosted variable font as WOFF2 and never one from a third-party CDN

MEMBERSHIP WITHOUT PASSWORDS
- Sign-in by magic link only. No passwords for readers — nobody wants another one, and there is nothing here worth the risk of storing them
- Tokens single-use, expiring, compared in constant time, and invalidated on use
- A session cookie that is httpOnly, secure and sameSite lax
- The member's own page shows their tier, their billing and a way to leave that takes two clicks

PAID TIERS
- The payment processor holds the card; this application never sees one
- Checkout hosted by the processor, webhooks consumed with signature verification, idempotency by event id and out-of-order delivery handled
- The local subscription state is a mirror. Reconcile nightly against the processor and alert on disagreement
- Access checked on the server for every members-only and paid post. Content gating done in the browser is not gating
- Failed payments retried by the processor, with your own emails alongside and a card-update link that needs no login

THE NEWSLETTER
- A published post can be sent to a segment: everyone, free members, paid members, a label
- HTML built with tables and inline styles because that is what mail clients render, plus a plain-text alternative generated from the same source
- A test send to yourself first, always, and the interface refuses to send without one
- Batched, rate-limited to what the provider accepts, resumable, and idempotent per member
- Every mail carries a one-click unsubscribe that needs no login, and the List-Unsubscribe headers

DELIVERABILITY, THE HARD PART
- SPF, DKIM and DMARC on your sending domain, with the records written out in the README
- A dedicated subdomain for sending, warmed slowly — a new domain sending two thousand messages on day one goes straight to spam and stays there
- Bounces and complaints consumed from the provider's webhook: a hard bounce unsubscribes, a complaint unsubscribes permanently
- Watch the complaint rate; above a fraction of a percent the provider will suspend you
- This is what the hosted fee is really buying, and it is worth saying so honestly

OPERATIONS
- .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SMTP_URL, FROM_ADDRESS, SESSION_SECRET, STRIPE_KEY, STRIPE_WEBHOOK_SECRET, HASH_SALT
- Migrations on boot, each once
- Nightly backup off the machine, restore script — this holds your subscriber list and your revenue, and an untested backup is not a backup
- Health endpoint checking the database, mail and the processor

WHAT MATTERS MOST
The send path and the access check. Build idempotent per-member delivery and server-side gating first, then send to yourself, to a colleague and to a free address at three different providers and see where each lands. A publication that mails somebody twice, or that leaks a paid post, loses the reader either way.

Give me the repository, migrations, .env.example, a seed with posts and members, and a README with deploy steps behind Caddy, the DNS records, and a warm-up schedule.

What you lose

  • A managed instance with updates, backups and a CDN, which is what the fee actually buys
  • Bulk sending through a warmed provider account already configured
  • A theme ecosystem and an editor other people can use without you

If you would rather not build

  • Hugo with a static membership wall, for very simple cases

What it costs

read from their page 17 Aug 2026

PlanBilled monthlyBilled yearlyLast read
—$15/mo—17 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

Ghost

$0

The product itself, MIT-licensed and self-hostable.

TryGhost/Ghostfree · open source

Listmonk

$0

Self-hosted sending, if you assemble the pieces yourself.

knadh/listmonkfree · open source

Why this verdict

our own opinion · changed only by a person

70/100

Verdict yes at 70 with a caveat: the fastest route is self-hosting Ghost itself, not writing a replacement. The score reflects how easy leaving the hosted plan is.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

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

Questions about Ghost

answered from the record above

Is Ghost free?

No — the plan we track is $15 a month. Starter at $15/month billed yearly for solo blogs and newsletters; the software itself is open source and free to self-host.

Can you replace Ghost by building your own?

YES. Replaceable in one session with an AI coding agent. Replacement score 70 out of 100, build time one session. Read what you lose before you decide.

How much does Ghost cost?

$15 a month on Starter — $180 a year. Recorded 17 Aug 2026.

What do you lose by replacing Ghost?

A managed instance with updates, backups and a CDN, which is what the fee actually buys; Bulk sending through a warmed provider account already configured; A theme ecosystem and an editor other people can use without you. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Ghost?

Yes: Ghost, Listmonk. 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