A Usable account
Your CMS editors sign in with Usable. Workspace membership decides who can edit, publish, restore, or manage setup.
Usable CMS for AI-built websites
Bring your favorite AI coding tool, install the free Usable CMS Marketplace app, connect the site to cms.usable.dev, and deploy it anywhere suitable for your project.
What you need first
Usable CMS is the editing and authorization layer. Your website is still your website, and your deployment platform is still your deployment platform.
Your CMS editors sign in with Usable. Workspace membership decides who can edit, publish, restore, or manage setup.
Install Usable CMS from the Usable Marketplace so the site can use the brokered login, file upload, publish, and version APIs.
Use Vercel, Netlify, Render, Railway, Fly.io, Cloud Run, GitHub Pages for static sites, your own Kubernetes, or another host that fits your project.
Step-by-step setup
The path is intentionally tool-agnostic. Your AI builder creates or adapts the code; Usable CMS provides the account, workspace, app authorization, and safe content operations.
Tell any coding agent: create a website that uses https://cms.usable.dev. The page prompt points it at capabilities, register, and the live skill index.
The agent calls /api/auth/device/start, shows the user code and login URL, then polls /api/auth/device/poll until Usable returns a setup token.
The agent calls /api/setup/register. Usable CMS creates or updates the workspace, global/page fragments, server token permissions, site id, public ucms_ key, binding, and manifest.
The agent uses the default wysiwyg-login-gated-multi-page mode, then wires server-only public reads with cache and /cms?page=<page> broker editing with no-store.
The setup kit returns public/server env vars, broker snippet, manifest sync URL, skill URLs, and smoke commands. Server tokens stay server-only.
Manifest model
Manifest v2 is a strict, version-negotiated contract. Generic field and collection declarations compile deterministically, while the broker rejects unknown versions, undeclared paths, unsafe values, and index-addressed v2 collection edits before content is written.
Declare stable paths such as hero.title, metadata.description, or customCss when there is only one editable value.
Use * as one complete path segment: hero.choices.*.text matches hero.choices.0.text, but not hero.choices.0.unsafeHtml.
In manifest v2, declare UUID item identity, fields, allowed block types, min/max constraints, and stable add/update/move/remove/restore operations.
The broker keeps unknown siblings, broad prefixes, unsafe hrefs/images, invalid enums, and undeclared JSON branches outside the publish path.
{
"version": 2,
"schemaVersion": "cms-manifest.2",
"compatibility": {
"readableVersions": [1, 2],
"writableVersions": [2],
"minimumAdapterVersion": 2
},
"projectionCompatibility": {
"keyVersion": 1,
"legacyKey": "<workspace>:manifest:<site>",
"retirement": {
"allSitesOnVersion": 2,
"allAdaptersSupportVersion": 2,
"projectionRebuildVerified": false
}
},
"regions": [],
"fields": [
{ "id": "hero.title", "kind": "text", "label": "Hero title", "path": "hero.title" },
{ "id": "metadata", "kind": "object", "label": "Metadata", "path": "metadata",
"properties": [{ "id": "description", "kind": "text", "label": "Description", "path": "description" }] }
],
"collections": [
{
"id": "content.blocks",
"label": "Content blocks",
"path": "content.blocks",
"itemIdentity": "stable-id",
"itemIdentityPath": "id",
"blockTypePath": "type",
"allowedBlockTypes": ["text", "image"],
"allowedOperations": ["add", "update", "move", "remove", "restore"],
"constraints": { "minItems": 1, "maxItems": 40 },
"fields": [
{ "id": "title", "kind": "text", "label": "Title", "path": "title" },
{ "id": "body", "kind": "text", "label": "Body", "path": "body" }
]
}
]
}Prompt any builder
The important part is not the brand of builder. Tell it to create a website that uses https://cms.usable.dev; the prompt below tells it to fetch the default WYSIWYG skill index and follow the setup flow.
Great for repository work: add the manifest, broker client, tests, build checks, and deployment configuration in the actual codebase.
Useful for adapting an existing app, keeping local patterns intact, and wiring the CMS model into real pages and routes.
Use workspace context to shape the site brief, content model, prompt, and implementation checklist before or during code generation.
Start from a polished generated website, then ask for the Usable CMS connection, editable regions, and deployment-ready environment variables.
Build a beautiful, useful website for <website name>. Use https://cms.usable.dev for CMS editing. Follow the Usable CMS agent-first setup flow: - Fetch https://cms.usable.dev/api/setup/capabilities. - Use the default setup mode: wysiwyg-login-gated-multi-page. - Fetch https://cms.usable.dev/api/setup/skills and load only skills tagged ucms:setup-skill. - Default to these setup skills when present: usable-cms-public-renderer and usable-cms-wysiwyg-broker-editor. - If the site needs forms, orders, signups, bookings, or other server-stored data, also load usable-cms-backend-data from the skill catalog. - If the site should let CMS editors create new pages from templates, also load usable-cms-page-templates from the skill catalog and register with features:["page-templates"] plus pageTemplates[]. - Treat usable-cms-wysiwyg-broker-editor as the default editor skill; it includes multi-page routing, login gate, publish feedback, local draft recovery, section ordering, image editing, and manifest sync requirements. - Start Usable device login through /api/auth/device/start. Show both the manual verification_uri + user_code and the prefilled verification_uri_complete when present. Poll /api/auth/device/poll with both device_code and signed device_state, respect interval/slow_down until expires_at, and handle approved, denied, expired, consumed replay, and invalid as distinct terminal states. - Register the site through /api/setup/register with site name, exact allowed origins, selected default skill ids, globalContent, pages, and an initial manifest when useful. When binding an existing Usable workspace, include its workspaceId; setup must then resolve types and write only in that workspace. - Model content as one global config fragment plus one CMS Page fragment per page. Use manifest scope:"global" for shared config and scope:"page" with pageId for page-local fields. - Treat /api/setup/register as idempotent. It succeeds only after durable exact-manifest readback. Reuse returned existing workspace/site/key/token metadata. Re-register with serverTokenAccess:"read-write" only when the site needs server-side writes to Usable, such as forms, orders, signups, CMS-created pages, or other submitted data. Never create a replacement token merely because its existing permissions need repair. - Use the returned workspace id, site id, contentFragments.global.fragmentId, contentFragments.pages[].fragmentId, signed ucms1. public key, server-only USABLE_CMS_SERVER_TOKEN, broker snippet, skill URLs, manifest sync URL, and smoke commands. - Write agent-visible project instructions in AGENTS.md and, when relevant, CLAUDE.md. If the target agent supports local skills, also write/install the native skill file in that agent's discoverable skill directory. Include how to fetch the Usable CMS skill index, selected skill URLs, a daily refresh rule to pull latest selected skills from /api/setup/skills, site id, workspace id, global and page fragment ids, manifest paths, env var names, cache rules, /cms route, validation commands, how to re-register setup, how to add new skills from the catalog, and how to create Usable fragment types for backend data such as forms or orders. Do not write secret token values into the spec. - Build real multi-page public routes, not a SPA. - Add /cms?page=<page> editor routes with the WYSIWYG broker editor as the default editing experience. - When page templates are enabled, add a + Page flow in the WYSIWYG Pages tab: show template cards, validate title/slug/path, optionally add to navigation, create exactly one new CMS Page fragment server-side, sync page-scoped manifest entries with the full new fragment UUID, then navigate to /cms?page=<new-page-id>. - Guard /cms before showing editor tools. Show a checking auth state first with a spinning or pulsing lock icon, then show the signed-out CMS login gate when needed. The Sign in action must use same-tab broker login, not popup/new-tab login. - Render public pages with server-only Usable reads and sensible cache/revalidation. - Render /cms with no-store. - For forms/orders/data submissions, create server-only routes that use the read-write server token to create Usable memory fragments with dedicated fragment types. Never write submitted data from browser code. - Model editable text, images, navigation, forms, sections, collections, and page content in the CMS manifest. - For new collection/block integrations, send manifest version:2 with schemaVersion:"cms-manifest.2", compatibility and projectionCompatibility metadata, itemIdentity:"stable-id", a UUID itemIdentityPath, and add/update/move/remove/restore operations. Address items and move anchors by UUID, never by array index. - Sync the complete final manifest through /api/setup/manifest with mode:"repair" and all five families: regions, pages, pageTemplates, fields, and collections. This endpoint repairs only the manifest and must not create setup resources. If it returns MANIFEST_SYNC_INCOMPLETE, use its phase/count/fingerprint/missing details, resend the complete declaration, and do not continue until readback succeeds. - Validate editing, draft save, publish, page switching, signed-out login gate, public rendering, device-code replay, and a second registration that reuses every resource id. - Keep USABLE_CMS_SERVER_TOKEN out of browser code and out of broker.js. Treat USABLE_CMS_RENDERER_READ_TOKEN as a legacy alias only; do not introduce it in new projects.
Deploy wherever the site fits
A usable-cms-enabled website can be static, server-rendered, or containerized. The key is that production has HTTPS, exact origins, safe environment variables, and a refresh strategy after content changes.
Vercel and Netlify are natural fits for many public websites, especially when you want route handlers, server rendering, or revalidation.
Render, Railway, Fly.io, Cloud Run, DigitalOcean App Platform, and similar hosts work well when your site needs a server or container.
GitHub Pages and other static hosts can work when the site exports static files and either rebuilds after publish or fetches safe public content.
Flowcore Kubernetes, another Kubernetes cluster, or a private VPS is fine as long as HTTPS, secrets, headers, and deploy automation are handled.
Auth Broker and write plane
Your deployed site owns the editing UI, routes, and hosting. cms.usable.dev handles Usable sign-in, workspace checks, draft/publish, uploads, version history, restore, and safe assistant actions.
Auth Broker production flow is live for in-site editors.
Public integrations use exact allowed origins and public ucms_ integration keys.
Torshavn Marathon, Favna, and KST use customer-site CMS routes backed by the broker.
Editors work inside the CMS experience your own site provides.
Upload images through Usable and reference safe CMS asset URLs from the website.
Model news, pages, sponsors, navigation, footer links, nested sections, localized fields, and scalar lists.
Unknown paths, unsafe links, bad image references, and guarded deletes are rejected before write.
Usable tokens stay on cms.usable.dev; customer-origin JavaScript receives only safe operation results.
Publish with restore points so editors can roll back content without redeploying code.
Ask your coding tool to preserve the current design while adding a Usable CMS workspace, manifest, broker client, exact-origin setup, and deploy-time environment variables.
Start a new AI-generated site with editable copy, collections, images, drafts, publish, restore, and a clear deployment checklist from day one.