11/2/2026

Write your first post

How the blog module reads posts, and the frontmatter fields it needs


Blog posts live in content/blog/, one Markdown file per post. The file name is the post's URL segment, so content/blog/hello.md is served at /marketing/blog/hello.

A post needs a title, a description and a date. Everything else has a default:

FieldRequiredMeaning
titleyesThe post title, shown in the list and on the page
descriptionyesOne line, used in the list and in <meta name="description">
dateyesISO timestamp; the list is ordered by it, newest first
publishednofalse keeps the post out of the list, the sitemap and llms.txt
localenoen or zh; the file name suffix decides it when omitted
tagsnoFree-form labels, currently only used by your own templates
imagenoAbsolute URL of the cover image

Two languages, one file name

Translations share the file name and differ by suffix: hello.md is English and hello.zh.md is Chinese. The URL does not carry the language — the language is negotiated per request, so the same address shows the right translation and a missing translation falls back instead of returning a 404.

Body

The body is Markdown, rendered with the components in src/components/mdx/. Headings get stable anchor ids, so links such as #configuration keep working.

Delete this file once you have written your own post — it is here to show the format, not to be published as-is.