---
title: "Content Frontmatter"
description: "The YAML frontmatter fields shared by every content type (Academy, Blog, Docs, FAQ, Pages)."
type: "docs"
category: "doc"
tags: []
authors: [Anonymous]
date: "2026-08-21"
last_update: "2026-08-21"
time_minutes: 3
draft: false
unlisted: false
url: "https://www.derafu.dev/docs/ui/content/frontmatter"
---

# Content frontmatter

Every Markdown content file starts with a YAML frontmatter block:

```markdown
---
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](./introduction#content-content-hierarchy) for the "one file per directory level" rule that trips people up most often.



---
Last updated on 21/08/2026

