Content and navigation
ReferenceWhat a publish contains: the site manifest and its navigation tree, one page artifact per page, and the raw source the assistant reads.
Interface
A publish is files. The host stores them verbatim and the reader renders them. Hosted pages use a fumadocs-compatible package: one site manifest, one prepared page artifact per page, and one raw source per page.
| Artifact | Role |
|---|---|
manifest.json | Site title and navigation tree. One per version. |
<path>.page.json | Prepared page: title, description, TOC, compiled HTML body. |
<path>.md | Raw source. Served at /<path>.md and used for the assistant index. |
Parameters
| Field | Meaning |
|---|---|
| Page path | Content file maps to a route with no extension. Root path is exactly index. |
meta.json pages | Child slugs in sidebar order. "..." means the rest alphabetically. |
| Nav entry | Title plus either path (a page) or children (a folder). |
| N pages | One manifest plus N page artifacts and N source files. |
Behavior
Restricted MDX only: no import/export, no raw JSX expressions, and only the platform component allowlist (callouts, tabs, steps, cards, code). That keeps tenant CSP at script-src 'self'. The body HTML is rendered as is. Agent discovery surfaces are on by default and can be toggled in superadmin:
/llms.txt: index linking to each page.md/llms-full.txt: full corpus markdown/llms-lite.txt: short site card/<path>.md: raw source per page/agents.mdand/AGENTS.md: agent brief/docs.json: page tree plus export URLs/sitemap.xml: machine sitemap
Private ACL pages stay out of public exports.
Errors
- Unsanitized body: scripts, event handlers, and unsafe URLs must be stripped by the build. The host does not rewrite the compiled HTML.
- Heading without id: on-page TOC links will not resolve. Ids must match the TOC anchors.
- Missing pair: a page without both
.page.jsonand.mdwill not render or index cleanly. *(see How-to: How to publish from your pipeline)*
Examples
{
"title": "Guides",
"pages": ["install", "auth", "..."]
}{
"version": "2026-07-16-a1b2c3",
"siteTitle": "Acme API",
"nav": [
{ "title": "Introduction", "path": "index" },
{
"title": "Guides",
"children": [
{ "title": "Install", "path": "guides/install" },
{ "title": "Authentication", "path": "guides/auth" }
]
},
{ "title": "API reference", "path": "reference" }
]
}{
"path": "guides/install",
"title": "Install",
"description": "Install the Acme CLI and run your first command.",
"bodyHtml": "<h2 id=\"requirements\">Requirements</h2><p>...</p>",
"toc": [
{ "title": "Requirements", "url": "#requirements", "depth": 2 }
]
}Source at content/guides/install.md becomes path guides/install and publishes both guides/install.page.json and guides/install.md. Any generator that emits this shape works. *(see Explanation: About grounded answers)*