docs.json 参考
完整介绍 docs.json 的各字段:主题、颜色、导航、标签页、OpenAPI 集成、品牌、SEO、分析和 AI 聊天设置。
docs.json 文件是 Jamdesk 文档网站的中央配置文件。
docs.json 中的关键设置会显示在 Dashboard 的 Project Settings → Configuration Highlights 下。此视图为只读视图, 每次构建成功后都会自动更新。
必填字段
name
类型: string(必填)
文档网站的名称。显示在页眉和浏览器标签页中。
{ "name": "Acme API Docs" }
theme
类型: "jam" | "nebula" | "pulsar" | "halo"(必填)
使用 Inter 字体的简洁现代设计。基于页眉的导航。
适用于: 大多数文档网站、API 参考
colors
类型: object(必填)
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
primary | string (hex) | 是 | 主要品牌颜色 |
light | string (hex) | 否 | 浅色主题强调色 |
dark | string (hex) | 否 | 深色主题强调色 |
{
"colors": {
"primary": "#635BFF",
"light": "#7C75FF",
"dark": "#4F46E5"
}
}
品牌设置
favicon
类型: string 或 object
favicon 文件的路径(建议使用 SVG)。可以为两种模式提供同一张图片,也可以分别提供 light / dark 变体。
| 字段 | 类型 | 描述 |
|---|---|---|
light | string | 浅色模式的 favicon(使用对象形式时必填) |
dark | string | 深色模式的 favicon(可选,默认使用 light) |
{ "favicon": "/images/favicon.svg" }
{
"favicon": {
"light": "/images/favicon.svg",
"dark": "/images/favicon-dark.svg"
}
}
logo
类型: object
| 字段 | 类型 | 描述 |
|---|---|---|
light | string | 浅色模式的 Logo |
dark | string | 深色模式的 Logo |
href | string | 点击 Logo 时跳转的 URL |
{
"logo": {
"light": "/images/logo-light.webp",
"dark": "/images/logo-dark.webp",
"href": "https://yoursite.com"
}
}
字体排版
fonts
类型: object(可选)
覆盖主题为正文和标题设置的默认字体。每个主题都提供经过调整的默认字体。只有需要不同视觉效果时才设置 fonts。
全局使用同一种字体:
{
"fonts": {
"family": "Lora"
}
}
分别设置标题和正文:
{
"fonts": {
"heading": { "family": "Space Grotesk" },
"body": { "family": "Inter" }
}
}
| 字段 | 类型 | 描述 |
|---|---|---|
family | string | 字体系列名称。任何 Google Font 都可用;构建时会自动获取 |
weight | number | 要加载的单个字重(例如 400)。省略时加载 400, 500, 600, 700 |
source | string | 自托管字体文件的 URL 或相对于 / 的路径。设置后跳过 Google Fonts |
format | "woff" | "woff2" | 设置 source 时必填 |
heading 和 body 接受相同的字段。有关选择字体的指导,请参阅主题 → 字体排版。
外观
appearance
类型: object(可选)
控制网站默认的深色模式行为。
{
"appearance": {
"default": "dark",
"strict": true
}
}
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
default | "system" | "light" | "dark" | "system" | 首次访问者的初始模式 |
strict | boolean | false | 为 true 时隐藏导航栏切换按钮,使访问者保持在 default 模式 |
有关切换按钮行为,请参阅主题 → 深色模式。
页面元数据
metadata
类型: object(可选)
控制每个文档页面上显示的页面元数据。
{
"metadata": {
"timestamp": true
}
}
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
timestamp | boolean | false | 为 true 时,在每个页面页脚显示类似“Last updated on June 15, 2026”的行。日期来自最后一次修改该页面的 Git 提交,因此每次构建都会自动保持准确。 |
日期会显示在已发布的网站和 jamdesk dev 中。它反映了最后一次修改各页面文件的提交,因此未编辑过的页面会保留原始日期。
横幅
banner
在每个页面顶部、页眉上方,以全宽和主题强调色显示全站公告栏。可用于发布新版本、迁移、维护窗口,或发布所有访问者都应看到的消息。
{
"banner": {
"content": "🎉 Version 2.0 is live! Read the [changelog](/changelog).",
"dismissible": true
}
}
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
content | string | - | 必填。 横幅文本。支持基本的行内格式:链接 [text](url)、粗体(**text**)和斜体(*text*)。不支持自定义 MDX 组件。 |
dismissible | boolean | false | 为 true 时显示关闭按钮。访问者关闭横幅后,横幅会持续隐藏,直到你更改 content。编辑消息后横幅会重新显示。 |
横幅会显示在已发布的网站和 jamdesk dev 中。它是全局配置的(整个网站只有一个横幅);目前不支持按标签页和按语言配置横幅。
OpenAPI
api.openapi
类型: string | string[]
列出希望 Jamdesk 验证并用于端点页面的 OpenAPI 3.x 规范文件。使用相对于 docs.json 的路径。
{
"api": {
"openapi": ["/openapi/api.yaml"]
}
}配置完成后,可以在页面的 frontmatter 中添加 openapi 字段来生成端点页面:
---
title: Create Ticket
openapi: /openapi/api.yaml POST /tickets
---
如果只列出一个规范,也可以使用简写格式:
---
title: Create Ticket
openapi: POST /tickets
---
请参阅 OpenAPI 示例查看实时端点页面,并参阅目录结构了解文件放置位置。
如果网站支持多语言,请在每个源规范旁放置一个 <spec>.<lang>.<ext> 文件(例如 openapi/api.fr.yaml),Jamdesk 会在对应语言的 URL 中提供该文件。请参阅翻译 OpenAPI 规范。
asyncapi 键可以出现在 openapi 可用的任何位置,但 Jamdesk 目前还不会渲染 AsyncAPI 规范——不会从中生成任何内容。jamdesk validate 找到该键时会发出警告,因此看似受支持的配置不会一直保持这种状态直到网站构建完成。
navigation openapi(生成的页面)
类型: object
在导航标签页上放置 openapi 对象并设置 generate: true 后,Jamdesk 会在构建时为该规范中的每个操作构建一个端点页面,并创建用于容纳这些页面的侧边栏分组。无需编写内容,也无需提交文件。
{
"navigation": {
"tabs": [
{
"tab": "API Reference",
"openapi": { "source": "/openapi/api.yaml", "generate": true }
}
]
}
}| 键 | 类型 | 描述 |
|---|---|---|
source | string | 规范路径,相对于 docs.json |
generate | boolean | true 时构建页面和侧边栏。不设置时该键不生效 |
生成的页面位于该标签页自己的名称下,并经过 slug 化;slug 由方法和路径构成——上面的标签页会将 POST /tickets 放置在 /api-reference/post-tickets。操作按其第一个 tag 分组;没有标签的规范会回退到第一个有意义的路径片段,因此 /api/v1/auctions/{auctionId} 会归入 Auctions。如果规范包含操作 summary,标题取自该字段;否则使用方法和路径;针对单个资源的操作会使用单数标题(GET /users/{id} → “Get User”)。
generate 的设计采用显式启用方式。标签页上单独使用 "openapi": "/openapi/api.yaml",或使用未设置 generate: true 的对象,都会保持之前的行为——因此现有配置不会在下一次构建时突然增加数百个页面。
已提交的 .mdx 文件始终优先于 slug 冲突,因此可以逐步采用生成机制:启用生成后,在准备好时逐个删除手写的端点页面。
如果之后重命名规范中的路径,生成的 slug 会随之移动。Jamdesk 会保留每个操作的 slug 历史记录,并在每次构建时将所有旧 URL 重定向到当前 URL,因此入站链接和书签不会因重命名失效。你自己的重定向和任何已存在的页面仍具有更高优先级。
当前限制。 生成机制仅对顶层 navigation.tabs 运行——不适用于分组、锚点,或嵌套在 languages 或 versions 下的标签页,并且只为默认语言生成页面。架构接受 directory 键,但它不会影响页面的放置位置。
api.mdx.server
类型: string
用于 api: frontmatter 页面代码示例的基础 URL(即 MDX 编写的页面,不是从规范中获取 server 的 openapi: 页面)。
{
"api": {
"mdx": {
"server": "https://api.example.com"
}
}
}
为兼容性支持数组,但始终只使用第一个条目,后面的条目都会被丢弃。列出多个条目时,jamdesk validate 会发出警告。
api.examples.languages
类型: string[]
默认值: ["curl", "python", "javascript"]
选择在 openapi: 页面自动生成的 API 代码示例中显示的编程语言。数组顺序决定标签页显示顺序,第一个语言默认选中。
支持的值: curl、bash、python、javascript、go、ruby、csharp、java、rust、php
bash 是 curl 的别名;两者生成相同的输出。使用你偏好的标签即可。{
"api": {
"examples": {
"languages": ["curl", "python", "javascript", "go", "ruby", "csharp", "java", "rust", "php"]
}
}
}{
"api": {
"examples": {
"languages": ["python", "javascript", "go"]
}
}
}api.examples.defaults
类型: "required" | "all"
默认值: "all"
控制自动生成的代码示例中显示哪些参数。
| 值 | 行为 |
|---|---|
"all" | 示例包含带占位值的所有参数 |
"required" | 示例仅包含规范中标记为 required 的参数 |
{
"api": {
"examples": {
"defaults": "required"
}
}
}
api.examples.prefill
类型: boolean
默认值: false
为 true 时,API Playground 会使用 OpenAPI 规范中的 example 值预填充参数字段。
{
"api": {
"examples": {
"prefill": true
}
}
}
api.playground.display
类型: "interactive" | "simple" | "none"
默认值: "interactive"
控制端点页面上的 API Playground。默认情况下,每个 openapi: 和 api: 页面都会显示 “Try it” 按钮。
| 值 | 行为 |
|---|---|
"interactive" | 完整 Playground:填写参数、生成代码、发送请求(默认) |
"simple" | 填写参数并复制代码,但不显示 Send 按钮 |
"none" | 禁用 Playground |
{
"api": {
"playground": {
"display": "interactive"
}
}
}
请参阅 API Playground了解使用详情和按页面覆盖设置。
api.mdx.auth.method
类型: "bearer" | "basic" | "key" | "cobo"
自动生成代码示例中使用的身份验证方法。设置后,示例会包含相应的身份验证标头。
| 值 | 标头格式 |
|---|---|
"bearer" | Authorization: Bearer <token> |
"basic" | Authorization: Basic <base64> |
"key" | 自定义标头(参阅 api.mdx.auth.name) |
"cobo" | Cobo 专用身份验证 |
{
"api": {
"mdx": {
"auth": {
"method": "bearer"
}
}
}
}
api.mdx.auth.name
类型: string
基于密钥的身份验证所使用的自定义标头名称。仅当 api.mdx.auth.method 为 "key" 时使用。
{
"api": {
"mdx": {
"auth": {
"method": "key",
"name": "X-API-Key"
}
}
}
}
导航
tabsPosition
类型: "top" | "left"
控制导航标签页的显示位置。
| 值 | 描述 |
|---|---|
"top" | 标签页显示在页眉标签栏中 |
"left" | 标签页显示在侧边栏顶部 |
默认值取决于主题:
| 主题 | 默认值 |
|---|---|
| jam | "left" |
| nebula | "left" |
| pulsar | "top" |
| halo | "left" |
{ "tabsPosition": "left" }
anchors
类型: array
显示在所有页面侧边栏顶部的外部链接。
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
name | string | 是 | 显示文本 |
href | string | 是 | URL(外部链接) |
icon | string | 否 | Font Awesome 图标名称 |
{
"anchors": [
{ "name": "Blog", "href": "https://blog.example.com", "icon": "newspaper" }
]
}
navigation(结构)
类型: object
文档的导航结构。详细文档请参阅导航。
页面可以是字符串(标题根据文件名自动生成),也可以是带自定义标题的对象:
"pages": [
"introduction",
{ "page": "content/mdx-basics", "title": "MDX Basics" }
]
{
"navigation": {
"tabs": [
{
"tab": "Docs",
"icon": "book-open",
"groups": [
{
"group": "Getting Started",
"pages": ["introduction", "quickstart"]
}
]
}
]
}
}导航栏和页脚
navbar
类型: object
| 字段 | 类型 | 描述 |
|---|---|---|
links | array | 导航链接 |
links[].label | string | 默认按钮文本 |
links[].labels | object | 可选的按语言覆盖值,以语言代码为键(例如 fr、es)。未设置时回退到 label |
links[].icon | icon | 可选的图标,显示在标签旁 |
links[].href | string | 目标 URL |
primary | object | 主要 CTA 按钮 |
primary.label | string | 默认按钮文本 |
primary.labels | object | 可选的按语言覆盖值,以语言代码为键。未设置时回退到 label |
{
"navbar": {
"links": [
{
"label": "Blog",
"labels": { "fr": "Blog", "es": "Blog" },
"href": "/blog"
},
{
"label": "Pricing",
"labels": { "fr": "Tarifs", "es": "Precios" },
"href": "/pricing"
}
],
"primary": {
"type": "button",
"label": "Dashboard",
"labels": { "fr": "Tableau de bord", "es": "Panel" },
"href": "https://app.example.com"
}
}
}
labels 是可选的。单语言文档可以省略它。设置后,当前 URL 中的语言(例如 /fr/...)会选择匹配的覆盖值。
footer
类型: object
使用社交链接和自定义链接列配置页面页脚。
{
"footer": {
"socials": {
"github": "https://github.com/yourorg",
"x": "https://x.com/yourhandle",
"discord": "https://discord.gg/yourserver"
},
"links": [
{
"header": "Resources",
"items": [
{ "label": "Blog", "href": "https://example.com/blog" },
{ "label": "Changelog", "href": "/changelog" }
]
}
]
}
}
| 字段 | 类型 | 描述 |
|---|---|---|
socials | object | 社交媒体平台 URL |
links | array | 链接列配置 |
links[].header | string | 列标题 |
links[].items | array | { label, href } 对象数组 |
支持的社交平台: github、x、twitter、linkedin、discord、slack、youtube、instagram、facebook、reddit、telegram、bluesky、threads、medium、hacker-news、website
样式
styling.latex
类型: boolean
启用使用 KaTeX 的 LaTeX 数学渲染。启用后,可以使用 $...$ 表示行内数学公式,使用 $$...$$ 表示块级公式。
{
"styling": {
"latex": true
}
}
有关使用详情,请参阅数学与 LaTeX。
styling.js
类型: string | string[]
要在每个页面中包含的自定义 JavaScript 文件。路径相对于文档目录,并且必须以 / 开头。
{
"styling": {
"js": "/script.js"
}
}
多个文件请传入数组:
{
"styling": {
"js": ["/chat.js", "/analytics.js"]
}
}
未设置此字段时,Jamdesk 会自动检测项目根目录中的 .js 文件。详情请参阅自定义 JavaScript。
搜索
search
类型: object(可选)
自定义文档搜索栏。搜索开箱即用;只有需要更改占位文本或在空状态中展示热门页面时,才需要设置此字段。
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
prompt | string | Search documentation… | 搜索输入框中显示的占位文本 |
popularPages | array | Quick Start, Introduction | 访问者输入查询前显示的快速访问链接 |
{
"search": {
"prompt": "Ask me anything…",
"popularPages": [
{ "title": "Quick Start", "slug": "quickstart", "icon": "rocket" },
{ "title": "Authentication", "slug": "guides/authentication", "icon": "key" }
]
}
}
热门页面
popularPages 中的每个条目接受以下字段:
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
title | string | 是 | 链接显示的标签 |
slug | string | 是 | 页面路径,不带开头的斜杠或 .mdx 扩展名(例如 quickstart,或文件 guides/authentication.mdx 对应的 guides/authentication) |
icon | string | 否 | 链接旁显示的 Font Awesome 图标名称(例如 rocket 或 bell) |
icon 字段也接受完整的 { "name", "style", "library" } 对象。请参阅图标对象形式。省略 popularPages 时,Jamdesk 默认显示 Quick Start 和 Introduction。
聊天
chat
类型: object(可选)
配置内置的 AI 聊天助手。所有网站默认启用聊天;只有需要自定义开场问题或禁用聊天时,才需要设置此字段。
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
enabled | boolean | true | 设置为 false 可从网站中移除聊天面板 |
starterQuestions | string[] | 自动生成 | 聊天打开时显示的最多 4 个问题(每个 5–200 个字符)。省略时在构建期间自动生成。设置为 [] 表示不显示 |
{
"chat": {
"starterQuestions": [
"How do I get started?",
"What API endpoints are available?"
]
}
}
详情请参阅 AI 聊天,了解聊天的工作方式以及访问者看到的内容。
AI 操作菜单
contextual
类型: object(可选)
配置显示在每个页面上的 AI Actions 下拉菜单。默认启用所有选项;只有需要自定义显示的选项或禁用该菜单时,才需要设置此字段。
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
enabled | boolean | true | 设置为 false 可从网站中移除 AI Actions 菜单 |
options | array | 所有内置选项 | 选项键和/或自定义选项对象列表 |
内置选项键: copy、view、chatgpt、claude、perplexity、gemini、mcp、cursor、vscode
{
"contextual": {
"options": ["copy", "claude", "mcp", "cursor"]
}
}
在内置选项旁添加自定义选项:
{
"contextual": {
"options": [
"copy",
"claude",
{
"title": "Ask on Discord",
"description": "Get help from the community",
"icon": "discord",
"href": "https://discord.gg/your-server"
}
]
}
}
完整选项列表和自定义选项格式请参阅 AI Actions 菜单。
拼写检查
spellcheck
类型: object(可选)
配置 jamdesk spellcheck CLI 命令。只有需要将项目专用词语添加到忽略列表时,才需要设置此字段。
| 字段 | 类型 | 描述 |
|---|---|---|
ignore | string[] | 拼写检查时跳过的词语(产品名称、技术术语等) |
{
"spellcheck": {
"ignore": ["Acme", "kubectl", "Terraform"]
}
}
CLI 内置了 180 多个技术术语(API、GraphQL、Kubernetes、React 等),并会自动忽略 name 字段中的项目名称。只需添加项目专用词语。
有关使用详情和交互式修复模式,请参阅 CLI 概览:拼写检查。
图像
images.convertToWebp
类型: boolean(可选,默认 false)
在构建期间为 PNG 和 JPG 资源启用自动 WebP 转换。转换后的文件通常比原文件小 60–80%,且不会有明显的质量损失。MDX、自定义 CSS、自定义 JS 和 docs.json 中的引用都会自动重写,因此无需更改任何路径。
favicon、og:image 和 twitter:image 会保留原始格式。并非所有社交媒体爬虫或电子邮件客户端都能可靠渲染 WebP;预览卡片损坏比 JPG 文件略大更糟糕。
{
"images": {
"convertToWebp": true
}
}
有关转换内容、缓存工作方式和构建进度指示器,请参阅自动图像转换。
访问控制
auth.password
类型: object(可选)
选择启用网站的共享密码保护。该配置仅声明保护方式。你仍需在下一次构建运行后,通过 Dashboard 设置实际密码。
设置 auth.password.enabled: true 可锁定整个网站,或在 auth.password.private[] 下列出路径,仅保护指定页面。两种方式都会在下一次构建时触发相同的 Dashboard 密码提示。
{
"auth": {
"password": {
"enabled": true,
"hint": "Ask your account manager",
"public": ["/marketing/**", "/changelog"]
}
}
}
| 字段 | 类型 | 描述 |
|---|---|---|
enabled | boolean | 全站模式。为 true 时,每个页面都需要密码(标记为公开的内容除外)。 |
hint | string(最多 200 个字符) | 解锁屏幕上显示的纯文本提示。不支持 HTML。 |
public | string[] | 绕过密码保护的路径 glob。支持 *(一个片段)和 **(递归匹配)。单独的 / 会被拒绝。 |
private | string[] | 需要密码的精确路径。不设置 enabled 时,设置此项会启用指定页面模式。 |
完整流程请参阅密码保护,其中包括 Dashboard 流程,以及 frontmatter 中的 public: true / private: true 如何与这些数组交互。
完整示例
{
"$schema": "https://jamdesk.com/docs.json",
"name": "Acme Documentation",
"description": "Learn how to use Acme",
"theme": "jam",
"colors": {
"primary": "#635BFF"
},
"favicon": "/images/favicon.svg",
"logo": {
"light": "/images/logo-light.webp",
"dark": "/images/logo-dark.webp"
},
"api": {
"openapi": ["/openapi/api.yaml"],
"playground": {
"display": "interactive"
},
"examples": {
"languages": ["curl", "python", "javascript"],
"prefill": true
}
},
"styling": {
"latex": true,
"js": "/script.js"
},
"chat": {
"starterQuestions": ["How do I get started?", "What endpoints are available?"]
},
"contextual": {
"options": ["copy", "claude", "chatgpt", "mcp", "cursor"]
},
"spellcheck": {
"ignore": ["Acme"]
},
"anchors": [
{ "name": "Blog", "href": "https://blog.acme.com", "icon": "newspaper" }
],
"navbar": {
"links": [
{ "label": "Support", "href": "/support" }
],
"primary": {
"type": "button",
"label": "Dashboard",
"href": "https://app.acme.com"
}
},
"navigation": {
"tabs": [
{
"tab": "Docs",
"icon": "book-open",
"groups": [
{
"group": "Get Started",
"pages": ["introduction", "quickstart"]
}
]
},
{
"tab": "API Reference",
"icon": "code",
"groups": [
{
"group": "Endpoints",
"pages": ["api/users", "api/posts"]
}
]
}
]
}
}