Content frontmatter
Every Markdown content file starts with a YAML frontmatter block:
---
title: "How to void a DTE"
description: "Steps to void an electronic tax document"
tags: ["billing", "chile"]
draft: false
---
The body of the content, in Markdown, starts here.
These fields are defined once, in AbstractContentItem, and apply to every content type (Academy lessons/modules/courses, Blog posts, Docs, FAQ questions, Pages). A plugin’s own page only lists fields it adds or overrides on top of this shared set — if a plugin’s page doesn’t mention a field from this table, it behaves exactly as described here.
Unknown keys are not rejected: the frontmatter schema allows undefined keys, so a plugin (or a Twig template) can read a custom field with item.metadata('my_field') without declaring it anywhere first.
Identity and SEO
| Field | Type | Default | Description |
|---|---|---|---|
title |
string | file name | Title of the content. |
description |
string | auto (see preview below) |
Meta description and card/preview text. summary is a deprecated alias. |
keywords |
array of strings | [] |
Extra keywords added to the <meta name="keywords"> tag, on top of the tags. |
image |
string | none | Absolute or relative URL used for og:image and card previews. |
video |
string | none | Video URL. YouTube “watch” URLs are automatically rewritten to embed URLs. |
slug |
string | slugified file name | Overrides the URL segment used for this item. |
tags |
array of strings | [] |
Tags shown on the item and used to filter listings (/type/tags/{tag}). |
authors |
string, or array of strings/objects ({name, slug}) |
Anonymous |
author (singular) is a deprecated alias. |
Publishing
| Field | Type | Default | Description |
|---|---|---|---|
draft |
bool | false |
Drafts are only visible when APP_ENV=local or the request host is localhost; hidden otherwise. |
unlisted |
bool | false |
Still reachable by direct URL, but excluded from listings/tag pages unless explicitly filtered by id/uri. |
date |
string or timestamp | YYYY-MM-DD- prefix in the file name, or file creation time |
Publish date. created is a deprecated alias. |
last_update |
string or timestamp | file modification time | Shown as “last updated on”. |
deprecated |
bool, string or timestamp | false |
true uses the file’s modification time; a string/timestamp sets a specific deprecation date. |
indexable |
bool | !draft && !unlisted && !deprecated, and at least 100 characters of body |
Whether the item should be considered for the /api/content.json export and, from there, external indexing (Qdrant, etc.). |
searchable |
bool | !draft && !unlisted && !deprecated |
Whether the item should be considered a candidate for the site’s own search (search plugin) — independent of indexable. |
time |
int (minutes) | auto-estimated from word count (200 wpm) | Reading time. Set it explicitly when the estimate is off (code-heavy pages, etc.). |
Sidebar and table of contents
| Field | Type | Default | Description |
|---|---|---|---|
pagination_label |
string | title |
Label used in the previous/next pagination links. |
sidebar_label |
string | title |
Label used in the sidebar, which can differ from the page title. |
sidebar_position |
int | descending by date (newest first) |
order is a deprecated alias. Lower sorts first. |
sidebar_class_name |
string | none | Extra CSS class added to the sidebar entry. |
sidebar_custom_props |
array | [] |
Arbitrary data made available to the sidebar template. |
hide_title |
bool | false |
Hides the <h1> rendered from title. |
hide_table_of_contents |
bool | false (true for Blog and FAQ) |
Hides the in-page table of contents. |
toc_min_heading_level |
int (2-6) | 2 |
Minimum heading level included in the table of contents. |
toc_max_heading_level |
int (2-6) | 6 |
Maximum heading level included in the table of contents. |
Authoring helpers
| Field | Type | Default | Description |
|---|---|---|---|
has_twig |
bool | auto-detected (<twig: in the body) |
Whether the Markdown body should be rendered as Twig before being rendered as Markdown, so it can use Twig components. |
Content is organized hierarchically on the filesystem for the plugins that support nesting — see Content hierarchy for the “one file per directory level” rule that trips people up most often.