corpusctl vs Ghost: publishing platform or content infrastructure?
Ghost(Pro) prices by audience size, and one install is one publication. corpusctl runs N publications from one panel on a flat plan. Compared honestly.
Ghost is excellent at something corpusctl does not do at all.
If you are one writer or one publication and you want a beautiful editor,
paid memberships, newsletter delivery and a theme you can install in a
minute — Ghost is the right answer and this article will not talk you out of
it. About 55,000 GitHub stars, open source, self-hostable, genuinely loved.
This comparison is for the other case: when the publication stops being the
product and starts being part of the product.
Ghost(Pro) prices by audience size. The pricing page has a member-count slider,
and moving it moves the price. As listed on ghost.org on 17 August 2026, the
Starter plan begins at $18 a month billed yearly.
That model is coherent for a paid newsletter — more members means more revenue,
so more cost is fair. It is much less coherent for a company blog, a
documentation site, or a product changelog, where readers are a marketing
outcome and not a revenue line. There you are paying more for a thing that does
not directly pay you back.
corpusctl is a flat plan, and the reason is architectural rather than generous.
Published content is written to an immutable, hash-addressed file
This is the structural difference and it decides most evaluations.
A Ghost install is a publication. Five brands means five installs to operate
and upgrade, or five Ghost(Pro) subscriptions to pay. There is no shared panel,
no per-space roles, no single place where an editor sees the three brands they
work on and none of the two they do not.
corpusctl is multi-tenant in the core, next to auth and the module registry:
One panel, unlimited spaces.
A user carries a separate role per space — editor on one brand, owner on
another, invisible on a third.
Isolation enforced by PostgreSQL row-level security, in the database,
underneath the application layer where a forgotten filter lives.
For an agency, a group of brands, or a SaaS giving each customer their own
content, that difference is the whole decision.
Ghost has a Content API and it works. But Ghost's centre of gravity is themes:
Handlebars templates, rendered by Ghost, on Ghost's own front end. Going
headless with Ghost means turning off the part of the product that most of the
work went into.
corpusctl never renders a page. It has no theme layer, and the read client is
the primary interface, not a bolt-on.
The consequence lands in the client packages. Block renderers ship with zero
default styling — not one line of CSS. Every block type is overridable, and
an unknown block type is skipped gracefully rather than throwing. The core
render tree is framework-agnostic; React, Vue and Next.js adapters are thin
layers on top.
The rule behind it: if rendering a block type requires framework-specific code,
the abstraction is in the wrong place. Turning an API response into styled
markup is the hardest part of adopting a headless CMS, and a package that
imposes a design has not solved that — it has renamed it.
Ghost's model is a post: title, feature image, tags, body. That is the right
model for a publication and a poor one for a product catalogue, a docs site, or
a marketing site with case studies, team members and pricing tiers.
corpusctl has no built-in content types at all. You define them — from the
panel or the API — and fields carry roles such as title, slug and
body, so the system knows which field is the heading without you naming it
title. Localisation is per field. Every record is versioned, older versions
are restorable, and publishing can be scheduled.
This is the clearest split between the two, and it is worth being precise.
Ghost self-hosted is free to licence, and you operate everything: Node, the
database, a mail provider for newsletters, storage for images, backups, security
updates and the upgrade path. The software costs nothing; the operations are the
cost.
corpusctl is a managed service — you run nothing. The stack behind it
(PostgreSQL, Valkey, Typesense, Garage, nginx) is operated for you, and none of
it is a third-party service billed per usage, so a traffic spike does not become
an invoice. You get the assembled product without the operational surface.
Ghost is free and you assemble and run it. corpusctl costs money and arrives
running. Neither is the correct answer in general — it depends on whether you
want to operate infrastructure or ship content.
Audience size — Ghost(Pro) from $18/mo billed yearly
Read metering
None — reads never reach the API
N/A; audience-priced
Multiple publications
Unlimited spaces, one panel
One install = one publication
Tenant isolation
PostgreSQL row-level security
Separate installs
Content model
You define it; fields carry roles
Post-shaped, built in
Rendering
None imposed; zero default styling
Handlebars themes
Memberships / paid subs
None
Built in
Newsletter delivery
None — webhook only
Built in
Themes
None
Hundreds
Self-hosting
Enterprise plan; whole stack included
Free, MIT
Pick Ghost if the publication is the product: paid subscriptions,
newsletters, one brand, one voice.
Pick corpusctl if content is infrastructure for something else — several
brands, structured types beyond a post, and a bill that does not move when the
audience does.
Ghost(Pro) pricing taken from ghost.org/pricing
on 17 August 2026; the plan price scales with member count. Prices change —
check before quoting.