Frontmatter
Frontmatter is the YAML block at the top of every content file. It controls how a page behaves, where it appears, and how it's rendered.
All fields
Identity
| Field | Type | Default | Description |
|---|---|---|---|
title |
string | "" |
Page title (required for meaningful pages) |
nav_title |
string | title |
Navigation label — used in menus and breadcrumbs instead of title when set |
heading |
string | title |
On-page <h1> — use when the SEO title differs from the desired on-page heading |
descriptor |
string | — | Short subtitle shown after title in browser tab |
slug |
string | folder name | Override the URL slug |
template |
string | filename | Override template selection (.md only) |
layout |
string | false | "default" |
Layout wrapping (.tsx only) |
The descriptor field controls the page title shown in the browser tab. When present, the title format is "Title - Descriptor | Site Name". Without it, the format is "Title | Site Name".
title: "Services"
descriptor: "Custom Web Solutions"
# → browser tab: "Services - Custom Web Solutions | My Site"
Publishing
| Field | Type | Default | Description |
|---|---|---|---|
published |
boolean | true |
If false, page doesn't exist for visitors |
status |
string | — | Workflow status: draft, in_review, published, archived |
date |
string | — | Publication date (ISO 8601) |
publish_date |
string | — | Scheduled publish (ISO 8601 datetime) |
unpublish_date |
string | — | Scheduled unpublish (ISO 8601 datetime) |
visible |
boolean | true |
If false, accessible but hidden from navigation |
routable |
boolean | true |
If false, page has no URL (modular sections) |
The status field is used by the content workflow system for editorial management. It works independently of published — a page with status: draft and published: true is still accessible. Use published: false to actually hide a page from visitors.
Taxonomy
taxonomy:
category: [tutorials, guides]
tag: [deno, fresh, cms]
author: [jane]
Taxonomies are defined in config/site.yaml under taxonomies. Any taxonomy listed there can be used in frontmatter. Values are always arrays.
Metadata
metadata:
description: "Page description for SEO"
og:image: cover.jpg
robots: "noindex"
Key-value pairs for HTML <meta> tags and SEO. Values are strings.
Routes
routes:
aliases:
- /old-path
- /another-old-path
canonical: /the-real-url
aliases create additional URLs that serve this page. canonical sets the preferred URL for search engines.
Summary
summary:
size: 300 # characters
format: short # "short" or "long"
Controls automatic excerpt generation from the page body.
Cache
cache:
enable: true
lifetime: 3600 # seconds
Per-page cache overrides. Takes precedence over system-level cache settings.
Collection
collection:
items:
"@self.children": true
order:
by: date
dir: desc
filter:
published: true
limit: 10
pagination:
size: 10
Declarative content queries. See the Collections page for full details.
Media
| Field | Type | Default | Description |
|---|---|---|---|
image |
string | — | Cover image filename (co-located with the content file) |
The image field names a file in the same directory as the content file. It is used in three places:
- RSS & Atom feeds — included as the feed item's cover image (
<enclosure>/<media:content>) - XML Sitemap — generates a
<image:image>entry for the page - Templates — accessible as
page.frontmatter.image; use with the image processing API for responsive images
---
title: "My Post"
date: 2026-03-09
image: cover.jpg
---
The image must be a bare filename, not a path or URL. The generated URL follows the pattern /content-media/{content-dir}/{image}.
Custom data
custom:
featured: true
rating: 5
hero_color: "#1a1a2e"
Arbitrary structured data accessible in templates. Use this for any page-specific data that doesn't fit the standard fields.
Minimal frontmatter
The only truly required field is title. Everything else has sensible defaults:
---
title: "My Page"
---
This creates a published, visible, routable page with no taxonomies, default caching, and template selection by filename.