Build on a CMS that works the way you do.

ApostropheCMS is an open source CMS with a first-class Astro integration. One consistent module architecture, automatic REST APIs, and in-context visual editing, all without giving up your frontend.

Why developers choose ApostropheCMS

  • One module pattern covers everything: content types, widgets, admin UI, API extensions. Learn it once, use it everywhere.

  • Define your content schema in code. The admin UI and REST API generate from it automatically.

  • Use Astro to build with React, Vue, Svelte, Solid, or any combination — with in-context visual editing included.

  • Extend or override any part of the core without forking it.

  • Official extensions from the core team (SEO, localization, advanced permissions, redirects) built on the same patterns you already know.

  • ApostropheCMS CLI

Go from zero to building in minutes

The ApostropheCMS CLI gets you from zero to a running local environment in minutes. SQLite works out of the box for local development — no database server to configure before you're writing code. MongoDB and PostgreSQL are there when you need them.

What to expect from the CLI

One pattern for everything

Most CMSes have multiple extension surfaces: a plugin API, a hook system, a theme layer, something separate for the admin UI. ApostropheCMS has one. Content types, widgets, page types, API customizations, admin UI extensions all use the same module architecture and extend the same way.

That consistency compounds. Once you understand how a custom widget type is structured, you already know how to build a piece type, extend a page type, or modify the admin UI. There's nothing else to learn. And because modules extend rather than fork, you can override methods or add fields to any core module without maintaining a divergent copy when updates ship.

Model content once with schemas

Define your content types in code. From that schema, ApostropheCMS automatically generates the editor form, REST API endpoints, permissions, and validation — no separate admin build step, no code generation after schema changes.

ApostropheCMS organizes content into three building blocks:

  • Pages own a URL and live in a site hierarchy.

  • Pieces are reusable content objects — blog posts, products, team members — not tied to a specific URL by default.

  • Widgets are the components editors use to assemble content inside a page or piece.

All three follow the same module pattern. All three get REST API endpoints automatically. Whether you're building a landing page, product catalog, or knowledge base, the development pattern stays the same.

Build with the frontend you want

The most common question developers ask when evaluating a CMS is whether it will work with their stack. With ApostropheCMS and Astro, the answer is yes — not because the CMS supports one specific framework, but because Astro lets you use any of them.
  • Astro: use any frontend framework, with in-context visual editing

    Astro's key advantage is frontend freedom. Unlike meta-frameworks that lock you into a single choice, Astro lets you build with React, Vue, Svelte, Solid, or any combination.

    That's the choice Apostrophe brings to you through the Astro integration. With it, editors work in the rendered Astro frontend rather than a detached form editor. Click directly on content to edit it, add widgets in context, and preview changes. It's the the same on-page editing model as a traditional full-stack Apostrophe deployment, in a modern decoupled architecture.

  • Full-stack with JSX

    For projects that prefer a simpler, single-server architecture, ApostropheCMS supports server-side templating with JSX natively. (We also still support Nunjucks for existing projects.) ApostropheCMS handles routing, rendering, and content delivery without a decoupled frontend.

  • Pure headless

    The REST API is framework-agnostic. If your architecture requires a fully decoupled frontend outside of Astro, point your frontend at the API directly. Even if the public will only interact with your content through native apps, you can still create a preview experience for your editors using our JSX template support.

Automatic APIs, not boilerplate

Define a content type and you immediately have a full authenticated REST API for it — list with filtering and pagination, read by ID, create, update, patch, and delete. No route handlers to write, no auth middleware to wire up, no pagination logic to maintain.

Permissions from your content model apply to every endpoint automatically. If desired, public content can be made accessible without authentication. Protected content requires an API key or session. Draft and published states are handled at the API level. None of this is configured separately. It derives from the same schema definition you wrote to create the content type.

The same API supports headless and hybrid architectures. Consume it directly from a decoupled frontend, or mix server-rendered routes with API-driven ones in the same project.

Extend the CMS without fighting it

When you extend a module in ApostropheCMS, creating a new module, you inherit everything the parent defines, like schema fields, methods, editing capabilities and REST API behavior. Add or override only what you need. This applies whether you're extending a core module, an official extension, or your own project module.

Apostrophe also provides ways to improve modules, including our core modules, so that the rest of the system automatically sees your "improved" version without the need to change dependencies all over the project.

Rich support for event handlers and frontend admin UI component overrides completes our extensibility story.

You're never working around the CMS; you're using the same tools and techniques as the core team.

What extensions are already available for ApostropheCMS?

These are just just a few of the officially maintained extensions available for ApostropheCMS. The full library covers everything from forms and search to SSO, accessibility tooling, and data import/export, all built on the same module pattern as your project code.

Extension

What it does

@apostrophecms/seo

Meta fields, structured data (JSON-LD), robots.txt, analytics integrations

@apostrophecms/sitemap

Automatic XML sitemap, kept in sync as content changes

@apostrophecms/localization

Multi-locale content with independent publish states per locale

@apostrophecms/passport-bridge

SSO with Google, Okta, Auth0, and other providers

@apostrophecms/redirects

Editor-managed URL redirects without a deployment

@apostrophecms/openapi-generator

Auto-generates API docs and client SDKs for your project

@apostrophecms/scheduled-publishing

Time-based publish and unpublish

@apostrophecms-pro/advanced-permission

Go beyond our standard set of user roles to full user and group-level permissions across document types, individual documents, and locales.

Production-ready tooling

  • Git-based deployments

    Deploys like any Node.js application. Works with Railway, Render, or any CI/CD pipeline without modification.

  • HMR with Astro

    Take advantage of hot module replacement during development in hybrid ApostropheCMS + Astro projects. Save a file and see the change. No full page reload or separate build step to trigger.

  • Cypress testing utilities

    @apostrophecms-pro/cypress-tools handles CMS-specific test infrastructure: fixture database management, login/logout, admin UI interactions, database fixtures.

Common questions about developer experience

A few minutes on a decent internet connection. The ApostropheCMS CLI handles setup — no database server required to get started locally with SQLite.

Yes. Pages and pieces automatically get a full set of REST endpoints when the type is defined. You can customize and extend API behavior at the module level, but the baseline endpoints exist without any extra configuration.

Through the Astro integration, ApostropheCMS supports any frontend framework Astro supports — React, Vue, Svelte, Solid, and more — including combinations of them in the same project. Astro is the recommended path for new projects. For simpler projects without a decoupled frontend, Nunjucks and JSX server-side templates are built in.

Everything in ApostropheCMS is a module: content types, widgets, page types, admin UI customizations, and core CMS functionality. Modules extend other modules using one consistent pattern. Once you understand how a piece-type module is structured, that knowledge applies directly to widget types, page types, and extensions to existing types.

Pages live in a URL hierarchy and own a route. Pieces are freestanding content objects not tied to a specific URL by default (articles, products, events). Use pieces for content that gets paginated, reused across contexts or queried regularly via the API. Use pages for content that appears only at one fixed URL.

Yes, through the standard module extension pattern, without forking anything. Add custom columns to list views, extend edit forms on existing types, add custom manager views, or modify admin behaviors.

Documentation and support

Technical documentation covers the module system, schema fields, the REST API (with an OpenAPI spec), templating, and all official extensions. Versioned and maintained alongside the core. The core team is active on GitHub and Discord.