Beta . Ortha CMS is in public beta. Every plan is free until it ends.
Features Ortha CMS on GitHub

Package map

Every app and package, one line each, so you can find the right one quickly.

Documents 0.13.1 Updated Edit this page Report a problem

On this page

Two apps, two test suites, and a lockstep package set: one version number across all of them.

Count at 0.13.1
Published packages71 — 70 under @orthacms, plus the unscoped create-orthacms-app
Private, never published2 — nx (repository tooling), copilot-provider-fake (e2e model fixture)

The set has not changed since 0.8.0, which added three: the schema builder’s domain, server and admin packages. create-orthacms-app is unscoped so both npx create-orthacms-app and npm create orthacms-app work.

# Every @orthacms package in an app shares one version
npm install @orthacms/media-provider-s3@0.13.1

Apps

ProjectWhat it is
adminReact 19 + Vite SPA. Composes admin plugins via createAdmin.
serverNestJS API. Composes server plugins via createServer. Owns your content types.
admin-e2ePlaywright page-object suite for the admin, with /api mocked.
server-e2eIn-process testcontainer and supertest suite for the API.

Hosts and infrastructure

PackageRole
bootstrap-adminHost. createAdmin({ plugins }) — React root, router, providers.
bootstrap-serverHost. createServer({ plugins }) — Nest app, /api prefix, validation, API reference.
databasePlugin. One Drizzle connection, the unit of work, and the transactional outbox. Owns one table, outbox_events.
utils-server, utils-adminShared plumbing. The admin’s apiClient, query client, slots and error handling.
design-systemshadcn/ui component library and Tailwind tokens.
nxNx plugin. Infers the db:generate, db:migrate and db:studio targets, and the release targets.
cliThe orthacms binary — build, run and migrate an installed app, and regenerate its content manifest.
create-orthacms-appThe scaffolder. Unscoped, so npx create-orthacms-app works.

cli and nx are two adapters over one implementation — cli for installed apps, nx for the monorepo. See the CLI reference.

Content

PackageRole
content-domainThe framework-free kernel: validation, the publish gate, rich-text rules.
content-serverPlugin. The registry, the DSL, entries, revisions, the public API.
content-adminPlugin. The content library, the records table, the entry editor.
content-graphqlPlugin. GraphQL as a protocol adapter over the public API.
alarms-serverPlugin. Content rules and findings. Two tables; never blocks a write.
alarms-adminPlugin. The Alarms page, the entry’s Checks block and header status item, an optional Checks column, “Save as alarm”, a Home card.
segments-domainThe framework-free entitlement kernel: the canRead rules.
segments-serverPlugin. Audiences, per-entry access, and the public read predicate.
segments-adminPlugin. The audience directory, each audience’s page with where it is used and a reader tester, and the entry’s access controls.
protection-domainThe framework-free kernel: evaluateProtection, which counts approvals against a rule.
protection-serverPlugin. Three tables, the publish guard, /api/protection.
protection-adminPlugin. The entry’s Review block and publish verdict, the Publishing section of workspace settings, the Reviews page and its review panel, a records column and filter, a Needs attention line in Insights, a Home card.

Schema builder

PackageRole
schema-builder-domainThe framework-free kernel: the schema document, the diff, the change verdicts, the code generator, and the manifest renderer orthacms content sync uses too.
schema-builder-serverPlugin. Reads the registry; in development, plans and applies a change as type files and a drizzle-kit migration. Owns no tables.
schema-builder-adminPlugin. The Content Model page at /content-model: the type list, the fields-first type page, the kind picker and field panel, type templates, the one-page review, the grant card.

See the schema builder.

Webhooks

PackageRole
webhooks-domainThe framework-free kernel: the event catalogue, the envelope, the signature, the retry ladder, the URL policy.
webhooks-serverPlugin. Three tables, the outbox fan-out subscriber, the delivery worker, /api/webhooks.
webhooks-adminPlugin. The global /webhooks pages in the directory group: endpoints, the delivery log, redeliver, rotate, test, a Home card for a stopped endpoint.

A receiver can import webhooks-domain to verify a signature with the code that produced it. See webhooks.

Mail

PackageRole
mail-domainThe framework-free kernel: the provider port, the rendered message, the four templates, the retry schedule. Ships with every app.
mail-serverPlugin. One table, the queue, the delivery worker. Installed with --mail mail-smtp.
mail-provider-smtpThe backend a deployment runs, over any SMTP relay. Installed with --mail mail-smtp.
mail-provider-consoleWrites messages to the log. Ships with every app, offered by no picker.
mail-provider-testkitCaptures messages, and can be told to fail. Same install rule.

No mail-admin: the flows mail changes live in users-admin. See mail.

Identity, users and workspaces

PackageRole
identity-domainThe framework-free SSO seam: the provider port, the profile, the conformance kit.
identity-serverPlugin. Auth, sessions, RBAC, API tokens, preferences, SSO, and password recovery when mail is configured.
identity-adminPlugin. The public pages — sign in, forgot password, reset password, accept invite — and auth state.
identity-provider-oidcGeneric OpenID Connect, plus presets for five named vendors.
identity-provider-githubGitHub and GitHub Enterprise. OAuth2, so not a preset.
identity-provider-samlSAML 2.0 — a POST binding and XML signatures.
identity-provider-fakeScripted and offline. Published and installed everywhere, registered nowhere.
users-serverPlugin. Member management — list, invite (one or several at once), edit, disable, sessions, and /api/users/:id/reveal-link.
users-adminPlugin. The members roster and its quick filters, the invite page, the member page, preferences, Home’s Invite member button.
workspaces-serverPlugin. Workspaces, memberships, content grants — own and, since 0.7.0, shared grants from shared workspaces.
workspaces-adminPlugin. The workspace cards, the three-step create and its ready page, the archive confirmation, workspace settings and workspace shell.
api-tokens-adminPlugin. The API Tokens page.
activity-serverPlugin. The audit schema, the read API and its CSV export.
activity-adminPlugin. Activity logs with search, an event panel and Export CSV, an entry’s activity in its History timeline, and Home’s recent-activity panel and dead-letter card.

Media, localization and editing

PackageRole
media-domainThe storage port every adapter speaks, and the one error get rejects with. No dependencies at all.
media-serverPlugin. Assets, folders, derivatives, the public media API.
media-adminPlugin. The media library, and the media field’s control in the entry form.
media-provider-localLocal filesystem storage adapter. The default install.
media-provider-s3S3-compatible: AWS, R2, MinIO, Spaces, B2, Wasabi.
media-provider-azureAzure Blob Storage — the one store with no S3 compatibility.
media-provider-gcsGoogle Cloud Storage, with native Google auth.
media-provider-vercel-blobVercel Blob. Every blob is world-readable.
media-provider-memoryIn-memory. For tests and offline development, never a deployment.
media-provider-testkitThe contract suite a storage provider is written against.
transfer-domainThe transfer kernel: the document contract, the four formats, identity.
transfer-serverPlugin. One-hop export, two-phase import. Owns no tables; imports media-server directly for asset rows and storage.
transfer-adminPlugin. Export and import in the Content Library’s menus.
i18n-serverPlugin. Locale policy, bound to content’s entry-extension port, plus the translation coverage aggregate. Owns no tables.
i18n-adminPlugin. The records list’s locale switcher, the Locales column, the editor’s locale switcher and menu, the translation-group Details row, coverage card. No routes.
wysiwyg-adminPlugin. The rich-text control. Fills the editor’s field-control slot and defines WYSIWYG_MEDIA_SLOT for media sources. No routes.
query-builder-adminThe filter and query-builder UI.
shell-adminPlugin. The authenticated chrome — sidebar, layout, right panel, home.
insights-adminPlugin. The Insights dashboard frame: the section tabs, the Needs attention card and its drill-down panel. Ships no widgets and no lines.

AI and agents

PackageRole
copilot-domainThe framework-free core: the model port, tool contracts, the untrusted-content fence.
copilot-serverPlugin. The run engine, the SSE route, the write path, skills. Off unless enabled.
copilot-adminPlugin. The chat windows, opened from the Ask Ortha AI launcher (or ⌘J), and the full-page Agents view, whose chats take over the workspace sidebar.
copilot-provider-anthropicNative Claude adapter; a generated app registers it as claude. The only one that imports a vendor SDK.
copilot-provider-openaiAny OpenAI-compatible endpoint; a generated app registers it as openai — Ollama, vLLM, llama.cpp, LM Studio, LiteLLM, OpenRouter, Azure, OpenAI.
copilot-provider-fakeScripted and deterministic. Private and unpublished — the e2e fixture.
tools-serverThe shared, transport-neutral agent tool registry.
mcp-serverPlugin. The Model Context Protocol endpoint, POST /api/v1/mcp. Owns no tools; off unless MCP_ENABLED=true.

How they resolve

Inside the monorepo, packages are consumed from source: exports point at ./src/index.ts, resolved by a custom TypeScript condition — no build step. Publishing runs a pack step that rewrites each manifest for consumers outside the workspace.

npx nx sync    # after changing cross-project dependencies
npx nx graph   # see the dependency graph