Skip to main content

Pages

A page in Flexweg CMS is a static, evergreen piece of content — typically About, Contact, Privacy Policy, Terms, Pricing, Home (when used as a static-page home).

Pages share the editor and the Firestore storage with posts, but they differ on a few axes:

PostPage
Has primary categoryYesNo
Has tagsYesNo
Appears in archivesYesNo
Appears in RSSYesNo
Has a dateYes (publishedAt)No (createdAt only, not surfaced)
URL pattern/<category>/<slug>.html or /<slug>.html/<slug>.html (always top-level)
Hero image surfaced by themesYesSometimes (theme-dependent)
Free-form compositionBody markdown onlyBody markdown + theme blocks for full layouts

Use a post for time-relevant content, a page for evergreen content.

Pages list

Pages in the sidebar opens the same UI as Posts but filtered to type: "page":

  • Title, status, last-modified date
  • Search (title + slug + excerpt)
  • Status filter tabs (All / Draft / Online)
  • Bulk actions (Publish / Unpublish / Delete)
  • New page button

There's no category column (pages don't have categories).

Creating a page

Click New page. The editor opens.

Editor

Same Tiptap-based editor as posts. Same block library. Same Document / Block sidebar tabs.

The Document sidebar has fewer fields than for posts:

  • Title
  • Slug (defaults to slugified title)
  • Excerpt
  • Status
  • Hero image
  • SEO (title, description, OG image)
  • Author

No primary category, no tags, no publication date.

Theme blocks for free composition

Posts typically have a structure imposed by the theme — header, hero, byline, body, sidebar, footer. Pages are free-composition: themes deliberately render them with just the body, no surrounding chrome so you can fully compose them with theme blocks.

For example, the corporate theme expects pages to use:

  • corporate/hero-overlay block — full-bleed hero with title + CTA
  • corporate/services-grid block — feature cards
  • corporate/testimonials block — social proof
  • corporate/cta-banner block — call to action
  • corporate/contact-form block — embedded form
  • corporate/contact-info block — address, phone, hours

Each theme ships its own set of blocks. The page's body is just a Markdown blob containing block markers; the publisher resolves each marker to its block's render output at publish time.

See Theme blocks for the editing experience and Theme blocks (authoring) if you want to add your own blocks.

Static-page home

You can use a Page as your home page — useful for vitrine sites where the home is a custom layout (hero + services + testimonials + CTA), not a list of latest posts.

To enable:

  1. Create a Page (e.g. titled "Home" with slug home).
  2. Compose it with theme blocks.
  3. Open Settings → General.
  4. Set Home mode to Static page.
  5. Home page field appears — pick the Page you just created.
  6. Save.
  7. Click Themes → Regenerate site → Everything (or wait for the next publish to cascade).

The publisher now renders the Page's body as index.html instead of the latest-posts grid.

To switch back: set Home mode to Latest posts.

The exact behavior depends on the active theme:

  • Default theme — supports both modes
  • Magazine theme — supports both modes
  • Corporate theme — defaults to static-page mode (typical for vitrine sites)

URL structure

Pages always live at the top level:

/about.html
/contact.html
/privacy-policy.html

You can't nest pages under categories or other pages. If you need URL nesting, use the slug:

/legal-privacy.html
/legal-terms.html

The slug can contain dashes, but no slashes (the admin validates and strips them). For real path nesting, you'd need a more complex slug format that the project doesn't currently support.

Page-specific URL collisions

Pages can collide with categories on the URL path level:

EntityPath
Page news (top-level)/news.html
Category news (archive)/news/index.html

These are different paths — no collision. The admin handles this correctly (see URL structure).

But:

EntityPath
Page news (top-level)/news.html
Post news without category/news.html

These collide. The admin's slug validator catches this on save and refuses the duplicate slug. See URL structure for the full collision matrix.

Static page mode in plugins

Some plugins respect the homeMode setting. For example:

  • flexweg-archives — when home is a static page, the archive index lives at /archives.html (not the home)
  • flexweg-rss — site-wide feed always exists at /rss.xml regardless of home mode

Continue