Frontmatter
Every frontmatter field a page accepts, all optional — title, description, sidebar, SEO, search, and the rest, with what each one controls.
Every page accepts the following frontmatter. All fields are optional.
title?string
Page title.
stringdescription?string
Page summary.
stringtype?string
Content type. blog/changelog drive feeds.
stringdocdate?string
Publish date for blog/changelog feeds (ISO or YAML date).
stringauthors?string | string[] | object[]
Post author(s) for blog/changelog content — a name, or objects with a name plus optional avatar/url and any extra fields. Preserved as-is.
string | string[] | object[]slug?string
Override the generated slug.
stringdraft?boolean
Exclude from production builds.
booleanfalselastModified?string
Pin the page's "last updated" date (ISO or YAML date); overrides the git-derived date.
stringSidebar
sidebar:
label: Install
order: 2
icon: download
badge: New
hidden: false
SEO
seo:
title: Install Blume
description: Install Blume and scaffold your first project.
image: /og/install.png
canonical: https://acme.com/install
noindex: false
Search
search:
exclude: false
tags: [api]
Changelog
Changelog entries (type: changelog) accept an optional changelog object for richer feed and display metadata:
type: changelog
changelog:
version: 1.2.0
date: 2026-06-20
category: Features
date may live here or at the top level — both feed the changelog RSS feed. See Changelog for the generated timeline page and feed.
Custom keys
Any key outside this reference fails the build, so typos are caught early. Projects that carry their own metadata can opt extra keys in via frontmatter.extend in blume.config.ts, each validated by a schema the project supplies:
import { defineConfig } from "blume";
import { z } from "zod";
export default defineConfig({
frontmatter: {
extend: {
owner: z.string(),
reviewedAt: z.coerce.date().optional(),
},
},
});
---
title: Install
owner: "@sam"
reviewedAt: 2026-06-20
---
Schemas are accepted through the Standard Schema interface, so Zod (whichever version your project installs), Valibot, and ArkType all work. Every declared key is validated on every page — absent ones included — so a required schema enforces the key site-wide; mark it .optional() to validate only where present. All other keys stay strictly validated, and built-in fields can’t be redeclared.
A page that fails validation fails blume build with a diagnostic naming the file and key. With --no-strict, the build succeeds anyway and the failing pages are dropped from the output — the build summary reports how many.
Schemas are exported from blume/schema for editor and migration tooling.