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.

On this page

Last updated on 21/08/2026 by Anonymous