Appearance
Managing pages (admin)
In the admin: Pages — the screen this page documents (opens in the running app).
What/why: Content & media — what this screen manages and why it exists.
Looking for the whole content surface? The content inventory (
/admin/content) is the one-stop home listing every CMS page and code-routed slot with its publish state; it drives the same page lifecycle actions described here.
The Pages screen under /admin/pages manages admin-authored static pages — the App Content CMS. A page has a title and a URL slug, and moves through a draft → published → retired lifecycle. A published page is served to visitors at /<slug>. The screen is restricted to the data editor capability (edit_data); see admin-access.md.
Pages deliberately mirror how tracks work — the same slug rules, the same publish slug-lock, and the same reversible retire — so the two behave predictably alongside each other.
What's live: the page entity + admin CRUD (#673), the typed sections that compose its body (#674), and the public rendering of a published page at
/<slug>(#675). A published page is served to visitors; a draft or retired page is previewable by an admin at its real URL under a banner. See the CMS public-rendering reference for the routing and preview rules.
The pages list (/admin/pages)
The list shows every page with its slug and status (Draft / Published), with retired pages in their own section below. Lifecycle actions run from here:
- Publish makes a draft live at
/<slug>and permanently locks its slug (see below). - Retire takes a published page offline. The page and its content are preserved — retire is a soft, reversible status change, never a delete.
- A retired page can be re-published as-is, or revived to draft to edit before going live again.
Every create, edit, publish, retire, and revive is written to the audit trail with the acting editor's identity.
Creating a page
A new page is always born a draft — editable and not yet public.
- Click New page to reveal the create form in place.
- Title it. The slug derives from the title automatically (kebab-case); override it only if you want a different URL.
- Create draft page adds it to the list; publish it when it's ready.
Slug rules. A slug must be kebab-case (lower-case letters, numbers, single hyphens), unique across all pages, and not a reserved word. Reserved words are the top-level routes a page URL would otherwise shadow — select, compare, admin, api, health, and media. A duplicate or reserved slug is rejected with a message on the field.
Editing a page (/admin/pages/<id>)
The edit screen lets you change the title and, until first publish, the slug. Lifecycle transitions (publish / retire / revive) run from the list.
- The slug is locked once the page is first published — forever. Published URLs may be shared and printed, and there is no redirect layer, so a live URL must never rot. Renaming a page after publish changes only its display title. This holds even for a retired or revived-to-draft page — once published, always locked. The slug field on the edit screen is disabled and labelled locked in that state.
Sections
A page's body is composed of an ordered list of sections — typed content blocks — on the Sections tab of the page edit screen (#674).
- Add a section: pick a block type (Hero, Rich text, Call to action, Image) and click Add section. It is appended at the end as a draft.
- Edit: fill in the block's fields and Save draft. Each block type has its own small set of fields (a hero's heading and button, a rich-text body, and so on) — there is no freeform HTML; content is always structured, named fields.
- Publish a section: Publish promotes the section's draft to what visitors will see. A section stays Draft only — and is never served — until you publish it, so you can stage several blocks and reveal them together.
- Reorder: the ↑ / ↓ controls move a block up or down; the new order is saved immediately.
- Remove: deletes the block from the page (with a confirm) and closes the gap in the order.
Every one of these — add, edit, publish, remove, reorder — is recorded in the audit trail. The full data model, the type registry, and the draft/publish and ordering rules are in the page-sections reference.
Lifecycle at a glance
| From | Allowed to | Notes |
|---|---|---|
| Draft | Published | First publish stamps the page and locks the slug. |
| Published | Retired | Soft, reversible — content preserved. |
| Retired | Published, Draft | Re-publish as-is, or revive to draft to edit first (slug stays locked). |
Any other transition (for example draft → retired, or published → draft directly) is rejected — the loop is linear with a revive path back from retired.