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:
| Post | Page | |
|---|---|---|
| Has primary category | Yes | No |
| Has tags | Yes | No |
| Appears in archives | Yes | No |
| Appears in RSS | Yes | No |
| Has a date | Yes (publishedAt) | No (createdAt only, not surfaced) |
| URL pattern | /<category>/<slug>.html or /<slug>.html | /<slug>.html (always top-level) |
| Hero image surfaced by themes | Yes | Sometimes (theme-dependent) |
| Free-form composition | Body markdown only | Body 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-overlayblock — full-bleed hero with title + CTAcorporate/services-gridblock — feature cardscorporate/testimonialsblock — social proofcorporate/cta-bannerblock — call to actioncorporate/contact-formblock — embedded formcorporate/contact-infoblock — 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:
- Create a Page (e.g. titled "Home" with slug
home). - Compose it with theme blocks.
- Open Settings → General.
- Set Home mode to Static page.
- Home page field appears — pick the Page you just created.
- Save.
- 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:
| Entity | Path |
|---|---|
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:
| Entity | Path |
|---|---|
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.xmlregardless of home mode
Continue
- Posts — for time-stamped content
- Editor overview — block library
- Theme blocks — free-composition layouts
- URL structure — slug rules