Jamdesk Documentation logo

docs.json 参考

完整参考 docs.json 的各项配置:主题、颜色、导航、标签页、OpenAPI 集成、品牌、SEO、分析和 AI 聊天设置。

docs.json 文件是 Jamdesk 文档网站的中央配置文件。

docs.json 中的关键设置会显示在仪表板的 Project Settings → Configuration Highlights 下。此视图为只读, 每次构建成功后都会自动更新。

必填字段

name

类型: string(必填)

文档网站的名称。显示在页眉和浏览器标签页中。

{ "name": "Acme API Docs" }

theme

类型: "jam" | "nebula" | "pulsar" | "halo"(必填)

使用 Inter 字体的简洁现代设计。基于页眉的导航。

适用于: 大多数文档网站、API 参考

colors

类型: object(必填)

字段类型必填描述
primarystring (hex)是主要品牌颜色
lightstring (hex)否浅色主题强调色
darkstring (hex)否深色主题强调色
{
  "colors": {
    "primary": "#635BFF",
    "light": "#7C75FF",
    "dark": "#4F46E5"
  }
}

品牌

favicon

类型: string 或 object

网站图标文件的路径(推荐使用 SVG)。可以为两种模式提供一个图标,也可以分别提供 light / dark 变体。

字段类型描述
lightstring浅色模式的网站图标(使用对象形式时必填)
darkstring深色模式的网站图标(可选,默认使用 light)
{ "favicon": "/images/favicon.svg" }
{
  "favicon": {
    "light": "/images/favicon.svg",
    "dark": "/images/favicon-dark.svg"
  }
}

类型: object

字段类型描述
lightstring浅色模式的 Logo
darkstring深色模式的 Logo
hrefstring点击 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" }
  }
}
字段类型描述
familystring字体系列名称。任何 Google Font 都可以使用;构建时会自动获取
weightnumber要加载的单个字重(例如 400)。省略后加载 400, 500, 600, 700
sourcestring自托管字体文件的 URL 或相对于 / 的路径。跳过 Google Fonts
format"woff" | "woff2"设置 source 时必填

heading 和 body 接受相同字段。有关如何选择字体,请参阅主题 → 字体。

外观

appearance

类型: object(可选)

控制网站默认的深色模式行为。

{
  "appearance": {
    "default": "dark",
    "strict": true
  }
}
字段类型默认值描述
default"system" | "light" | "dark""system"首次访问者的初始模式
strictbooleanfalse为 true 时隐藏导航栏切换按钮,使访问者保持在 default 模式

有关切换按钮行为,请参阅主题 → 深色模式。

页面元数据

metadata

类型: object(可选)

控制每个文档页面上显示的页面元数据。

{
  "metadata": {
    "timestamp": true
  }
}
字段类型默认值描述
timestampbooleanfalse为 true 时,在每个页面页脚显示类似“Last updated on June 15, 2026”的一行文字。日期来自最后一次修改该页面的 Git 提交,因此每次构建都会自动保持准确。

日期会显示在已发布的网站和 jamdesk dev 中。它反映最近一次修改每个页面文件的提交,因此未编辑过的页面会保留原始日期。

本地化

localization

类型: object(可选)

控制访客如何进入文档的翻译版本。

{
  "localization": {
    "autoRedirect": true
  }
}
字段类型默认值描述
autoRedirectbooleanfalse为 true 时,首次到访文档根路径的访客会被送到与其浏览器 Accept-Language 头部匹配的语言。需要在 navigation.languages 中配置两个或更多条目。

只有根路径会重定向。/guides/authentication 这样的深层链接始终提供它所指向的页面,因此您粘贴到工单里的链接对所有人打开的都是同一个页面。搜索引擎爬虫永远不会被重定向,由您的 hreflang 标签继续决定哪些内容被收录。

访客的语言会被记住一年。从语言选择器中选择语言后,从那时起该选择会覆盖自动匹配的结果。

完整行为请参阅多语言支持 → 自动语言路由。

横幅

在每个页面顶部、页眉上方,以全宽和主题强调色显示网站级公告栏。可用于发布、迁移、维护窗口或任何所有访问者都应看到的消息。

{
  "banner": {
    "content": "🎉 Version 2.0 is live! Read the [changelog](/changelog).",
    "dismissible": true
  }
}
字段类型默认值描述
contentstring-必填。 横幅文本。支持基本的行内格式:链接 [text](url)、粗体(**text**)和斜体(*text*)。不支持自定义 MDX 组件。
dismissiblebooleanfalse为 true 时显示关闭按钮。访问者关闭横幅后,在你更改 content 前,横幅会持续对其隐藏。编辑消息会使横幅重新显示。

横幅会显示在已发布的网站和 jamdesk dev 中。它是全局配置的(整个网站只有一个横幅);目前不支持按标签页和按语言配置横幅。

OpenAPI

api.openapi

类型: string | string[]

列出希望 Jamdesk 验证并用于端点页面的 OpenAPI 3.x 规范文件。使用相对于 docs.json 的路径。

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 找到该键时会发出警告,因此看似受支持的配置不会一直保持这种状态,直到你构建网站。

类型: object

在导航标签页上放置 openapi 对象并设置 generate: true 后,Jamdesk 会在构建时为该规范中的每个操作构建一个端点页面,并创建用于容纳这些页面的侧边栏分组。无需编写内容,也无需提交文件。

docs.json
{
  "navigation": {
    "tabs": [
      {
        "tab": "API Reference",
        "openapi": { "source": "/openapi/api.yaml", "generate": true }
      }
    ]
  }
}
键类型描述
sourcestring规范的路径,相对于 docs.json
generatebooleantrue 时构建页面和侧边栏。不设置时该键不生效

生成的页面位于标签页自身名称对应的 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 编写的页面,不是从规范中获取服务器配置的 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 的别名;两者会生成相同的输出。可以使用你偏好的标签。
All supported languages
{
  "api": {
    "examples": {
      "languages": ["curl", "python", "javascript", "go", "ruby", "csharp", "java", "rust", "php"]
    }
  }
}
Custom subset
{
  "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

显示在所有页面侧边栏顶部的外部链接。

字段类型必填描述
namestring是显示文本
hrefstring是URL(外部链接)
iconstring否Font Awesome 图标名称
{
  "anchors": [
    { "name": "Blog", "href": "https://blog.example.com", "icon": "newspaper" }
  ]
}

类型: object

文档的导航结构。有关详细文档,请参阅导航。

页面可以是字符串(从文件名自动生成标题),也可以是包含自定义标题的对象:

"pages": [
  "introduction",
  { "page": "content/mdx-basics", "title": "MDX Basics" }
]
{
  "navigation": {
    "tabs": [
      {
        "tab": "Docs",
        "icon": "book-open",
        "groups": [
          {
            "group": "Getting Started",
            "pages": ["introduction", "quickstart"]
          }
        ]
      }
    ]
  }
}

导航栏和页脚

类型: object

字段类型描述
linksarray导航链接
links[].labelstring默认按钮文本
links[].labelsobject可选的按语言覆盖值,以语言代码为键(例如 fr、es)。默认使用 label
links[].iconicon可选的图标,显示在标签旁
links[].hrefstring目标 URL
primaryobject主要 CTA 按钮
primary.labelstring默认按钮文本
primary.labelsobject可选的按语言覆盖值,以语言代码为键。默认使用 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/...)会选择匹配的覆盖值。

类型: 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" }
        ]
      }
    ]
  }
}
字段类型描述
socialsobject社交媒体平台 URL
linksarray链接列配置
links[].headerstring列标题
links[].itemsarray{ 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。

搜索

类型: object(可选)

自定义文档搜索栏。搜索开箱即用;只有在需要更改占位文本或在空状态中显示热门页面时,才需要此字段。

字段类型默认值描述
promptstringSearch documentation…搜索输入框中显示的占位文本
popularPagesarrayQuick Start, Introduction访问者输入查询前显示的快速访问链接
{
  "search": {
    "prompt": "Ask me anything…",
    "popularPages": [
      { "title": "Quick Start", "slug": "quickstart", "icon": "rocket" },
      { "title": "Authentication", "slug": "guides/authentication", "icon": "key" }
    ]
  }
}

热门页面

popularPages 中的每个条目接受以下字段:

字段类型必填描述
titlestring是链接显示的标签
slugstring是页面路径,不带开头的斜杠或 .mdx 扩展名(例如 quickstart,或文件 guides/authentication.mdx 对应的 guides/authentication)
iconstring否链接旁显示的 Font Awesome 图标名称(例如 rocket 或 bell)

icon 字段也接受完整的 { "name", "style", "library" } 对象。请参阅图标对象形式。省略 popularPages 时,Jamdesk 默认显示 Quick Start 和 Introduction。

聊天

chat

类型: object(可选)

配置内置的 AI 聊天助手。所有网站默认启用聊天;只有在需要自定义开场问题或禁用聊天时,才需要此字段。

字段类型默认值描述
enabledbooleantrue设置为 false 可从网站中移除聊天面板
starterQuestionsstring[]自动生成聊天打开时显示的最多 4 个问题(每个 5–200 个字符)。省略时在构建期间自动生成。设置为 [] 表示不显示
{
  "chat": {
    "starterQuestions": [
      "How do I get started?",
      "What API endpoints are available?"
    ]
  }
}

有关聊天工作方式及访问者所见内容的详情,请参阅 AI Chat。

AI 操作菜单

contextual

类型: object(可选)

配置显示在每个页面上的 AI Actions 下拉菜单。默认启用所有选项;只有在需要自定义显示的选项或禁用菜单时,才需要此字段。

字段类型默认值描述
enabledbooleantrue设置为 false 可从网站中移除 AI Actions 菜单
optionsarray所有内置选项选项键和/或自定义选项对象列表

内置选项键: 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 Menu。

拼写检查

spellcheck

类型: object(可选)

配置 jamdesk spellcheck CLI 命令。只有在需要将项目专用词添加到忽略列表时,才需要此字段。

字段类型描述
ignorestring[]拼写检查期间跳过的词语(产品名称、技术术语等)
{
  "spellcheck": {
    "ignore": ["Acme", "kubectl", "Terraform"]
  }
}

CLI 包含 180 多个内置技术术语(API、GraphQL、Kubernetes、React 等),并会自动忽略 name 字段中的项目名称。只添加项目专用词语。

有关用法详情和交互式修复模式,请参阅 CLI Overview: Spellcheck。

图片

images.convertToWebp

类型: boolean(可选,默认值为 false)

在构建期间为 PNG 和 JPG 资源启用自动 WebP 转换。转换后的文件通常比原文件小 60–80%,且不会出现明显的质量损失。MDX、自定义 CSS、自定义 JS 和 docs.json 中的引用都会自动重写,因此无需更改任何路径。

网站图标、og:image 和 twitter:image 会保留原始格式。并非所有社交爬虫或电子邮件客户端都能可靠地渲染 WebP,损坏的预览卡片比稍大的 JPG 更糟糕。

{
  "images": {
    "convertToWebp": true
  }
}

有关转换内容、缓存工作方式和构建进度指示器,请参阅自动图片转换。

访问控制

auth.password

类型: object(可选)

选择为网站启用共享密码保护。这里只配置声明式设置。你仍需在下一次构建运行后,通过仪表板设置实际密码短语。

设置 auth.password.enabled: true 可锁定整个网站,或在 auth.password.private[] 下列出路径,仅保护指定页面。两种方式都会在下一次构建时触发相同的仪表板密码提示。

{
  "auth": {
    "password": {
      "enabled": true,
      "hint": "Ask your account manager",
      "public": ["/marketing/**", "/changelog"]
    }
  }
}
字段类型描述
enabledboolean全站模式。为 true 时,每个页面都需要密码(标记为公开的内容除外)。
hintstring(最多 200 个字符)解锁屏幕上显示的纯文本提示。不支持 HTML。
publicstring[]绕过密码保护的路径 glob。支持 *(一个片段)和 **(递归)。单独的 / 会被拒绝。
privatestring[]需要密码的确切路径。不设置 enabled 而设置此字段会启用指定页面模式。

有关完整流程(包括仪表板流程,以及 frontmatter 中的 public: true / private: true 如何与这些数组交互),请参阅密码保护。

auth.jwt

类型: object(可选)

使用你自己的登录系统保护整个网站。你的后端为每个已登录用户签署短期令牌,Jamdesk 将其交换为会话 Cookie。签名密钥在仪表板中生成,而不是在此文件中生成。不能同时启用 auth.jwt 和 auth.password;同时启用时,构建会因 config_error 失败。

{
  "auth": {
    "jwt": {
      "enabled": true,
      "loginUrl": "https://app.example.com/docs-login",
      "public": ["/changelog/**", "/status"]
    }
  }
}
字段类型描述
enabledboolean启用 JWT 身份验证。每个页面都需要会话,标记为公开的内容除外。
loginUrlstring当 enabled 为 true 时必填。你方的绝对 https:// URL。没有会话的访问者会被发送到此 URL,并附带 ?redirect=<path>,以便你将其带回所请求的页面。
publicstring[]无需登录即可访问的路径 glob。语法与 auth.password.public 相同,并与 frontmatter 中的 public: true 以及导航分组上的 "public": true 合并。

在此基础上进行按页面访问控制,需要使用页面 frontmatter 中的 groups。有关令牌格式、重定向流程和分组工作方式,请参阅 JWT Authentication。

完整示例

{
  "$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"]
          }
        ]
      }
    ]
  }
}

下一步是什么?

导航概览

构建文档导航结构

AI 操作菜单

自定义每个页面上的 AI 下拉菜单