Frontmatter
Every markdown file starts with YAML frontmatter:
--- title: Page Title date: 2025-01-01 author: Your Name lead: A short description for listings and previews. tags: - tag1 - tag2 menu: visible: true order: 1 template: default ---
Available Fields
| Field | Description | Required |
|---|---|---|
title | Page title | Yes |
date | Publication date | No |
author | Author name | No |
lead | Short excerpt for listings | No |
tags | List of tags | No |
categories, … | A configured taxonomy’s terms, a single value or a list; the singular spelling (category:) works too | No |
menu.visible | Show in navigation | No |
menu.order | Sort order in menu | No |
template | Template to use | No |
process.markdown | Enable/disable markdown rendering (default: true) | No |
The process.markdown field is covered in detail under Processing Control.
How values are typed
Frontmatter follows YAML 1.2. An unquoted value that looks like a number is a
number: 01234 is the integer 1234, and 007 is 7, so a postal code, a
product code, or anything else that must keep its leading zeros needs quotes:
zip: "01234". Dates such as 2026-12-31 and the words yes and no are
plain strings; only true and false are booleans. A field Accent CMS reads
as text, such as title or author, accepts an unquoted number or true
as the text you wrote, so version: 1.0 stays 1.0. When a value cannot be
read, the error names the line and column.
A key written twice fails the parse, and so do two keys that differ only in
quoting, such as 1: beside "1":. YAML reads them as different keys that
would land in the same field.
When Accent CMS rewrites a page’s frontmatter (an admin save, accent content update-frontmatter), it writes the values it read: a quoted number stays
quoted, a plain date stays plain, and multi-line text keeps its block style.
It also rewrites only the fields that changed. Comments, blank lines, and the order you put the keys in are left exactly as they are, so you can annotate a page’s frontmatter and keep those notes through any number of edits. Writing a value identical to the one already there changes nothing on disk.
Field names must be printable text. A name containing a control character
other than tab (a line break, DEL, or a C1 control) or the non-characters
U+FFFE and U+FFFF is refused by every write path – the admin editor, the MCP
tools, and the CLI – before the page is read: accent content update-frontmatter --set and --remove exit with the key named, and the MCP
tools return an invalid-params error.
A field name may contain [, ], or *. Every write path treats such a
name as text: you can add, change, remove, and rename the field like any
other. A . in a field name still nests, as it always has: --set menu.visible=false writes visible under menu.
Using Lead in Templates
The lead field provides a short description that appears in page listings (like the Docs or Blog index). Use it in templates:
{% for p in all_pages %}
<h3><a href="{{ p.url }}">{{ p.title }}</a></h3>
{% if p.lead %}<p class="lead">{{ p.lead }}</p>{% endif %}
{% if p.date %}<time>{{ p.date }}</time>{% endif %}
{% endfor %}
Leave lead out and Accent CMS derives one from the page’s first paragraph, so
a listing always has something to show.
If you have written a description, that is used instead of the derived
excerpt – you do not have to write the same sentence twice. The order is
lead, then description, then the first paragraph. A lead you wrote always
wins; only the derived excerpt gives way.
This applies everywhere the lead is published, not just to listings: your theme
renders it wherever it uses page.lead, and it becomes the page’s RSS item
description and its search snippet as well. So on a page that has a
description and no lead, adding one changes what readers see on the page
itself – which is usually what you want, and worth knowing before you add
description to a page whose derived lead you were happy with.
Either way the lead is published as plain text: raw HTML is stripped from it,
because it also becomes the page’s <meta name="description">, its social-card
description, its RSS item description and its llms.txt entry, none of which
can render markup. Your file keeps whatever you wrote – only the published
view is stripped – and a tag inside `backticks` survives, so you can
still write a lead about <section>.