--- name: bx-sites-configuration metadata: version: "1.0" description: Full bxsites.yaml/bxsites.json key reference for a bx-sites (ortus-boxlang/bx-sites) project - baseURL, robots.txt, nav, redirects, markdown options, repo/social/footer, lastUpdated, analytics, ogImage/generateOgImages, extraCss/extraJs, the assets/image pipeline, pageActions, and the plugins/i18n/blog/variables keys. Use this whenever a user asks what a bxsites.yaml key does, how to set the site's base URL/sub-path, how to customize the nav, or wants to tune the responsive-image/asset-bundling pipeline. For themes, search providers, and deployment config, use bx-sites-themes/bx-sites-search/bx-sites-deployment instead. --- # BxSites Configuration Reference One site config at the project root: `bxsites.yaml` (or `.yml`, default/ preferred) or `bxsites.json` (fully supported). If more than one is present, `bxsites.yaml` wins, then `bxsites.yml`, then `bxsites.json`. Only `name` is required - everything else defaults as shown. A partial `theme` object merges one level deep (`{theme: {name: material}}` keeps the default empty `options`). ```yaml title="bxsites.yaml - every key and its default" name: "My Docs" description: "" baseURL: "/" theme: name: bootstrap options: {} logo: "" favicon: "" search: true searchProvider: provider: local algolia: { appId: "", apiKey: "", indexName: "", insights: false } nav: [] markdown: enableAdmonition: true repo: url: "" editUri: "" social: [] footer: false lastUpdated: false mermaid: false math: false analytics: provider: "" id: "" ogImage: "" generateOgImages: false extraCss: [] extraJs: [] assets: fingerprint: true bundle: true images: { enabled: true, widths: [400, 800, 1200, 1600], formats: [original, webp] } plugins: [] i18n: defaultLocale: { code: en, label: English } locales: [] blog: postsPerPage: 10 feed: true variables: {} ``` ## `name` / `description` `name` (required) - site name, shown in header/brand mark and page titles. `description` - fallback ``/`og:description` for any page without its own `description` frontmatter (see `bx-sites-getting-started` for page frontmatter). ## `baseURL` Controls prefixing for every internal link/asset/nav entry, and doubles as the canonical URL for `sitemap.xml`/`robots.txt`/`llms.txt`/canonical tags. - **Blank or `"/"`** (default) - root-relative links (`/page/`); no `sitemap.xml`, no `Sitemap:` line, no canonical tags (no domain to build them from). - **A bare path** (`"my-docs"` or `"/my-docs/"`) - sub-path served (`/my-docs/page/`); still no sitemap/canonical (no absolute domain). - **A full URL** (`"https://docs.example.com/"`) - the path portion is used the same as a bare path, **and** `sitemap.xml`/`robots.txt`'s `Sitemap:` line/every page's `` are generated. A version/locale tree points its canonical at its own URL, not the main site's. `llms.txt` is always written regardless (absolute URLs when `baseURL` provides them, `basePath`-relative otherwise). ## `robots.txt` `robots: true` (default) writes `Allow: /` for every crawler plus a `Sitemap:` line (when `baseURL` is a full URL). `robots: false` writes `Disallow: /` and no `Sitemap:` line - a crawler opt-out only, **not access control** (the site is still fully reachable by URL - see `bx-sites-deployment` for real access restriction). Drop a hand-authored `docs/robots.txt` to bypass the generated one entirely (copied byte-for-byte, `robots` key ignored once this file exists). ## `theme` - `theme.name` - `bootstrap`/`material`/`tailwind`/a gallery theme name, or a custom theme's own name - see `bx-sites-themes` - `theme.logo`/`theme.favicon` - path (resolved against `docs/assets/`, prefixed with `baseURL`) or absolute URL - `theme.options.colorMode` - `"auto"` (default, follows OS)/`"light"`/`"dark"` first-visit default; a visitor's own toggle choice always wins after - `theme.options.navCollapsible` - `false` (default): every nav section always expanded. `true`: sections get a collapse toggle; the section containing the current page always starts open. - `theme.options.navExpandAll` - only with `navCollapsible: true`. `true` (default): every section starts open. `false`: every section starts collapsed except the current page's. - `theme.options.tocPosition` - `"top"` (default, inline at article top) or `"sticky"` (pinned right-hand column on wide viewports; a collapsible top-pinned bar below that width) - `theme.options.pageMetaPosition` - `"bottom"` (default, footer note) or `"top"` for the edit-page/download-markdown/last-updated row - `theme.options.pageActionsPosition` - `"top"` (default) or `"bottom"` for the [`pageActions`](#pageactions) dropdown ## `search` / `searchProvider` `search: true`/`false` is the master switch regardless of provider. `searchProvider.provider`: `"local"` (default, MiniSearch + static index), `"algolia"` (needs `algolia.appId`/`apiKey`/`indexName`), `"pagefind"` (`pagefind.bin`/`options`, both optional), or any other string for a fully custom provider wired via a theme override. Full comparison and setup in `bx-sites-search`. ## `nav` Empty array (default) = infer from `docs/`'s folder/file structure (honoring page `order`/`hidden` frontmatter). A non-empty array replaces inference entirely - array order becomes nav order; a page not referenced is still built, just unlinked (same as `hidden: true`). Each entry is either: - a bare `docs/`-relative path string (`"guides/setup.md"`), title from that page's own frontmatter/filename - an object `{ title, path, icon, children }` - `path`/`icon`/`children` all optional; a `title`-only entry with no `path` is an unlinked group heading; explicit `title`/`icon` override the page's own nav label/icon (the page's real `
`/`` | Inline code wrapper |
| `fencedCodeLanguageClassPrefix` | `"language-"` | Class prefix highlighter/Mermaid key off |
| `tableOptions.columnSpans` | `true` | Honors `colspan` merged cells |
| `tableOptions.appendMissingColumns` | `true` | Pads a short row |
| `tableOptions.discardExtraColumns` | `true` | Drops a long row's extra cells |
| `tableOptions.className` | `"table"` | CSS class per `