Overview

This page documents every field available in docs.json, organized by section. Each entry includes the field path, type, default value, whether it is required, and a description.

For a guided walkthrough of how to use these fields, see Global Settings. This page is designed as a lookup reference.


Top-Level Fields

These fields sit at the root of your docs.json object.

FieldTypeDefaultRequiredDescription
$schemastring--NoJSON Schema URL for editor autocompletion
namestring--YesProject name, shown in browser tab and meta tags
descriptionstring--NoProject description for default meta tags
themestring"mint"NoBuilt-in theme name
logostring | object--NoSite logo (see Logo)
faviconstring | object--NoBrowser tab icon (see Favicon)

Accepted theme values

mint | maple | palm | willow | linden | almond | aspen | holy | atlas | nova | cipher


The logo field accepts either a string path or an object that can render an image, text, or both.

json
{ "logo": "/images/logo.svg" }

Renders a single image in both modes. Site name is used as the alt attribute.

FieldTypeRequiredDescription
logo (string)string--Single image path used in both modes. Equivalent to { light, dark } with the same value.
logo.lightstringNoImage shown in light mode.
logo.darkstringNoImage shown in dark mode. Falls back to light if omitted.
logo.textboolean | stringNotrue renders site name next to the image. A string overrides the visible label and the alt attribute. Defaults to no text.
logo.hrefstringNoClick target for the logo. Defaults to the site root (or basePath when subfolder hosting is enabled).

With text enabled, the resolved string also becomes the image's alt attribute — so a string override (text: "Acme Docs") doubles as accessible labeling.


Favicon

The favicon field accepts a string path or an object with light/dark variants.

FieldTypeRequiredDescription
favicon (string)string--Single favicon path
favicon.lightstringYes (if object)Favicon for light mode
favicon.darkstringYes (if object)Favicon for dark mode

Colors

FieldTypeDefaultRequiredValidationDescription
colors.primarystring--Yes/^#[0-9a-fA-F]{6}$/Primary brand color
colors.lightstringAutoNo6-digit hexLighter variant for hover states
colors.darkstringAutoNo6-digit hexDarker variant for pressed states
colors.background.lightstringTheme defaultNoAny color stringLight mode page background
colors.background.darkstringTheme defaultNoAny color stringDark mode page background

Appearance

FieldTypeDefaultRequiredValidationDescription
appearance.defaultstring"system"Nosystem | light | darkInitial appearance for first-time visitors
appearance.strictbooleanfalseNo--Hide the theme toggle and lock to default
appearance.animations.enabledbooleantrueNo--Master switch for entry animations on rendered pages.
appearance.animations.stylestring"fadeUp"Nonone | fade | fadeUp | slideUp | scaleEntry-animation style applied to direct children of the page content.
appearance.animations.staggernumber40No0200 (ms)Delay between each animated section. Set to 0 for a single uniform fade.
json
{ "appearance": { "default": "system", "animations": { "enabled": true, "style": "fadeUp", "stagger": 40 } }}

Animations are skipped automatically when the visitor has prefers-reduced-motion: reduce set, regardless of the enabled value. Set style: "none" (or enabled: false) to opt every visitor out.

Related: Dark Mode


Fonts

FieldTypeDefaultRequiredDescription
fonts.familystringTheme defaultNoGlobal font family (applies to both heading and body)
fonts.weightstring | numberTheme defaultNoGlobal font weight
fonts.sourcestring--NoGlobal font CSS URL
fonts.formatstring--NoGlobal font format hint (e.g. woff2)
fonts.heading.familystringTheme defaultNoHeading font family
fonts.heading.weightstring | numberTheme defaultNoHeading font weight
fonts.heading.sourcestring--NoHeading font CSS URL
fonts.heading.formatstring--NoHeading font format hint
fonts.body.familystringTheme defaultNoBody font family
fonts.body.weightstring | numberTheme defaultNoBody font weight
fonts.body.sourcestring--NoBody font CSS URL
fonts.body.formatstring--NoBody font format hint

Styling

FieldTypeDefaultRequiredValidationDescription
styling.eyebrowsstring"section"Nosection | breadcrumbsText above the page title
styling.latexbooleanfalseNo--Enable LaTeX/KaTeX math rendering
styling.codeblocksstring | object"system"Nosystem | dark | objectCode block color scheme

styling.codeblocks (object form)

FieldTypeDescription
codeblocks.themestring | { light: string, dark: string }Syntax highlighting theme name(s)
codeblocks.languages.customstring[]Additional language grammars to load

Background

FieldTypeDefaultRequiredValidationDescription
background.decorationstring--Nogradient | grid | windowsBackground decoration style
background.color.lightstringTheme defaultNo--Light mode background color
background.color.darkstringTheme defaultNo--Dark mode background color
background.imagestring | object--No--Background image URL or { light, dark }

Icons

FieldTypeDefaultRequiredValidationDescription
icons.librarystring"lucide"Nofontawesome | lucideIcon library used across the site

The navigation object defines the entire sidebar and tab structure. See Navigation Configuration for a full guide.

Tab

FieldTypeRequiredDescription
tabstringYesTab label
iconstringNoIcon next to the label
landingstringNoPage slug a tab click should navigate to. Overrides the default (first leaf page) and the per-visitor "last visited" memory.
groupsGroup[]YesNavigation groups within this tab

Tab clicks resolve to a real URL in this order: landing → the visitor's last-visited page in that tab (stored client-side) → the first leaf page found by walking groups. Set landing when you want a curated entry page (an overview, a hero) instead of dropping readers into the first sub-page.

Group

FieldTypeRequiredDescription
groupstringYesGroup heading
iconstringNoIcon next to the heading
pages(string | Group)[]YesPage paths or nested groups

Anchor

FieldTypeRequiredDescription
namestringNoAnchor label
anchorstringNoAlternative to name
urlstringNoLink URL
hrefstringNoAlternative to url
iconstringNoIcon name
colorstringNoAccent color

Version

FieldTypeDefaultRequiredDescription
namestring--YesVersion label (e.g. "v2.0")
urlstring--YesURL path prefix
defaultbooleanfalseNoWhether this is the default version
hiddenbooleanfalseNoHide from dropdown (still accessible by URL)
lifecyclestring--Noactive | maintenance | deprecated | eol
sunsetDatestring--NoISO date for end of life
migrationUrlstring--NoURL to migration guide
deprecationMessagestring--NoCustom deprecation banner message
branchstring--NoGit branch for this version

Language (HolyDocs format)

FieldTypeRequiredDescription
codestringYesLanguage code (e.g. "en")
namestringYesDisplay name (e.g. "English")
urlstringYesURL path prefix

Primary header configuration for top-level links and the main CTA.

FieldTypeRequiredDescription
navbar.linksNavbarLink[]NoArray of top bar links
navbar.primaryobjectNoPrimary action button
navbar.primary.typestringYes (if set)button | github
navbar.primary.labelstringYes (if set)Button text
navbar.primary.hrefstringYes (if set)Button destination
FieldTypeRequiredDescription
labelstringYesLink text
hrefstringYesLink destination
iconstringNoIcon name

FieldTypeRequiredDescription
footer.socialsRecord<string, string>NoPlatform name to URL mapping
footer.linksFooterLinkGroup[]NoGrouped footer links
footer.textstringNoShort footer copy such as copyright or legal text
footer.htmlstringNoRaw trusted HTML for badges, status links, or compliance snippets
footer.poweredBybooleanNoShow the HolyDocs attribution. Defaults to true when footer is set

FooterLinkGroup

FieldTypeRequiredDescription
headerstringNoGroup heading
items{ label: string, href: string }[]YesLinks in this group

Use footer.socials directly for social icons and footer.links for grouped footer columns. Legacy aliases are documented in migration guides only.

footer.html is rendered as raw HTML. Only include markup you control.


FieldTypeDefaultRequiredDescription
banner.contentstring--Yes (if banner set)Banner text (supports inline Markdown links)
banner.dismissiblebooleantrueNoAllow readers to dismiss the banner

FieldTypeDefaultRequiredDescription
search.promptstring--NoPrompt text inside the search modal
search.hotkeystring"k"NoKeyboard shortcut key (with Cmd/Ctrl)
search.placeholderstring"Search documentation..."NoSearch input placeholder text

SEO

FieldTypeDefaultRequiredValidationDescription
seo.indexingstring"navigable"Nonavigable | allWhich pages get search engine indexing
seo.noindexbooleanfalseNo--Add noindex to all pages
seo.ogImagestringAuto-generatedNo--Default Open Graph image path
seo.twitterHandlestring--No--Twitter handle for twitter:site tag
seo.metatagsRecord<string, string>{}No--Key-value pairs added as <meta> tags

"navigable" only indexes pages included in your navigation. "all" indexes every MDX file, including orphaned pages not in the sidebar.


API

OpenAPI source formats

json
"openapi": "https://api.example.com/openapi.json"

Related: OpenAPI | API Playground | Code Samples


Assistant

FieldTypeDefaultRequiredValidationDescription
assistant.enabledbooleantrueNo--Enable the AI chat widget
assistant.namestring"AI Assistant"No--Name in the chat header
assistant.greetingstring--No--Welcome message
assistant.modelstring"anthropic/claude-sonnet-4"NoSee models belowLLM model
assistant.systemPromptstring--NoMax 2000 charsCustom system prompt
assistant.suggestedQuestionsstring[]--NoMax 4 itemsStarter questions
assistant.positionstring"bottom-right"Nobottom-right | bottom-leftWidget position
assistant.theme.accentColorstringPrimary colorNo--Chat button/header color
assistant.theme.iconstring"sparkle"Nosparkle | chat | bot | searchTrigger icon
assistant.contactSupport.enabledbooleanfalseNo--Show support fallback
assistant.contactSupport.emailstring--No--Support email address
assistant.contactSupport.labelstring"Contact support"No--Support link text
assistant.deflection.enabledbooleanfalseNo--Enable ticket deflection
assistant.deflection.supportEmailstring--NoValid emailDeflection email
assistant.deflection.showHelpButtonbooleanfalseNo--Show help button

Validated model IDs

ModelProvider
anthropic/claude-sonnet-4Anthropic
anthropic/claude-4-opusAnthropic
openai/gpt-4oOpenAI
openai/gpt-4o-miniOpenAI
x-ai/grok-4.1-fastxAI
google/gemini-2.5-flashGoogle

Other model strings are accepted but not schema-validated.

Related: AI Assistant


Auth

FieldTypeDefaultRequiredValidationDescription
auth.enabledbooleanfalseNo--Enable site authentication
auth.providerstring"better-auth"Nobetter-auth | customAuth provider
auth.loginUrlstring--No--Redirect URL for unauthenticated users
auth.publicPathsstring[]--No--Paths accessible without auth
auth.jwksUrlstring--No--JWKS endpoint for JWT verification
auth.claimsMapping.groupsstring--No--JWT claim path for group membership
auth.claimsMapping.emailstring--No--JWT claim path for email
auth.groupsRecord<string, Group>--No--Named access groups
auth.groups.<name>.labelstring--Yes (if group)--Group display name
auth.groups.<name>.pagesstring[]--Yes (if group)--Pages accessible to this group

Auth-enabled sites skip all page caching (including AI search caching) to prevent content leakage between users. This increases latency compared to public sites.

Related: SSO | RBAC


Redirects

Each redirect is an object in the redirects array.

FieldTypeDefaultRequiredValidationDescription
sourcestring--Yes--Path to redirect from (supports :param and *)
destinationstring--Yes--Path or URL to redirect to
permanentbooleantrueNo--true = 301, false = 302
json
{ "redirects": [ { "source": "/old", "destination": "/new", "permanent": true }, { "source": "/api/v1/:path*", "destination": "/api/v2/:path*", "permanent": false } ]}

Integrations

The integrations field is a Record<string, Record<string, string>>. Each key is a provider name, and the value is an object of provider-specific configuration.

Related: Analytics


Addons

FieldTypeDefaultRequiredValidationDescription
addons.feedback.thumbsRatingbooleantrueNo--Page-level thumbs rating
addons.feedback.editSuggestionsbooleanfalseNo--Suggest-edit button
addons.feedback.raiseIssuesbooleanfalseNo--Report-issue button
addons.ciChecks.brokenLinksstring"off"Nooff | warning | errorCI broken link checking
addons.ciChecks.grammarLinterstring"off"Nooff | warning | errorCI grammar linting
addons.previews.enabledbooleantrueNo--Deploy previews for PRs

Variables

Each entry in the variables array defines a reusable variable.

FieldTypeDefaultRequiredValidationDescription
namestring--Yes/^[a-zA-Z_][a-zA-Z0-9_.]*$/Variable identifier
typestring"string"Nostring | select | secret | computedVariable type
labelstring--No--Human-readable label
descriptionstring--No--Tooltip text
defaultValuestring--No--Default value
optionsstring[]--No--Options for select type
expressionstring--No--Expression for computed type

Usage in MDX: {{variable.name}}


Component Theme

Override default component styling across all pages.

FieldTypeDefaultRequiredValidationDescription
componentTheme.defaultVariantstring"default"Nodefault | outlined | filled | ghostDefault component variant
componentTheme.radiusstring--NoCSS valueComponent border radius
componentTheme.paddingstring--NoCSS valueComponent padding
componentTheme.borderstring--NoCSS valueComponent border style

Thumbnails

Configure auto-generated OG image thumbnails.

FieldTypeDefaultRequiredDescription
thumbnails.appearancestring--Nolight | dark
thumbnails.backgroundstring--NoBackground color or gradient
thumbnails.fonts.familystring--NoFont family for thumbnail text

Contextual

Add context-aware action buttons that appear alongside page content.

FieldTypeRequiredDescription
contextual.options(string | ContextualOption)[]Yes (if set)Action options

ContextualOption (object form)

FieldTypeRequiredDescription
titlestringYesOption title
descriptionstringYesOption description
iconstringNoIcon name
hrefstring | objectYesDestination URL or { base, query } object

Metadata

FieldTypeDefaultRequiredDescription
metadata.timestampboolean--NoAdd last-modified timestamps to pages

Errors

Customize error page behavior.

FieldTypeDefaultRequiredDescription
errors.404.redirectboolean--NoAuto-redirect 404s to closest match
errors.404.titlestring"Page not found"NoCustom 404 title
errors.404.descriptionstring--NoCustom 404 description

Hosting

FieldTypeDefaultRequiredValidationDescription
hosting.basePathstring--No/^\/[a-zA-Z0-9_/-]*$/Subfolder path prefix

Related: Subfolder Hosting


i18n

FieldTypeDefaultRequiredValidationDescription
i18n.defaultLanguagestring"en"No2-10 charsPrimary language code
i18n.languagesstring[][]No2-10 chars eachTarget translation languages
i18n.translationStylestring"formal"Noformal | informalTranslation tone
i18n.translateCodeCommentsbooleanfalseNo--Translate code comments
i18n.blockDeployOnTranslationbooleanfalseNo--Block deploy until translations complete

Related: i18n


FieldTypeDefaultRequiredDescription
cookieConsent.enabledbooleanfalseNoShow consent banner
cookieConsent.positionstring"bottom"Nobottom | top
cookieConsent.themestring"light"Nolight | dark
cookieConsent.privacyPolicyUrlstring--NoValid URL
cookieConsent.categories.essentialbooleantrueNoAlways enabled
cookieConsent.categories.analyticsbooleanfalseNoAnalytics opt-in default
cookieConsent.categories.functionalbooleanfalseNoFunctional opt-in default
cookieConsent.categories.marketingbooleanfalseNoMarketing opt-in default

Web3

FieldTypeRequiredDescription
web3.walletConnect.projectIdstringYes (if set)WalletConnect project ID
web3.walletConnect.chainsnumber[]Yes (if set)Supported chain IDs
web3.walletConnect.defaultChainnumberNoDefault chain ID
web3.rpcRecord<string, string>NoChain ID to RPC URL mapping
web3.explorerRecord<string, string>NoChain ID to block explorer URL
web3.contractsRecord<string, Contract>NoNamed contract definitions
web3.contracts.<name>.addressRecord<string, string>YesChain ID to contract address
web3.contracts.<name>.abistringYesABI file path or URL

Minimal Required Configuration

The absolute minimum docs.json requires three things: a name, a primary color, and at least one navigation group.

json
{ "name": "My Docs", "colors": { "primary": "#007AFF" }, "navigation": { "groups": [ { "group": "Getting Started", "pages": ["introduction"] } ] }}

Everything else has sensible defaults. Build from this baseline and add configuration as your documentation grows.


Validation

HolyDocs validates your docs.json at three points:

1

CLI (local)

Run holydocs check to validate your config, check for broken page references, and catch common mistakes before pushing. See CLI: check.

2

Build (CI)

The build pipeline validates docs.json before processing any content. Invalid configs fail the build with descriptive error messages.

3

Dashboard (GUI)

The Settings page in the dashboard validates fields in real-time as you edit them, with inline error messages for invalid values.


Global Settings

Guided walkthrough of every docs.json section with full examples.

Learn More
Navigation Configuration

Sidebar, tabs, groups, anchors, versions, and languages.

Learn More
Themes

Visual comparison of all 11 built-in themes.

Learn More
CLI: check

Validate your docs.json locally before deploying.

Learn More
Ask a question... ⌘I