Documentation Configuration Reference

Everything that makes a documentation set look and behave the way it does lives in one object on the page type, called documentationConfiguration. This page is the complete enumeration of that object — every key, no omissions — plus the page-type fields around it that change how a set behaves, and the one inheritance rule that explains why a value you can see in the CMS may never reach your site.

How to read this page

One row per field.

  • Stored form matters more than it sounds. Three of the four appearance values are stored as the complete CSS class name (color-theme-leed), and one is stored bare (charlie) because the build turns it into a template path. Getting this backwards is the most common configuration mistake in the whole object.
  • Set where is the CMS screen that writes the value. One field is written by the server and should never be typed by hand.
  • Inherits answers whether a page type falls back to the company-level copy. The answer is almost always display only — see the inheritance rule, which is the single most consequential paragraph on this page.
  • Read by names what on the published site actually consumes the value, so you can tell what breaks when it is wrong.

Nothing in this object has a schema default. An absent key stays absent, and the consumer’s own fallback — usually do nothing — applies.

The documentationConfiguration fields

FieldTypeStored formDefaultSet whereInherits?Gated?Read byIf unset
layoutNamestringbare name — alpha, bravo, charlienone; the editor seeds alpha on a new setSettings → Page Types → the set → Documentationdisplay onlynoThe layout partial leed/docs/<name>/base, and the docs-layout-<name> class on <html>Hard failure. Every page in the set renders one line: documentationConfiguration is missing!
colorThemestringfull class name — color-theme-tealnone; the editor seeds color-theme-bluesame paneldisplay onlyStarter, to introduce a name that is not built inA class on <html>; the theme’s --docs-* token layerNo --docs-* layer. Every token falls through to your site’s own values, then to Leed’s defaults
codeThemestringfull class name — code-theme-githubnone; the editor seeds code-theme-githubsame paneldisplay onlyStarter, to introduce a name that is not built inA class on <html>Highlight.js still emits its token classes, with no rules behind them — code renders unstyled
fontstringTailwind font utility — font-noto-sansnone; the editor seeds font-open-sanssame paneldisplay onlyStarter, to introduce a name that is not built inA class on <html>The set inherits whatever font your site sets
menus.leftstringa menu id, not a namenonesame panel, Documentation Menudisplay onlynoThe sidebar, breadcrumbs and previous/next. Also server-side: it is what classifies a menu as a docs menu, what derives the read-only navMenuId, and what folder-path recompute keys offNo sidebar, no breadcrumbs, no pager — and the set’s pages get flat URLs with no folder structure
menus.topstringa menu idnonesame paneldisplay onlynoThe header navigationThe header nav renders empty; the build logs documentationConfiguration.menus.top was not located!
menus.bottomstringa menu idnonesame paneldisplay onlynoThe footer menu columnsThe footer renders only its social row and its copyright line
searchIndexIdstringa search-index idnoneServer-written when you create a search index and the set has nonedisplay onlynoThe search asset hashes on every page of the setSearch asset hashes come back empty. Do not hand-author this
startingPagestringpageid:<uuid>nonesame paneldisplay onlynoThe breadcrumb home crumb, and nothing elseBreadcrumbs render without a home crumb. Nothing else changes
header.button.textstringplain textnonesame paneldisplay onlynoThe header call-to-action labelWith href also absent, no CTA renders at all. With the object present and the text empty, an unlabeled button renders
header.button.hrefstringabsolute URL or pageid:<uuid>nonesame paneldisplay onlynoThe header call-to-action targetAs above
logo.lightstringa URL or site pathnonesame paneldisplay onlynoThe --nav-logo-url custom property used by the docs header and footer logoThe logo box renders empty — it is a background image with no image
logo.darkstringa URL or site pathnonesame paneldisplay onlynoThe same property inside a dark-scheme media queryDark mode keeps the light logo
tabGroupsobjectgroupId → tabKey → entrynoneSettings → General → Tab Groups, and the set’s own panelspecial — see belownoThe tab renderer at build time; separately, the editor’s Tab Group menu reads the company copyTabs still render, with the label the author typed and no icon
openAPI.snippetLanguagesarraysnippet language configsnone; Settings → General seeds cURL, TypeScript, Python and GoSettings → Generaldisplay onlynoThe CMS’s OpenAPI import when it generates code samples. The site build does not read itGeneration falls back to the same four languages
highlighter.extraLanguagesstring arraylanguage namesnoneno CMS control writes here——Nothing at allNothing. See the note below
A complete stored configuration, as committed

This is the documentation half of a real set — the page type’s data file after publishing. The site-wide half of the same configuration lives in the workspace’s own data file and layers underneath it.

{
  "documentationConfiguration": {
    "layoutName": "charlie",
    "colorTheme": "color-theme-leed",
    "codeTheme": "code-theme-leed",
    "font": "font-noto-sans",
    "logo": {
      "light": "/static/images/logo/leed-logo-p-light.svg",
      "dark": "/static/images/logo/leed-logo-p-dark.svg"
    },
    "menus": { "top": "87cf4837", "left": "leeddocs", "bottom": "IU24ZTE1" },
    "header": {
      "button": { "text": "Start free", "href": "https://app.leed.ai/auth/sign-up" }
    },
    "startingPage": "pageid:f9618447-4ab8-48f6-9b37-73f2e957b88c",
    "tabGroups": {
      "operating-system": {
        "linux": { "title": "Linux", "icon": "fa-brands fa-linux", "order": 0 },
        "mac": { "title": "Mac", "icon": "fa-brands fa-apple", "order": 1 },
        "windows": { "title": "Windows", "icon": "fa-brands fa-windows", "order": 2 }
      }
    }
  }
}

Where the values end up on the published site

Four of the fields become nothing but a class list. The build joins font, then docs-layout- plus layoutName, then colorTheme, then codeTheme, and puts the result on the root element of every page in the set:

<html lang="en" class="scroll-smooth js-focus-visible leed-documentation font-noto-sans docs-layout-charlie color-theme-leed code-theme-leed">

That is the whole mechanism, and it is why the stored forms differ: colorTheme, codeTheme and font are emitted verbatim as classes, so they must be class names, while layoutName is prefixed here and used as a template path elsewhere, so it must be bare. It is also the hook your own CSS attaches to — How Styling Works starts from this element.

Everything else is read by a template: the menu ids by the sidebar, header and footer partials, the logo by a custom property, the starting page by the breadcrumb trail. A template author reaches most of it through a small set of helpers rather than the raw object — those are at Documentation Navigation Helpers.

The inheritance rule, stated once

The mechanism is worth one paragraph, because a developer reading the site repository will otherwise conclude the files are incomplete.

Your workspace serializes to one site-wide data file, and the schema that produces that file does not include documentationConfiguration at all — it carries site title, description, locale, logo, favicon, social accounts, date format, paging, deployment details and the plan tier, and nothing else. Every writer of that file parses the record and replaces the file whole, so a block hand-written into it is deleted by the next settings save, batch publish, or entitlement change. The page-type schema does include the configuration, and serializes it to the set’s own data file at src/<slug>/<last-slug-segment>.11tydata.json. Both files are Leed-owned; hand-editing either one is temporary.

Set the configuration on the page type and let the CMS regenerate the file. What the word “default” does and does not mean on the workspace screen is covered at Default Content Configuration.

The one field that behaves differently

tabGroups needs to exist in both places, and this is not a contradiction of the rule above — it is two different consumers reading two different copies.

  • The page type copy is what the build reads. A group defined only here renders correctly on your site and is missing from the editor’s Tab Group menu.
  • The workspace copy is what the editor’s Tab Group menu reads. A group defined only here appears in the toolbar and renders on the site with no titles and no icons.

Define your groups in both, and know that they can drift: the workspace copy propagates down to your documentation and API page types fill-only — a new group is added, a changed title is never overwritten, and a deleted tab is never removed. Tab Groups for Consistent Examples owns the detail.

What the front matter of a published page contains

Each page commits as a block of JSON between --- fences — not YAML — followed by the body. On a hand-authored documentation page the keys that carry real values are title, pageTypeId, pageId, publishedAt, modifiedAt and summary.

Three things developers look for and do not find:

  • No category and no order. Hierarchy comes from the menu tree, and ordering from an item’s position in it. (order is a real key on a tab-group entry, where it sorts what the editor inserts. The two are unrelated.)
  • No path. See below.
  • previewOnly is in the emitted set and defaults to false. It has no CMS control, and if it is ever set the page is excluded from production builds and from indexing.

The complete emitted field list, including the keys a documentation page never populates, is at Front Matter Reference.

Where a page’s URL comes from — and the fields that do not set it

path is not a documentationConfiguration field, not a page-type field, and not an emitted front-matter key. A documentation page’s URL is composed: the page type’s slug, then the slugified name of each docs-menu folder above the page, joined by /, then the page’s own slug. The create endpoint ignores a client-supplied path for a menu-bound documentation page type by design, so the URL can never contradict the menu.

The consequence — that renaming a folder physically moves every page beneath it — is worked through at Folders Set Your URLs.

Page type fields that change how a documentation set behaves

The fields above configure the set’s appearance and navigation. These are on the page type itself and change how the set works.

FieldTypeDefault for a docs typeWhat it changesRead byEditable where
slugstringnone — you choose itThe first segment of every URL in the set, and the directory the set’s files live in. May nest (docs/api/1.2.0) for versioned API setsThe build, for every path in the setSettings → Page Types, until the set is published
typedocumentationapipostsdocumentationWhich machinery applies. documentation and api share the docs menu, the docs layout and this configuration object; posts shares none of it
layoutstringleed-documentation.hbsThe Handlebars layout every page in the set renders through. Documentation and API types are always set to the system docs layoutThe buildNot meaningfully editable for a docs set
navMenuIdstringderivedA read-only projection of menus.left. It exists so other parts of the CMS can ask “which menu owns this set?” without reading the configuration objectThe CMSNot client-settable — change menus.left instead
requiredFieldsobjectsummary: true, everything else offWhich fields must be filled before a page can publishThe publish check, in the CMS and over the APISettings → Page Types
editorFormattingOptionsobjectinert for docs typesWhich editor blocks are available. For documentation and api types the toggles are not rendered and the flags are not enforced — every block is availableOnly posts typesNot shown for a docs set
lockedbooleanfalseContent Locked: no new pages, and existing pages become read-only. Only an Administrator or Content Publisher can set or clear itThe CMSSettings → Page Types
navMenuLockedbooleanfalseNavigation Menu Locked: the set’s pages cannot change URL through its menu — no reordering, no moving, no folder renames, no removal from the nav. Presentation edits stay allowedThe CMS menu editorSettings → Page Types
aliasesstring arraynoneExtra URL prefixes that redirect into the setThe build’s redirect rulesSettings → Page Types
redirectIndexstringnoneWhat the set’s root URL does: first, last, a site-relative path, or an external URLThe build’s redirect rulesSettings → Page Types
noRenderbooleanfalseSuppresses rendering of the set’s pages by the site builder, leaving them for a developer’s own templatesThe buildSettings → Page Types
autolinkbooleantrueWhether the set’s pages participate in automatic keyword linkingThe build’s content passSettings → Page Types
includeInFeedsbooleantrueWhether the set appears in feeds and in the AI-support surfaces built from themThe buildSettings → Page Types
allowRecommendationsbooleannoneWhether the set’s pages are eligible as recommendationsThe recommendation engineSettings → Page Types
sitemapPrioritynumberfalls back to 0.99The <priority> written into the sitemap for the set’s pagesThe sitemapSettings → Page Types
labelSiteMapPrioritynumberfalls back to 0.79The same, for the set’s generated label pagesThe sitemapSettings → Page Types

Every page-type field that is not documentation-specific — and the ones above in their non-documentation meanings — is enumerated at Page Type Reference.

Two of the appearance fields are plan-gated on introducing a name that is not built in, which is a narrower rule than it first appears: echoing the stored value, clearing it, or swapping one built-in theme for another passes on every plan. Themes, Fonts and Code Themes has the exact behavior, and the CSS that makes a custom name mean anything.

ESC