Skip to content

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.

  1. Click New page to reveal the create form in place.
  2. Title it. The slug derives from the title automatically (kebab-case); override it only if you want a different URL.
  3. 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

FromAllowed toNotes
DraftPublishedFirst publish stamps the page and locks the slug.
PublishedRetiredSoft, reversible — content preserved.
RetiredPublished, DraftRe-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.