What ships in the open core
Everything on this page is in the repository today. Items that are planned say so on the roadmap, not here.
Content model
Typed content types
Text, rich text, number, boolean, date, select, reference, media, link, JSON, layout, date range with recurrence, taxonomy. Edit types in the admin or ship them in a kit.
Revisions and statuses
Draft, review, published, archived. Every save is a revision; compare two, restore any, prune by policy.
Taxonomy and collections
Hierarchical vocabularies with term pages; saved queries rendered as cards, lists or grids with visitor filters, pagers, calendars and RSS and iCal feeds.
Media with derivatives
Upload, alt text, focal point, responsive pictures generated on demand in WebP and AVIF.
Rich text that stays safe
An allow-list sanitiser runs on save and again at render; internal links follow renames; embeds are limited to hosts you allow.
Kits and config as code
Install a sector's whole structure in one step; export yours as JSON and push it to many sites.
Page building
Puck editor, server rendering
Hero, Heading, Text, Image, Columns, Cards, Call to action, Button, Embed, Spacer, Divider, Collection, Calendar, Form, Shared, Personalize, Experiment. Rendered to plain HTML with cache tags.
Shared blocks
Save any block to the library, reuse it everywhere, edit it once.
Theme tokens
Colours, fonts, radius and width as CSS custom properties; import from Figma variables, W3C token files, Tailwind or CSS; export back.
Menus
Two-level navigation that follows renames, per-locale labels, no JavaScript needed.
SEO built in
SEO fields on every type, sitemaps per locale, robots.txt, canonical URLs, JSON-LD, redirects with a 404 log, llms.txt.
Site search
Full-text search on SQLite or Postgres out of the box; Meilisearch with facets and typo tolerance when you want it.
Editorial workflow
Roles and review
Viewer, author, editor, manager, admin. Submit for review, comment on fields, reject with a note, publish.
Pre-publish checks
Required fields, SEO lengths, alt text, heading order, banned words from the brand profile, broken internal links. Publishing is refused on errors unless a person forces it.
Scheduling and locks
Publish at, unpublish at, with the checks applied at the moment; editing locks with heartbeats.
Workstreams
A branch of content changes across pages, menus and settings: preview as a whole, share a link, diff, merge or schedule the merge.
Notifications
Email, Slack and signed webhooks on review, publish, comments, failed schedules and form submissions, with a delivery outbox.
Audit log
One row per write, including every bearer request and every agent tool call.
Marketing
Forms and lead capture
Forms defined in the admin, rendered without JavaScript, with spam protection, UTM capture, and connectors to HubSpot, signed webhooks and email. Every submission is stored first.
Personalization and A/B tests
Audiences from UTM, referrer, path, device and time; Personalize and Experiment blocks served as islands so pages stay cached.
Cookie-free analytics
Views, visitors, referrers, sources and conversions counted in-process without a cookie or a third-party script; GTM, GA4 and Plausible when you want them, behind consent mode.
Events and calendars
Recurring events with exceptions, a month calendar block, iCal feeds per collection.
Site alerts
Info, warning and emergency banners with schedules and dismissal, injected without breaking the page cache.
Bulk actions
Publish, archive, assign, tag or delete many items at once, with the same permission checks per item.
Localization and multisite
Translations
Every entity is one translation; shared fields stay in sync, outdated translations are flagged, URLs carry a locale prefix, hreflang and per-locale sitemaps are automatic.
Multisite
Many sites in one install, resolved by domain, with shared users and types and per-site content, menus, forms and settings.
Department sections
Hand a path prefix and a menu to a department; its editors see nothing else.
AI and agents
Brand profile
Voice, tone, audience, terminology, banned words and examples that shape every suggestion and feed the checks.
Page from a brief
A layout built only from registered blocks, validated and repaired, saved as a draft. Assist on any field: rewrite, shorten, expand, tone, fix, translate, summarise.
MCP server
Agents connect with an API token whose permissions can only shrink. Tools create drafts and run the checks; publishing stays with people. Anthropic, OpenAI, Google, xAI or any compatible endpoint.
Platform and operations
Modules
Trusted modules in-process, sandboxed extensions in WebAssembly with declared capabilities and limits; a signed registry.
Enterprise sign-in
OpenID Connect and SAML 2.0 with Okta, Entra ID, Google Workspace, Shibboleth and Login.gov; just-in-time accounts and group-to-role mapping.
Fleet provisioning
One command or one HTTP call creates a site on Fly.io, Docker or Kubernetes, runs setup, applies a template and attaches a domain; staged upgrades across the fleet.
One image, two databases
SQLite in WAL mode or Postgres via DATABASE_URL, migrations on boot, export and import, backups through the fleet.
Security by default
Cookie sessions with CSRF, scrypt hashing, rate limits, body limits, an SSRF guard on every outbound request, CSP and HSTS.
API first
Everything the admin does goes through the JSON API, described in OpenAPI; a TypeScript contract shared by every package.
Compare it with what you run today
Honest tables against Drupal, WordPress and Contentful, including where they are ahead.