每个页面都可以使用以下 frontmatter 字段。所有字段都是可选的。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
title? |
string |
- | 页面标题。 |
description? |
string |
- | 页面摘要。 |
type? |
string |
doc |
内容类型。blog/changelog 会驱动订阅源。 |
date? |
string |
- | blog/changelog 订阅源使用的发布日期(ISO 或 YAML 日期)。 |
authors? |
string | string[] | object[] |
- | blog/changelog 内容的作者——一个名字,或带 name 以及可选的 avatar/url 和任意额外字段的对象。保持原样。 |
slug? |
string |
- | 设置页面从内容根目录起的完整路由(guides/setup)。它替换的是文件位置给出的整条路径,而不只是最后一段。出现 . 或 .. 段属于错误:浏览器会把它消解掉,任何链接都无法到达该页面。 |
draft? |
boolean |
false |
不纳入生产构建。 |
deprecated? |
boolean |
false |
标记页面已弃用:它的侧边栏行会加上一个弃用标记(可翻译的 UI 文案)。 |
hidden? |
boolean |
false |
sidebar.hidden 的简写。 |
noindex? |
boolean |
false |
seo.noindex 的简写。 |
narration? |
boolean |
true |
设为 false 可让该页面在开启朗读时不显示「收听本页」播放器。 |
related? |
(string | { [title]: string })[] | false |
- | 建议在页面底部展示的页面,最多十个:根相对路径、绝对 URL,或用 { Title: link } 为链接命名。参见下文的「相关页面」。 |
pagination? |
boolean |
true |
设为 false 可去掉页面底部的上一页/下一页链接。页面本身仍留在顺序中,因此相邻页面依旧会链接到它。 |
icon? |
string |
- | 当 sidebar.icon 未设置时,用于页面侧边栏行的 Lucide 图标(sidebar.icon 优先)。 |
lastModified? |
string |
- | 固定页面的「最后更新」日期(ISO 或 YAML 日期);会覆盖从 git 推导出的日期。 |
mode? |
"default" | "wide" | "center" | "custom" | "frame" |
"default" |
页面在内容之外还显示哪些部分。参见下文的「布局」。 |
api? |
string |
- | 该页面手动记录的接口,以 HTTP 方法加路径或 URL 表示(POST /v1/users)。参见「手写 API 页面」。 |
authMethod? |
"bearer" | "basic" | "key" | "none" |
- | api 页面的接口如何认证,作用于站点的 api.auth。 |
playground? |
"interactive" | "simple" | "none" |
"interactive" |
api 页面显示什么:「试一试」面板和示例、仅示例,或都不显示。 |
布局#
mode 决定页面在内容之外还显示什么:
| 模式 | 侧边栏 | 标题与目录 | 页尾链接与页脚 | 内容宽度 |
|---|---|---|---|---|
default |
显示 | 显示 | 显示 | 正文宽度 |
wide |
显示 | 仅标题 | 显示 | 整列 |
center |
不显示 | 仅标题 | 显示 | 居中的更宽一列 |
frame |
显示 | 不显示 | 不显示 | 整列 |
custom |
不显示 | 不显示 | 不显示 | 整页 |
wide 适合满是宽表格或图示的页面,center 适合从头往下读的发行说明或公告。custom 只保留页眉,适合用 MDX 编写的落地页;frame 还会保留侧边栏,适合嵌在文档导航里的工具或仪表盘。这两种模式都不渲染页面的 title 和 description,所以请自己写标题。所有模式都会参与搜索,并保留 Markdown 副本。
title: Welcome
mode: custom
这些取值与 Mintlify 一致;它的 assistant 模式(整页聊天)在这里没有对应项。
相关页面#
related 列出建议在页面底部展示的页面,以卡片形式显示在 相关页面 标题之下:
related:
- /guides/deployment
- Search setup: /configuration/search
- https://astro.build
根相对路径指向另一个页面,卡片会用该页面的标题和描述展示它;在已翻译的页面上,如果存在译文则链接到译文。Title: link 形式的条目会自行设定卡片标题,而绝对 URL 则以主机名链接到站外。路径和页面上的其他链接一样会被校验,所以 blume validate 会报告匹配不到任何页面的路径。这个键名与 Mintlify 一致,因此迁移过来的页面可以原样保留。
侧边栏#
sidebar:
label: Install
order: 2
icon: download
badge: New
hidden: false
display: page
hidden 会把页面从侧边栏以及上一页/下一页翻页中移除。用在文件夹的 index 页面上时,它只移除该页面自己的那一行:分组行仍然链接到该页面,上一页/下一页链接也仍会经过它。
display 设定页面所属文件夹分组的渲染模式(按分组覆盖),并且只在自动生成的侧边栏中、文件夹的 index 页面上才有意义——在其他任何位置(非 index 页面、内容根目录自身的 index 页面,或显式 navigation.sidebar 下的任何页面)它都没有可配置的分组,Blume 会以 BLUME_SIDEBAR_DISPLAY_IGNORED 发出警告。
SEO#
seo:
title: Install Blume
description: Install Blume and scaffold your first project.
image: /og/install.png
canonical: https://acme.com/install
noindex: false
x:
creator: "@jane"
noindex 会输出 robots noindex,把页面从站点地图中移除,并跳过它的结构化数据。x.creator 把页面的作者信息指向一个 X 账号(twitter:creator)——比如客座文章的作者。全部字段参见元数据。
搜索#
search:
exclude: false
tags: [api]
keywords: [install, setup]
boost: 3
exclude 让页面不出现在搜索结果中,tags 把它归入搜索对话框里的某个筛选项。keywords 是除页面正文之外、能命中该页面的额外词。boost 会乘上页面的相关度:大于 1 排名更高,小于 1 则更低。参见排序。
AI#
ai:
exclude: true
ai.exclude 让页面不出现在 llms.txt 与 llms-full.txt 中。页面照常渲染、参与搜索,并在站点地图中保留位置。
更新日志#
更新日志条目(type: changelog)可以接受一个可选的 changelog 对象,用来提供更丰富的订阅源与展示元数据:
type: changelog
changelog:
version: 1.2.0
date: 2026-06-20
category: Features
date 可以写在这里,也可以写在顶层——两者都会用于更新日志 RSS 订阅。自动生成的时间线页面和订阅源参见更新日志。
自定义键#
本表之外的任何键都会导致构建失败,从而尽早发现拼写错误。带有自有元数据的项目可以在 blume.config.ts 中通过 frontmatter.extend 开放额外的键,每个键都由项目提供的 schema 校验:
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
---
schema 通过 Standard Schema 接口接入,因此 Zod(无论你的项目安装的是哪个版本)、Valibot 和 ArkType 都能用。每个声明的键都会在每个页面上校验——包括不存在的页面——因此必填 schema 会在全站强制该键;把它标为 .optional() 则只在出现时校验。其他所有键仍保持严格校验,内置字段也不能重复声明。
按类型区分的键#
如果只想在某一种内容类型上要求某些键——比如 RFC 的 status、事故报告的 severity——就改在 content.types 下按它们适用的 frontmatter type 声明:
import { defineConfig } from "blume";
import { z } from "zod";
export default defineConfig({
content: {
types: {
rfc: {
frontmatter: {
domain: z.string(),
status: z.enum(["draft", "review", "enforced"]),
},
},
},
},
});
---
title: OpenAPI request schemas
type: rfc
domain: architecture
status: enforced
---
按类型区分的键遵循与 extend 相同的校验规则,但只作用于解析出的 type 匹配的页面——当声明针对 content.defaultType 时,也包括那些没有设置 type 的页面。一个键只属于一处声明,要么全站级别,要么按类型级别,不能两者兼有。而只为另一种类型声明的键在其他地方依然属于未知键,所以普通文档页面上多写一个 status 仍会导致构建失败。
校验失败的页面会让 blume build 失败,并给出指明文件和键名的诊断信息。加上 --no-strict 后构建仍会成功,但失败的页面会从产物中剔除——构建摘要会报告剔除的数量。
这些 schema 从 blume/schema 导出,供编辑器和迁移工具使用。