Self-hosting means you run @cms0/admin yourself.
The admin app gives you the editor UI, runtime API, schema snapshots, API keys, backups, triggers, and usage views.
What you run
@cms0/admin- PostgreSQL
- filesystem or S3-compatible storage
- email delivery for account and invitation flows
- a reverse proxy with HTTPS
Setup order
Create a Postgres database
Set DATABASE_URL to the database used by @cms0/admin.
Choose storage
Use filesystem storage for local or single-host deployments, or S3-compatible storage for movable containers.
Configure auth and origins
Set CMS0_PUBLIC_APP_URL, BETTER_AUTH_URL, BETTER_AUTH_SECRET, and TRUSTED_ORIGINS.
Bootstrap the first admin
Set ADMIN_EMAIL and ADMIN_PASSWORD, start the app, then sign in.
Create an API key
Point your app and cms0.config.ts at the runtime URL ending in /api/content.
Runtime URL
For a local admin running on port 4002, the runtime API base URL is:
http://localhost:4002/api/contentIn production, use your admin origin:
https://cms.example.com/api/contentSelf-hosted app integrations still use @cms0/cms0; only the runtime base URL changes.
Success check
Your self-hosted instance is ready when:
- you can sign in as the bootstrap admin
/api/content/healthresponds through the deployed origin- you can create an API key
pnpm exec cms0 buildpublishes a schema into the admin UI