Eleventy Baseline Navigator

Start building your site and skip the setup work.

 Go back

Navigator

Page Context
{ site:
   { title: 'Eleventy Baseline',
     tagline: 'Start building your site and skip the setup work.',
     description: '',
     url: 'https://www.eleventy-baseline.dev/',
     noindex: false },
  page:
   { part: undefined,
     inputPath: './src/navigator-core.html',
     fileSlug: 'navigator-core',
     filePathStem: '/navigator-core',
     outputFileExtension: 'html',
     templateSyntax: 'njk',
     date: 2026-09-12T21:27:59.338Z,
     url: '/navigator-core.html',
     outputPath: './dist/navigator-core.html',
     lang: 'en',
     locale: 'en',
     translationKey: undefined,
     isDefaultLang: true,
     sitemap: { ignore: true, changefreq: '', priority: -1 } },
  entry:
   { title: 'Navigator Core',
     description: 'Eleventy + Baseline internals',
     excerpt: undefined,
     slug: 'navigator-core',
     section: undefined,
     type: undefined,
     head:
      { style:
         [ { content:
              '._navigator__wrapper:not(#\\#):not(#\\#) {box-sizing: content-box;max-width: 60rem;padding-inline: clamp(1rem, 0.2083rem + 3.5185vw, 3.375rem);margin-inline: auto;}._navigator__wrapper:not(#\\#):not(#\\#) > * + * {margin-block-start: 1.25rem;}' } ] },
     breadcrumbs: [] },
  query: { isHome: false },
  meta:
   { title: 'Navigator Core | Eleventy Baseline',
     description: 'Eleventy + Baseline internals',
     canonical: undefined,
     robots: 'noindex, nofollow',
     noindex: true },
  render: { generator: 'Eleventy v3.1.6' },
  head:
   { link:
      [ { rel: 'stylesheet', href: '/assets/css/index.css' },
        { rel: 'me', href: 'https://mastodon.social/@crisverstraeten' },
        { rel: 'icon', type: 'image/png', href: '/favicon-96x96.png', sizes: '96x96' },
        { rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
        { rel: 'shortcut icon', href: '/favicon.ico' },
        { rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
        { rel: 'manifest', href: '/site.webmanifest' } ],
     script:
      [ { content:
           "var t=localStorage.getItem('theme');if(t==='light'||t==='dark')document.documentElement.dataset.theme=t;" },
        { src: '/assets/js/index.js', defer: true },
        { src: '/assets/js/vendor/index.js', defer: true } ],
     style:
      [ { content:
           '._navigator__wrapper:not(#\\#):not(#\\#) {box-sizing: content-box;max-width: 60rem;padding-inline: clamp(1rem, 0.2083rem + 3.5185vw, 3.375rem);margin-inline: auto;}._navigator__wrapper:not(#\\#):not(#\\#) > * + * {margin-block-start: 1.25rem;}' } ],
     meta:
      [ { name: 'color-scheme', content: 'light dark' },
        { name: 'theme-color', content: '#ffffff' } ] } }
env
Environment {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  opts:
   { dev: true,
     autoescape: true,
     throwOnUndefined: false,
     trimBlocks: false,
     lstripBlocks: false },
  loaders:
   [ FileSystemLoader {
       _events:
        [Object: null prototype] { update: [Function (anonymous)], load: [Function (anonymous)] },
       _eventsCount: 2,
       _maxListeners: undefined,
       pathsToNames: {},
       noCache: false,
       searchPaths: [ 'src/_includes/', '/opt/build/repo' ],
       cache: {},
       [Symbol(shapeMode)]: false,
       [Symbol(kCapture)]: false } ],
  globals:
   { range: [Function: range],
     cycler: [Function: cycler],
     joiner: [Function: joiner],
     date: { toUTCISO: [Function: toUTCISO] },
     _runtime: [Function: fn],
     _ctx: [Function: fn] },
  filters:
   { abs: [Function: abs],
     batch: [Function: batch],
     capitalize: [Function: capitalize],
     center: [Function: center],
     default: [Function: default_],
     dictsort: [Function: dictsort],
     dump: [Function: dump],
     escape: [Function: escape],
     safe: [Function: safe],
     first: [Function: first],
     forceescape: [Function: forceescape],
     groupby: [Function: groupby],
     indent: [Function: indent],
     join: [Function: join],
     last: [Function: last],
     length: [Function: lengthFilter],
     list: [Function: list],
     lower: [Function: lower],
     nl2br: [Function: nl2br],
     random: [Function: random],
     reject: [Function: filter],
     rejectattr: [Function: rejectattr],
     select: [Function: filter],
     selectattr: [Function: selectattr],
     replace: [Function: replace],
     reverse: [Function: reverse],
     round: [Function: round],
     slice: [Function: slice],
     sum: [Function: sum],
     sort: [Function: macro],
     string: [Function: string],
     striptags: [Function: striptags],
     title: [Function: title],
     trim: [Function: trim],
     truncate: [Function: truncate],
     upper: [Function: upper],
     urlencode: [Function: urlencode],
     urlize: [Function: urlize],
     wordcount: [Function: wordcount],
     float: [Function: float],
     int: [Function: macro],
     d: [Function: default_],
     e: [Function: escape],
     inputPathToUrl: [Function (anonymous)],
     slug: [Function (anonymous)],
     slugify: [Function (anonymous)],
     url: [Function (anonymous)],
     log: [Function (anonymous)],
     getCollectionItemIndex: [Function (anonymous)],
     getCollectionItem: [Function (anonymous)],
     getPreviousCollectionItem: [Function (anonymous)],
     getNextCollectionItem: [Function (anonymous)],
     siblings: [Function (anonymous)],
     unique: [Function (anonymous)],
     addPathPrefixToFullUrl: [Function (anonymous)],
     htmlBaseUrl: [Function (anonymous)],
     locale_url: [Function (anonymous)],
     locale_links: [Function (anonymous)],
     locale_page: [Function (anonymous)],
     translationsFor: [Function (anonymous)],
     translationIn: [Function (anonymous)],
     defaultTranslation: [Function (anonymous)],
     _inspect: [Function (anonymous)],
     _json: [Function (anonymous)],
     _keys: [Function (anonymous)],
     markdownify: [Function (anonymous)],
     relatedPosts: [Function (anonymous)],
     isString: [Function (anonymous)],
     t: [Function (anonymous)],
     renderTransforms: [Function (anonymous)],
     transformWithHtmlBase: [Function (anonymous)],
     inlineESbuild: [Function (anonymous)],
     inlinePostCSS: [Function (anonymous)] },
  tests:
   { callable: [Function: callable],
     defined: [Function: defined],
     divisibleby: [Function: divisibleby],
     escaped: [Function: escaped],
     equalto: [Function: equalto],
     eq: [Function: equalto],
     sameas: [Function: equalto],
     even: [Function: even],
     falsy: [Function: falsy],
     ge: [Function: ge],
     greaterthan: [Function: greaterthan],
     gt: [Function: greaterthan],
     le: [Function: le],
     lessthan: [Function: lessthan],
     lt: [Function: lessthan],
     lower: [Function: lower],
     ne: [Function: ne],
     null: [Function: nullTest],
     number: [Function: number],
     odd: [Function: odd],
     string: [Function: string],
     truthy: [Function: truthy],
     undefined: [Function: undefinedTest],
     upper: [Function: upper],
     iterable: [Function: iterable],
     mapping: [Function: mapping] },
  asyncFilters:
   [ 'renderTransforms', 'transformWithHtmlBase', 'inlineESbuild', 'inlinePostCSS' ],
  extensions:
   { setAsync:
      PairedShortcodeFunction {
        tags: [ 'setAsync' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'setAsync' },
     getBundle:
      ShortcodeFunction {
        tags: [ 'getBundle' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'getBundle' },
     getBundleFileUrl:
      ShortcodeFunction {
        tags: [ 'getBundleFileUrl' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'getBundleFileUrl' },
     image:
      ShortcodeFunction {
        tags: [ 'image' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'image' },
     alertBlock:
      PairedShortcodeFunction {
        tags: [ 'alertBlock' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'alertBlock' },
     stepsBlock:
      PairedShortcodeFunction {
        tags: [ 'stepsBlock' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'stepsBlock' },
     tableBlock:
      PairedShortcodeFunction {
        tags: [ 'tableBlock' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'tableBlock' },
     deckBlock:
      PairedShortcodeFunction {
        tags: [ 'deckBlock' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'deckBlock' },
     detailsBlock:
      PairedShortcodeFunction {
        tags: [ 'detailsBlock' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'detailsBlock' },
     highlight:
      PairedShortcodeFunction {
        tags: [ 'highlight' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'highlight' } },
  extensionsList:
   [ PairedShortcodeFunction {
       tags: [ 'setAsync' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'setAsync' },
     ShortcodeFunction {
       tags: [ 'getBundle' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'getBundle' },
     ShortcodeFunction {
       tags: [ 'getBundleFileUrl' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'getBundleFileUrl' },
     ShortcodeFunction {
       tags: [ 'image' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'image' },
     PairedShortcodeFunction {
       tags: [ 'alertBlock' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'alertBlock' },
     PairedShortcodeFunction {
       tags: [ 'stepsBlock' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'stepsBlock' },
     PairedShortcodeFunction {
       tags: [ 'tableBlock' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'tableBlock' },
     PairedShortcodeFunction {
       tags: [ 'deckBlock' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'deckBlock' },
     PairedShortcodeFunction {
       tags: [ 'detailsBlock' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'detailsBlock' },
     PairedShortcodeFunction {
       tags: [ 'highlight' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'highlight' } ],
  [Symbol(shapeMode)]: false,
  [Symbol(kCapture)]: false }
ctx
{ helpers: { buildCommit: [Function: buildCommit] },
  navigation:
   { en:
      { main:
         [ { label: 'Documentation', url: '/docs/' },
           { label: 'Release notes', url: '/release-notes/' },
           { label: 'About', url: '/about/' } ],
        footer:
         [ { label: 'Project', items: [Array] },
           { label: 'System', items: [Array] },
           { label: 'Elsewhere', items: [Array] } ] },
     nl:
      { main:
         [ { label: 'Documentatie', url: '/docs/' },
           { label: 'Release notes', url: '/release-notes/' },
           { label: 'Over', url: '/nl/about/' } ],
        footer:
         [ { label: 'Project', items: [Array] },
           { label: 'Systeem', items: [Array] },
           { label: 'Elders', items: [Array] } ] },
     fr:
      { main:
         [ { label: 'Documentation', url: '/docs/' },
           { label: 'Release notes', url: '/release-notes/' },
           { label: 'À propos', url: '/fr/about/' } ],
        footer:
         [ { label: 'Projet', items: [Array] },
           { label: 'Système', items: [Array] },
           { label: 'Ailleurs', items: [Array] } ] } },
  schema:
   { organization:
      { '@type': 'Organization',
        name: 'a pleasant view',
        legalName: null,
        url: 'https://www.apleasantview.com/',
        email: 'hello@apleasantview.com',
        telephone: null,
        address: null,
        geo: null,
        areaServed: null,
        taxID: '60532955',
        vatID: null,
        foundingDate: null,
        logo: { url: 'https://www.eleventy-baseline.dev/logo.png', width: 400, height: 400 },
        sameAs:
         [ 'https://mastodon.social/@crisverstraeten',
           'https://github.com/apleasantview',
           'https://www.linkedin.com/company/apleasantview' ],
        knowsAbout:
         [ 'Eleventy',
           'Static site generators',
           'Plugin architecture',
           'Web standards',
           'Open source software' ],
        slogan: null },
     person:
      { '@type': 'Person',
        name: 'Cristovao Verstraeten',
        givenName: 'Cristovao',
        familyName: 'Verstraeten',
        url: 'https://www.apleasantview.com/about/',
        email: null,
        image: null,
        jobTitle: 'Independent software developer',
        sameAs:
         [ 'https://mastodon.social/@crisverstraeten',
           'https://github.com/cristovaov',
           'https://www.linkedin.com/in/cristovaoverstraeten/' ] } },
  settings:
   { title: 'Eleventy Baseline',
     tagline: 'Start building your site and skip the setup work.',
     url: 'https://www.eleventy-baseline.dev/',
     noindex: false,
     defaultLanguage: 'en',
     languages:
      { en:
         { contentDir: 'content/en/',
           locale: 'en',
           languageName: 'English',
           title: 'Eleventy Baseline',
           tagline: 'Start building your site and skip the setup work.',
           homeLabel: 'Home' },
        nl:
         { contentDir: 'content/nl/',
           locale: 'nl',
           languageName: 'Nederlands',
           title: 'Eleventy Baseline',
           tagline: 'Start met het bouwen aan je site en sla de setup over.',
           homeLabel: 'Home' },
        fr:
         { contentDir: 'content/fr/',
           locale: 'fr',
           languageName: 'Français',
           title: 'Eleventy Baseline',
           tagline: 'Commencez à construire votre site sans vous occuper de la configuration.',
           homeLabel: 'Accueil' } },
     head:
      { link:
         [ { rel: 'stylesheet', href: '/assets/css/index.css' },
           { rel: 'me', href: 'https://mastodon.social/@crisverstraeten' },
           { rel: 'icon', type: 'image/png', href: '/favicon-96x96.png', sizes: '96x96' },
           { rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
           { rel: 'shortcut icon', href: '/favicon.ico' },
           { rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
           { rel: 'manifest', href: '/site.webmanifest' } ],
        script:
         [ { content:
              "var t=localStorage.getItem('theme');if(t==='light'||t==='dark')document.documentElement.dataset.theme=t;" },
           { src: '/assets/js/index.js', defer: true },
           { src: '/assets/js/vendor/index.js', defer: true } ],
        meta:
         [ { name: 'color-scheme', content: 'light dark' },
           { name: 'theme-color', content: '#ffffff' } ] },
     seo:
      { preserveQueryParams: false,
        ogImage:
         { url: 'https://www.eleventy-baseline.dev/og.jpg',
           width: 1200,
           height: 630,
           alt: 'Eleventy Baseline' },
        openGraph: { type: 'website' },
        twitter: { card: 'summary_large_image' } } },
  _baseline:
   { version: '0.1.0-next.46',
     name: 'Eleventy Baseline',
     env: { mode: 'production', package: '@apleasantview/eleventy-plugin-baseline' },
     options:
      { verbose: true,
        silent: false,
        multilang: true,
        sitemap: true,
        navigator: true,
        head: { titleSeparator: ' | ', showGenerator: true },
        assets: { esbuild: {} },
        media:
         { image:
            { widths: [Array],
              formats: [Array],
              sizes: '(max-width: 768px) 100vw, 768px',
              sizesAuthored: false } } },
     features:
      { multilang: true,
        sitemap: true,
        navigator: true,
        head: true,
        assets: true,
        hasImageTransformPlugin: false },
     paths:
      { input: './src/',
        output: './dist/',
        includes: './src/_includes/',
        data: './src/_data/',
        assets: './src/assets/',
        public: './src/static/' } },
  _assets: {},
  _head: {},
  _multilang: {},
  _navigator:
   { nodes:
      { '/navigator-core.html':
         { title: 'Navigator Core',
           slug: 'navigator-core',
           description: 'Eleventy + Baseline internals',
           section: undefined,
           breadcrumbs: [],
           type: undefined,
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-09-12T21:27:57.164Z,
           url: '/navigator-core.html',
           excerpt: '← Go back',
           headings: [ [Object] ],
           sections: [],
           images: [] },
        '/docs/':
         { title: 'Documentation',
           slug: 'docs',
           description:
            'Seven chapters: introduction, tutorials, feature guides, how-tos, core reference, the five modules, and the concepts behind the whole plugin.',
           section: [ 'docs' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/',
           excerpt: 'The documentation for Baseline. Each chapter with its own job:',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/introduction/':
         { title: 'Introduction',
           slug: 'introduction',
           description:
            'Start here: what Eleventy is, what Baseline adds on top, who it is for, and a quickstart that gets a site running.',
           section: [ 'docs', 'introduction' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/introduction/',
           excerpt:
            'Start here. What is Baseline? answers whether it is for you. What is Eleventy? is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The quickstart gets you a running site, and the simple site tutorial walks the same ground with the reasoning visible.',
           headings: [ [Object], [Object] ],
           sections: [ [Object] ],
           images: [] },
        '/docs/introduction/what-is-baseline/':
         { title: 'What is Baseline?',
           slug: 'what-is-baseline',
           description:
            'What Baseline is, who it is for, why it is a plugin, and what it gives you out of the box.',
           section: [ 'docs', 'introduction' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/introduction/what-is-baseline/',
           excerpt:
            'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/introduction/what-is-eleventy/':
         { title: 'What is Eleventy?',
           slug: 'what-is-eleventy',
           description:
            'Eleventy is a static site generator: it turns files on your computer into a finished website. Here is what it does, and what it deliberately leaves to you.',
           section: [ 'docs', 'introduction' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-07-30T00:00:00.000Z,
           url: '/docs/introduction/what-is-eleventy/',
           excerpt:
            'Eleventy is a static site generator. It takes a folder of files on your computer and turns them into a finished website: plain HTML, CSS and images that you can put on any host.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/introduction/quickstart/':
         { title: 'Quickstart',
           slug: 'quickstart',
           description:
            'The minimum working Baseline setup: install the plugin, write the settings file, run the build. A checklist rather than a walkthrough.',
           section: [ 'docs', 'introduction' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/introduction/quickstart/',
           excerpt:
            'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.',
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/':
         { title: 'Tutorials: build a site from an empty folder',
           slug: 'tutorial',
           description:
            'Build a Baseline site from an empty folder: a homepage, a page, a first post, then a second language with hreflang and per-language sitemaps.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-07-31T00:00:00.000Z,
           url: '/docs/tutorial/',
           excerpt:
            'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/simple-baseline-site/':
         { title: 'Create the project',
           slug: 'simple-baseline-site',
           description: 'Make the folder, add a package file, and install Eleventy and Baseline.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/tutorial/simple-baseline-site/',
           excerpt:
            "Let's start by creating the project folder. Everything after this happens in there.",
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/set-up-the-project/':
         { title: 'Lay out the folders',
           slug: 'set-up-the-project',
           description:
            'Build the folder shape Baseline expects, and the content folders you will write in.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-15T00:00:00.000Z,
           url: '/docs/tutorial/set-up-the-project/',
           excerpt:
            'Baseline has an opinion about where things live. src/ for what you write, dist/ for what gets built, and a handful of folders in between that it finds by name.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object] ],
           images: [] },
        '/docs/tutorial/wire-in-baseline/':
         { title: 'Wire in Baseline',
           slug: 'wire-in-baseline',
           description:
            'Add the plugin, re-export the directory config, and give the site its name and URL.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-15T00:00:00.000Z,
           url: '/docs/tutorial/wire-in-baseline/',
           excerpt:
            'This is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/tutorial/front-matter-and-slugs/':
         { title: 'Front matter and slugs',
           slug: 'front-matter-and-slugs',
           description:
            'Front matter is how a page tells Eleventy about itself, a slug is the name it goes by, and one folder rule turns that name into a URL.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-20T00:00:00.000Z,
           url: '/docs/tutorial/front-matter-and-slugs/',
           excerpt:
            'Before writing a page, two things it needs: a way to say what it is, and a name to go by. Front matter and a slug. Then one small file that turns the name into an address.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/writing-pages/':
         { title: 'Writing pages',
           slug: 'writing-pages',
           description:
            'Write the homepage and a page beside it, one naming its own address and the other letting the folder rule decide.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-15T00:00:00.000Z,
           url: '/docs/tutorial/writing-pages/',
           excerpt:
            'Two pages to start with: a homepage, and one sitting next to it. Where each one lives decides how it gets its address.',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/tutorial/posts-and-collections/':
         { title: 'Posts and collections',
           slug: 'posts-and-collections',
           description:
            'Register a posts collection, give posts their own address rule, and write two posts with date-prefixed filenames, one of them a draft.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-20T00:00:00.000Z,
           url: '/docs/tutorial/posts-and-collections/',
           excerpt:
            'A post is not a page with a different word on it. It belongs to a collection, so other pages can ask for it, and it gets its own address rule so posts sit together under one segment.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/add-a-layout/':
         { title: 'Add a layout and a stylesheet',
           slug: 'add-a-layout',
           description:
            'Wrap the pages in a layout with baseline-head, then add the CSS and JS the settings file already points at.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-15T00:00:00.000Z,
           url: '/docs/tutorial/add-a-layout/',
           excerpt:
            'Your pages render, and they arrive with nothing around them: no <head>, no navigation, nothing to look at. This page gives them a shell. It is also where two things you set up earlier finally reach a file.',
           headings: [ [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/run-and-build/':
         { title: 'Run it, then build it',
           slug: 'run-and-build',
           description:
            'What the dev server does for you, what changes in a production build, and what to look for in dist/.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-15T00:00:00.000Z,
           url: '/docs/tutorial/run-and-build/',
           excerpt:
            'You have run npm start twice already, so the dev server is not news. A build is a different site, though, and the gap between the two is where the surprises live.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/multilingual-baseline-site/':
         { title: 'Build a multilingual site',
           slug: 'multilingual-baseline-site',
           description:
            'Add a second language to a Baseline site: per-language URLs, hreflang on every page, and a sitemap for each language plus an index.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 0,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/tutorial/multilingual-baseline-site/',
           excerpt:
            "Add a second language to a Baseline site, with everything you'd expect: per-language URLs, hreflang on every page, a sitemap for each language plus an index.",
           headings: [ [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/tutorial/multilingual-baseline-site/2/':
         { title: 'Build a multilingual site',
           slug: 'multilingual-baseline-site',
           description:
            'Add a second language to a Baseline site: per-language URLs, hreflang on every page, and a sitemap for each language plus an index.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 1,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/tutorial/multilingual-baseline-site/2/',
           excerpt:
            "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default.",
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/tutorial/multilingual-baseline-site/3/':
         { title: 'Build a multilingual site',
           slug: 'multilingual-baseline-site',
           description:
            'Add a second language to a Baseline site: per-language URLs, hreflang on every page, and a sitemap for each language plus an index.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 2,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/tutorial/multilingual-baseline-site/3/',
           excerpt:
            'The contentDir entries you just wrote record English content as living in content/en/ and Dutch in content/nl/. Nothing enforces that, but the point of writing it down is to follow it, so the content moves:',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/tutorial/multilingual-baseline-site/4/':
         { title: 'Build a multilingual site',
           slug: 'multilingual-baseline-site',
           description:
            'Add a second language to a Baseline site: per-language URLs, hreflang on every page, and a sitemap for each language plus an index.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 3,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/tutorial/multilingual-baseline-site/4/',
           excerpt:
            'src/_includes/layouts/base.njk needs no changes, and one line in it is the reason. You wrote lang="{{ lang or settings.defaultLanguage }}" two pages ago, when both halves resolved to the same value and the fallback looked like belt and braces. It stops looking that way now. The two files you just wrote put a lang on everything under en/ and nl/, so each page declares its own language and Dutch pages stop claiming to be English, while the homepage takes the other branch and falls back. Both halves of that line are now load-bearing, on the same site.',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/tutorial/multilingual-baseline-site/5/':
         { title: 'Build a multilingual site',
           slug: 'multilingual-baseline-site',
           description:
            'Add a second language to a Baseline site: per-language URLs, hreflang on every page, and a sitemap for each language plus an index.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 4,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/tutorial/multilingual-baseline-site/5/',
           excerpt:
            "Visit / for English, since default-language permalinks are unprefixed, and /nl/ for Dutch. View source on either one and you should find all three alternates, en, nl and x-default, which Baseline emits because both pages share translationKey: 'home'. Then open /about/ and find none, for the reason above.",
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/tutorial/where-to-go-next/':
         { title: 'Where to go next',
           slug: 'where-to-go-next',
           description: 'What the tutorial built thinly, and which guide takes each part further.',
           section: [ 'docs', 'tutorial' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/tutorial/where-to-go-next/',
           excerpt:
            'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/how-to/':
         { title: 'How-to guides',
           slug: 'how-to',
           description:
            'Recipes for the things Baseline does not do for you, plus guides on grafting it onto an Eleventy setup that already exists.',
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/how-to/',
           excerpt:
            'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/how-to/customise-assets-pipeline/':
         { title: 'Customise the assets pipeline',
           slug: 'customise-assets-pipeline',
           description:
            "Override Baseline's fallback PostCSS config, add esbuild entry points, and set targets and minification for the assets module.",
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/how-to/customise-assets-pipeline/',
           excerpt:
            'When the fallback configs in the assets module are not enough, drop your own in. PostCSS for CSS, esbuild for JS. The module picks them up.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 6 more items ],
           sections: [ [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/how-to/deploy-under-a-subpath/':
         { title: 'Deploy under a subpath',
           slug: 'deploy-under-a-subpath',
           description:
            'Serve your Baseline site from a subpath: set pathPrefix, keep settings.url clean, use root-relative links, and verify sitemap and canonical URLs.',
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/how-to/deploy-under-a-subpath/',
           excerpt:
            'Serve a Baseline site from a subpath like /docs/ without breaking links, asset paths, canonical URLs, or the sitemap on the way.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/how-to/image-transform/':
         { title: 'Image transform',
           slug: 'image-transform',
           description:
            "Use Eleventy Image's HTML transform to rewrite img tags into responsive picture markup with multiple formats, sizes, and caching, alongside Baseline.",
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-15T00:00:00.000Z,
           url: '/docs/how-to/image-transform/',
           excerpt:
            "The image transform is eleventy-img's, not Baseline's. The two run side by side: eleventyImageTransformPlugin rewrites <img> and <picture> into responsive markup with generated assets and caching, and you add it to your config yourself.",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/how-to/multilingual-index/':
         { title: 'Multilingual index',
           slug: 'multilingual-index',
           description:
            "List your site's pages grouped by language using Baseline's multilingual setup, with a small Nunjucks template.",
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-26T00:00:00.000Z,
           url: '/docs/how-to/multilingual-index/',
           excerpt:
            "A small index page that groups every page on the site by language. Useful when you have a multilingual site and want a single landing point that fans out to each language's content.",
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/how-to/build-scripts-and-cleanup/':
         { title: 'Build scripts and cleanup',
           slug: 'build-scripts-and-cleanup',
           description:
            'Use npm-run-all, rimraf, and cross-env to keep Baseline builds clean and predictable for dev and production.',
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/how-to/build-scripts-and-cleanup/',
           excerpt:
            `A small set of npm scripts that take Baseline's dev and build commands from "works on my machine" to predictable across platforms. Three helpers do the work: rimraf for cleanup, npm-run-all for sequencing, and cross-env for portable env vars.`,
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/how-to/translate-ui-strings/':
         { title: 'Translate UI strings',
           slug: 'translate-ui-strings',
           description:
            'Move hardcoded labels out of your templates into one table per language, and read them back with the t filter.',
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/how-to/translate-ui-strings/',
           excerpt:
            'Every site accumulates labels that live in templates: "Read more", "Back to top", the words around a form. Reach for this when you want them in one place instead of scattered across partials, or when a second language means each one now needs two spellings.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/how-to/deployment-checks/':
         { title: 'Deployment checks',
           slug: 'deployment-checks',
           description:
            'Keep URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak localhost to the live site.',
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/how-to/deployment-checks/',
           excerpt:
            'Keep your URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak localhost to the live site. The mechanics are mostly Eleventy and environment variables; this page is the small set of habits that keep them honest.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 1 more item ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/how-to/persist-the-build-cache/':
         { title: 'Persist the build cache on your host',
           slug: 'persist-the-build-cache',
           description:
            'Keep .cache/media between deploys so a build does not re-encode every image, and confirm the cache is actually being restored.',
           section: [ 'docs', 'how-to' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-09-03T00:00:00.000Z,
           url: '/docs/how-to/persist-the-build-cache/',
           excerpt:
            'Encoding images is the slowest thing in most Baseline builds, and a rendition never changes once it exists. Locally the cache takes care of itself. A CI runner starts from a clean checkout every time, so unless the host is told to keep the cache, every deploy pays the full encode again.',
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/feature-guide/':
         { title: 'Feature guide',
           slug: 'feature-guide',
           description:
            'Seven guides that build on each other: assets, images, head and noindex, sitemaps and drafts, debugging, custom schema, and splitting a long page.',
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-03T00:00:00.000Z,
           url: '/docs/feature-guide/',
           excerpt:
            'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.',
           headings: [ [Object], [Object] ],
           sections: [ [Object] ],
           images: [] },
        '/docs/feature-guide/assets-pipeline/':
         { title: 'Assets pipeline quickstart',
           slug: 'assets-pipeline',
           description:
            "Ship CSS and JS through Baseline's assets module: one CSS entry through PostCSS, one JS entry through esbuild, and the inline filters when you need them.",
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-13T00:00:00.000Z,
           url: '/docs/feature-guide/assets-pipeline/',
           excerpt:
            "Ship CSS and JS through Baseline's assets module. One entry point each, compiled on every build, plus a pair of filters for the times you want the bytes in the page rather than in a file.",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/feature-guide/image-shortcode-basics/':
         { title: 'Image shortcode basics',
           slug: 'image-shortcode-basics',
           description:
            "Render responsive images with Baseline's image shortcode: alt and caption, multiple formats and sizes, and verify output in dist/media.",
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-13T00:00:00.000Z,
           url: '/docs/feature-guide/image-shortcode-basics/',
           excerpt: 'Render a responsive image with one line of template code.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/feature-guide/head-and-noindex/':
         { title: 'Head and noindex',
           slug: 'head-and-noindex',
           description: 'Set Baseline head defaults, add per-page head extras and block robots.',
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/feature-guide/head-and-noindex/',
           excerpt:
            'Get a clean, correct <head> on every page with one placeholder and a settings file. You write the placeholder, and Baseline writes everything that goes in it.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 3 more items ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 2 more items ],
           images: [] },
        '/docs/feature-guide/sitemaps-and-drafts/':
         { title: 'Sitemaps and drafts',
           slug: 'sitemaps-and-drafts',
           description:
            'Control sitemap entries and drafts in Baseline: set per-page sitemap fields, apply noindex, and see how drafts behave in dev versus build.',
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/feature-guide/sitemaps-and-drafts/',
           excerpt:
            'Control which pages end up in your sitemap, and let work-in-progress pages live alongside published ones without leaking into production. Those are separate switches, and knowing which one you want is most of the work.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 1 more item ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/feature-guide/debugging-navigator/':
         { title: 'Debugging with the navigator',
           slug: 'debugging-navigator',
           description:
            'Use Baseline debug filters and the navigator to inspect Eleventy data, render context, and the page-context snapshot without shipping debug tools to production.',
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-26T00:00:00.000Z,
           url: '/docs/feature-guide/debugging-navigator/',
           excerpt:
            "When something looks off in a build, Baseline's debug helpers let you see the data Eleventy is working with from inside any template. By the end you'll know which helper to reach for, when, and how to keep them out of production.",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 2 more items ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 1 more item ],
           images: [] },
        '/docs/feature-guide/custom-schema/':
         { title: 'Custom schema with schema.pieces',
           slug: 'custom-schema',
           description:
            'Add your own schema.org nodes to the JSON-LD graph through the schema.pieces seam, scoped by the cascade.',
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-06-02T00:00:00.000Z,
           url: '/docs/feature-guide/custom-schema/',
           excerpt:
            "Baseline assembles a complete JSON-LD graph for every page on its own: a WebSite, your Organization or Person identity, the WebPage, an Article where relevant, breadcrumbs, and the image and translation references, all wired together with stable @ids. That spine is automatic. When a page needs something the spine doesn't model, a Service, an FAQPage, a Product, an Event, it comes in through one seam: schema.pieces.",
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/feature-guide/page-breaks/':
         { title: 'Splitting a long page',
           slug: 'page-breaks',
           description:
            'Split a long page into parts with a comment marker, name them, and render the navigation between them yourself.',
           section: [ 'docs', 'feature-guide' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-09-03T00:00:00.000Z,
           url: '/docs/feature-guide/page-breaks/',
           excerpt:
            'Some pages get long enough that a reader loses their place in them. A marker in the body splits one source file into several pages, each with its own URL, and hands your layout the pieces to draw links from.',
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/':
         { title: 'Core reference',
           slug: 'core-reference',
           description:
            'Every surface Baseline exposes: the plugin call, settings, page context, the SEO and content graphs, filters, globals, the image shortcode, and the content helpers.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/core-reference/',
           excerpt:
            'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/plugin-entrypoint/':
         { title: 'Plugin entrypoint',
           slug: 'plugin-entrypoint',
           description:
            'The baseline() factory: signature, options, and what it registers when you add it to Eleventy.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-15T00:00:00.000Z,
           url: '/docs/core-reference/plugin-entrypoint/',
           excerpt:
            'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/site-settings/':
         { title: 'Site settings',
           slug: 'site-settings',
           description:
            'The settings argument to baseline(): site identity, languages, and head extras.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/core-reference/site-settings/',
           excerpt:
            'settings is the first argument to baseline(). It carries site identity: title, tagline, canonical URL, indexability, languages, and any extra <head> items you want injected on every page.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 1 more item ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/config-export/':
         { title: 'Config export',
           slug: 'config-export',
           description:
            'The directory contract Baseline ships as a named config export: what it sets, why it matters, and how to override safely.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/core-reference/config-export/',
           excerpt:
            "Baseline ships a directory contract as a named export. Eleventy's modules expect specific input, output, includes, and data folders; Baseline's modules expect two more (assets, public).",
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/page-context/':
         { title: 'Page context',
           slug: 'page-context',
           description:
            'The normalised per-page object Baseline builds at cascade-time and exposes as _pageContext.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/core-reference/page-context/',
           excerpt:
            "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data.",
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/seo-graph/':
         { title: 'The SEO graph: canonical, Open Graph, JSON-LD',
           slug: 'seo-graph',
           description:
            'A resolved per-page object built once during the cascade and read at transform-time: canonical URL, Open Graph and Twitter projections, and a JSON-LD @graph.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-06-07T00:00:00.000Z,
           url: '/docs/core-reference/seo-graph/',
           excerpt:
            'A resolved per-page object: the canonical URL, the Open Graph and Twitter projections, and a JSON-LD @graph. Built once during the data cascade, cached, and read again at transform-time when the head module emits the tags.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/content-graph/':
         { title: 'Content graph',
           slug: 'content-graph',
           description:
            'The queryable map of every rendered page, exposed to templates as _node, _backlinks, _outgoing, and the _navigator global.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-14T00:00:00.000Z,
           url: '/docs/core-reference/content-graph/',
           excerpt:
            "A pre-rendered map of every page's headings, images, links, and excerpts, plus the links between pages. Built once before Eleventy's main build by a programmatic dry-run of the site; cached at .cache/_baseline/content-graph.json. Templates read it through cascade keys; modules read it through coreContext.runtime.contentGraph.",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 4 more items ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/core-reference/internals/':
         { title: 'Baseline internals: registry, stores, seams',
           slug: 'internals',
           description:
            'Names for the internals you may run into via the navigator or while debugging: registry, stores, virtual directories, driver seam, reserved keys.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/core-reference/internals/',
           excerpt:
            'You can run Baseline without knowing any of this. The page exists for the moments when you peek into _snapshot, watch a console log, or follow a stack trace into the plugin and want to know what each piece is called.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/filters/':
         { title: 'Filters reference: names and availability',
           slug: 'filters',
           description:
            'Filters Baseline registers, grouped by module: when each is available and what it does.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/core-reference/filters/',
           excerpt:
            'Eleventy filters Baseline registers. Some are always available; the rest come on with the module that registers them.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 9 more items ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/globals/':
         { title: 'Global data keys and reserved namespaces',
           slug: 'globals',
           description:
            'The global data keys Baseline registers: _baseline, _pageContext, _snapshot, _navigator, _node, _backlinks, _outgoing, and the reserved namespaces.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/core-reference/globals/',
           excerpt:
            'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 4 more items ],
           sections:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/core-reference/image-shortcode/':
         { title: 'Image shortcode',
           slug: 'image-shortcode',
           description:
            'The image shortcode: responsive <picture>, multiple formats, captions, and on-request transforms in dev. Built on @11ty/eleventy-img.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/core-reference/image-shortcode/',
           excerpt:
            "The shortcode is Baseline's; the underlying engine is @11ty/eleventy-img. The two halves split cleanly:",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 9 more items ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 1 more item ],
           images: [] },
        '/docs/core-reference/content-helpers/':
         { title: 'Content helpers',
           slug: 'content-helpers',
           description:
            'How drafts, wikilinks, heading IDs, element attributes, and image handling work in Baseline, and the rules that keep content predictable.',
           section: [ 'docs', 'core-reference' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-02T00:00:00.000Z,
           url: '/docs/core-reference/content-helpers/',
           excerpt:
            'The syntax Baseline adds to your Markdown, and the front-matter key that keeps a page out of a build: drafts, wikilinks, automatic heading ids, attributes on any element, and images.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 7 more items ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/concept/':
         { title: 'Concepts: the decisions behind Baseline',
           slug: 'concept',
           description:
            'The mental model behind Baseline: the decisions it makes, project structure, content organisation, and the three-layer architecture.',
           section: [ 'docs', 'concept' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/concept/',
           excerpt:
            'How Baseline works is the mental model behind the plugin. Project structure is the small set of rules that keep Baseline out of your way, and content organisation is the page-data pattern those rules assume.',
           headings: [ [Object], [Object] ],
           sections: [ [Object] ],
           images: [] },
        '/docs/concept/how-baseline-works/':
         { title: 'How Baseline works',
           slug: 'how-baseline-works',
           description:
            'A conceptual map of Baseline: what it handles, the placeholder, and the two configuration surfaces.',
           section: [ 'docs', 'concept' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/concept/how-baseline-works/',
           excerpt:
            'Baseline makes the structural decisions Eleventy leaves open and wires them into a small set of feature modules that work together. This page is the mental model: what Baseline handles, what stays yours, and how you configure it.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/concept/project-structure/':
         { title: 'Project structure',
           slug: 'project-structure',
           description:
            'The folder structure that keeps Baseline out of your way: where files go, which environment variables matter, and the seams it expects to own.',
           section: [ 'docs', 'concept' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-02T00:00:00.000Z,
           url: '/docs/concept/project-structure/',
           excerpt:
            "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own.",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           sections:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/concept/content-organisation/':
         { title: 'Content organisation',
           slug: 'content-organisation',
           description:
            'Every page has two layers: structure in a sibling *.11tydata.js, content metadata in front matter. A way of using the data cascade, not a Baseline rule.',
           section: [ 'docs', 'concept' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-02T00:00:00.000Z,
           url: '/docs/concept/content-organisation/',
           excerpt: 'Every page on a Baseline site has two layers behind it.',
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/concept/architecture-snapshot/':
         { title: 'Architecture snapshot',
           slug: 'architecture-snapshot',
           description:
            'The three-layer model behind Baseline: state, runtime, modules. Why it is built that way and how the layers talk to each other.',
           section: [ 'docs', 'concept' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-28T00:00:00.000Z,
           url: '/docs/concept/architecture-snapshot/',
           excerpt: 'The plugin is built in three concentric layers, each with one strict job.',
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/modules/':
         { title: 'Modules reference',
           slug: 'modules',
           description:
            'The five modules, all wired on install: assets for CSS and JS, head for meta tags and structured data, plus multilang, navigator, and sitemap.',
           section: [ 'docs', 'modules' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-01-25T00:00:00.000Z,
           url: '/docs/modules/',
           excerpt:
            'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/modules/assets/':
         { title: 'The assets module: PostCSS and esbuild',
           slug: 'assets',
           description:
            'The bridge between Eleventy templates and the asset processors: js and css as template formats, plus compile guards, a watch target, and two inline filters.',
           section: [ 'docs', 'modules' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-13T00:00:00.000Z,
           url: '/docs/modules/assets/',
           excerpt: "INTERNAL_KEY: '_assets'",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 2 more items ],
           sections:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/modules/head/':
         { title: 'The head module and baseline-head',
           slug: 'head',
           description:
            'Drop a <baseline-head> placeholder in your layout and get the full head: title, description, canonical, hreflang, Open Graph, Twitter, and JSON-LD.',
           section: [ 'docs', 'modules' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-15T00:00:00.000Z,
           url: '/docs/modules/head/',
           excerpt: "INTERNAL_KEY: '_head'",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 6 more items ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/modules/multilang/':
         { title: 'The multilang module: hreflang and locales',
           slug: 'multilang',
           description:
            'Language infrastructure: normalises language config, attaches per-page locale data, builds the translation map, and exposes translation filters. Opt-in.',
           section: [ 'docs', 'modules' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-18T00:00:00.000Z,
           url: '/docs/modules/multilang/',
           excerpt: "INTERNAL_KEY: '_multilang'",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 6 more items ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/modules/navigator/':
         { title: 'The navigator module and debug page',
           slug: 'navigator',
           description:
            'Two hats: a phpinfo()-style page for current build state, and the _navigator read surface for cross-page data (nodes, edges, backlinks).',
           section: [ 'docs', 'modules' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-15T00:00:00.000Z,
           url: '/docs/modules/navigator/',
           excerpt: "INTERNAL_KEY: '_navigator'",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 5 more items ],
           sections:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object] ],
           images: [] },
        '/docs/modules/sitemap/':
         { title: 'The sitemap module: drafts and exclusions',
           slug: 'sitemap',
           description:
            'Generate /sitemap.xml automatically, with per-language sitemaps and an index for multilingual sites. Any page can opt out from its front matter.',
           section: [ 'docs', 'modules' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-04-15T00:00:00.000Z,
           url: '/docs/modules/sitemap/',
           excerpt: "INTERNAL_KEY: '_sitemap'",
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 3 more items ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/release-notes/0-1-0-next-42/':
         { title: 'v0.1.0-next.42',
           slug: '0-1-0-next-42',
           description:
            'Mostly an SEO release. Baseline head now emits the structured data, social tags, and canonical link that used to be hand-wired per site.',
           section: [ 'release-notes' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-06-04T00:00:00.000Z,
           url: '/release-notes/0-1-0-next-42/',
           excerpt:
            'Mostly an SEO release. <baseline-head> now emits the structured data, social tags, and canonical link that used to be hand-wired per site. A handful of shapes changed to make room for it.',
           headings: [ [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object] ],
           images: [] },
        '/release-notes/0-1-0-next-43/':
         { title: 'v0.1.0-next.43',
           slug: '0-1-0-next-43',
           description:
            'A single fix in 0.1.0-next.43: wikilinks now resolve on single-language sites, where they had been left unlinked.',
           section: [ 'release-notes' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-06-21T00:00:00.000Z,
           url: '/release-notes/0-1-0-next-43/',
           excerpt: 'A single fix: wikilinks on single-language sites.',
           headings: [ [Object], [Object] ],
           sections: [ [Object] ],
           images: [] },
        '/release-notes/0-1-0-next-44/':
         { title: 'v0.1.0-next.44',
           slug: '0-1-0-next-44',
           description:
            'A housekeeping release: the supported Node range and the dependency versions Baseline declares.',
           section: [ 'release-notes' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-07-04T00:00:00.000Z,
           url: '/release-notes/0-1-0-next-44/',
           excerpt:
            'A housekeeping release: the supported Node range and the dependency versions Baseline declares.',
           headings: [ [Object], [Object] ],
           sections: [ [Object] ],
           images: [] },
        '/release-notes/':
         { title: 'Release notes',
           slug: 'release-notes',
           description:
            'Baseline ships on a rolling release cadence (0.1.0-next.X). Every entry names what changed and the line you have to change with it.',
           section: [ 'release-notes' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-06-04T00:00:00.000Z,
           url: '/release-notes/',
           excerpt:
            'Baseline ships on a rolling release cadence (0.1.0-next.X). Things shift, break, and get renamed between releases. Pin a version when you build something serious on top.',
           headings:
            [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/about/':
         { title: 'About Eleventy Baseline',
           slug: 'about',
           description: 'How a personal client-work starter became a build framework for Eleventy.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'about',
           lang: 'en',
           locale: 'en',
           translationKey: 'about',
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-23T00:00:00.000Z,
           url: '/about/',
           excerpt:
            "Baseline is a build framework for Eleventy: the structural decisions you'd otherwise wire up on every project, already made. Looking for the pitch? That's the homepage.",
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/agent-discovery/':
         { title: 'Agent discovery',
           slug: 'agent-discovery',
           description:
            'The static discovery surfaces this site publishes for AI agents and integrations: schema endpoints, a schema map, llms.txt and an API catalog.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-22T00:00:00.000Z,
           url: '/agent-discovery/',
           excerpt:
            'This site exposes a handful of static surfaces that AI agents, search crawlers, and integrations can read without parsing HTML. They are generated at build time and cross-reference each other.',
           headings: [ [Object] ],
           sections: [],
           images: [] },
        '/commercial-support/':
         { title: 'Commercial support',
           slug: 'commercial-support',
           description:
            'Baseline is free and stays free. Help adopting it, extending it, or building on it runs through a pleasant view.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: 'commercial-support',
           isDefaultLang: true,
           part: undefined,
           date: 2026-07-29T00:00:00.000Z,
           url: '/commercial-support/',
           excerpt:
            'Baseline is MIT-licensed and free, and it stays that way. If you would rather have the work done than do it yourself, that runs through a pleasant view.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/sitemap/':
         { title: 'Sitemap: every page, grouped by section',
           slug: 'sitemap-index',
           description:
            'Every English page on the site, grouped by section: documentation, release notes, and the pages about the project itself.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-13T00:00:00.000Z,
           url: '/sitemap/',
           excerpt: 'Every English page on the site, grouped by section.',
           headings: [ [Object] ],
           sections: [],
           images: [] },
        '/fr/about/':
         { title: "À propos d'Eleventy Baseline",
           slug: 'about',
           description:
            'Comment un starter personnel pour du travail client est devenu un build framework pour Eleventy.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'about',
           lang: 'fr',
           locale: 'fr',
           translationKey: 'about',
           isDefaultLang: false,
           part: undefined,
           date: 2026-05-23T00:00:00.000Z,
           url: '/fr/about/',
           excerpt:
            "Baseline est un build framework pour Eleventy : les décisions structurelles que vous câbleriez autrement sur chaque projet, déjà prises. Vous cherchez le pitch ? Il est sur la page d'accueil.",
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/fr/commercial-support/':
         { title: 'Support commercial',
           slug: 'commercial-support',
           description:
            "Baseline est gratuit et le restera. L'aide pour l'adopter, l'étendre ou construire dessus passe par a pleasant view.",
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'fr',
           locale: 'fr',
           translationKey: 'commercial-support',
           isDefaultLang: false,
           part: undefined,
           date: 2026-07-29T00:00:00.000Z,
           url: '/fr/commercial-support/',
           excerpt:
            'Baseline est sous licence MIT et gratuit, et le restera. Si vous préférez faire faire le travail plutôt que de le faire vous-même, cela passe par a pleasant view.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/nl/about/':
         { title: 'Over Eleventy Baseline',
           slug: 'about',
           description:
            'Hoe een persoonlijke starter voor klantenwerk uitgroeide tot een build framework voor Eleventy.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'about',
           lang: 'nl',
           locale: 'nl',
           translationKey: 'about',
           isDefaultLang: false,
           part: undefined,
           date: 2026-05-23T00:00:00.000Z,
           url: '/nl/about/',
           excerpt:
            'Baseline is een build framework voor Eleventy: de structurele beslissingen die je anders in elk project opnieuw zou aansluiten, al genomen. Op zoek naar de pitch? Die staat op de homepage.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/nl/commercial-support/':
         { title: 'Commerciële ondersteuning',
           slug: 'commercial-support',
           description:
            'Baseline is gratis en blijft gratis. Hulp bij het adopteren, uitbreiden of erop bouwen loopt via a pleasant view.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'nl',
           locale: 'nl',
           translationKey: 'commercial-support',
           isDefaultLang: false,
           part: undefined,
           date: 2026-07-29T00:00:00.000Z,
           url: '/nl/commercial-support/',
           excerpt:
            'Baseline is MIT-gelicentieerd en gratis, en dat blijft zo. Laat je het werk liever doen dan het zelf te doen, dan loopt dat via a pleasant view.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/faq/':
         { title: 'Baseline FAQ: scope, tooling and support',
           slug: 'faq',
           description:
            'Does Baseline lock you in? Is it production-ready? Answers on scope, tooling, SEO, and where to get help.',
           section: [ 'root' ],
           breadcrumbs: [ [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-06-02T00:00:00.000Z,
           url: '/faq/',
           excerpt:
            "No. It's a standard Eleventy plugin. Take it out and your Eleventy site still builds: you keep your content, your config, your output. Baseline adds conventions and wiring, not a cage.",
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/':
         { title: 'Eleventy Baseline: a build framework for Eleventy',
           slug: 'home',
           description:
            'Eleventy Baseline is a build framework for Eleventy. Assets, head tags, sitemaps and structured data, ready on the first build.',
           section: [ 'root' ],
           breadcrumbs: [],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: 'homepage',
           isDefaultLang: true,
           part: undefined,
           date: 2026-05-17T00:00:00.000Z,
           url: '/',
           excerpt: 'Start building your site and skip the setup work.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [],
           images: [] },
        '/fr/':
         { title: 'Eleventy Baseline : un framework de build pour Eleventy',
           slug: 'home',
           description:
            'Eleventy Baseline est un build framework pour Eleventy. Assets, balises head, sitemaps et données structurées, prêts dès le premier build.',
           section: [ 'root' ],
           breadcrumbs: [],
           type: 'page',
           lang: 'fr',
           locale: 'fr',
           translationKey: 'homepage',
           isDefaultLang: false,
           part: undefined,
           date: 2026-05-17T00:00:00.000Z,
           url: '/fr/',
           excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 1 more item ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/nl/':
         { title: 'Eleventy Baseline: een build framework voor Eleventy',
           slug: 'home',
           description:
            'Eleventy Baseline is een build framework voor Eleventy. Assets, head-tags, sitemaps en gestructureerde data, klaar bij de eerste build.',
           section: [ 'root' ],
           breadcrumbs: [],
           type: 'page',
           lang: 'nl',
           locale: 'nl',
           translationKey: 'homepage',
           isDefaultLang: false,
           part: undefined,
           date: 2026-05-17T00:00:00.000Z,
           url: '/nl/',
           excerpt: 'Start met het bouwen aan je site en sla de setup over.',
           headings:
            [ [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              [Object],
              ... 1 more item ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/':
         { title: 'Integrations',
           slug: 'integrations',
           description:
            'Guides for adding Baseline to Eleventy projects that already exist, one starter at a time.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-08-24T00:00:00.000Z,
           url: '/docs/integrations/',
           excerpt:
            'Baseline expects a directory contract and a head placeholder, and a project that already exists has its own answers to both. These guides work through the reconciliation one starter at a time: what moves, what gets deleted, and what you keep.',
           headings: [ [Object], [Object] ],
           sections: [ [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-base-blog/':
         { title: 'Integrate Baseline with Eleventy Base Blog',
           slug: 'integrate-eleventy-base-blog',
           description:
            'Integrate the official eleventy-base-blog starter with Baseline: what moves, what gets deleted, what comes back, and the failures a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 0,
           date: 2026-08-25T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-base-blog/',
           excerpt:
            'Adding Baseline to eleventy-base-blog is mostly subtraction. The config goes from 168 lines to 84, sixteen registrations to nine, and dependencies ends up holding exactly one package.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-base-blog/2/':
         { title: 'Integrate Baseline with Eleventy Base Blog',
           slug: 'integrate-eleventy-base-blog',
           description:
            'Integrate the official eleventy-base-blog starter with Baseline: what moves, what gets deleted, what comes back, and the failures a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 1,
           date: 2026-08-25T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-base-blog/2/',
           excerpt:
            "The starter ignores _site/, which is the only output directory it knows about. Baseline's output is dist/, so until you do this every build is stageable. Nothing warns you. Do it before anything can generate output rather than at the point the output moves.",
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-base-blog/3/':
         { title: 'Integrate Baseline with Eleventy Base Blog',
           slug: 'integrate-eleventy-base-blog',
           description:
            'Integrate the official eleventy-base-blog starter with Baseline: what moves, what gets deleted, what comes back, and the failures a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 2,
           date: 2026-08-25T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-base-blog/3/',
           excerpt:
            'Plain mv is fine. Git infers the renames from content similarity when you stage them.',
           headings: [ [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-base-blog/4/':
         { title: 'Integrate Baseline with Eleventy Base Blog',
           slug: 'integrate-eleventy-base-blog',
           description:
            'Integrate the official eleventy-base-blog starter with Baseline: what moves, what gets deleted, what comes back, and the failures a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 3,
           date: 2026-08-25T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-base-blog/4/',
           excerpt: 'Move eleventy.config.js out of the way, then write a new one from scratch:',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-base-blog/5/':
         { title: 'Integrate Baseline with Eleventy Base Blog',
           slug: 'integrate-eleventy-base-blog',
           description:
            'Integrate the official eleventy-base-blog starter with Baseline: what moves, what gets deleted, what comes back, and the failures a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 4,
           date: 2026-08-25T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-base-blog/5/',
           excerpt: 'In base.njk, replace the entire hand-written <head> with:',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-base-blog/6/':
         { title: 'Integrate Baseline with Eleventy Base Blog',
           slug: 'integrate-eleventy-base-blog',
           description:
            'Integrate the official eleventy-base-blog starter with Baseline: what moves, what gets deleted, what comes back, and the failures a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 5,
           date: 2026-08-25T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-base-blog/6/',
           excerpt:
            'A loose end left behind by the deletions on the config page, and one that builds cleanly while being wrong.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 0,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/',
           excerpt:
            'Baseline and eleventy-excellent make a lot of the same decisions. Both keep config in its own directory instead of one long file, and both keep content clear of the machinery around it. CSS and JS go through a real pipeline. Share cards are generated at build time, and the head is composed from data rather than typed out page by page.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/2/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 1,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/2/',
           excerpt:
            'Before anything else happens. Ignore rules first means your notes are covered before you take the first one, and a personal global gitignore cannot swallow a source file you are about to write. dist is already ignored by the starter, so this is temp/ and two negations:',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/3/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 2,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/3/',
           excerpt:
            '_config/ comes out of the input directory and the content directories go under src/content/, leaving src/ holding only what Eleventy treats specially. Almost all of this is renaming.',
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/4/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 3,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/4/',
           excerpt:
            "Baseline registers every page under a slug, in one index shared across the whole site, so that wikilinks can resolve [[a-page]] to a URL. Registering the same slug twice throws, whether or not anything reads it, so a post whose filename matches a tag name collides with that tag's page:",
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/5/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 4,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/5/',
           excerpt: 'Baseline arrives as one addPlugin call, and the settings file arrives with it.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/6/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 5,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/6/',
           excerpt:
            'One file in src/_data/, and no wiring. Dropping it in is the wiring, because schema is a cascade key.',
           headings: [ [Object], [Object], [Object] ],
           sections: [ [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/7/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 6,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/7/',
           excerpt:
            'base.njk loses its entire <head> block and gains the placeholder. Seven partials stop being included, and everything worth keeping is already in settings.head. One of the seven comes straight back as an inline block, under "What stays in the template".',
           headings: [ [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/8/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 7,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/8/',
           excerpt:
            "Entry points replace the starter's per-page bundle calls, and PostCSS and esbuild run inside the plugin.",
           headings: [ [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/9/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 8,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/9/',
           excerpt:
            'The starter declares its assets where they are used, with a {% css %} or {% js %} block wrapping an include. Baseline works one bundle per directory instead, so you will not treat those blocks the same way. Delete the CSS ones, translate the JS ones, and move two things to the config.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/docs/integrations/integrate-eleventy-excellent/10/':
         { title: 'Integrate Baseline with Eleventy Excellent',
           slug: 'integrate-eleventy-excellent',
           description:
            'Integrate the eleventy-excellent starter with Baseline, step by step: project structure, slugs, the head, the assets pipeline, and what a green build hides.',
           section: [ 'docs', 'integrations' ],
           breadcrumbs: [ [Object], [Object], [Object], [Object] ],
           type: 'article',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: 9,
           date: 2026-09-04T00:00:00.000Z,
           url: '/docs/integrations/integrate-eleventy-excellent/10/',
           excerpt:
            'Everything dead has been left in the tree until now, which makes this one pass you can verify in a single check. Confirm zero inbound references for each file before it goes.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/release-notes/0-1-0-next-45/':
         { title: 'v0.1.0-next.45',
           slug: '0-1-0-next-45',
           description:
            'Baseline stops loading your .env, translations move onto the page, three filters lose a prefix, and a pre-pass bug that switched dev into build mode.',
           section: [ 'release-notes' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-09-12T19:52:50.603Z,
           url: '/release-notes/0-1-0-next-45/',
           excerpt:
            'Two strands of work in one release. Half of it is Baseline claiming something about your site that was not so: an origin anchored to the wrong place, a breadcrumb trail pointing at itself, a debug page asking to be indexed. The other half is multilingual: a page can now list its own translations without going through a collection, and the strings in your templates get somewhere to live.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object] ],
           images: [] },
        '/release-notes/0-1-0-next-46/':
         { title: 'v0.1.0-next.46',
           slug: '0-1-0-next-46',
           description:
            'A page can split itself on a comment marker, the image shortcode was reworked and now caches, Baseline goes quiet by default, and a dark-mode meta tag stops disappearing.',
           section: [ 'release-notes' ],
           breadcrumbs: [ [Object], [Object], [Object] ],
           type: 'page',
           lang: 'en',
           locale: 'en',
           translationKey: undefined,
           isDefaultLang: true,
           part: undefined,
           date: 2026-09-12T19:52:50.603Z,
           url: '/release-notes/0-1-0-next-46/',
           excerpt:
            'The biggest release so far, and it has one new feature and a lot of sharpening. The feature is page breaks: a comment in the body turns one file into several pages, an affordance WordPress has had for twenty years and static site generators have not.',
           headings: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
           sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
           images: [] } },
     edges:
      [ { internal: false, from: '/navigator-core.html', to: '', text: '← Go back', rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/introduction/',
          text: 'Introduction',
          rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/tutorial/',
          text: 'Tutorials: build a site from an empty folder',
          rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/feature-guide/',
          text: 'Feature guide',
          rel: [] },
        { internal: true, from: '/docs/', to: '/docs/how-to/', text: 'How-to guides', rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/core-reference/',
          text: 'Core reference',
          rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/modules/',
          text: 'Modules reference',
          rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/concept/',
          text: 'Concepts: the decisions behind Baseline',
          rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/introduction/',
          text: 'introduction',
          rel: [] },
        { internal: true,
          from: '/docs/',
          to: '/docs/core-reference/',
          text: 'core reference',
          rel: [] },
        ... 550 more items ],
     backlinks:
      { '/docs/introduction/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' },
           { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' },
           { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' } ],
        '/docs/tutorial/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' },
           { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' },
           { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' },
           { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' } ],
        '/docs/feature-guide/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' },
           { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' } ],
        '/docs/how-to/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' } ],
        '/docs/core-reference/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' },
           { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/concept/architecture-snapshot/',
             title: 'Architecture snapshot',
             excerpt: 'The plugin is built in three concentric layers, each with one strict job.' } ],
        '/docs/modules/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' },
           { url: '/docs/concept/architecture-snapshot/',
             title: 'Architecture snapshot',
             excerpt: 'The plugin is built in three concentric layers, each with one strict job.' } ],
        '/docs/concept/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' },
           { url: '/docs/introduction/',
             title: 'Introduction',
             excerpt:
              'Start here. What is Baseline? answers whether it is for you. What is Eleventy? is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The quickstart gets you a running site, and the simple site tutorial walks the same ground with the reasoning visible.' },
           { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/introduction/what-is-eleventy/',
             title: 'What is Eleventy?',
             excerpt:
              'Eleventy is a static site generator. It takes a folder of files on your computer and turns them into a finished website: plain HTML, CSS and images that you can put on any host.' },
           { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' } ],
        '/docs/introduction/what-is-baseline/':
         [ { url: '/docs/',
             title: 'Documentation',
             excerpt: 'The documentation for Baseline. Each chapter with its own job:' },
           { url: '/docs/introduction/',
             title: 'Introduction',
             excerpt:
              'Start here. What is Baseline? answers whether it is for you. What is Eleventy? is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The quickstart gets you a running site, and the simple site tutorial walks the same ground with the reasoning visible.' },
           { url: '/docs/introduction/what-is-eleventy/',
             title: 'What is Eleventy?',
             excerpt:
              'Eleventy is a static site generator. It takes a folder of files on your computer and turns them into a finished website: plain HTML, CSS and images that you can put on any host.' },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." } ],
        '/docs/introduction/what-is-eleventy/':
         [ { url: '/docs/introduction/',
             title: 'Introduction',
             excerpt:
              'Start here. What is Baseline? answers whether it is for you. What is Eleventy? is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The quickstart gets you a running site, and the simple site tutorial walks the same ground with the reasoning visible.' } ],
        '/docs/introduction/quickstart/':
         [ { url: '/docs/introduction/',
             title: 'Introduction',
             excerpt:
              'Start here. What is Baseline? answers whether it is for you. What is Eleventy? is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The quickstart gets you a running site, and the simple site tutorial walks the same ground with the reasoning visible.' },
           { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/introduction/what-is-eleventy/',
             title: 'What is Eleventy?',
             excerpt:
              'Eleventy is a static site generator. It takes a folder of files on your computer and turns them into a finished website: plain HTML, CSS and images that you can put on any host.' },
           { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." },
           { url: '/docs/concept/architecture-snapshot/',
             title: 'Architecture snapshot',
             excerpt: 'The plugin is built in three concentric layers, each with one strict job.' },
           { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' },
           { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' },
           { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' } ],
        '/docs/tutorial/simple-baseline-site/':
         [ { url: '/docs/introduction/',
             title: 'Introduction',
             excerpt:
              'Start here. What is Baseline? answers whether it is for you. What is Eleventy? is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The quickstart gets you a running site, and the simple site tutorial walks the same ground with the reasoning visible.' },
           { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/introduction/what-is-eleventy/',
             title: 'What is Eleventy?',
             excerpt:
              'Eleventy is a static site generator. It takes a folder of files on your computer and turns them into a finished website: plain HTML, CSS and images that you can put on any host.' },
           { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/how-to/build-scripts-and-cleanup/',
             title: 'Build scripts and cleanup',
             excerpt:
              `A small set of npm scripts that take Baseline's dev and build commands from "works on my machine" to predictable across platforms. Three helpers do the work: rimraf for cleanup, npm-run-all for sequencing, and cross-env for portable env vars.` },
           { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' },
           { url: '/docs/feature-guide/head-and-noindex/',
             title: 'Head and noindex',
             excerpt:
              'Get a clean, correct <head> on every page with one placeholder and a settings file. You write the placeholder, and Baseline writes everything that goes in it.' },
           { url: '/docs/integrations/',
             title: 'Integrations',
             excerpt:
              'Baseline expects a directory contract and a head placeholder, and a project that already exists has its own answers to both. These guides work through the reconciliation one starter at a time: what moves, what gets deleted, and what you keep.' } ],
        '/docs/modules/assets/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/tutorial/add-a-layout/',
             title: 'Add a layout and a stylesheet',
             excerpt:
              'Your pages render, and they arrive with nothing around them: no <head>, no navigation, nothing to look at. This page gives them a shell. It is also where two things you set up earlier finally reach a file.' },
           { url: '/docs/how-to/customise-assets-pipeline/',
             title: 'Customise the assets pipeline',
             excerpt:
              'When the fallback configs in the assets module are not enough, drop your own in. PostCSS for CSS, esbuild for JS. The module picks them up.' },
           { url: '/docs/feature-guide/assets-pipeline/',
             title: 'Assets pipeline quickstart',
             excerpt:
              "Ship CSS and JS through Baseline's assets module. One entry point each, compiled on every build, plus a pair of filters for the times you want the bytes in the page rather than in a file." },
           { url: '/docs/core-reference/filters/',
             title: 'Filters reference: names and availability',
             excerpt:
              'Eleventy filters Baseline registers. Some are always available; the rest come on with the module that registers them.' },
           { url: '/docs/core-reference/image-shortcode/',
             title: 'Image shortcode',
             excerpt:
              "The shortcode is Baseline's; the underlying engine is @11ty/eleventy-img. The two halves split cleanly:" },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' },
           { url: '/docs/modules/navigator/',
             title: 'The navigator module and debug page',
             excerpt: "INTERNAL_KEY: '_navigator'" },
           { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' },
           ... 5 more items ],
        '/docs/modules/head/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/wire-in-baseline/',
             title: 'Wire in Baseline',
             excerpt:
              'This is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.' },
           { url: '/docs/tutorial/add-a-layout/',
             title: 'Add a layout and a stylesheet',
             excerpt:
              'Your pages render, and they arrive with nothing around them: no <head>, no navigation, nothing to look at. This page gives them a shell. It is also where two things you set up earlier finally reach a file.' },
           { url: '/docs/tutorial/multilingual-baseline-site/2/',
             title: 'Build a multilingual site',
             excerpt:
              "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default." },
           { url: '/docs/feature-guide/head-and-noindex/',
             title: 'Head and noindex',
             excerpt:
              'Get a clean, correct <head> on every page with one placeholder and a settings file. You write the placeholder, and Baseline writes everything that goes in it.' },
           { url: '/docs/feature-guide/custom-schema/',
             title: 'Custom schema with schema.pieces',
             excerpt:
              "Baseline assembles a complete JSON-LD graph for every page on its own: a WebSite, your Organization or Person identity, the WebPage, an Article where relevant, breadcrumbs, and the image and translation references, all wired together with stable @ids. That spine is automatic. When a page needs something the spine doesn't model, a Service, an FAQPage, a Product, an Event, it comes in through one seam: schema.pieces." },
           { url: '/docs/core-reference/site-settings/',
             title: 'Site settings',
             excerpt:
              'settings is the first argument to baseline(). It carries site identity: title, tagline, canonical URL, indexability, languages, and any extra <head> items you want injected on every page.' },
           { url: '/docs/core-reference/page-context/',
             title: 'Page context',
             excerpt:
              "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data." },
           { url: '/docs/core-reference/seo-graph/',
             title: 'The SEO graph: canonical, Open Graph, JSON-LD',
             excerpt:
              'A resolved per-page object: the canonical URL, the Open Graph and Twitter projections, and a JSON-LD @graph. Built once during the data cascade, cached, and read again at transform-time when the head module emits the tags.' },
           ... 8 more items ],
        '/docs/modules/multilang/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/how-to/multilingual-index/',
             title: 'Multilingual index',
             excerpt:
              "A small index page that groups every page on the site by language. Useful when you have a multilingual site and want a single landing point that fans out to each language's content." },
           { url: '/docs/how-to/translate-ui-strings/',
             title: 'Translate UI strings',
             excerpt:
              'Every site accumulates labels that live in templates: "Read more", "Back to top", the words around a form. Reach for this when you want them in one place instead of scattered across partials, or when a second language means each one now needs two spellings.' },
           { url: '/docs/core-reference/site-settings/',
             title: 'Site settings',
             excerpt:
              'settings is the first argument to baseline(). It carries site identity: title, tagline, canonical URL, indexability, languages, and any extra <head> items you want injected on every page.' },
           { url: '/docs/core-reference/page-context/',
             title: 'Page context',
             excerpt:
              "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data." },
           { url: '/docs/core-reference/filters/',
             title: 'Filters reference: names and availability',
             excerpt:
              'Eleventy filters Baseline registers. Some are always available; the rest come on with the module that registers them.' },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." },
           { url: '/docs/concept/content-organisation/',
             title: 'Content organisation',
             excerpt: 'Every page on a Baseline site has two layers behind it.' },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' },
           ... 4 more items ],
        '/docs/modules/navigator/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/feature-guide/debugging-navigator/',
             title: 'Debugging with the navigator',
             excerpt:
              "When something looks off in a build, Baseline's debug helpers let you see the data Eleventy is working with from inside any template. By the end you'll know which helper to reach for, when, and how to keep them out of production." },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/content-graph/',
             title: 'Content graph',
             excerpt:
              "A pre-rendered map of every page's headings, images, links, and excerpts, plus the links between pages. Built once before Eleventy's main build by a programmatic dry-run of the site; cached at .cache/_baseline/content-graph.json. Templates read it through cascade keys; modules read it through coreContext.runtime.contentGraph." },
           { url: '/docs/core-reference/filters/',
             title: 'Filters reference: names and availability',
             excerpt:
              'Eleventy filters Baseline registers. Some are always available; the rest come on with the module that registers them.' },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' },
           { url: '/release-notes/0-1-0-next-42/',
             title: 'v0.1.0-next.42',
             excerpt:
              'Mostly an SEO release. <baseline-head> now emits the structured data, social tags, and canonical link that used to be hand-wired per site. A handful of shapes changed to make room for it.' } ],
        '/docs/core-reference/content-graph/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/page-context/',
             title: 'Page context',
             excerpt:
              "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data." },
           { url: '/docs/core-reference/internals/',
             title: 'Baseline internals: registry, stores, seams',
             excerpt:
              'You can run Baseline without knowing any of this. The page exists for the moments when you peek into _snapshot, watch a console log, or follow a stack trace into the plugin and want to know what each piece is called.' },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/docs/core-reference/content-helpers/',
             title: 'Content helpers',
             excerpt:
              'The syntax Baseline adds to your Markdown, and the front-matter key that keeps a page out of a build: drafts, wikilinks, automatic heading ids, attributes on any element, and images.' },
           { url: '/docs/concept/content-organisation/',
             title: 'Content organisation',
             excerpt: 'Every page on a Baseline site has two layers behind it.' },
           { url: '/docs/concept/architecture-snapshot/',
             title: 'Architecture snapshot',
             excerpt: 'The plugin is built in three concentric layers, each with one strict job.' },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' },
           ... 3 more items ],
        '/docs/modules/sitemap/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/feature-guide/head-and-noindex/',
             title: 'Head and noindex',
             excerpt:
              'Get a clean, correct <head> on every page with one placeholder and a settings file. You write the placeholder, and Baseline writes everything that goes in it.' },
           { url: '/docs/feature-guide/sitemaps-and-drafts/',
             title: 'Sitemaps and drafts',
             excerpt:
              'Control which pages end up in your sitemap, and let work-in-progress pages live alongside published ones without leaking into production. Those are separate switches, and knowing which one you want is most of the work.' },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' },
           { url: '/docs/modules/multilang/',
             title: 'The multilang module: hreflang and locales',
             excerpt: "INTERNAL_KEY: '_multilang'" },
           { url: '/docs/modules/navigator/',
             title: 'The navigator module and debug page',
             excerpt: "INTERNAL_KEY: '_navigator'" } ],
        '/docs/core-reference/page-context/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/site-settings/',
             title: 'Site settings',
             excerpt:
              'settings is the first argument to baseline(). It carries site identity: title, tagline, canonical URL, indexability, languages, and any extra <head> items you want injected on every page.' },
           { url: '/docs/core-reference/seo-graph/',
             title: 'The SEO graph: canonical, Open Graph, JSON-LD',
             excerpt:
              'A resolved per-page object: the canonical URL, the Open Graph and Twitter projections, and a JSON-LD @graph. Built once during the data cascade, cached, and read again at transform-time when the head module emits the tags.' },
           { url: '/docs/core-reference/content-graph/',
             title: 'Content graph',
             excerpt:
              "A pre-rendered map of every page's headings, images, links, and excerpts, plus the links between pages. Built once before Eleventy's main build by a programmatic dry-run of the site; cached at .cache/_baseline/content-graph.json. Templates read it through cascade keys; modules read it through coreContext.runtime.contentGraph." },
           { url: '/docs/core-reference/internals/',
             title: 'Baseline internals: registry, stores, seams',
             excerpt:
              'You can run Baseline without knowing any of this. The page exists for the moments when you peek into _snapshot, watch a console log, or follow a stack trace into the plugin and want to know what each piece is called.' },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." },
           { url: '/docs/concept/content-organisation/',
             title: 'Content organisation',
             excerpt: 'Every page on a Baseline site has two layers behind it.' },
           ... 5 more items ],
        '/docs/core-reference/filters/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/how-to/translate-ui-strings/',
             title: 'Translate UI strings',
             excerpt:
              'Every site accumulates labels that live in templates: "Read more", "Back to top", the words around a form. Reach for this when you want them in one place instead of scattered across partials, or when a second language means each one now needs two spellings.' },
           { url: '/docs/feature-guide/assets-pipeline/',
             title: 'Assets pipeline quickstart',
             excerpt:
              "Ship CSS and JS through Baseline's assets module. One entry point each, compiled on every build, plus a pair of filters for the times you want the bytes in the page rather than in a file." },
           { url: '/docs/feature-guide/debugging-navigator/',
             title: 'Debugging with the navigator',
             excerpt:
              "When something looks off in a build, Baseline's debug helpers let you see the data Eleventy is working with from inside any template. By the end you'll know which helper to reach for, when, and how to keep them out of production." },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/modules/assets/',
             title: 'The assets module: PostCSS and esbuild',
             excerpt: "INTERNAL_KEY: '_assets'" },
           { url: '/docs/modules/multilang/',
             title: 'The multilang module: hreflang and locales',
             excerpt: "INTERNAL_KEY: '_multilang'" },
           { url: '/docs/modules/navigator/',
             title: 'The navigator module and debug page',
             excerpt: "INTERNAL_KEY: '_navigator'" },
           ... 2 more items ],
        '/docs/core-reference/globals/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/tutorial/add-a-layout/',
             title: 'Add a layout and a stylesheet',
             excerpt:
              'Your pages render, and they arrive with nothing around them: no <head>, no navigation, nothing to look at. This page gives them a shell. It is also where two things you set up earlier finally reach a file.' },
           { url: '/docs/how-to/customise-assets-pipeline/',
             title: 'Customise the assets pipeline',
             excerpt:
              'When the fallback configs in the assets module are not enough, drop your own in. PostCSS for CSS, esbuild for JS. The module picks them up.' },
           { url: '/docs/feature-guide/debugging-navigator/',
             title: 'Debugging with the navigator',
             excerpt:
              "When something looks off in a build, Baseline's debug helpers let you see the data Eleventy is working with from inside any template. By the end you'll know which helper to reach for, when, and how to keep them out of production." },
           { url: '/docs/feature-guide/page-breaks/',
             title: 'Splitting a long page',
             excerpt:
              'Some pages get long enough that a reader loses their place in them. A marker in the body splits one source file into several pages, each with its own URL, and hands your layout the pieces to draw links from.' },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/page-context/',
             title: 'Page context',
             excerpt:
              "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data." },
           { url: '/docs/core-reference/seo-graph/',
             title: 'The SEO graph: canonical, Open Graph, JSON-LD',
             excerpt:
              'A resolved per-page object: the canonical URL, the Open Graph and Twitter projections, and a JSON-LD @graph. Built once during the data cascade, cached, and read again at transform-time when the head module emits the tags.' },
           { url: '/docs/core-reference/content-graph/',
             title: 'Content graph',
             excerpt:
              "A pre-rendered map of every page's headings, images, links, and excerpts, plus the links between pages. Built once before Eleventy's main build by a programmatic dry-run of the site; cached at .cache/_baseline/content-graph.json. Templates read it through cascade keys; modules read it through coreContext.runtime.contentGraph." },
           ... 9 more items ],
        '/docs/core-reference/image-shortcode/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/how-to/image-transform/',
             title: 'Image transform',
             excerpt:
              "The image transform is eleventy-img's, not Baseline's. The two run side by side: eleventyImageTransformPlugin rewrites <img> and <picture> into responsive markup with generated assets and caching, and you add it to your config yourself." },
           { url: '/docs/how-to/persist-the-build-cache/',
             title: 'Persist the build cache on your host',
             excerpt:
              'Encoding images is the slowest thing in most Baseline builds, and a rendition never changes once it exists. Locally the cache takes care of itself. A CI runner starts from a clean checkout every time, so unless the host is told to keep the cache, every deploy pays the full encode again.' },
           { url: '/docs/feature-guide/image-shortcode-basics/',
             title: 'Image shortcode basics',
             excerpt: 'Render a responsive image with one line of template code.' },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/site-settings/',
             title: 'Site settings',
             excerpt:
              'settings is the first argument to baseline(). It carries site identity: title, tagline, canonical URL, indexability, languages, and any extra <head> items you want injected on every page.' },
           { url: '/docs/core-reference/image-shortcode/',
             title: 'Image shortcode',
             excerpt:
              "The shortcode is Baseline's; the underlying engine is @11ty/eleventy-img. The two halves split cleanly:" },
           { url: '/docs/core-reference/content-helpers/',
             title: 'Content helpers',
             excerpt:
              'The syntax Baseline adds to your Markdown, and the front-matter key that keeps a page out of a build: drafts, wikilinks, automatic heading ids, attributes on any element, and images.' },
           { url: '/docs/modules/assets/',
             title: 'The assets module: PostCSS and esbuild',
             excerpt: "INTERNAL_KEY: '_assets'" },
           ... 4 more items ],
        '/docs/core-reference/content-helpers/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/feature-guide/page-breaks/',
             title: 'Splitting a long page',
             excerpt:
              'Some pages get long enough that a reader loses their place in them. A marker in the body splits one source file into several pages, each with its own URL, and hands your layout the pieces to draw links from.' },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' },
           { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' },
           { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' },
           { url: '/docs/integrations/integrate-eleventy-base-blog/6/',
             title: 'Integrate Baseline with Eleventy Base Blog',
             excerpt:
              'A loose end left behind by the deletions on the config page, and one that builds cleanly while being wrong.' },
           { url: '/release-notes/0-1-0-next-46/',
             title: 'v0.1.0-next.46',
             excerpt:
              'The biggest release so far, and it has one new feature and a lot of sharpening. The feature is page breaks: a comment in the body turns one file into several pages, an affordance WordPress has had for twenty years and static site generators have not.' } ],
        '/docs/concept/architecture-snapshot/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/core-reference/content-graph/',
             title: 'Content graph',
             excerpt:
              "A pre-rendered map of every page's headings, images, links, and excerpts, plus the links between pages. Built once before Eleventy's main build by a programmatic dry-run of the site; cached at .cache/_baseline/content-graph.json. Templates read it through cascade keys; modules read it through coreContext.runtime.contentGraph." },
           { url: '/docs/concept/',
             title: 'Concepts: the decisions behind Baseline',
             excerpt:
              'How Baseline works is the mental model behind the plugin. Project structure is the small set of rules that keep Baseline out of your way, and content organisation is the page-data pattern those rules assume.' },
           { url: '/docs/concept/how-baseline-works/',
             title: 'How Baseline works',
             excerpt:
              'Baseline makes the structural decisions Eleventy leaves open and wires them into a small set of feature modules that work together. This page is the mental model: what Baseline handles, what stays yours, and how you configure it.' } ],
        '/docs/integrations/integrate-eleventy-base-blog/':
         [ { url: '/docs/introduction/what-is-baseline/',
             title: 'What is Baseline?',
             excerpt:
              'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
           { url: '/docs/integrations/',
             title: 'Integrations',
             excerpt:
              'Baseline expects a directory contract and a head placeholder, and a project that already exists has its own answers to both. These guides work through the reconciliation one starter at a time: what moves, what gets deleted, and what you keep.' },
           { url: '/docs/integrations/integrate-eleventy-excellent/10/',
             title: 'Integrate Baseline with Eleventy Excellent',
             excerpt:
              'Everything dead has been left in the tree until now, which makes this one pass you can verify in a single check. Confirm zero inbound references for each file before it goes.' } ],
        '/docs/how-to/deployment-checks/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/simple-baseline-site/',
             title: 'Create the project',
             excerpt:
              "Let's start by creating the project folder. Everything after this happens in there." },
           { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/how-to/deploy-under-a-subpath/',
             title: 'Deploy under a subpath',
             excerpt:
              'Serve a Baseline site from a subpath like /docs/ without breaking links, asset paths, canonical URLs, or the sitemap on the way.' },
           { url: '/docs/how-to/build-scripts-and-cleanup/',
             title: 'Build scripts and cleanup',
             excerpt:
              `A small set of npm scripts that take Baseline's dev and build commands from "works on my machine" to predictable across platforms. Three helpers do the work: rimraf for cleanup, npm-run-all for sequencing, and cross-env for portable env vars.` },
           { url: '/docs/feature-guide/head-and-noindex/',
             title: 'Head and noindex',
             excerpt:
              'Get a clean, correct <head> on every page with one placeholder and a settings file. You write the placeholder, and Baseline writes everything that goes in it.' },
           { url: '/docs/feature-guide/sitemaps-and-drafts/',
             title: 'Sitemaps and drafts',
             excerpt:
              'Control which pages end up in your sitemap, and let work-in-progress pages live alongside published ones without leaking into production. Those are separate switches, and knowing which one you want is most of the work.' },
           { url: '/docs/integrations/integrate-eleventy-base-blog/2/',
             title: 'Integrate Baseline with Eleventy Base Blog',
             excerpt:
              "The starter ignores _site/, which is the only output directory it knows about. Baseline's output is dist/, so until you do this every build is stageable. Nothing warns you. Do it before anything can generate output rather than at the point the output moves." } ],
        '/docs/core-reference/site-settings/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/wire-in-baseline/',
             title: 'Wire in Baseline',
             excerpt:
              'This is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.' },
           { url: '/docs/tutorial/multilingual-baseline-site/2/',
             title: 'Build a multilingual site',
             excerpt:
              "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default." },
           { url: '/docs/how-to/deployment-checks/',
             title: 'Deployment checks',
             excerpt:
              'Keep your URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak localhost to the live site. The mechanics are mostly Eleventy and environment variables; this page is the small set of habits that keep them honest.' },
           { url: '/docs/feature-guide/image-shortcode-basics/',
             title: 'Image shortcode basics',
             excerpt: 'Render a responsive image with one line of template code.' },
           { url: '/docs/feature-guide/head-and-noindex/',
             title: 'Head and noindex',
             excerpt:
              'Get a clean, correct <head> on every page with one placeholder and a settings file. You write the placeholder, and Baseline writes everything that goes in it.' },
           { url: '/docs/feature-guide/custom-schema/',
             title: 'Custom schema with schema.pieces',
             excerpt:
              "Baseline assembles a complete JSON-LD graph for every page on its own: a WebSite, your Organization or Person identity, the WebPage, an Article where relevant, breadcrumbs, and the image and translation references, all wired together with stable @ids. That spine is automatic. When a page needs something the spine doesn't model, a Service, an FAQPage, a Product, an Event, it comes in through one seam: schema.pieces." },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/page-context/',
             title: 'Page context',
             excerpt:
              "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data." },
           ... 12 more items ],
        '/docs/core-reference/plugin-entrypoint/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/how-to/deploy-under-a-subpath/',
             title: 'Deploy under a subpath',
             excerpt:
              'Serve a Baseline site from a subpath like /docs/ without breaking links, asset paths, canonical URLs, or the sitemap on the way.' },
           { url: '/docs/how-to/multilingual-index/',
             title: 'Multilingual index',
             excerpt:
              "A small index page that groups every page on the site by language. Useful when you have a multilingual site and want a single landing point that fans out to each language's content." },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/site-settings/',
             title: 'Site settings',
             excerpt:
              'settings is the first argument to baseline(). It carries site identity: title, tagline, canonical URL, indexability, languages, and any extra <head> items you want injected on every page.' },
           { url: '/docs/core-reference/config-export/',
             title: 'Config export',
             excerpt:
              "Baseline ships a directory contract as a named export. Eleventy's modules expect specific input, output, includes, and data folders; Baseline's modules expect two more (assets, public)." },
           { url: '/docs/core-reference/filters/',
             title: 'Filters reference: names and availability',
             excerpt:
              'Eleventy filters Baseline registers. Some are always available; the rest come on with the module that registers them.' },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/docs/core-reference/image-shortcode/',
             title: 'Image shortcode',
             excerpt:
              "The shortcode is Baseline's; the underlying engine is @11ty/eleventy-img. The two halves split cleanly:" },
           ... 4 more items ],
        '/docs/concept/how-baseline-works/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/wire-in-baseline/',
             title: 'Wire in Baseline',
             excerpt:
              'This is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.' },
           { url: '/docs/concept/',
             title: 'Concepts: the decisions behind Baseline',
             excerpt:
              'How Baseline works is the mental model behind the plugin. Project structure is the small set of rules that keep Baseline out of your way, and content organisation is the page-data pattern those rules assume.' },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' } ],
        '/docs/core-reference/config-export/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/wire-in-baseline/',
             title: 'Wire in Baseline',
             excerpt:
              'This is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.' },
           { url: '/docs/how-to/deploy-under-a-subpath/',
             title: 'Deploy under a subpath',
             excerpt:
              'Serve a Baseline site from a subpath like /docs/ without breaking links, asset paths, canonical URLs, or the sitemap on the way.' },
           { url: '/docs/how-to/build-scripts-and-cleanup/',
             title: 'Build scripts and cleanup',
             excerpt:
              `A small set of npm scripts that take Baseline's dev and build commands from "works on my machine" to predictable across platforms. Three helpers do the work: rimraf for cleanup, npm-run-all for sequencing, and cross-env for portable env vars.` },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/internals/',
             title: 'Baseline internals: registry, stores, seams',
             excerpt:
              'You can run Baseline without knowing any of this. The page exists for the moments when you peek into _snapshot, watch a console log, or follow a stack trace into the plugin and want to know what each piece is called.' },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/docs/concept/how-baseline-works/',
             title: 'How Baseline works',
             excerpt:
              'Baseline makes the structural decisions Eleventy leaves open and wires them into a small set of feature modules that work together. This page is the mental model: what Baseline handles, what stays yours, and how you configure it.' },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." },
           ... 3 more items ],
        '/docs/concept/project-structure/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/set-up-the-project/',
             title: 'Lay out the folders',
             excerpt:
              'Baseline has an opinion about where things live. src/ for what you write, dist/ for what gets built, and a handful of folders in between that it finds by name.' },
           { url: '/docs/tutorial/wire-in-baseline/',
             title: 'Wire in Baseline',
             excerpt:
              'This is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.' },
           { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/how-to/deployment-checks/',
             title: 'Deployment checks',
             excerpt:
              'Keep your URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak localhost to the live site. The mechanics are mostly Eleventy and environment variables; this page is the small set of habits that keep them honest.' },
           { url: '/docs/core-reference/config-export/',
             title: 'Config export',
             excerpt:
              "Baseline ships a directory contract as a named export. Eleventy's modules expect specific input, output, includes, and data folders; Baseline's modules expect two more (assets, public)." },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/docs/concept/',
             title: 'Concepts: the decisions behind Baseline',
             excerpt:
              'How Baseline works is the mental model behind the plugin. Project structure is the small set of rules that keep Baseline out of your way, and content organisation is the page-data pattern those rules assume.' },
           { url: '/docs/concept/how-baseline-works/',
             title: 'How Baseline works',
             excerpt:
              'Baseline makes the structural decisions Eleventy leaves open and wires them into a small set of feature modules that work together. This page is the mental model: what Baseline handles, what stays yours, and how you configure it.' },
           { url: '/docs/concept/content-organisation/',
             title: 'Content organisation',
             excerpt: 'Every page on a Baseline site has two layers behind it.' } ],
        '/docs/tutorial/multilingual-baseline-site/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/tutorial/add-a-layout/',
             title: 'Add a layout and a stylesheet',
             excerpt:
              'Your pages render, and they arrive with nothing around them: no <head>, no navigation, nothing to look at. This page gives them a shell. It is also where two things you set up earlier finally reach a file.' },
           { url: '/docs/tutorial/multilingual-baseline-site/2/',
             title: 'Build a multilingual site',
             excerpt:
              "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default." },
           { url: '/docs/tutorial/multilingual-baseline-site/3/',
             title: 'Build a multilingual site',
             excerpt:
              'The contentDir entries you just wrote record English content as living in content/en/ and Dutch in content/nl/. Nothing enforces that, but the point of writing it down is to follow it, so the content moves:' },
           { url: '/docs/tutorial/multilingual-baseline-site/4/',
             title: 'Build a multilingual site',
             excerpt:
              'src/_includes/layouts/base.njk needs no changes, and one line in it is the reason. You wrote lang="{{ lang or settings.defaultLanguage }}" two pages ago, when both halves resolved to the same value and the fallback looked like belt and braces. It stops looking that way now. The two files you just wrote put a lang on everything under en/ and nl/, so each page declares its own language and Dutch pages stop claiming to be English, while the homepage takes the other branch and falls back. Both halves of that line are now load-bearing, on the same site.' },
           { url: '/docs/tutorial/multilingual-baseline-site/5/',
             title: 'Build a multilingual site',
             excerpt:
              "Visit / for English, since default-language permalinks are unprefixed, and /nl/ for Dutch. View source on either one and you should find all three alternates, en, nl and x-default, which Baseline emits because both pages share translationKey: 'home'. Then open /about/ and find none, for the reason above." },
           { url: '/docs/how-to/multilingual-index/',
             title: 'Multilingual index',
             excerpt:
              "A small index page that groups every page on the site by language. Useful when you have a multilingual site and want a single landing point that fans out to each language's content." },
           { url: '/docs/how-to/translate-ui-strings/',
             title: 'Translate UI strings',
             excerpt:
              'Every site accumulates labels that live in templates: "Read more", "Back to top", the words around a form. Reach for this when you want them in one place instead of scattered across partials, or when a second language means each one now needs two spellings.' },
           { url: '/docs/feature-guide/head-and-noindex/',
             title: 'Head and noindex',
             excerpt:
              'Get a clean, correct <head> on every page with one placeholder and a settings file. You write the placeholder, and Baseline writes everything that goes in it.' },
           ... 2 more items ],
        '/docs/feature-guide/head-and-noindex/':
         [ { url: '/docs/introduction/quickstart/',
             title: 'Quickstart',
             excerpt:
              'The minimum working setup. A checklist; for a guided walk with reasoning, see the simple site tutorial.' },
           { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' },
           { url: '/docs/feature-guide/sitemaps-and-drafts/',
             title: 'Sitemaps and drafts',
             excerpt:
              'Control which pages end up in your sitemap, and let work-in-progress pages live alongside published ones without leaking into production. Those are separate switches, and knowing which one you want is most of the work.' },
           { url: '/docs/modules/head/',
             title: 'The head module and baseline-head',
             excerpt: "INTERNAL_KEY: '_head'" } ],
        '/docs/tutorial/set-up-the-project/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' } ],
        '/docs/tutorial/wire-in-baseline/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/tutorial/multilingual-baseline-site/2/',
             title: 'Build a multilingual site',
             excerpt:
              "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default." },
           { url: '/docs/core-reference/config-export/',
             title: 'Config export',
             excerpt:
              "Baseline ships a directory contract as a named export. Eleventy's modules expect specific input, output, includes, and data folders; Baseline's modules expect two more (assets, public)." } ],
        '/docs/tutorial/front-matter-and-slugs/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' } ],
        '/docs/tutorial/writing-pages/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/tutorial/multilingual-baseline-site/3/',
             title: 'Build a multilingual site',
             excerpt:
              'The contentDir entries you just wrote record English content as living in content/en/ and Dutch in content/nl/. Nothing enforces that, but the point of writing it down is to follow it, so the content moves:' } ],
        '/docs/tutorial/posts-and-collections/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' } ],
        '/docs/tutorial/add-a-layout/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/tutorial/multilingual-baseline-site/3/',
             title: 'Build a multilingual site',
             excerpt:
              'The contentDir entries you just wrote record English content as living in content/en/ and Dutch in content/nl/. Nothing enforces that, but the point of writing it down is to follow it, so the content moves:' },
           { url: '/docs/tutorial/multilingual-baseline-site/4/',
             title: 'Build a multilingual site',
             excerpt:
              'src/_includes/layouts/base.njk needs no changes, and one line in it is the reason. You wrote lang="{{ lang or settings.defaultLanguage }}" two pages ago, when both halves resolved to the same value and the fallback looked like belt and braces. It stops looking that way now. The two files you just wrote put a lang on everything under en/ and nl/, so each page declares its own language and Dutch pages stop claiming to be English, while the homepage takes the other branch and falls back. Both halves of that line are now load-bearing, on the same site.' } ],
        '/docs/tutorial/run-and-build/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/tutorial/posts-and-collections/',
             title: 'Posts and collections',
             excerpt:
              'A post is not a page with a different word on it. It belongs to a collection, so other pages can ask for it, and it gets its own address rule so posts sit together under one segment.' },
           { url: '/docs/tutorial/multilingual-baseline-site/5/',
             title: 'Build a multilingual site',
             excerpt:
              "Visit / for English, since default-language permalinks are unprefixed, and /nl/ for Dutch. View source on either one and you should find all three alternates, en, nl and x-default, which Baseline emits because both pages share translationKey: 'home'. Then open /about/ and find none, for the reason above." } ],
        '/docs/tutorial/where-to-go-next/':
         [ { url: '/docs/tutorial/',
             title: 'Tutorials: build a site from an empty folder',
             excerpt:
              'The shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.' },
           { url: '/docs/tutorial/multilingual-baseline-site/5/',
             title: 'Build a multilingual site',
             excerpt:
              "Visit / for English, since default-language permalinks are unprefixed, and /nl/ for Dutch. View source on either one and you should find all three alternates, en, nl and x-default, which Baseline emits because both pages share translationKey: 'home'. Then open /about/ and find none, for the reason above." } ],
        '/docs/tutorial/multilingual-baseline-site/2/':
         [ { url: '/docs/tutorial/multilingual-baseline-site/',
             title: 'Build a multilingual site',
             excerpt:
              "Add a second language to a Baseline site, with everything you'd expect: per-language URLs, hreflang on every page, a sitemap for each language plus an index." },
           { url: '/docs/tutorial/multilingual-baseline-site/3/',
             title: 'Build a multilingual site',
             excerpt:
              'The contentDir entries you just wrote record English content as living in content/en/ and Dutch in content/nl/. Nothing enforces that, but the point of writing it down is to follow it, so the content moves:' },
           { url: '/docs/tutorial/multilingual-baseline-site/4/',
             title: 'Build a multilingual site',
             excerpt:
              'src/_includes/layouts/base.njk needs no changes, and one line in it is the reason. You wrote lang="{{ lang or settings.defaultLanguage }}" two pages ago, when both halves resolved to the same value and the fallback looked like belt and braces. It stops looking that way now. The two files you just wrote put a lang on everything under en/ and nl/, so each page declares its own language and Dutch pages stop claiming to be English, while the homepage takes the other branch and falls back. Both halves of that line are now load-bearing, on the same site.' },
           { url: '/docs/tutorial/multilingual-baseline-site/5/',
             title: 'Build a multilingual site',
             excerpt:
              "Visit / for English, since default-language permalinks are unprefixed, and /nl/ for Dutch. View source on either one and you should find all three alternates, en, nl and x-default, which Baseline emits because both pages share translationKey: 'home'. Then open /about/ and find none, for the reason above." } ],
        '/docs/tutorial/multilingual-baseline-site/3/':
         [ { url: '/docs/tutorial/multilingual-baseline-site/',
             title: 'Build a multilingual site',
             excerpt:
              "Add a second language to a Baseline site, with everything you'd expect: per-language URLs, hreflang on every page, a sitemap for each language plus an index." },
           { url: '/docs/tutorial/multilingual-baseline-site/2/',
             title: 'Build a multilingual site',
             excerpt:
              "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default." },
           { url: '/docs/tutorial/multilingual-baseline-site/4/',
             title: 'Build a multilingual site',
             excerpt:
              'src/_includes/layouts/base.njk needs no changes, and one line in it is the reason. You wrote lang="{{ lang or settings.defaultLanguage }}" two pages ago, when both halves resolved to the same value and the fallback looked like belt and braces. It stops looking that way now. The two files you just wrote put a lang on everything under en/ and nl/, so each page declares its own language and Dutch pages stop claiming to be English, while the homepage takes the other branch and falls back. Both halves of that line are now load-bearing, on the same site.' },
           { url: '/docs/tutorial/multilingual-baseline-site/5/',
             title: 'Build a multilingual site',
             excerpt:
              "Visit / for English, since default-language permalinks are unprefixed, and /nl/ for Dutch. View source on either one and you should find all three alternates, en, nl and x-default, which Baseline emits because both pages share translationKey: 'home'. Then open /about/ and find none, for the reason above." } ],
        '/docs/tutorial/multilingual-baseline-site/4/':
         [ { url: '/docs/tutorial/multilingual-baseline-site/',
             title: 'Build a multilingual site',
             excerpt:
              "Add a second language to a Baseline site, with everything you'd expect: per-language URLs, hreflang on every page, a sitemap for each language plus an index." },
           { url: '/docs/tutorial/multilingual-baseline-site/2/',
             title: 'Build a multilingual site',
             excerpt:
              "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default." },
           { url: '/docs/tutorial/multilingual-baseline-site/3/',
             title: 'Build a multilingual site',
             excerpt:
              'The contentDir entries you just wrote record English content as living in content/en/ and Dutch in content/nl/. Nothing enforces that, but the point of writing it down is to follow it, so the content moves:' },
           { url: '/docs/tutorial/multilingual-baseline-site/5/',
             title: 'Build a multilingual site',
             excerpt:
              "Visit / for English, since default-language permalinks are unprefixed, and /nl/ for Dutch. View source on either one and you should find all three alternates, en, nl and x-default, which Baseline emits because both pages share translationKey: 'home'. Then open /about/ and find none, for the reason above." } ],
        '/docs/tutorial/multilingual-baseline-site/5/':
         [ { url: '/docs/tutorial/multilingual-baseline-site/',
             title: 'Build a multilingual site',
             excerpt:
              "Add a second language to a Baseline site, with everything you'd expect: per-language URLs, hreflang on every page, a sitemap for each language plus an index." },
           { url: '/docs/tutorial/multilingual-baseline-site/2/',
             title: 'Build a multilingual site',
             excerpt:
              "Open eleventy.config.js and pass an options object as baseline()'s second argument. Until now it has had settings only, which left every option at its default." },
           { url: '/docs/tutorial/multilingual-baseline-site/3/',
             title: 'Build a multilingual site',
             excerpt:
              'The contentDir entries you just wrote record English content as living in content/en/ and Dutch in content/nl/. Nothing enforces that, but the point of writing it down is to follow it, so the content moves:' },
           { url: '/docs/tutorial/multilingual-baseline-site/4/',
             title: 'Build a multilingual site',
             excerpt:
              'src/_includes/layouts/base.njk needs no changes, and one line in it is the reason. You wrote lang="{{ lang or settings.defaultLanguage }}" two pages ago, when both halves resolved to the same value and the fallback looked like belt and braces. It stops looking that way now. The two files you just wrote put a lang on everything under en/ and nl/, so each page declares its own language and Dutch pages stop claiming to be English, while the homepage takes the other branch and falls back. Both halves of that line are now load-bearing, on the same site.' } ],
        '/docs/feature-guide/assets-pipeline/':
         [ { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/how-to/customise-assets-pipeline/',
             title: 'Customise the assets pipeline',
             excerpt:
              'When the fallback configs in the assets module are not enough, drop your own in. PostCSS for CSS, esbuild for JS. The module picks them up.' },
           { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' },
           { url: '/docs/modules/assets/',
             title: 'The assets module: PostCSS and esbuild',
             excerpt: "INTERNAL_KEY: '_assets'" },
           { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' },
           { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' },
           { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' } ],
        '/docs/feature-guide/sitemaps-and-drafts/':
         [ { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' },
           { url: '/docs/feature-guide/debugging-navigator/',
             title: 'Debugging with the navigator',
             excerpt:
              "When something looks off in a build, Baseline's debug helpers let you see the data Eleventy is working with from inside any template. By the end you'll know which helper to reach for, when, and how to keep them out of production." },
           { url: '/docs/core-reference/content-helpers/',
             title: 'Content helpers',
             excerpt:
              'The syntax Baseline adds to your Markdown, and the front-matter key that keeps a page out of a build: drafts, wikilinks, automatic heading ids, attributes on any element, and images.' },
           { url: '/docs/modules/sitemap/',
             title: 'The sitemap module: drafts and exclusions',
             excerpt: "INTERNAL_KEY: '_sitemap'" } ],
        '/docs/how-to/deploy-under-a-subpath/':
         [ { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/how-to/multilingual-index/',
             title: 'Multilingual index',
             excerpt:
              "A small index page that groups every page on the site by language. Useful when you have a multilingual site and want a single landing point that fans out to each language's content." },
           { url: '/docs/how-to/deployment-checks/',
             title: 'Deployment checks',
             excerpt:
              'Keep your URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak localhost to the live site. The mechanics are mostly Eleventy and environment variables; this page is the small set of habits that keep them honest.' },
           { url: '/docs/feature-guide/sitemaps-and-drafts/',
             title: 'Sitemaps and drafts',
             excerpt:
              'Control which pages end up in your sitemap, and let work-in-progress pages live alongside published ones without leaking into production. Those are separate switches, and knowing which one you want is most of the work.' },
           { url: '/docs/core-reference/site-settings/',
             title: 'Site settings',
             excerpt:
              'settings is the first argument to baseline(). It carries site identity: title, tagline, canonical URL, indexability, languages, and any extra <head> items you want injected on every page.' },
           { url: '/docs/core-reference/config-export/',
             title: 'Config export',
             excerpt:
              "Baseline ships a directory contract as a named export. Eleventy's modules expect specific input, output, includes, and data folders; Baseline's modules expect two more (assets, public)." },
           { url: '/docs/integrations/integrate-eleventy-base-blog/6/',
             title: 'Integrate Baseline with Eleventy Base Blog',
             excerpt:
              'A loose end left behind by the deletions on the config page, and one that builds cleanly while being wrong.' } ],
        '/docs/how-to/translate-ui-strings/':
         [ { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' } ],
        '/docs/concept/content-organisation/':
         [ { url: '/docs/tutorial/where-to-go-next/',
             title: 'Where to go next',
             excerpt:
              'An empty folder is now a site with a homepage, a page, a post and two languages, which is deliberately thin. Every part of it has a guide that goes further on the topic.' },
           { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/feature-guide/page-breaks/',
             title: 'Splitting a long page',
             excerpt:
              'Some pages get long enough that a reader loses their place in them. A marker in the body splits one source file into several pages, each with its own URL, and hands your layout the pieces to draw links from.' },
           { url: '/docs/core-reference/content-helpers/',
             title: 'Content helpers',
             excerpt:
              'The syntax Baseline adds to your Markdown, and the front-matter key that keeps a page out of a build: drafts, wikilinks, automatic heading ids, attributes on any element, and images.' },
           { url: '/docs/concept/',
             title: 'Concepts: the decisions behind Baseline',
             excerpt:
              'How Baseline works is the mental model behind the plugin. Project structure is the small set of rules that keep Baseline out of your way, and content organisation is the page-data pattern those rules assume.' },
           { url: '/docs/concept/how-baseline-works/',
             title: 'How Baseline works',
             excerpt:
              'Baseline makes the structural decisions Eleventy leaves open and wires them into a small set of feature modules that work together. This page is the mental model: what Baseline handles, what stays yours, and how you configure it.' },
           { url: '/docs/integrations/integrate-eleventy-base-blog/3/',
             title: 'Integrate Baseline with Eleventy Base Blog',
             excerpt:
              'Plain mv is fine. Git infers the renames from content similarity when you stage them.' } ],
        '/docs/how-to/customise-assets-pipeline/':
         [ { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/feature-guide/assets-pipeline/',
             title: 'Assets pipeline quickstart',
             excerpt:
              "Ship CSS and JS through Baseline's assets module. One entry point each, compiled on every build, plus a pair of filters for the times you want the bytes in the page rather than in a file." },
           { url: '/docs/concept/project-structure/',
             title: 'Project structure',
             excerpt:
              "The folder structure that keeps Baseline out of your way. If you've read what Baseline is and how Baseline works, you already have the shape. This page is the practical companion: where files go, which environment variables matter, and the few seams Baseline expects to own." },
           { url: '/docs/modules/assets/',
             title: 'The assets module: PostCSS and esbuild',
             excerpt: "INTERNAL_KEY: '_assets'" },
           { url: '/release-notes/0-1-0-next-46/',
             title: 'v0.1.0-next.46',
             excerpt:
              'The biggest release so far, and it has one new feature and a lot of sharpening. The feature is page breaks: a comment in the body turns one file into several pages, an affordance WordPress has had for twenty years and static site generators have not.' } ],
        '/docs/how-to/image-transform/':
         [ { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/feature-guide/image-shortcode-basics/',
             title: 'Image shortcode basics',
             excerpt: 'Render a responsive image with one line of template code.' },
           { url: '/docs/core-reference/content-helpers/',
             title: 'Content helpers',
             excerpt:
              'The syntax Baseline adds to your Markdown, and the front-matter key that keeps a page out of a build: drafts, wikilinks, automatic heading ids, attributes on any element, and images.' } ],
        '/docs/how-to/multilingual-index/':
         [ { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/modules/multilang/',
             title: 'The multilang module: hreflang and locales',
             excerpt: "INTERNAL_KEY: '_multilang'" } ],
        '/docs/how-to/build-scripts-and-cleanup/':
         [ { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/docs/how-to/deploy-under-a-subpath/',
             title: 'Deploy under a subpath',
             excerpt:
              'Serve a Baseline site from a subpath like /docs/ without breaking links, asset paths, canonical URLs, or the sitemap on the way.' },
           { url: '/docs/how-to/deployment-checks/',
             title: 'Deployment checks',
             excerpt:
              'Keep your URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak localhost to the live site. The mechanics are mostly Eleventy and environment variables; this page is the small set of habits that keep them honest.' } ],
        '/docs/how-to/persist-the-build-cache/':
         [ { url: '/docs/how-to/',
             title: 'How-to guides',
             excerpt:
              'Recipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.' },
           { url: '/release-notes/0-1-0-next-46/',
             title: 'v0.1.0-next.46',
             excerpt:
              'The biggest release so far, and it has one new feature and a lot of sharpening. The feature is page breaks: a comment in the body turns one file into several pages, an affordance WordPress has had for twenty years and static site generators have not.' } ],
        '/docs/feature-guide/image-shortcode-basics/':
         [ { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' } ],
        '/docs/feature-guide/debugging-navigator/':
         [ { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' },
           { url: '/docs/modules/navigator/',
             title: 'The navigator module and debug page',
             excerpt: "INTERNAL_KEY: '_navigator'" } ],
        '/docs/feature-guide/custom-schema/':
         [ { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' },
           { url: '/docs/core-reference/seo-graph/',
             title: 'The SEO graph: canonical, Open Graph, JSON-LD',
             excerpt:
              'A resolved per-page object: the canonical URL, the Open Graph and Twitter projections, and a JSON-LD @graph. Built once during the data cascade, cached, and read again at transform-time when the head module emits the tags.' },
           { url: '/release-notes/0-1-0-next-42/',
             title: 'v0.1.0-next.42',
             excerpt:
              'Mostly an SEO release. <baseline-head> now emits the structured data, social tags, and canonical link that used to be hand-wired per site. A handful of shapes changed to make room for it.' } ],
        '/docs/feature-guide/page-breaks/':
         [ { url: '/docs/feature-guide/',
             title: 'Feature guide',
             excerpt:
              'These feature guides build on each other. Starting from the simple site, you fill it in with assets, images and head extras, then sitemaps and drafts. The last three stand apart: debugging is what you reach for when something is off, custom schema is a tour of a seam rather than a walkthrough, and splitting a long page is a content job rather than a configuration one.' },
           { url: '/release-notes/0-1-0-next-46/',
             title: 'v0.1.0-next.46',
             excerpt:
              'The biggest release so far, and it has one new feature and a lot of sharpening. The feature is page breaks: a comment in the body turns one file into several pages, an affordance WordPress has had for twenty years and static site generators have not.' } ],
        '/docs/core-reference/seo-graph/':
         [ { url: '/docs/feature-guide/custom-schema/',
             title: 'Custom schema with schema.pieces',
             excerpt:
              "Baseline assembles a complete JSON-LD graph for every page on its own: a WebSite, your Organization or Person identity, the WebPage, an Article where relevant, breadcrumbs, and the image and translation references, all wired together with stable @ids. That spine is automatic. When a page needs something the spine doesn't model, a Service, an FAQPage, a Product, an Event, it comes in through one seam: schema.pieces." },
           { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/page-context/',
             title: 'Page context',
             excerpt:
              "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data." },
           { url: '/docs/core-reference/content-graph/',
             title: 'Content graph',
             excerpt:
              "A pre-rendered map of every page's headings, images, links, and excerpts, plus the links between pages. Built once before Eleventy's main build by a programmatic dry-run of the site; cached at .cache/_baseline/content-graph.json. Templates read it through cascade keys; modules read it through coreContext.runtime.contentGraph." },
           { url: '/docs/modules/head/',
             title: 'The head module and baseline-head',
             excerpt: "INTERNAL_KEY: '_head'" },
           { url: '/release-notes/0-1-0-next-42/',
             title: 'v0.1.0-next.42',
             excerpt:
              'Mostly an SEO release. <baseline-head> now emits the structured data, social tags, and canonical link that used to be hand-wired per site. A handful of shapes changed to make room for it.' },
           { url: '/docs/integrations/integrate-eleventy-excellent/10/',
             title: 'Integrate Baseline with Eleventy Excellent',
             excerpt:
              'Everything dead has been left in the tree until now, which makes this one pass you can verify in a single check. Confirm zero inbound references for each file before it goes.' } ],
        '':
         [ { url: '/docs/feature-guide/custom-schema/',
             title: 'Custom schema with schema.pieces',
             excerpt:
              "Baseline assembles a complete JSON-LD graph for every page on its own: a WebSite, your Organization or Person identity, the WebPage, an Article where relevant, breadcrumbs, and the image and translation references, all wired together with stable @ids. That spine is automatic. When a page needs something the spine doesn't model, a Service, an FAQPage, a Product, an Event, it comes in through one seam: schema.pieces." },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/modules/multilang/',
             title: 'The multilang module: hreflang and locales',
             excerpt: "INTERNAL_KEY: '_multilang'" } ],
        '/docs/core-reference/internals/':
         [ { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/core-reference/plugin-entrypoint/',
             title: 'Plugin entrypoint',
             excerpt:
              'The baseline() factory is the single entry point. You call it once in your Eleventy config callback with two arguments: site settings and module options. Everything below is what that call sets up.' },
           { url: '/docs/core-reference/config-export/',
             title: 'Config export',
             excerpt:
              "Baseline ships a directory contract as a named export. Eleventy's modules expect specific input, output, includes, and data folders; Baseline's modules expect two more (assets, public)." },
           { url: '/docs/core-reference/page-context/',
             title: 'Page context',
             excerpt:
              "A normalised per-page object: one cached snapshot of the values Baseline's modules need, built once during the data cascade and read again at transform-time without re-deriving from raw cascade data." },
           { url: '/docs/core-reference/seo-graph/',
             title: 'The SEO graph: canonical, Open Graph, JSON-LD',
             excerpt:
              'A resolved per-page object: the canonical URL, the Open Graph and Twitter projections, and a JSON-LD @graph. Built once during the data cascade, cached, and read again at transform-time when the head module emits the tags.' },
           { url: '/docs/core-reference/globals/',
             title: 'Global data keys and reserved namespaces',
             excerpt:
              'Baseline registers a handful of global data keys and a few Nunjucks globals. Most of them are reference targets you can read in templates; the rest are reserved namespaces that keep module-namespaced data from colliding with filters.' },
           { url: '/docs/concept/architecture-snapshot/',
             title: 'Architecture snapshot',
             excerpt: 'The plugin is built in three concentric layers, each with one strict job.' },
           { url: '/docs/modules/head/',
             title: 'The head module and baseline-head',
             excerpt: "INTERNAL_KEY: '_head'" },
           { url: '/docs/modules/navigator/',
             title: 'The navigator module and debug page',
             excerpt: "INTERNAL_KEY: '_navigator'" } ],
        '/docs/':
         [ { url: '/docs/core-reference/',
             title: 'Core reference',
             excerpt:
              'The inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.' },
           { url: '/docs/modules/',
             title: 'Modules reference',
             excerpt:
              'Baseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.' } ],
        '/navigator-core.html':
         [ { url: '/docs/modules/navigator/',
             title: 'The navigator module and debug page',
             excerpt: "INTERNAL_KEY: '_navigator'" } ],
        '/release-notes/0-1-0-next-46/':
         [ { url: '/release-notes/',
             title: 'Release notes',
             excerpt:
              'Baseline ships on a rolling release cadence (0.1.0-next.X). Things shift, break, and get renamed between releases. Pin a version when you build something serious on top.' } ],
        '/release-notes/0-1-0-next-45/':
         [ { url: '/release-notes/',
             title: 'Release notes',
             excerpt:
              'Baseline ships on a rolling release cadence (0.1.0-next.X). Things shift, break, and get renamed between releases. Pin a version when you build something serious on top.' } ],
        '/release-notes/0-1-0-next-44/':
         [ { url: '/release-notes/',
             title: 'Release notes',
             excerpt:
              'Baseline ships on a rolling release cadence (0.1.0-next.X). Things shift, break, and get renamed between releases. Pin a version when you build something serious on top.' } ],
        '/release-notes/0-1-0-next-43/':
         [ { url: '/release-notes/',
             title: 'Release notes',
             excerpt:
              'Baseline ships on a rolling release cadence (0.1.0-next.X). Things shift, break, and get renamed between releases. Pin a version when you build something serious on top.' } ],
        '/release-notes/0-1-0-next-42/':
         [ { url: '/release-notes/',
             title: 'Release notes',
             excerpt:
              'Baseline ships on a rolling release cadence (0.1.0-next.X). Things shift, break, and get renamed between releases. Pin a version when you build something serious on top.' } ],
        '/':
         [ { url: '/about/',
             title: 'About Eleventy Baseline',
             excerpt:
              "Baseline is a build framework for Eleventy: the structural decisions you'd otherwise wire up on every project, already made. Looking for the pitch? That's the homepage." } ],
        '/fr/':
         [ { url: '/fr/about/',
             title: "À propos d'Eleventy Baseline",
             excerpt:
              "Baseline est un build framework pour Eleventy : les décisions structurelles que vous câbleriez autrement sur chaque projet, déjà prises. Vous cherchez le pitch ? Il est sur la page d'accueil." } ],
        '/nl/':
         [ { url: '/nl/about/',
             title: 'Over Eleventy Baseline',
             excerpt:
              'Baseline is een build framework voor Eleventy: de structurele beslissingen die je anders in elk project opnieuw zou aansluiten, al genomen. Op zoek naar de pitch? Die staat op de homepage.' } ],
        '/release-notes/':
         [ { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' },
           { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' },
           { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' } ],
        '/about/':
         [ { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' } ],
        '/commercial-support/':
         [ { url: '/',
             title: 'Eleventy Baseline: a build framework for Eleventy',
             excerpt: 'Start building your site and skip the setup work.' } ],
        '/fr/about/':
         [ { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' } ],
        '/fr/commercial-support/':
         [ { url: '/fr/',
             title: 'Eleventy Baseline : un framework de build pour Eleventy',
             excerpt: 'Commencez à construire votre site sans vous occuper de la configuration.' } ],
        '/nl/about/':
         [ { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' } ],
        '/nl/commercial-support/':
         [ { url: '/nl/',
             title: 'Eleventy Baseline: een build framework voor Eleventy',
             excerpt: 'Start met het bouwen aan je site en sla de setup over.' } ],
        '/docs/integrations/integrate-eleventy-excellent/':
         [ { url: '/docs/integrations/',
             title: 'Integrations',
             excerpt:
              'Baseline expects a directory contract and a head placeholder, and a project that already exists has its own answers to both. These guides work through the reconciliation one starter at a time: what moves, what gets deleted, and what you keep.' } ] } },
  _sitemap: {},
  _snapshot:
   { contentMap: null,
     pageContext:
      { '/navigator-core.html':
         { site:
            { title: 'Eleventy Baseline',
              tagline: 'Start building your site and skip the setup work.',
              description: '',
              url: 'https://www.eleventy-baseline.dev/',
              noindex: false },
           page:
            { part: undefined,
              inputPath: './src/navigator-core.html',
              fileSlug: 'navigator-core',
              filePathStem: '/navigator-core',
              outputFileExtension: 'html',
              templateSyntax: 'njk',
              date: 2026-09-12T21:27:59.338Z,
              url: '/navigator-core.html',
              outputPath: './dist/navigator-core.html',
              lang: 'en',
              locale: 'en',
              translationKey: undefined,
              isDefaultLang: true,
              sitemap: [Object] },
           entry:
            { title: 'Navigator Core',
              description: 'Eleventy + Baseline internals',
              excerpt: undefined,
              slug: 'navigator-core',
              section: undefined,
              type: undefined,
              head: [Object],
              breadcrumbs: [] },
           query: { isHome: false },
           meta:
            { title: 'Navigator Core | Eleventy Baseline',
              description: 'Eleventy + Baseline internals',
              canonical: undefined,
              robots: 'noindex, nofollow',
              noindex: true },
           render: { generator: 'Eleventy v3.1.6' },
           head: { link: [Array], script: [Array], style: [Array], meta: [Array] } } },
     seoGraph:
      { '/navigator-core.html':
         { schema: [ [Object], [Object], [Object], [Object], [Object] ],
           openGraph:
            { title: 'Navigator Core',
              type: 'website',
              url: 'https://www.eleventy-baseline.dev/navigator-core.html',
              locale: 'en',
              description: 'Eleventy + Baseline internals',
              siteName: 'Eleventy Baseline',
              image: 'https://www.eleventy-baseline.dev/og.jpg',
              imageAlt: 'Eleventy Baseline',
              imageWidth: 1200,
              imageHeight: 630 },
           twitter: { card: 'summary_large_image' } } } },
  _segments: {},
  eleventyComputed:
   { _pagebreak: [Function (anonymous)],
     _pageContext: [Function (anonymous)],
     _seoGraph: [Function (anonymous)],
     _node: [Function (anonymous)],
     _backlinks: [Function (anonymous)],
     _outgoing: [Function (anonymous)],
     page:
      { lang: [Function (anonymous)],
        locale: [Function (anonymous)],
        translationKey: [Function (anonymous)],
        isDefaultLang: [Function (anonymous)],
        translations: [Function (anonymous)],
        sitemap: [Function (anonymous)] },
     _snapshot: [Function (anonymous)] },
  eleventy:
   { version: '3.1.6',
     generator: 'Eleventy v3.1.6',
     env:
      { source: 'cli',
        runMode: 'build',
        config: '/opt/build/repo/eleventy.config.js',
        root: '/opt/build/repo' },
     directories:
      { input: './src/',
        inputFile: undefined,
        inputGlob: undefined,
        data: './src/_data/',
        includes: './src/_includes/',
        layouts: undefined,
        output: './dist/' } },
  pkg:
   { name: 'eleventy-baseline-docs',
     version: '1.0.0',
     description: 'An experimental Swiss army knife toolkit for Eleventy',
     main: 'index.js',
     type: 'module',
     engines: { node: '>=22' },
     scripts:
      { test: 'vitest run',
        start: 'npm-run-all clean dev',
        'start-next': 'npm-run-all clean dev-next',
        clean: 'rimraf dist/',
        dev: 'eleventy --serve',
        'dev-next': 'eleventy --config=eleventy.config.next.js --serve',
        build: 'npm-run-all clean build:eleventy build:pagefind',
        'build-next': 'npm-run-all clean build:eleventy-next',
        'build:eleventy': 'cross-env ELEVENTY_ENV=production eleventy',
        'build:pagefind': 'pagefind --site dist',
        'build:eleventy-next': 'cross-env ELEVENTY_ENV=production eleventy --config=eleventy.config.next.js',
        dryrun: 'eleventy --dryrun',
        'dryrun:prod': 'cross-env ELEVENTY_ENV=production eleventy --dryrun',
        'dryrun:next': 'eleventy --config=eleventy.config.next.js --dryrun',
        debug: 'npm-run-all clean debug:*',
        'debug:log': 'npm-run-all clean debug:eleventy-logged',
        'debug:eleventy': 'cross-env DEBUG=Eleventy* eleventy --dryrun',
        'debug:eleventy-logged': 'cross-env DEBUG=Eleventy* eleventy --dryrun > debug.log 2>&1',
        lint: 'eslint . --ext=js,jsx,ts,tsx',
        'lint:fix': 'eslint . --ext=js,jsx,ts,tsx --fix',
        'lint:docs': 'eslint . --ignore-pattern "_baseline/" --ext=js,jsx,ts,tsx',
        'lint:docs-fix': 'eslint . --ignore-pattern "_baseline/" --ext=js,jsx,ts,tsx --fix',
        'lint:plugin': 'eslint _baseline/ --ext=js,jsx,ts,tsx',
        'lint:plugin-fix': 'eslint _baseline/ --ext=js,jsx,ts,tsx --fix',
        'format:docs': 'prettier . "!_baseline/**/*" --check',
        'format:docs-fix': 'prettier . "!_baseline/**/*" --write',
        'format:plugin': 'prettier ./_baseline --check --debug-check',
        'format:plugin-fix': 'prettier ./_baseline --write',
        baseline: 'eleventy --config _baseline/eleventy.config.js --serve',
        release: 'bash _baseline/release.sh',
        'release:tag': 'bash _baseline/release.sh tag',
        'release:local': 'bash _baseline/release.sh local',
        indexnow: 'node tasks/indexnow.mjs',
        'indexnow:submit': 'node tasks/indexnow.mjs --submit' },
     author: 'Cristovao Verstraeten',
     license: 'ISC',
     keywords: [ 'eleventy-plugin', 'eleventy' ],
     repository:
      { url: 'git@github.com:apleasantview/eleventy-plugin-baseline.git', type: 'git' },
     private: true,
     dependencies:
      { '@11ty/eleventy': '3.1.6',
        '@11ty/eleventy-img': '^7.0.0',
        '@11ty/eleventy-plugin-syntaxhighlight': '^5.0.2',
        '@jdevalk/seo-graph-core': '^0.6.2',
        '@rviscomi/capo.js': '^2.1.0',
        'cross-env': '^10.1.0',
        cssnano: '^8.0.2',
        dotenv: '^17.4.2',
        esbuild: '0.28.1',
        linkedom: '^0.18.12',
        'markdown-it-attrs': '^5.0.0',
        'npm-run-all': '^4.1.5',
        pagefind: '1.5.2',
        postcss: '^8.5.16',
        'postcss-import': '^16.1.1',
        'postcss-import-ext-glob': '^2.1.1',
        'postcss-load-config': '^6.0.1',
        'postcss-preset-env': '^11.3.2',
        prismjs: '^1.30.0',
        rimraf: '^6.1.3',
        zod: '^4.4.3' },
     devDependencies:
      { '@eslint/js': '^10.0.1',
        '@vitest/coverage-v8': '^4.1.9',
        eslint: '^10.6.0',
        globals: '^17.7.0',
        nunjucks: '^3.2.4',
        prettier: '^3.9.4',
        'prettier-plugin-jinja-template': '^2.2.0',
        sharp: '^0.35.3',
        vitest: '^4.1.9' },
     allowScripts: { 'sharp@0.33.5': true, 'esbuild@0.28.1': true } },
  title: 'Navigator Core',
  permalink: '/navigator-core.html',
  description: 'Eleventy + Baseline internals',
  layout: null,
  eleventyExcludeFromCollections: true,
  _internal: false,
  noindex: true,
  head:
   { style:
      [ { content:
           '._navigator__wrapper:not(#\\#):not(#\\#) {box-sizing: content-box;max-width: 60rem;padding-inline: clamp(1rem, 0.2083rem + 3.5185vw, 3.375rem);margin-inline: auto;}._navigator__wrapper:not(#\\#):not(#\\#) > * + * {margin-block-start: 1.25rem;}' } ] },
  inspectorDepth: 4,
  page:
   { inputPath: './src/navigator-core.html',
     fileSlug: 'navigator-core',
     filePathStem: '/navigator-core',
     outputFileExtension: 'html',
     templateSyntax: 'njk',
     date: 2026-09-12T21:27:59.338Z,
     rawInput:
      '\n<!DOCTYPE html>\n<html lang="{{ lang | default(settings.defaultLanguage) }}">\n\n<baseline-head></baseline-head>\n\n<body data-pagefind-ignore>\n\t<a href="#main" class="skip-link">\n\t\tSkip to main content\n\t</a>\n\t<header>\n\t\t<div class="_navigator__wrapper">\n\t\t\t<h1>{{ settings.title }} Navigator</h1>\n\t\t\t<div>\n\t\t\t\t<p>{{ settings.tagline }}</p>\n\t\t\t</div>\n\t\t</div>\n\t</header>\n\t<main id="main" tabindex="-1">\n\t\t<div class="_navigator__wrapper">\n\t\t\t<p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n\t\t\t<h2><u>Navigator</u></h2>\n\t\t\t<details>\n\t\t\t\t<summary><strong>Page Context</strong></summary>\n\t\t\t\t<pre>\n\t\t\t\t\t{{- _pageContext | _inspect({ depth: null }) -}}\n\t\t\t\t</pre>\n\t\t\t</details>\n\t\t\t{% for key, value in _runtime() %}\n\t\t\t<details>\n\t\t\t\t<summary><strong>{{ key }}</strong></summary>\n\t\t\t\t{% if value | isString %}\n\t\t\t\t<pre>{{ value }}</pre>\n\t\t\t\t{% else %}\n\t\t\t\t<pre>{{ value | _inspect({ depth: inspectorDepth }) }}</pre>\n\t\t\t\t{% endif %}\n\t\t\t</details>\n\t\t\t{% endfor %}\n\t\t</div>\n\t</main>\n\t<script>\n\t\tdocument.getElementById("go-back").addEventListener("click", (event) => {\n\t\t\tevent.preventDefault();\n\t\t\thistory.back();\n\t\t});\n\t</script>\n\t<footer>\n\t\t<div class="_navigator__wrapper"><small>Navigator Core — Eleventy Plugin Baseline</small></div>\n\t</footer>\n</body>\n\n</html>\n',
     url: '/navigator-core.html',
     outputPath: './dist/navigator-core.html',
     lang: 'en',
     locale: 'en',
     translationKey: undefined,
     isDefaultLang: true,
     translations: [],
     sitemap: { ignore: true, changefreq: '', priority: -1 } },
  collections:
   <ref *1> {
     docs:
      [ { template:
           Template {
             inputPath: './src/content/docs/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nThe documentation for Baseline. Each chapter with its own job:\n\n- **[[introduction]]**: what Baseline is, who it is for and a quickstart.\n- **[[tutorial]]**: guided walks through real builds, end to end.\n- **[[feature-guide]]**: what each feature is like to use, built on the tutorial site.\n- **[[how-to]]**: task-oriented recipes for specific problems.\n- **[[core-reference]]**: exact details of what the plugin registers. Options, filters, globals, the image shortcode, the page context, internals.\n- **[[modules]]**: per-module reference for the five feature modules (assets, head, multilang, navigator, sitemap).\n- **[[concept]]**: the mental model, community-seeded conventions and a snapshot of the inner workings.\n\n---\n\n## Where to start\n\nIf Baseline is new to you, the [[introduction | introduction]] is the door. If you already know the plugin and want a specific detail, the [[core-reference | core reference]] and [[modules | modules]] chapters are the lookup view.\n\nWhat Baseline gives you out of the box, module by module, is answered on [[what-is-baseline | what Baseline is]].\n\n---\n\n## About this project\n\nPackage: `@apleasantview/eleventy-plugin-baseline` on [npm](https://www.npmjs.com/package/@apleasantview/eleventy-plugin-baseline). Source on [GitHub](https://github.com/apleasantview/eleventy-plugin-baseline).\n\nBaseline is in active development, published under `0.1.0-next.X` semver. APIs and defaults may shift between releases.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: '/docs/',
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             title: 'Documentation',
             slug: 'docs',
             description:
              'Seven chapters: introduction, tutorials, feature guides, how-tos, core reference, the five modules, and the concepts behind the whole plugin.',
             date: 2026-04-28T00:00:00.000Z,
             pageType: 'CollectionPage',
             section: [Array],
             sectionLabel: 'Docs',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-28T00:00:00.000Z,
             rawInput:
              '\nThe documentation for Baseline. Each chapter with its own job:\n\n- **[[introduction]]**: what Baseline is, who it is for and a quickstart.\n- **[[tutorial]]**: guided walks through real builds, end to end.\n- **[[feature-guide]]**: what each feature is like to use, built on the tutorial site.\n- **[[how-to]]**: task-oriented recipes for specific problems.\n- **[[core-reference]]**: exact details of what the plugin registers. Options, filters, globals, the image shortcode, the page context, internals.\n- **[[modules]]**: per-module reference for the five feature modules (assets, head, multilang, navigator, sitemap).\n- **[[concept]]**: the mental model, community-seeded conventions and a snapshot of the inner workings.\n\n---\n\n## Where to start\n\nIf Baseline is new to you, the [[introduction | introduction]] is the door. If you already know the plugin and want a specific detail, the [[core-reference | core reference]] and [[modules | modules]] chapters are the lookup view.\n\nWhat Baseline gives you out of the box, module by module, is answered on [[what-is-baseline | what Baseline is]].\n\n---\n\n## About this project\n\nPackage: `@apleasantview/eleventy-plugin-baseline` on [npm](https://www.npmjs.com/package/@apleasantview/eleventy-plugin-baseline). Source on [GitHub](https://github.com/apleasantview/eleventy-plugin-baseline).\n\nBaseline is in active development, published under `0.1.0-next.X` semver. APIs and defaults may shift between releases.\n',
             url: '/docs/',
             outputPath: './dist/docs/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-04-28T00:00:00.000Z,
             dateModified: 2026-09-06T22:57:44.000Z },
          inputPath: './src/content/docs/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/00.index',
          date: 2026-04-28T00:00:00.000Z,
          outputPath: './dist/docs/index.html',
          url: '/docs/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/00.introduction/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/00.introduction/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nStart here. [[what-is-baseline | What is Baseline?]] answers whether it is for you. [[what-is-eleventy | What is Eleventy?]] is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The [[quickstart | quickstart]] gets you a running site, and the [[simple-baseline-site | simple site tutorial]] walks the same ground with the reasoning visible.\n\nFrom there, the [[concept | concept chapter]] has the mental model behind the plugin and the small set of rules that keep Baseline out of your way.\n\n---\n\n## In this chapter\n\n{% include "partials/chapter-toc.njk" %}\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: '/docs/introduction/',
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Introduction',
             title: 'Introduction',
             description:
              'Start here: what Eleventy is, what Baseline adds on top, who it is for, and a quickstart that gets a site running.',
             slug: 'introduction',
             date: 2026-04-28T00:00:00.000Z,
             pageType: 'CollectionPage',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/00.introduction/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/00.introduction/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-28T00:00:00.000Z,
             rawInput:
              '\nStart here. [[what-is-baseline | What is Baseline?]] answers whether it is for you. [[what-is-eleventy | What is Eleventy?]] is the ground floor underneath it, for anyone who has not built a site out of files and a text editor before. The [[quickstart | quickstart]] gets you a running site, and the [[simple-baseline-site | simple site tutorial]] walks the same ground with the reasoning visible.\n\nFrom there, the [[concept | concept chapter]] has the mental model behind the plugin and the small set of rules that keep Baseline out of your way.\n\n---\n\n## In this chapter\n\n{% include "partials/chapter-toc.njk" %}\n',
             url: '/docs/introduction/',
             outputPath: './dist/docs/introduction/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-04-28T00:00:00.000Z,
             dateModified: 2026-09-06T22:57:44.000Z },
          inputPath: './src/content/docs/00.introduction/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/00.introduction/00.index',
          date: 2026-04-28T00:00:00.000Z,
          outputPath: './dist/docs/introduction/index.html',
          url: '/docs/introduction/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/00.introduction/01.overview.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01.overview',
             filePathStem: '/content/docs/00.introduction/01.overview',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\n## What Baseline is\n\nBaseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.\n\nEleventy hands you a content pipeline and gets out of your way.\n\nThat is the appeal, and also the reason every site you build with it ends up needing the same wiring underneath: directory layout, an asset pipeline, image handling, head tags, sitemap, language routing.\n\nNone of it is hard. You just write it again every time.\n\n---\n\n## A cohesive plugin system\n\nThe usual ways out are starter repos that fork once and rot, or stacks of single-purpose plugins that do not know about each other and tend to fight at the edges.\n\nBaseline handles the infrastructure layer, specifically the parts that fit together.\n\nYour layouts in `_includes/`, your content and data in `content/` and `_data/`, your styles and scripts in `assets/`, and any plugins or filters you add yourself, all stay yours.\n\n---\n\n### Who this is for\n\nBaseline is written for someone who has built a handful of Eleventy sites and caught themselves wiring up the same things every time. You want those decisions made together, so they fit.\n\nYou still want to own your templates, content, and design. You would rather start from a working Baseline than a blank slate.\n\nIt is probably not for you if you already have a setup you like. Baseline does not replace what works; it replaces the third or fourth time you would set the same thing up from scratch.\n\nIt is also not for you if you want a full framework that owns layout and content as well. Baseline is deliberately smaller than that.\n\n---\n\n### Why a plugin?\n\nRecipes and starter repos hand you a copy, frozen on the day you took it. A framework hands you its whole project shape along with the answers.\n\nWhen Eleventy\'s defaults move or the patterns shift, you get the new version on `npm install` instead of hunting through six tutorials and reconciling them by hand again.\n\n---\n\n## What the Baseline modules do\n\nFive modules, each wiring a distinct concern into Eleventy:\n\n{% stepsBlock "compact" %}\n\n- **[[assets]]**: the asset pipeline. One CSS entry point per directory through PostCSS, one JS entry point through esbuild, and inline filters (`inlinePostCSS`, `inlineESbuild`) for critical-path CSS or JS.\n- **[[head]]**: a `<baseline-head>` placeholder that gets replaced with a sorted, deduped element list. Charset, viewport, title, description, robots, canonical, hreflang, plus the SEO payload (Open Graph, Twitter, JSON-LD). You drop the placeholder in your layout once.\n- **[[multilang]]**: directory-based multilingual support. `page.translations` for a page\'s other-language versions, hreflang, and translation filters (it wraps Eleventy\'s `I18nPlugin`). Opt-in.\n- **[[navigator]]**: runtime-introspection surface and public read surface. A `phpinfo()`-style virtual page that dumps current build state (on in development by default), plus the read surface for the [[content-graph | content graph]].\n- **[[sitemap]]**: an XML sitemap. Every page is included unless you exclude it. When `multilang` is active, you get per-language sitemaps plus an index.\n\n{% endstepsBlock %}\n\nThreading the modules together is **page context** at `_pageContext`: a normalised per-page object the head, multilang, and sitemap modules all read from internally. Your templates can read it too. See the [[page-context | page context reference]].\n\n---\n\n## Baseline content helpers\n\nAlongside the modules, Baseline registers a small set of additions the moment you load it. These are always on because they are too small to be worth opting in or out of:\n\n{% stepsBlock "compact" %}\n\n- **Filters**: `markdownify`, `relatedPosts`, `isString`, and `t` for translating UI strings. See the [[filters | filters reference]].\n- **Globals**: a date-formatting helper, plus the `_baseline` data tree (`env`, `features`, `paths`) that templates can read at any time. See the [[globals | globals reference]].\n- **An [[image-shortcode | image shortcode]]** built on top of [eleventy-img](https://www.11ty.dev/docs/plugins/image/): AVIF, WebP and JPEG, responsive widths, lazy loading. Alt text is required, and a missing one stops the build.\n\n{% endstepsBlock %}\n\nThree more behaviours need no configuration at all: a drafts preprocessor, a dev image pipeline, and passthrough copy for the `static/` directory. [[content-helpers | Content helpers]] covers what each one does, and the full surface lives in the [[core-reference | core reference]] chapter.\n\n---\n\n## Stability and scope\n\nBaseline is in active development. Versions ship as `0.1.0-next.X` and that is a deliberate signal: things may shift between releases, and you should pin a version when you build something serious on top.\n\nThe five modules above are the supported surface today. The head module also emits a full SEO payload: canonical, Open Graph, Twitter cards, and a JSON-LD graph, configured through `settings.seo` and per-page front matter.\n\nIf something in the docs claims a behaviour you cannot reproduce, the docs are probably wrong. Please [open an issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues).\n\n---\n\n## Where to go next\n\n- The [[concept | concept]] chapter for the mental model.\n- The [[quickstart | quickstart]] for a checklist that gets you a running site.\n- The [[simple-baseline-site | simple site]] tutorial for a guided walk through the same checklist with reasoning.\n- The [[architecture-snapshot | architecture snapshot]] for the three layers Baseline is built in: state, runtime, modules.\n\nAlready have an Eleventy site you want to graft Baseline onto? See [[integrate-eleventy-base-blog]].\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Introduction',
             title: 'What is Baseline?',
             description:
              'What Baseline is, who it is for, why it is a plugin, and what it gives you out of the box.',
             slug: 'what-is-baseline',
             date: 2026-04-28T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/00.introduction/01.overview.md',
             fileSlug: '01.overview',
             filePathStem: '/content/docs/00.introduction/01.overview',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-28T00:00:00.000Z,
             rawInput:
              '\n## What Baseline is\n\nBaseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.\n\nEleventy hands you a content pipeline and gets out of your way.\n\nThat is the appeal, and also the reason every site you build with it ends up needing the same wiring underneath: directory layout, an asset pipeline, image handling, head tags, sitemap, language routing.\n\nNone of it is hard. You just write it again every time.\n\n---\n\n## A cohesive plugin system\n\nThe usual ways out are starter repos that fork once and rot, or stacks of single-purpose plugins that do not know about each other and tend to fight at the edges.\n\nBaseline handles the infrastructure layer, specifically the parts that fit together.\n\nYour layouts in `_includes/`, your content and data in `content/` and `_data/`, your styles and scripts in `assets/`, and any plugins or filters you add yourself, all stay yours.\n\n---\n\n### Who this is for\n\nBaseline is written for someone who has built a handful of Eleventy sites and caught themselves wiring up the same things every time. You want those decisions made together, so they fit.\n\nYou still want to own your templates, content, and design. You would rather start from a working Baseline than a blank slate.\n\nIt is probably not for you if you already have a setup you like. Baseline does not replace what works; it replaces the third or fourth time you would set the same thing up from scratch.\n\nIt is also not for you if you want a full framework that owns layout and content as well. Baseline is deliberately smaller than that.\n\n---\n\n### Why a plugin?\n\nRecipes and starter repos hand you a copy, frozen on the day you took it. A framework hands you its whole project shape along with the answers.\n\nWhen Eleventy\'s defaults move or the patterns shift, you get the new version on `npm install` instead of hunting through six tutorials and reconciling them by hand again.\n\n---\n\n## What the Baseline modules do\n\nFive modules, each wiring a distinct concern into Eleventy:\n\n{% stepsBlock "compact" %}\n\n- **[[assets]]**: the asset pipeline. One CSS entry point per directory through PostCSS, one JS entry point through esbuild, and inline filters (`inlinePostCSS`, `inlineESbuild`) for critical-path CSS or JS.\n- **[[head]]**: a `<baseline-head>` placeholder that gets replaced with a sorted, deduped element list. Charset, viewport, title, description, robots, canonical, hreflang, plus the SEO payload (Open Graph, Twitter, JSON-LD). You drop the placeholder in your layout once.\n- **[[multilang]]**: directory-based multilingual support. `page.translations` for a page\'s other-language versions, hreflang, and translation filters (it wraps Eleventy\'s `I18nPlugin`). Opt-in.\n- **[[navigator]]**: runtime-introspection surface and public read surface. A `phpinfo()`-style virtual page that dumps current build state (on in development by default), plus the read surface for the [[content-graph | content graph]].\n- **[[sitemap]]**: an XML sitemap. Every page is included unless you exclude it. When `multilang` is active, you get per-language sitemaps plus an index.\n\n{% endstepsBlock %}\n\nThreading the modules together is **page context** at `_pageContext`: a normalised per-page object the head, multilang, and sitemap modules all read from internally. Your templates can read it too. See the [[page-context | page context reference]].\n\n---\n\n## Baseline content helpers\n\nAlongside the modules, Baseline registers a small set of additions the moment you load it. These are always on because they are too small to be worth opting in or out of:\n\n{% stepsBlock "compact" %}\n\n- **Filters**: `markdownify`, `relatedPosts`, `isString`, and `t` for translating UI strings. See the [[filters | filters reference]].\n- **Globals**: a date-formatting helper, plus the `_baseline` data tree (`env`, `features`, `paths`) that templates can read at any time. See the [[globals | globals reference]].\n- **An [[image-shortcode | image shortcode]]** built on top of [eleventy-img](https://www.11ty.dev/docs/plugins/image/): AVIF, WebP and JPEG, responsive widths, lazy loading. Alt text is required, and a missing one stops the build.\n\n{% endstepsBlock %}\n\nThree more behaviours need no configuration at all: a drafts preprocessor, a dev image pipeline, and passthrough copy for the `static/` directory. [[content-helpers | Content helpers]] covers what each one does, and the full surface lives in the [[core-reference | core reference]] chapter.\n\n---\n\n## Stability and scope\n\nBaseline is in active development. Versions ship as `0.1.0-next.X` and that is a deliberate signal: things may shift between releases, and you should pin a version when you build something serious on top.\n\nThe five modules above are the supported surface today. The head module also emits a full SEO payload: canonical, Open Graph, Twitter cards, and a JSON-LD graph, configured through `settings.seo` and per-page front matter.\n\nIf something in the docs claims a behaviour you cannot reproduce, the docs are probably wrong. Please [open an issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues).\n\n---\n\n## Where to go next\n\n- The [[concept | concept]] chapter for the mental model.\n- The [[quickstart | quickstart]] for a checklist that gets you a running site.\n- The [[simple-baseline-site | simple site]] tutorial for a guided walk through the same checklist with reasoning.\n- The [[architecture-snapshot | architecture snapshot]] for the three layers Baseline is built in: state, runtime, modules.\n\nAlready have an Eleventy site you want to graft Baseline onto? See [[integrate-eleventy-base-blog]].\n',
             url: '/docs/introduction/what-is-baseline/',
             outputPath: './dist/docs/introduction/what-is-baseline/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-04-28T00:00:00.000Z,
             dateModified: 2026-09-03T07:36:45.000Z },
          inputPath: './src/content/docs/00.introduction/01.overview.md',
          fileSlug: '01.overview',
          filePathStem: '/content/docs/00.introduction/01.overview',
          date: 2026-04-28T00:00:00.000Z,
          outputPath: './dist/docs/introduction/what-is-baseline/index.html',
          url: '/docs/introduction/what-is-baseline/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/00.introduction/02.what-is-eleventy.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '02.what-is-eleventy',
             filePathStem: '/content/docs/00.introduction/02.what-is-eleventy',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nEleventy is a static site generator. It takes a folder of files on your computer and turns them into a finished website: plain HTML, CSS and images that you can put on any host.\n\nThat is the whole idea. Everything else is detail.\n\n---\n\n## What a static site generator does\n\nYou write your pages as Markdown or HTML. You write your layouts once. You run a command. Eleventy reads everything, puts your content into your layouts, and writes out a folder of finished pages.\n\nNothing happens after that. There is no database, no server deciding what to show, no software to keep patched. The pages already exist, so a visitor\'s browser just downloads them.\n\nIf you have used WordPress, the difference is where the work happens. WordPress builds the page when somebody asks for it. Eleventy builds it once, when you tell it to. That is why static sites are fast and cheap to host, and why almost nothing can go wrong at two in the morning.\n\nThe trade is that a static site cannot do things that need a server. Comments, user accounts, a live search index over private data. Plenty of sites do not need any of that.\n\n---\n\n## Why people pick Eleventy\n\nThere are a lot of static site generators. Eleventy is the one that gets chosen for a few specific reasons.\n\n**It sends no JavaScript to the browser unless you write some.** Many modern tools ship a framework runtime with every page whether the page needs it or not. Eleventy ships what you wrote and nothing else.\n\n**It does not pick your template language.** Markdown, Nunjucks, Liquid, plain HTML, JavaScript. You can mix them in one project, which sounds chaotic and turns out to be practical.\n\n**It is small enough to understand.** You can read the config file and know what your site does. That is rarer than it should be.\n\n**It stays out of the way.** Eleventy has very few opinions about how you organise a project. For an experienced developer that is freedom.\n\n---\n\n## What Eleventy leaves to you\n\nThat last one is the part worth sitting with, because it cuts both ways.\n\nEleventy gives you a build. It does not give you decisions. Where your files live, how your CSS and JavaScript get compiled, what goes in your `<head>`, how images get resized, whether you have a sitemap, how a second language works: all of that is yours to arrange.\n\nNothing there is hard. Each piece is an afternoon at most, and the answers exist in blog posts and plugin READMEs. The catch is that you make the same afternoon\'s worth of decisions on every new project, and you make them slightly differently each time, and six months later you cannot remember why this site does it one way and that site does it another.\n\nThis is the gap, and it is not a flaw in Eleventy. It is the direct cost of the flexibility that made you choose it.\n\n---\n\n## Do you need to learn Eleventy first?\n\nNot before you start, no.\n\nThe [[quickstart | quickstart]] gets you a running site without explaining Eleventy\'s internals, and the [[simple-baseline-site | simple site tutorial]] walks the same ground more slowly, with the reasoning visible. Either will give you something on screen in an afternoon.\n\nYou will want to learn Eleventy eventually, and you should. Baseline is built so that everything Eleventy documents still works exactly as documented: the data cascade, the template languages, the plugin API. Nothing you learn about Eleventy is wasted, and nothing Baseline does is hidden behind an abstraction you would have to unlearn.\n\nThe honest version: if you have never built a site with files and a text editor before, this will be a step up from a page builder. It is a smaller step than it looks, and it is one you keep.\n\nThe [official Eleventy documentation](https://www.11ty.dev/docs/) is where to go when you want the full picture.\n\nThere is also [Learn Eleventy](https://learneleventy.dev/), a free community course that goes more in depth on "vanilla" Eleventy. Maintained by [uncenter](https://uncenter.dev/).\n\n---\n\n## Where to go next\n\n- [[what-is-baseline | What is Baseline?]] for what it does and whether it is for you.\n- The [[quickstart | quickstart]] to get a site running.\n- The [[concept | concept chapter]] for the mental model once you have something working.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Introduction',
             title: 'What is Eleventy?',
             description:
              'Eleventy is a static site generator: it turns files on your computer into a finished website. Here is what it does, and what it deliberately leaves to you.',
             slug: 'what-is-eleventy',
             date: 2026-07-30T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/00.introduction/02.what-is-eleventy.md',
             fileSlug: '02.what-is-eleventy',
             filePathStem: '/content/docs/00.introduction/02.what-is-eleventy',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-07-30T00:00:00.000Z,
             rawInput:
              '\nEleventy is a static site generator. It takes a folder of files on your computer and turns them into a finished website: plain HTML, CSS and images that you can put on any host.\n\nThat is the whole idea. Everything else is detail.\n\n---\n\n## What a static site generator does\n\nYou write your pages as Markdown or HTML. You write your layouts once. You run a command. Eleventy reads everything, puts your content into your layouts, and writes out a folder of finished pages.\n\nNothing happens after that. There is no database, no server deciding what to show, no software to keep patched. The pages already exist, so a visitor\'s browser just downloads them.\n\nIf you have used WordPress, the difference is where the work happens. WordPress builds the page when somebody asks for it. Eleventy builds it once, when you tell it to. That is why static sites are fast and cheap to host, and why almost nothing can go wrong at two in the morning.\n\nThe trade is that a static site cannot do things that need a server. Comments, user accounts, a live search index over private data. Plenty of sites do not need any of that.\n\n---\n\n## Why people pick Eleventy\n\nThere are a lot of static site generators. Eleventy is the one that gets chosen for a few specific reasons.\n\n**It sends no JavaScript to the browser unless you write some.** Many modern tools ship a framework runtime with every page whether the page needs it or not. Eleventy ships what you wrote and nothing else.\n\n**It does not pick your template language.** Markdown, Nunjucks, Liquid, plain HTML, JavaScript. You can mix them in one project, which sounds chaotic and turns out to be practical.\n\n**It is small enough to understand.** You can read the config file and know what your site does. That is rarer than it should be.\n\n**It stays out of the way.** Eleventy has very few opinions about how you organise a project. For an experienced developer that is freedom.\n\n---\n\n## What Eleventy leaves to you\n\nThat last one is the part worth sitting with, because it cuts both ways.\n\nEleventy gives you a build. It does not give you decisions. Where your files live, how your CSS and JavaScript get compiled, what goes in your `<head>`, how images get resized, whether you have a sitemap, how a second language works: all of that is yours to arrange.\n\nNothing there is hard. Each piece is an afternoon at most, and the answers exist in blog posts and plugin READMEs. The catch is that you make the same afternoon\'s worth of decisions on every new project, and you make them slightly differently each time, and six months later you cannot remember why this site does it one way and that site does it another.\n\nThis is the gap, and it is not a flaw in Eleventy. It is the direct cost of the flexibility that made you choose it.\n\n---\n\n## Do you need to learn Eleventy first?\n\nNot before you start, no.\n\nThe [[quickstart | quickstart]] gets you a running site without explaining Eleventy\'s internals, and the [[simple-baseline-site | simple site tutorial]] walks the same ground more slowly, with the reasoning visible. Either will give you something on screen in an afternoon.\n\nYou will want to learn Eleventy eventually, and you should. Baseline is built so that everything Eleventy documents still works exactly as documented: the data cascade, the template languages, the plugin API. Nothing you learn about Eleventy is wasted, and nothing Baseline does is hidden behind an abstraction you would have to unlearn.\n\nThe honest version: if you have never built a site with files and a text editor before, this will be a step up from a page builder. It is a smaller step than it looks, and it is one you keep.\n\nThe [official Eleventy documentation](https://www.11ty.dev/docs/) is where to go when you want the full picture.\n\nThere is also [Learn Eleventy](https://learneleventy.dev/), a free community course that goes more in depth on "vanilla" Eleventy. Maintained by [uncenter](https://uncenter.dev/).\n\n---\n\n## Where to go next\n\n- [[what-is-baseline | What is Baseline?]] for what it does and whether it is for you.\n- The [[quickstart | quickstart]] to get a site running.\n- The [[concept | concept chapter]] for the mental model once you have something working.\n',
             url: '/docs/introduction/what-is-eleventy/',
             outputPath: './dist/docs/introduction/what-is-eleventy/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-07-30T00:00:00.000Z,
             dateModified: 2026-09-03T07:36:45.000Z },
          inputPath: './src/content/docs/00.introduction/02.what-is-eleventy.md',
          fileSlug: '02.what-is-eleventy',
          filePathStem: '/content/docs/00.introduction/02.what-is-eleventy',
          date: 2026-07-30T00:00:00.000Z,
          outputPath: './dist/docs/introduction/what-is-eleventy/index.html',
          url: '/docs/introduction/what-is-eleventy/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/00.introduction/03.quickstart.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '03.quickstart',
             filePathStem: '/content/docs/00.introduction/03.quickstart',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nThe minimum working setup. A checklist; for a guided walk with reasoning, see the [[simple-baseline-site | simple site tutorial]].\n\n---\n\n## Prerequisites\n\nNode 22 or newer, and npm. Eleventy 3.x is what Baseline is tested against; a stable 4.x is permitted and untried.\n\nA `package.json` with `"type": "module"` and Eleventy scripts:\n```json\n{\n\t"name": "baseline-quickstart",\n\t"type": "module",\n\t"scripts": {\n\t\t"start": "npm-run-all clean dev",\n\t\t"dev": "eleventy --serve",\n\t\t"build": "npm-run-all clean build:eleventy",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production eleventy",\n\t\t"clean": "rimraf dist/"\n\t}\n}\n```\n\nNo `.env` file. `ELEVENTY_ENV` is set by the `build` script above, and `BASELINE_URL` comes from your host in production, falling back to localhost while you work. Nothing in Baseline loads a `.env`, so keeping one means adding a loader for no gain. The variable name is yours to pick, though [[deployment-checks | deployment checks]] names two that are already taken.\n\n---\n\n## Install\n\n```bash\nmkdir baseline-quickstart\ncd baseline-quickstart\nnpm init -y\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline\nnpm install rimraf cross-env npm-run-all # the helpers the scripts above use\n```\n\n### Install warnings\n\nA prerelease Eleventy is refused. Semver excludes prereleases from a range that carries none, so `4.0.0-alpha.10` fails where `4.0.0` passes, and npm\'s error prints both values without saying why. Pin to a stable release, or install with `--legacy-peer-deps`.\n\nesbuild fetches a platform binary in a postinstall script. Run with `ignore-scripts` and the JavaScript half of the assets pipeline is dead, with nothing on screen to say so. `sharp`, via `@11ty/eleventy-img`, is the same.\n\n---\n\n## Configure\n\nCreate `eleventy.config.js` at the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\nconst settings = {\n\ttitle: \'My Site\',\n\turl: process.env.BASELINE_URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\n\thead: {\n\t\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\t\tscript: [{ src: \'/assets/js/index.js\', defer: true }],\n\t\tmeta: [{ name: \'color-scheme\', content: \'light dark\' }]\n\t},\n\n\tseo: {\n\t\togImage: {\n\t\t\turl: \'https://www.example.com/og.jpg\',\n\t\t\twidth: 1200,\n\t\t\theight: 630,\n\t\t\talt: \'My Site\'\n\t\t}\n\t}\n};\n\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\thead: { showGenerator: true }\n\t\t})\n\t);\n\n\televentyConfig.addGlobalData(\'settings\', settings);\n}\n\nexport const config = baselineConfig;\n```\n\nFive things to notice:\n\n`baseline()` takes two arguments. `settings` is the site identity (title, url, languages, head extras, seo defaults); `options` is runtime behaviour (which modules are on, log verbosity, per-module options). Key by key, that is [[site-settings | site settings]] and the [[plugin-entrypoint | plugin entrypoint]]; why the two are apart is on [[how-baseline-works | how Baseline works]].\n\n`addGlobalData(\'settings\', settings)` is what hands the same object to your templates, so a layout can read `settings.title` without importing anything. Putting the object in `src/_data/settings.js` and importing it here does that for free, and is the better shape once the file grows. One file is the simpler start.\n\n`head` is how tags reach every page. Baseline compiles the CSS and JS entry points below, but it does not link them for you, so a bundle missing from this list gets built and never loaded. The [[head | head module]] lists what Baseline emits alongside your entries. `seo` sets site-wide social and schema defaults that any page can override in front matter; `ogImage` is absolute on purpose, because it ends up in JSON-LD where Eleventy\'s `HtmlBasePlugin` cannot reach it to expand a relative path.\n\n`showGenerator` is off by default and turned on here. It adds a `<meta name="generator">` carrying Eleventy\'s own version string, which is how anyone counting Eleventy sites in the wild finds yours. A small courtesy to the project. Turn it off if you would rather not say.\n\nThe `config` re-export looks unusual. It is. That way both Baseline and Eleventy agree on where things live (`src/` as input, `dist/` as output, the asset and public folders). Why a plugin cannot set those for you is on [[how-baseline-works | how Baseline works]]; the contract it ships is the [[config-export | config-export reference]]\'s.\n\n---\n\n## Project files\n\nCreate the rest of the project files:\n\n`src/_includes/layouts/base.njk`: base layout. Drop `<baseline-head></baseline-head>` in place of the `<head>` element. That **placeholder** is the one element you write yourself.\n\n`src/content/index.md`: a starter page with front matter and a body. The `permalink` is what puts it at the site root; without one, Eleventy derives the URL from the file\'s path and it lands at `/content/` instead.\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\n---\n\nYou are looking at a page rendered with Eleventy and the Baseline plugin defaults.\n```\n\n`src/assets/assets.11tydata.js`, `src/assets/css/index.css`, `src/assets/js/index.js`: asset entry points (one CSS, one JS).\n\n`src/static/`: passthrough-copied to the site root. The on-disk folder is `static/`; the virtual directory key Baseline registers is `public`.\n\n---\n\n## Run and build\n\nDevelopment:\n\n```bash\nnpm start\n```\n\nOpen http://localhost:8080/. Check `dist/` for output, including `dist/sitemap.xml`.\n\nProduction build. `BASELINE_URL` is the address the build claims as its own, so supply the real one for the command. Any absolute URL does the job for this exercise:\n\n```bash\nBASELINE_URL=https://www.example.com/ npm run build\n```\n\nThe `NAME=value` prefix works in bash and zsh; on Windows `cmd` or PowerShell, put it in the script through `cross-env` instead. On a real deploy your host sets the variable and you never type it.\n\nInspect `dist/` for the final files, and check that the canonical link and `dist/sitemap.xml` both carry the URL you passed rather than localhost.\n\nThat fallback in the settings file is a convenience with a sharp edge: a production build that never sees `BASELINE_URL` will not warn, it will quietly ship `http://localhost:8080/` in every canonical, `og:url` and JSON-LD node. Set it on the host before the first deploy, not after.\n\nThe **drafts preprocessor** (a build-time filter that drops templates marked `draft: true`) is on automatically. Drafts render while the dev server is running (`npm start`) and are dropped from a build (`npm run build`). The switch is Eleventy\'s own run mode rather than `ELEVENTY_ENV`, so any build drops them, production or not. The two variables are put side by side on [[project-structure | project structure]].\n\n---\n\n## Next steps\n\n- The [[concept | concept chapter]] for the mental model and community-seeded conventions.\n- The [[simple-baseline-site | simple site]] tutorial for a fuller walk-through.\n- For multilingual: see the [[multilingual-baseline-site | multilingual site]] tutorial.\n- The [[head-and-noindex | head and noindex]] guide once you have the basics working.\n- The [[architecture-snapshot | architecture snapshot]] for the deeper read on how the plugin is built.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Introduction',
             title: 'Quickstart',
             description:
              'The minimum working Baseline setup: install the plugin, write the settings file, run the build. A checklist rather than a walkthrough.',
             slug: 'quickstart',
             date: 2026-04-28T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/00.introduction/03.quickstart.md',
             fileSlug: '03.quickstart',
             filePathStem: '/content/docs/00.introduction/03.quickstart',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-28T00:00:00.000Z,
             rawInput:
              '\nThe minimum working setup. A checklist; for a guided walk with reasoning, see the [[simple-baseline-site | simple site tutorial]].\n\n---\n\n## Prerequisites\n\nNode 22 or newer, and npm. Eleventy 3.x is what Baseline is tested against; a stable 4.x is permitted and untried.\n\nA `package.json` with `"type": "module"` and Eleventy scripts:\n```json\n{\n\t"name": "baseline-quickstart",\n\t"type": "module",\n\t"scripts": {\n\t\t"start": "npm-run-all clean dev",\n\t\t"dev": "eleventy --serve",\n\t\t"build": "npm-run-all clean build:eleventy",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production eleventy",\n\t\t"clean": "rimraf dist/"\n\t}\n}\n```\n\nNo `.env` file. `ELEVENTY_ENV` is set by the `build` script above, and `BASELINE_URL` comes from your host in production, falling back to localhost while you work. Nothing in Baseline loads a `.env`, so keeping one means adding a loader for no gain. The variable name is yours to pick, though [[deployment-checks | deployment checks]] names two that are already taken.\n\n---\n\n## Install\n\n```bash\nmkdir baseline-quickstart\ncd baseline-quickstart\nnpm init -y\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline\nnpm install rimraf cross-env npm-run-all # the helpers the scripts above use\n```\n\n### Install warnings\n\nA prerelease Eleventy is refused. Semver excludes prereleases from a range that carries none, so `4.0.0-alpha.10` fails where `4.0.0` passes, and npm\'s error prints both values without saying why. Pin to a stable release, or install with `--legacy-peer-deps`.\n\nesbuild fetches a platform binary in a postinstall script. Run with `ignore-scripts` and the JavaScript half of the assets pipeline is dead, with nothing on screen to say so. `sharp`, via `@11ty/eleventy-img`, is the same.\n\n---\n\n## Configure\n\nCreate `eleventy.config.js` at the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\nconst settings = {\n\ttitle: \'My Site\',\n\turl: process.env.BASELINE_URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\n\thead: {\n\t\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\t\tscript: [{ src: \'/assets/js/index.js\', defer: true }],\n\t\tmeta: [{ name: \'color-scheme\', content: \'light dark\' }]\n\t},\n\n\tseo: {\n\t\togImage: {\n\t\t\turl: \'https://www.example.com/og.jpg\',\n\t\t\twidth: 1200,\n\t\t\theight: 630,\n\t\t\talt: \'My Site\'\n\t\t}\n\t}\n};\n\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\thead: { showGenerator: true }\n\t\t})\n\t);\n\n\televentyConfig.addGlobalData(\'settings\', settings);\n}\n\nexport const config = baselineConfig;\n```\n\nFive things to notice:\n\n`baseline()` takes two arguments. `settings` is the site identity (title, url, languages, head extras, seo defaults); `options` is runtime behaviour (which modules are on, log verbosity, per-module options). Key by key, that is [[site-settings | site settings]] and the [[plugin-entrypoint | plugin entrypoint]]; why the two are apart is on [[how-baseline-works | how Baseline works]].\n\n`addGlobalData(\'settings\', settings)` is what hands the same object to your templates, so a layout can read `settings.title` without importing anything. Putting the object in `src/_data/settings.js` and importing it here does that for free, and is the better shape once the file grows. One file is the simpler start.\n\n`head` is how tags reach every page. Baseline compiles the CSS and JS entry points below, but it does not link them for you, so a bundle missing from this list gets built and never loaded. The [[head | head module]] lists what Baseline emits alongside your entries. `seo` sets site-wide social and schema defaults that any page can override in front matter; `ogImage` is absolute on purpose, because it ends up in JSON-LD where Eleventy\'s `HtmlBasePlugin` cannot reach it to expand a relative path.\n\n`showGenerator` is off by default and turned on here. It adds a `<meta name="generator">` carrying Eleventy\'s own version string, which is how anyone counting Eleventy sites in the wild finds yours. A small courtesy to the project. Turn it off if you would rather not say.\n\nThe `config` re-export looks unusual. It is. That way both Baseline and Eleventy agree on where things live (`src/` as input, `dist/` as output, the asset and public folders). Why a plugin cannot set those for you is on [[how-baseline-works | how Baseline works]]; the contract it ships is the [[config-export | config-export reference]]\'s.\n\n---\n\n## Project files\n\nCreate the rest of the project files:\n\n`src/_includes/layouts/base.njk`: base layout. Drop `<baseline-head></baseline-head>` in place of the `<head>` element. That **placeholder** is the one element you write yourself.\n\n`src/content/index.md`: a starter page with front matter and a body. The `permalink` is what puts it at the site root; without one, Eleventy derives the URL from the file\'s path and it lands at `/content/` instead.\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\n---\n\nYou are looking at a page rendered with Eleventy and the Baseline plugin defaults.\n```\n\n`src/assets/assets.11tydata.js`, `src/assets/css/index.css`, `src/assets/js/index.js`: asset entry points (one CSS, one JS).\n\n`src/static/`: passthrough-copied to the site root. The on-disk folder is `static/`; the virtual directory key Baseline registers is `public`.\n\n---\n\n## Run and build\n\nDevelopment:\n\n```bash\nnpm start\n```\n\nOpen http://localhost:8080/. Check `dist/` for output, including `dist/sitemap.xml`.\n\nProduction build. `BASELINE_URL` is the address the build claims as its own, so supply the real one for the command. Any absolute URL does the job for this exercise:\n\n```bash\nBASELINE_URL=https://www.example.com/ npm run build\n```\n\nThe `NAME=value` prefix works in bash and zsh; on Windows `cmd` or PowerShell, put it in the script through `cross-env` instead. On a real deploy your host sets the variable and you never type it.\n\nInspect `dist/` for the final files, and check that the canonical link and `dist/sitemap.xml` both carry the URL you passed rather than localhost.\n\nThat fallback in the settings file is a convenience with a sharp edge: a production build that never sees `BASELINE_URL` will not warn, it will quietly ship `http://localhost:8080/` in every canonical, `og:url` and JSON-LD node. Set it on the host before the first deploy, not after.\n\nThe **drafts preprocessor** (a build-time filter that drops templates marked `draft: true`) is on automatically. Drafts render while the dev server is running (`npm start`) and are dropped from a build (`npm run build`). The switch is Eleventy\'s own run mode rather than `ELEVENTY_ENV`, so any build drops them, production or not. The two variables are put side by side on [[project-structure | project structure]].\n\n---\n\n## Next steps\n\n- The [[concept | concept chapter]] for the mental model and community-seeded conventions.\n- The [[simple-baseline-site | simple site]] tutorial for a fuller walk-through.\n- For multilingual: see the [[multilingual-baseline-site | multilingual site]] tutorial.\n- The [[head-and-noindex | head and noindex]] guide once you have the basics working.\n- The [[architecture-snapshot | architecture snapshot]] for the deeper read on how the plugin is built.\n',
             url: '/docs/introduction/quickstart/',
             outputPath: './dist/docs/introduction/quickstart/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-04-28T00:00:00.000Z,
             dateModified: 2026-09-06T23:14:05.000Z },
          inputPath: './src/content/docs/00.introduction/03.quickstart.md',
          fileSlug: '03.quickstart',
          filePathStem: '/content/docs/00.introduction/03.quickstart',
          date: 2026-04-28T00:00:00.000Z,
          outputPath: './dist/docs/introduction/quickstart/index.html',
          url: '/docs/introduction/quickstart/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/01.tutorial/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nThe shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.\n\nWhat it builds is the plainest site there is: a homepage, a page beside it, and one post. That is on purpose. It is a shape you already recognise, so no page here has to spend words explaining what the example site is meant to be.\n\nThis is the tutorial the [[feature-guide | feature guides]] build on.\n\n---\n\n## What you will build\n\nA homepage, a page at `/about/`, and a first post at `/posts/hello-world/`.\n\nBaseline wired with default options: `sitemap` on, `navigator` on in dev and off in production, and `multilingual` off until the last stretch turns it on.\n\nA small stylesheet flowing through Baseline\'s assets pipeline, and an auto-generated `sitemap.xml` next to it.\n\nA Dutch version of the homepage, with hreflang and a sitemap per language.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer.\n- npm.\n- A terminal.\n\n---\n\nThe pages run in order and each one continues the site the last one left. Features are covered in the [[feature-guide | feature guides]] chapter.\n\n{% alertBlock "info" %}\n\nThe completed tutorial site (with how-to chapters) is [available on GitHub](https://github.com/apleasantview/simple-baseline-site). Please note that the repo might be stale.\n\n{% endalertBlock %}\n\n---\n\n## In this chapter\n\n{% include "partials/chapter-toc.njk" %}\n\nPrefer a checklist? See the [[quickstart | quickstart]].\n\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: '/docs/tutorial/',
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Tutorials',
             title: 'Tutorials',
             description:
              'Build a Baseline site from an empty folder: a homepage, a page, a first post, then a second language with hreflang and per-language sitemaps.',
             slug: 'tutorial',
             date: 2026-07-31T00:00:00.000Z,
             seo: [Object],
             pageType: 'CollectionPage',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/01.tutorial/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/01.tutorial/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-07-31T00:00:00.000Z,
             rawInput:
              '\nThe shortest path from an empty folder to a working Baseline site. One tutorial, read in order, ending with a site in two languages and a closing page pointing at what comes after.\n\nWhat it builds is the plainest site there is: a homepage, a page beside it, and one post. That is on purpose. It is a shape you already recognise, so no page here has to spend words explaining what the example site is meant to be.\n\nThis is the tutorial the [[feature-guide | feature guides]] build on.\n\n---\n\n## What you will build\n\nA homepage, a page at `/about/`, and a first post at `/posts/hello-world/`.\n\nBaseline wired with default options: `sitemap` on, `navigator` on in dev and off in production, and `multilingual` off until the last stretch turns it on.\n\nA small stylesheet flowing through Baseline\'s assets pipeline, and an auto-generated `sitemap.xml` next to it.\n\nA Dutch version of the homepage, with hreflang and a sitemap per language.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer.\n- npm.\n- A terminal.\n\n---\n\nThe pages run in order and each one continues the site the last one left. Features are covered in the [[feature-guide | feature guides]] chapter.\n\n{% alertBlock "info" %}\n\nThe completed tutorial site (with how-to chapters) is [available on GitHub](https://github.com/apleasantview/simple-baseline-site). Please note that the repo might be stale.\n\n{% endalertBlock %}\n\n---\n\n## In this chapter\n\n{% include "partials/chapter-toc.njk" %}\n\nPrefer a checklist? See the [[quickstart | quickstart]].\n\n',
             url: '/docs/tutorial/',
             outputPath: './dist/docs/tutorial/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-07-31T00:00:00.000Z,
             dateModified: 2026-09-06T23:14:05.000Z },
          inputPath: './src/content/docs/01.tutorial/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/01.tutorial/00.index',
          date: 2026-07-31T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/index.html',
          url: '/docs/tutorial/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/01.simple-site.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01.simple-site',
             filePathStem: '/content/docs/01.tutorial/01.simple-site',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nLet\'s start by creating the project folder. Everything after this happens in there.\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\n```\n\n---\n\n## Add the package file\n\nGenerate a standard `package.json` file. Now the folder becomes a project.\n\n```bash\nnpm init -y\n```\n\nThen switch `"type"` to `"module"`, which tells Node that the `.js` files here are ES modules, and swap the placeholder `test` script for the two the rest of the tutorial needs.\n\n```json\n{\n\t"name": "simple-baseline-site",\n\t"version": "1.0.0",\n\t"description": "",\n\t"main": "index.js",\n\t"scripts": {\n\t\t"start": "npm-run-all clean dev",\n\t\t"dev": "cross-env ELEVENTY_ENV=development BASELINE_URL=http://localhost:8080/ eleventy --serve",\n\t\t"build": "npm-run-all clean build:eleventy",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production eleventy",\n\t\t"clean": "rimraf dist/"\n\t},\n\t"keywords": [],\n\t"author": "",\n\t"license": "ISC",\n\t"type": "module"\n}\n```\n\nThe whole file, so you can check yours against it. `npm init` wrote the empty `description`, `main`, `keywords` and `author`; nothing in this tutorial reads any of them.\n\nBaseline is ESM, and so is the config you are about to write. Without that line Node reads `eleventy.config.js` as a CommonJS file and stops at the first `import`.\n\nFive scripts, but only two you will type: `npm start` and `npm run build`. Each one empties `dist/` first and then runs the real command, and `npm-run-all` is what chains them. Splitting them this way keeps each line short enough to read, and gives you somewhere to hang a second build step later.\n\nThe two variables in those scripts change with where the site is running, so they get set per command rather than typed into a file. `BASELINE_URL` comes back two pages from now as `settings.url`; [[deployment-checks | deployment checks]] covers both of them.\n\nThe scripts lean on three small helpers, installed in the next step.\n\n---\n\n## Install the packages\n\nEleventy comes first: Baseline names it as a peer dependency, so it belongs in your `package.json` rather than inside the plugin.\n\n```bash\nnpm install @11ty/eleventy\n```\n\nThen the three helpers those scripts need: `rimraf` to delete `dist/`, `cross-env` to set environment variables, and `npm-run-all` to run one script after another. The first two work the same way on every operating system, which is the whole reason they are here rather than in the shell.\n\n```bash\nnpm install rimraf cross-env npm-run-all\n```\n\nBaseline comes last, and brings everything else it needs with it, including the image library it uses when you reach for images.\n\n```bash\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nNewer npm versions hold install scripts back until you approve them, so you may see a warning naming `sharp` and `esbuild`. Nothing in this tutorial needs either, so you can ignore it, or run `allow-scripts --all` if it bothers you.\n\n---\n\n## Keep the generated files out of git\n\nIf you are tracking this in git, add a `.gitignore` at the project root. Not using git? Skip the file. Nothing else in the tutorial depends on it.\n\n```text\nnode_modules/\ndist/\n.cache/\ntemp/\n```\n\n`node_modules/` and `dist/` are the usual suspects, both rebuilt from what you commit. `.cache/` is where Baseline keeps the content graph it builds each run and the image renditions it has already encoded, both derived from what you commit.\n\n`temp/` is there in advance, for the scratch files every project ends up accumulating.\n\nEleventy will start now. It will also render nothing at all, because there is still no content.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Tutorials',
             title: 'Create the project',
             slug: 'simple-baseline-site',
             description: 'Make the folder, add a package file, and install Eleventy and Baseline.',
             date: 2026-08-18T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/01.tutorial/01.simple-site.md',
             fileSlug: '01.simple-site',
             filePathStem: '/content/docs/01.tutorial/01.simple-site',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-08-18T00:00:00.000Z,
             rawInput:
              '\nLet\'s start by creating the project folder. Everything after this happens in there.\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\n```\n\n---\n\n## Add the package file\n\nGenerate a standard `package.json` file. Now the folder becomes a project.\n\n```bash\nnpm init -y\n```\n\nThen switch `"type"` to `"module"`, which tells Node that the `.js` files here are ES modules, and swap the placeholder `test` script for the two the rest of the tutorial needs.\n\n```json\n{\n\t"name": "simple-baseline-site",\n\t"version": "1.0.0",\n\t"description": "",\n\t"main": "index.js",\n\t"scripts": {\n\t\t"start": "npm-run-all clean dev",\n\t\t"dev": "cross-env ELEVENTY_ENV=development BASELINE_URL=http://localhost:8080/ eleventy --serve",\n\t\t"build": "npm-run-all clean build:eleventy",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production eleventy",\n\t\t"clean": "rimraf dist/"\n\t},\n\t"keywords": [],\n\t"author": "",\n\t"license": "ISC",\n\t"type": "module"\n}\n```\n\nThe whole file, so you can check yours against it. `npm init` wrote the empty `description`, `main`, `keywords` and `author`; nothing in this tutorial reads any of them.\n\nBaseline is ESM, and so is the config you are about to write. Without that line Node reads `eleventy.config.js` as a CommonJS file and stops at the first `import`.\n\nFive scripts, but only two you will type: `npm start` and `npm run build`. Each one empties `dist/` first and then runs the real command, and `npm-run-all` is what chains them. Splitting them this way keeps each line short enough to read, and gives you somewhere to hang a second build step later.\n\nThe two variables in those scripts change with where the site is running, so they get set per command rather than typed into a file. `BASELINE_URL` comes back two pages from now as `settings.url`; [[deployment-checks | deployment checks]] covers both of them.\n\nThe scripts lean on three small helpers, installed in the next step.\n\n---\n\n## Install the packages\n\nEleventy comes first: Baseline names it as a peer dependency, so it belongs in your `package.json` rather than inside the plugin.\n\n```bash\nnpm install @11ty/eleventy\n```\n\nThen the three helpers those scripts need: `rimraf` to delete `dist/`, `cross-env` to set environment variables, and `npm-run-all` to run one script after another. The first two work the same way on every operating system, which is the whole reason they are here rather than in the shell.\n\n```bash\nnpm install rimraf cross-env npm-run-all\n```\n\nBaseline comes last, and brings everything else it needs with it, including the image library it uses when you reach for images.\n\n```bash\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nNewer npm versions hold install scripts back until you approve them, so you may see a warning naming `sharp` and `esbuild`. Nothing in this tutorial needs either, so you can ignore it, or run `allow-scripts --all` if it bothers you.\n\n---\n\n## Keep the generated files out of git\n\nIf you are tracking this in git, add a `.gitignore` at the project root. Not using git? Skip the file. Nothing else in the tutorial depends on it.\n\n```text\nnode_modules/\ndist/\n.cache/\ntemp/\n```\n\n`node_modules/` and `dist/` are the usual suspects, both rebuilt from what you commit. `.cache/` is where Baseline keeps the content graph it builds each run and the image renditions it has already encoded, both derived from what you commit.\n\n`temp/` is there in advance, for the scratch files every project ends up accumulating.\n\nEleventy will start now. It will also render nothing at all, because there is still no content.\n',
             url: '/docs/tutorial/simple-baseline-site/',
             outputPath: './dist/docs/tutorial/simple-baseline-site/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-08-18T00:00:00.000Z,
             dateModified: 2026-09-03T07:36:52.000Z },
          inputPath: './src/content/docs/01.tutorial/01.simple-site.md',
          fileSlug: '01.simple-site',
          filePathStem: '/content/docs/01.tutorial/01.simple-site',
          date: 2026-08-18T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/simple-baseline-site/index.html',
          url: '/docs/tutorial/simple-baseline-site/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/02.project-setup.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '02.project-setup',
             filePathStem: '/content/docs/01.tutorial/02.project-setup',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nBaseline has an opinion about where things live. `src/` for what you write, `dist/` for what gets built, and a handful of folders in between that it finds by name.\n\nBuild that shape first and every file in the rest of the tutorial has an obvious place to go.\n\n```text\nsimple-baseline-site/\n  src/\n    _data/              # site identity lives here\n    _includes/\n      layouts/          # the shell your pages render into\n    assets/\n      css/              # one CSS entry point\n      js/               # one JS entry point\n    content/            # everything you write\n      pages/            # pages, which stay put\n      posts/            # posts, which are dated and listed\n    static/             # copied to the site root untouched\n```\n\n## Make the folders\n\nWhat goes inside splits in two: the folders you write in, and the folders Baseline goes looking for.\n\n### Content folders\n\nThis is the one you will live in. Every word you publish goes here, and the shape it takes is the first real decision of the tutorial.\n\n`pages/` and `posts/` split the two kinds of thing a small site has. A page stays put. A post is dated and turns up in a list. Giving them separate folders is what lets each one have its own rules later, which is exactly what the next few pages do: they get different addresses, and eventually different layouts, because they sit in different folders.\n\nThere is a third position, and it is the root of `content/` itself. A file there is in no folder, so no folder's rules reach it, which turns out to be what the homepage wants.\n\n`content/`, `pages/` and `posts/` are conventions rather than requirements. Eleventy renders whatever it finds in `src/`, so the naming is your call in the end, but they are worth keeping while you learn where things go.\n\n### The ones Baseline expects\n\n`_data`, `_includes`, `assets` and `static` are Baseline's. It finds them by looking, so renaming one means telling Eleventy about it yourself.\n\n`static/` is the odd one of the four: on disk it stays `static/`, but in templates and config Baseline calls it `public`, the name most generators use. Two names, one folder. It only matters the day you go looking for it in [[project-structure | project structure]].\n\nHere's one Bash command to make them all at once:\n\n```bash\nmkdir -p src/_data src/_includes/layouts src/assets/css src/assets/js src/content/pages src/content/posts src/static\n```\n\nIf your shell doesn't take `-p`, make them by hand from the tree above.\n\nThe `dist/` folder is missing on purpose. It appears the first time you build your site.\n\nYou are ready to wire in Baseline next.\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Tutorials',
             title: 'Lay out the folders',
             slug: 'set-up-the-project',
             description:
              'Build the folder shape Baseline expects, and the content folders you will write in.',
             date: 2026-08-15T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/01.tutorial/02.project-setup.md',
             fileSlug: '02.project-setup',
             filePathStem: '/content/docs/01.tutorial/02.project-setup',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-08-15T00:00:00.000Z,
             rawInput:
              "\nBaseline has an opinion about where things live. `src/` for what you write, `dist/` for what gets built, and a handful of folders in between that it finds by name.\n\nBuild that shape first and every file in the rest of the tutorial has an obvious place to go.\n\n```text\nsimple-baseline-site/\n  src/\n    _data/              # site identity lives here\n    _includes/\n      layouts/          # the shell your pages render into\n    assets/\n      css/              # one CSS entry point\n      js/               # one JS entry point\n    content/            # everything you write\n      pages/            # pages, which stay put\n      posts/            # posts, which are dated and listed\n    static/             # copied to the site root untouched\n```\n\n## Make the folders\n\nWhat goes inside splits in two: the folders you write in, and the folders Baseline goes looking for.\n\n### Content folders\n\nThis is the one you will live in. Every word you publish goes here, and the shape it takes is the first real decision of the tutorial.\n\n`pages/` and `posts/` split the two kinds of thing a small site has. A page stays put. A post is dated and turns up in a list. Giving them separate folders is what lets each one have its own rules later, which is exactly what the next few pages do: they get different addresses, and eventually different layouts, because they sit in different folders.\n\nThere is a third position, and it is the root of `content/` itself. A file there is in no folder, so no folder's rules reach it, which turns out to be what the homepage wants.\n\n`content/`, `pages/` and `posts/` are conventions rather than requirements. Eleventy renders whatever it finds in `src/`, so the naming is your call in the end, but they are worth keeping while you learn where things go.\n\n### The ones Baseline expects\n\n`_data`, `_includes`, `assets` and `static` are Baseline's. It finds them by looking, so renaming one means telling Eleventy about it yourself.\n\n`static/` is the odd one of the four: on disk it stays `static/`, but in templates and config Baseline calls it `public`, the name most generators use. Two names, one folder. It only matters the day you go looking for it in [[project-structure | project structure]].\n\nHere's one Bash command to make them all at once:\n\n```bash\nmkdir -p src/_data src/_includes/layouts src/assets/css src/assets/js src/content/pages src/content/posts src/static\n```\n\nIf your shell doesn't take `-p`, make them by hand from the tree above.\n\nThe `dist/` folder is missing on purpose. It appears the first time you build your site.\n\nYou are ready to wire in Baseline next.\n",
             url: '/docs/tutorial/set-up-the-project/',
             outputPath: './dist/docs/tutorial/set-up-the-project/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-08-15T00:00:00.000Z,
             dateModified: 2026-08-21T01:19:28.000Z },
          inputPath: './src/content/docs/01.tutorial/02.project-setup.md',
          fileSlug: '02.project-setup',
          filePathStem: '/content/docs/01.tutorial/02.project-setup',
          date: 2026-08-15T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/set-up-the-project/index.html',
          url: '/docs/tutorial/set-up-the-project/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/03.wire-in-baseline.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '03.wire-in-baseline',
             filePathStem: '/content/docs/01.tutorial/03.wire-in-baseline',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nThis is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.\n\n---\n\n## Add the plugin\n\nThe config file is short, and its last line is the strangest thing in the whole tutorial. Create `eleventy.config.js` in the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(baseline(settings));\n}\n\nexport const config = baselineConfig;\n```\n\n`baseline()` takes two arguments: `settings`, which is what your site *is*, and `options`, which is how Baseline *behaves*. Passing settings only leaves every option at its default, which is the set this tutorial wants.\n\nNow that last line. Eleventy has already chosen its directories by the time a plugin loads, so Baseline ships them as a separate export and asks you to forward it. That is what makes `src/` the input and `dist/` the output. Leave it off and Baseline still runs, badly, in a project it cannot see.\n\nWhy there are two surfaces rather than one is on [[how-baseline-works | how Baseline works]]; the contract that last line forwards is the [[config-export | config export reference]]\'s.\n\n---\n\n## Give the site its identity\n\nNext, the file `eleventy.config.js` just imported. This one is your site\'s identity, the things that would still be true if you rewrote every template tomorrow.\n\nIt lives in `src/_data/`, so every template can read `settings.title` without importing anything. Why the location matters is on [[project-structure | project structure]].\n\nCreate `src/_data/settings.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.BASELINE_URL,\n\tdefaultLanguage: \'en\',\n\tnoindex: false,\n\n\thead: {\n\t\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\t\tscript: [{ src: \'/assets/js/index.js\', defer: true }],\n\t\tmeta: [{ name: \'color-scheme\', content: \'light dark\' }]\n\t}\n};\n```\n\n`url` is the only value not written here: it reads `process.env.BASELINE_URL`, set by the `start` script and passed in by a production build. `title` and `tagline` feed the `<title>` tag, `defaultLanguage` sets the `lang` attribute, and `noindex` keeps a staging build out of search results. The [[site-settings | settings reference]] has the others.\n\nA plain string works here too. `url: \'https://www.example.com/\'` is an ordinary setting, and if your site only ever builds in one place it is the simpler answer. The variable earns its place when the address changes with the build: localhost while you work, a preview URL on a branch, the real domain when it ships. That one value is the origin for every canonical link, sitemap entry, hreflang tag and JSON-LD node Baseline writes, so whatever you set here shows up in all of them.\n\nThe `head` block is how tags reach every page. `link`, `script` and `meta` are arrays whose keys become the rendered tag\'s attributes, and they arrive alongside what Baseline emits anyway, which the [[head | head module]] lists in full. The two files those paths point at get written two pages from now.\n\n{% alertBlock "info" %}\n\nBaseline compiles your CSS and JS, but it does not link them for you. A bundle that is not listed here gets built and then never loaded, which looks exactly like the stylesheet not working.\n\n{% endalertBlock %}\n\nBaseline is wired in. Content is next.\n\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Tutorials',
             title: 'Wire in Baseline',
             slug: 'wire-in-baseline',
             description:
              'Add the plugin, re-export the directory config, and give the site its name and URL.',
             date: 2026-08-15T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/01.tutorial/03.wire-in-baseline.md',
             fileSlug: '03.wire-in-baseline',
             filePathStem: '/content/docs/01.tutorial/03.wire-in-baseline',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-08-15T00:00:00.000Z,
             rawInput:
              '\nThis is the page where Baseline arrives. Two files, and both the kind you write once and rarely open again.\n\n---\n\n## Add the plugin\n\nThe config file is short, and its last line is the strangest thing in the whole tutorial. Create `eleventy.config.js` in the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(baseline(settings));\n}\n\nexport const config = baselineConfig;\n```\n\n`baseline()` takes two arguments: `settings`, which is what your site *is*, and `options`, which is how Baseline *behaves*. Passing settings only leaves every option at its default, which is the set this tutorial wants.\n\nNow that last line. Eleventy has already chosen its directories by the time a plugin loads, so Baseline ships them as a separate export and asks you to forward it. That is what makes `src/` the input and `dist/` the output. Leave it off and Baseline still runs, badly, in a project it cannot see.\n\nWhy there are two surfaces rather than one is on [[how-baseline-works | how Baseline works]]; the contract that last line forwards is the [[config-export | config export reference]]\'s.\n\n---\n\n## Give the site its identity\n\nNext, the file `eleventy.config.js` just imported. This one is your site\'s identity, the things that would still be true if you rewrote every template tomorrow.\n\nIt lives in `src/_data/`, so every template can read `settings.title` without importing anything. Why the location matters is on [[project-structure | project structure]].\n\nCreate `src/_data/settings.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.BASELINE_URL,\n\tdefaultLanguage: \'en\',\n\tnoindex: false,\n\n\thead: {\n\t\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\t\tscript: [{ src: \'/assets/js/index.js\', defer: true }],\n\t\tmeta: [{ name: \'color-scheme\', content: \'light dark\' }]\n\t}\n};\n```\n\n`url` is the only value not written here: it reads `process.env.BASELINE_URL`, set by the `start` script and passed in by a production build. `title` and `tagline` feed the `<title>` tag, `defaultLanguage` sets the `lang` attribute, and `noindex` keeps a staging build out of search results. The [[site-settings | settings reference]] has the others.\n\nA plain string works here too. `url: \'https://www.example.com/\'` is an ordinary setting, and if your site only ever builds in one place it is the simpler answer. The variable earns its place when the address changes with the build: localhost while you work, a preview URL on a branch, the real domain when it ships. That one value is the origin for every canonical link, sitemap entry, hreflang tag and JSON-LD node Baseline writes, so whatever you set here shows up in all of them.\n\nThe `head` block is how tags reach every page. `link`, `script` and `meta` are arrays whose keys become the rendered tag\'s attributes, and they arrive alongside what Baseline emits anyway, which the [[head | head module]] lists in full. The two files those paths point at get written two pages from now.\n\n{% alertBlock "info" %}\n\nBaseline compiles your CSS and JS, but it does not link them for you. A bundle that is not listed here gets built and then never loaded, which looks exactly like the stylesheet not working.\n\n{% endalertBlock %}\n\nBaseline is wired in. Content is next.\n\n',
             url: '/docs/tutorial/wire-in-baseline/',
             outputPath: './dist/docs/tutorial/wire-in-baseline/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-08-15T00:00:00.000Z,
             dateModified: 2026-09-03T07:36:52.000Z },
          inputPath: './src/content/docs/01.tutorial/03.wire-in-baseline.md',
          fileSlug: '03.wire-in-baseline',
          filePathStem: '/content/docs/01.tutorial/03.wire-in-baseline',
          date: 2026-08-15T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/wire-in-baseline/index.html',
          url: '/docs/tutorial/wire-in-baseline/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/04.front-matter-and-slugs.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '04.front-matter-and-slugs',
             filePathStem: '/content/docs/01.tutorial/04.front-matter-and-slugs',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nBefore writing a page, two things it needs: a way to say what it is, and a name to go by. Front matter and a slug. Then one small file that turns the name into an address.\n\n---\n\n## Front matter\n\nFront matter is the block at the very top of a file, fenced by two lines of three dashes and written as YAML:\n\n```md\n---\ntitle: \'About\'\nslug: \'about\'\ndescription: \'What this site is, in one sentence, for anyone who wonders.\'\n---\n\nThe words of the page start here.\n```\n\nEverything in that block becomes data attached to this page and nothing else. Eleventy reads some of the keys itself, `permalink`, `date`, `layout` and `tags` among them. Baseline reads others: `title` and `description` are the two that feed the head. Any key you invent is yours, waiting in the page\'s data for a template to ask for it.\n\nThree keys are the working minimum: `title`, `slug` and `description`. Write those on every page.\n\nThe rest is optional. `date` matters once something sorts your content, which posts do and pages do not, and `permalink` is for a page that has to name its own address rather than take the one it is given.\n\n---\n\n## Slugs\n\nA slug is the name a page goes by. Write `slug: \'about\'` and the page is called `about`, which is a different question from where the file sits or what the URL ends up being. A slug is a name, a permalink is a path, and names are easier to keep tidy.\n\nIt is also the page\'s identity as far as Baseline is concerned. The content graph is built around slugs: they are how Baseline knows which page is which, and how one page finds another without anybody writing a URL down.\n\n{% alertBlock "warning" %}\n\nGive every page a slug, and make it unique.\n\nForget one and the rule below refuses to write the page at all. You get a warning in the build log and no file, which is easy to miss if you are not reading the output.\n\nGive two pages the same slug and the build stops before writing anything, with an error naming both files. There is no winner to pick between them, so it refuses rather than guessing.\n\nAnd pick it once. The slug is the URL, so changing it later moves the page, which means a redirect and every link you forgot about pointing at nothing.\n\n{% endalertBlock %}\n\n---\n\n## Turning a slug into a URL\n\nEleventy lets every page declare its own address: put a `permalink` in the front matter and be done with it. It also means remembering it every single time, and missing it once puts the page at whatever the filename happened to be. So we set a rule for the whole folder instead, and let the URLs follow from what each page is called.\n\nThat rule lives in a directory data file, and the name is the mechanism: `pages.11tydata.js` sitting inside `pages/` is how Eleventy knows this data belongs to everything in that folder. Create `src/content/pages/pages.11tydata.js`:\n\n```js\nexport default {\n\t// Ensure we have a value to work with by explicitly asking for the slug field.\n\tpermalink: function ({ slug, page }) {\n\t\tif (!slug) {\n\t\t\tconsole.warn(`Warning: No slug found for ${page.inputPath}`);\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tconst normalizeSlug = this.slugify(slug);\n\t\t\treturn `/${normalizeSlug}/`;\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error generating permalink for ${page.inputPath}:`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n};\n```\n\nWrite `slug: \'about\'`, get `/about/`.\n\nThe rest is manners. `this.slugify` cleans up whatever you typed, so `\'About Us\'` still arrives at `/about-us/`. A page with no slug gets a warning and `return false`, which tells Eleventy not to write the file at all: a page with no name is more likely a mistake than a decision, and a loud nothing beats a quiet file at an address you never chose.\n\nThat `return false` is worth knowing on its own. Any page whose permalink is `false` gets built and never written, so the same move is how you keep a draft or a scratch file out of the site.\n\nIt never has to catch the data file itself, though. Baseline excludes `*.11tydata.js` from the build for you, everywhere in the project.\n\n{% alertBlock %}\n\n`eleventyComputed` looks like the tool for this, and it is the wrong one: a computed value always beats what the page wrote in its own front matter, so no page could ever name its own address. The permalink function leaves that door open.\n\n{% endalertBlock %}\n\nSo the order is: front matter wins. Write a `permalink` on a page and it gets that address, with the folder rule stepping aside; write none and the rule decides. Let\'s write some content next.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Tutorials',
             title: 'Front matter and slugs',
             slug: 'front-matter-and-slugs',
             description:
              'Front matter is how a page tells Eleventy about itself, a slug is the name it goes by, and one folder rule turns that name into a URL.',
             date: 2026-08-20T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/01.tutorial/04.front-matter-and-slugs.md',
             fileSlug: '04.front-matter-and-slugs',
             filePathStem: '/content/docs/01.tutorial/04.front-matter-and-slugs',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-08-20T00:00:00.000Z,
             rawInput:
              '\nBefore writing a page, two things it needs: a way to say what it is, and a name to go by. Front matter and a slug. Then one small file that turns the name into an address.\n\n---\n\n## Front matter\n\nFront matter is the block at the very top of a file, fenced by two lines of three dashes and written as YAML:\n\n```md\n---\ntitle: \'About\'\nslug: \'about\'\ndescription: \'What this site is, in one sentence, for anyone who wonders.\'\n---\n\nThe words of the page start here.\n```\n\nEverything in that block becomes data attached to this page and nothing else. Eleventy reads some of the keys itself, `permalink`, `date`, `layout` and `tags` among them. Baseline reads others: `title` and `description` are the two that feed the head. Any key you invent is yours, waiting in the page\'s data for a template to ask for it.\n\nThree keys are the working minimum: `title`, `slug` and `description`. Write those on every page.\n\nThe rest is optional. `date` matters once something sorts your content, which posts do and pages do not, and `permalink` is for a page that has to name its own address rather than take the one it is given.\n\n---\n\n## Slugs\n\nA slug is the name a page goes by. Write `slug: \'about\'` and the page is called `about`, which is a different question from where the file sits or what the URL ends up being. A slug is a name, a permalink is a path, and names are easier to keep tidy.\n\nIt is also the page\'s identity as far as Baseline is concerned. The content graph is built around slugs: they are how Baseline knows which page is which, and how one page finds another without anybody writing a URL down.\n\n{% alertBlock "warning" %}\n\nGive every page a slug, and make it unique.\n\nForget one and the rule below refuses to write the page at all. You get a warning in the build log and no file, which is easy to miss if you are not reading the output.\n\nGive two pages the same slug and the build stops before writing anything, with an error naming both files. There is no winner to pick between them, so it refuses rather than guessing.\n\nAnd pick it once. The slug is the URL, so changing it later moves the page, which means a redirect and every link you forgot about pointing at nothing.\n\n{% endalertBlock %}\n\n---\n\n## Turning a slug into a URL\n\nEleventy lets every page declare its own address: put a `permalink` in the front matter and be done with it. It also means remembering it every single time, and missing it once puts the page at whatever the filename happened to be. So we set a rule for the whole folder instead, and let the URLs follow from what each page is called.\n\nThat rule lives in a directory data file, and the name is the mechanism: `pages.11tydata.js` sitting inside `pages/` is how Eleventy knows this data belongs to everything in that folder. Create `src/content/pages/pages.11tydata.js`:\n\n```js\nexport default {\n\t// Ensure we have a value to work with by explicitly asking for the slug field.\n\tpermalink: function ({ slug, page }) {\n\t\tif (!slug) {\n\t\t\tconsole.warn(`Warning: No slug found for ${page.inputPath}`);\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tconst normalizeSlug = this.slugify(slug);\n\t\t\treturn `/${normalizeSlug}/`;\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error generating permalink for ${page.inputPath}:`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n};\n```\n\nWrite `slug: \'about\'`, get `/about/`.\n\nThe rest is manners. `this.slugify` cleans up whatever you typed, so `\'About Us\'` still arrives at `/about-us/`. A page with no slug gets a warning and `return false`, which tells Eleventy not to write the file at all: a page with no name is more likely a mistake than a decision, and a loud nothing beats a quiet file at an address you never chose.\n\nThat `return false` is worth knowing on its own. Any page whose permalink is `false` gets built and never written, so the same move is how you keep a draft or a scratch file out of the site.\n\nIt never has to catch the data file itself, though. Baseline excludes `*.11tydata.js` from the build for you, everywhere in the project.\n\n{% alertBlock %}\n\n`eleventyComputed` looks like the tool for this, and it is the wrong one: a computed value always beats what the page wrote in its own front matter, so no page could ever name its own address. The permalink function leaves that door open.\n\n{% endalertBlock %}\n\nSo the order is: front matter wins. Write a `permalink` on a page and it gets that address, with the folder rule stepping aside; write none and the rule decides. Let\'s write some content next.\n',
             url: '/docs/tutorial/front-matter-and-slugs/',
             outputPath: './dist/docs/tutorial/front-matter-and-slugs/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-08-20T00:00:00.000Z,
             dateModified: 2026-09-03T07:36:52.000Z },
          inputPath: './src/content/docs/01.tutorial/04.front-matter-and-slugs.md',
          fileSlug: '04.front-matter-and-slugs',
          filePathStem: '/content/docs/01.tutorial/04.front-matter-and-slugs',
          date: 2026-08-20T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/front-matter-and-slugs/index.html',
          url: '/docs/tutorial/front-matter-and-slugs/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        ... 49 more items ],
     releases:
      [ { template:
           Template {
             inputPath: './src/content/release-notes/0.1.0-next.42.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '0.1.0-next.42',
             filePathStem: '/content/release-notes/0.1.0-next.42',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nMostly an SEO release. `<baseline-head>` now emits the structured data, social tags, and canonical link that used to be hand-wired per site. A handful of shapes changed to make room for it.\n\n---\n\n## Breaking\n\n{% stepsBlock \'compact\' %}\n\n- **If you hand-wired SEO, unplug it first.**\n\n  `<baseline-head>` now emits the JSON-LD graph, Open Graph, Twitter, and canonical itself (see Added).\n\n  If your site still injects its own, the two coexist rather than replace, so remove your hand-wired SEO from the cascade and let the plugin own it.\n  - _Symptom: two `<script type="application/ld+json">` blocks in one `<head>`_.\n\n- **Content graph edges dropped `type`.**\n\n  It only ever mirrored `internal`, so read that instead: `!edge.internal` where you had `edge.type === \'external\'`, `edge.internal` where you had `edge.type === \'link\'`.\n\n  Edges now carry `rel`, the link\'s `rel` tokens as a lowercased array, for link-audit and SEO use.\n\n- **The SEO identity file moved.**\n\n  If you kept site identity (`organization` / `person`) in `_data/seo.js`, rename the file to `_data/schema.js` and its cascade key from `seo` to `schema`. Site-wide SEO defaults (`ogImage`, Open Graph, Twitter) now live under `settings.seo`. This is only the identity.\n\n  The per-page `seo:` presentation keys (`seo.title`, `seo.description`, `seo.ogImage`, `seo.canonical`, and the rest) are unchanged and stay under `seo`. Rename those to `schema` and your title and description overrides go silently empty.\n\n- **`page.locale` is a string now.**\n\n  It used to be an object; it is a BCP 47 tag (`\'en-US\'`). The three values it held are top-level: `page.lang` (the short code), `page.translationKey`, and `page.isDefaultLang`.\n\n  In settings, `settings.languages.<code>` gains a `locale` field and drops `languageCode`. Update any template reading `page.locale.lang` to `page.lang`, and the same for `.translationKey` / `.isDefaultLang`.\n\n  The content-graph node flattened identically: `node.locale` is a string, with `node.lang`, `node.translationKey`, and `node.isDefaultLang` top-level.\n  - _Symptom: `og:locale` or `inLanguage` falling back to the site default on a non-default-language page._\n\n- **Graph membership gates on `_internal`, not `eleventyExcludeFromCollections`.**\n\n  A page kept out of collections can now appear in the graph, which is usually what you want.\n\n  To keep a page out of the graph, set `baselineExcludeFromGraph: true` (or `_internal: true` for synthetic templates).\n\n  Audit any page that used `eleventyExcludeFromCollections` alone to stay out of the graph (404s, utility pages): they now reach the graph and the JSON-LD corpus until you add the flag.\n  - _Symptom: a 404 or utility page in `_navigator.nodes` or emitting its own WebPage JSON-LD._\n\n- **JSON-LD `@id`s are keyed on the canonical URL.**\n\n  Per-page and corpus graphs moved together, so they stay internally consistent. Any external consumer keyed on the old `#webpage` fragments needs re-keying.\n\n{% endstepsBlock %}\n\n---\n\n## Added\n\n{% stepsBlock \'compact\' %}\n\n- **`<baseline-head>` emits the SEO surface.**\n\n  With no per-site wiring, the head now writes:\n  - a JSON-LD `@graph`: WebSite, Organization or Person, WebPage, Article, BreadcrumbList, with translation links between language versions\n  - Open Graph and Twitter Card meta tags\n  - the canonical link (omitted on noindex pages)\n\n  The graph construction is an adapter to Joost de Valk\'s [`@jdevalk/seo-graph-core`](https://www.npmjs.com/package/@jdevalk/seo-graph-core).\n\n  Identity comes from `_data/schema.js` and `settings.seo`. Per page, `pageType` and `articleType` override the schema `@type`, and `ogImage` sets the share image (the object form `{ url, width, height, alt }` emits a dimensioned image). Keep social image URLs absolute: the graph sits in a script tag the base-URL transform can\'t reach.\n\n- **`node.sections` on the content graph.**\n\n  Each node now carries `sections`, one `{ heading, text }` record per H2. Heading-and-prose pairs make FAQPage, HowTo, and Speakable schemas derivable without re-parsing the rendered HTML.\n\n- **Breadcrumbs.**\n\n  Each content-graph node carries a `breadcrumbs` trail built from its section path, and Baseline emits a matching `BreadcrumbList` in the page\'s JSON-LD. Nothing to wire.\n\n- **`datePublished` and `dateModified` front-matter keys.**\n\n  Optional. Baseline resolves a publish/modified chain for the structured data (front matter, then the git last-commit date, then `page.date`). Sites that set neither are unchanged.\n\n- **Configurable title templates.**\n\n  New `head.titleTemplate` option and a per-page `titleTemplate`. Tokens: `%s` (the page title), `%siteTitle%`, `%tagline%`. Set it to `null` on a page for a bare title. With no template set, the old `Page - Site` composition is reproduced exactly.\n\n- **`topics` front matter for keywords.**\n\n  Lists in `topics` emit schema.org `keywords` (and `og:article:tag` on articles). Separate from Eleventy\'s `tags`, which stays untouched. Bring your own taxonomy.\n\n- **`settings.defaultLocale`.**\n\n  Set a BCP 47 site default (e.g. `\'en-US\'`) as the preferred site-default key; `defaultLanguage` stays valid as its short-code alias. Either one activates multilingual mode.\n\n{% endstepsBlock %}\n\n---\n\n## Fixed\n\n- Same-host links with different `rel` (a `preconnect` and a `dns-prefetch` to one host) are no longer collapsed to one in the head.\n- The sitemap and the markdown alternates skip `permalink:false` records instead of throwing on them.\n- An object-form page-level `seo.ogImage` now also emits a JSON-LD ImageObject, not just the `og:image` tag, so the graph and the social tag share one image.\n\n---\n\n## Reading list\n\nWhere to go deeper on the surfaces that changed.\n\n**SEO**\n\n- [[seo-graph|SEO graph reference]]\n- [[custom-schema|Custom schema]]\n- [[head|The head module]]\n- [[site-settings|Site settings]]\n\n**Content graph**\n\n- [[content-graph|Content graph reference]]\n- [[navigator|The navigator module]]\n- [[globals|Globals]]\n\n**Multilingual**\n\n- [[multilang|The multilang module]]\n- [[filters|Filters]]\n\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/releases.njk',
             section: [Array],
             sectionLabel: 'Release notes',
             title: 'v0.1.0-next.42',
             slug: '0-1-0-next-42',
             description:
              'Mostly an SEO release. Baseline head now emits the structured data, social tags, and canonical link that used to be hand-wired per site.',
             version: '0.1.0-next.42',
             released: '2026-06-04',
             date: '2026-06-04',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/release-notes/0.1.0-next.42.md',
             fileSlug: '0.1.0-next.42',
             filePathStem: '/content/release-notes/0.1.0-next.42',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-06-04T00:00:00.000Z,
             rawInput:
              '\nMostly an SEO release. `<baseline-head>` now emits the structured data, social tags, and canonical link that used to be hand-wired per site. A handful of shapes changed to make room for it.\n\n---\n\n## Breaking\n\n{% stepsBlock \'compact\' %}\n\n- **If you hand-wired SEO, unplug it first.**\n\n  `<baseline-head>` now emits the JSON-LD graph, Open Graph, Twitter, and canonical itself (see Added).\n\n  If your site still injects its own, the two coexist rather than replace, so remove your hand-wired SEO from the cascade and let the plugin own it.\n  - _Symptom: two `<script type="application/ld+json">` blocks in one `<head>`_.\n\n- **Content graph edges dropped `type`.**\n\n  It only ever mirrored `internal`, so read that instead: `!edge.internal` where you had `edge.type === \'external\'`, `edge.internal` where you had `edge.type === \'link\'`.\n\n  Edges now carry `rel`, the link\'s `rel` tokens as a lowercased array, for link-audit and SEO use.\n\n- **The SEO identity file moved.**\n\n  If you kept site identity (`organization` / `person`) in `_data/seo.js`, rename the file to `_data/schema.js` and its cascade key from `seo` to `schema`. Site-wide SEO defaults (`ogImage`, Open Graph, Twitter) now live under `settings.seo`. This is only the identity.\n\n  The per-page `seo:` presentation keys (`seo.title`, `seo.description`, `seo.ogImage`, `seo.canonical`, and the rest) are unchanged and stay under `seo`. Rename those to `schema` and your title and description overrides go silently empty.\n\n- **`page.locale` is a string now.**\n\n  It used to be an object; it is a BCP 47 tag (`\'en-US\'`). The three values it held are top-level: `page.lang` (the short code), `page.translationKey`, and `page.isDefaultLang`.\n\n  In settings, `settings.languages.<code>` gains a `locale` field and drops `languageCode`. Update any template reading `page.locale.lang` to `page.lang`, and the same for `.translationKey` / `.isDefaultLang`.\n\n  The content-graph node flattened identically: `node.locale` is a string, with `node.lang`, `node.translationKey`, and `node.isDefaultLang` top-level.\n  - _Symptom: `og:locale` or `inLanguage` falling back to the site default on a non-default-language page._\n\n- **Graph membership gates on `_internal`, not `eleventyExcludeFromCollections`.**\n\n  A page kept out of collections can now appear in the graph, which is usually what you want.\n\n  To keep a page out of the graph, set `baselineExcludeFromGraph: true` (or `_internal: true` for synthetic templates).\n\n  Audit any page that used `eleventyExcludeFromCollections` alone to stay out of the graph (404s, utility pages): they now reach the graph and the JSON-LD corpus until you add the flag.\n  - _Symptom: a 404 or utility page in `_navigator.nodes` or emitting its own WebPage JSON-LD._\n\n- **JSON-LD `@id`s are keyed on the canonical URL.**\n\n  Per-page and corpus graphs moved together, so they stay internally consistent. Any external consumer keyed on the old `#webpage` fragments needs re-keying.\n\n{% endstepsBlock %}\n\n---\n\n## Added\n\n{% stepsBlock \'compact\' %}\n\n- **`<baseline-head>` emits the SEO surface.**\n\n  With no per-site wiring, the head now writes:\n  - a JSON-LD `@graph`: WebSite, Organization or Person, WebPage, Article, BreadcrumbList, with translation links between language versions\n  - Open Graph and Twitter Card meta tags\n  - the canonical link (omitted on noindex pages)\n\n  The graph construction is an adapter to Joost de Valk\'s [`@jdevalk/seo-graph-core`](https://www.npmjs.com/package/@jdevalk/seo-graph-core).\n\n  Identity comes from `_data/schema.js` and `settings.seo`. Per page, `pageType` and `articleType` override the schema `@type`, and `ogImage` sets the share image (the object form `{ url, width, height, alt }` emits a dimensioned image). Keep social image URLs absolute: the graph sits in a script tag the base-URL transform can\'t reach.\n\n- **`node.sections` on the content graph.**\n\n  Each node now carries `sections`, one `{ heading, text }` record per H2. Heading-and-prose pairs make FAQPage, HowTo, and Speakable schemas derivable without re-parsing the rendered HTML.\n\n- **Breadcrumbs.**\n\n  Each content-graph node carries a `breadcrumbs` trail built from its section path, and Baseline emits a matching `BreadcrumbList` in the page\'s JSON-LD. Nothing to wire.\n\n- **`datePublished` and `dateModified` front-matter keys.**\n\n  Optional. Baseline resolves a publish/modified chain for the structured data (front matter, then the git last-commit date, then `page.date`). Sites that set neither are unchanged.\n\n- **Configurable title templates.**\n\n  New `head.titleTemplate` option and a per-page `titleTemplate`. Tokens: `%s` (the page title), `%siteTitle%`, `%tagline%`. Set it to `null` on a page for a bare title. With no template set, the old `Page - Site` composition is reproduced exactly.\n\n- **`topics` front matter for keywords.**\n\n  Lists in `topics` emit schema.org `keywords` (and `og:article:tag` on articles). Separate from Eleventy\'s `tags`, which stays untouched. Bring your own taxonomy.\n\n- **`settings.defaultLocale`.**\n\n  Set a BCP 47 site default (e.g. `\'en-US\'`) as the preferred site-default key; `defaultLanguage` stays valid as its short-code alias. Either one activates multilingual mode.\n\n{% endstepsBlock %}\n\n---\n\n## Fixed\n\n- Same-host links with different `rel` (a `preconnect` and a `dns-prefetch` to one host) are no longer collapsed to one in the head.\n- The sitemap and the markdown alternates skip `permalink:false` records instead of throwing on them.\n- An object-form page-level `seo.ogImage` now also emits a JSON-LD ImageObject, not just the `og:image` tag, so the graph and the social tag share one image.\n\n---\n\n## Reading list\n\nWhere to go deeper on the surfaces that changed.\n\n**SEO**\n\n- [[seo-graph|SEO graph reference]]\n- [[custom-schema|Custom schema]]\n- [[head|The head module]]\n- [[site-settings|Site settings]]\n\n**Content graph**\n\n- [[content-graph|Content graph reference]]\n- [[navigator|The navigator module]]\n- [[globals|Globals]]\n\n**Multilingual**\n\n- [[multilang|The multilang module]]\n- [[filters|Filters]]\n\n',
             url: '/release-notes/0-1-0-next-42/',
             outputPath: './dist/release-notes/0-1-0-next-42/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-06-04T00:00:00.000Z,
             dateModified: 2026-08-17T23:10:55.000Z },
          inputPath: './src/content/release-notes/0.1.0-next.42.md',
          fileSlug: '0.1.0-next.42',
          filePathStem: '/content/release-notes/0.1.0-next.42',
          date: 2026-06-04T00:00:00.000Z,
          outputPath: './dist/release-notes/0-1-0-next-42/index.html',
          url: '/release-notes/0-1-0-next-42/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/release-notes/0.1.0-next.43.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '0.1.0-next.43',
             filePathStem: '/content/release-notes/0.1.0-next.43',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nA single fix: wikilinks on single-language sites.\n\n---\n\n## Fixed\n\n- Wikilinks (`[[slug]]`) now resolve on single-language sites. Slug registration was gated on a multilang-only flag, so a site with no `languages` configured registered nothing and every wikilink rendered as literal text. Nothing to change on your end; they just work now.\n\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/releases.njk',
             section: [Array],
             sectionLabel: 'Release notes',
             title: 'v0.1.0-next.43',
             slug: '0-1-0-next-43',
             description:
              'A single fix in 0.1.0-next.43: wikilinks now resolve on single-language sites, where they had been left unlinked.',
             version: '0.1.0-next.43',
             released: '2026-06-21',
             date: '2026-06-21',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/release-notes/0.1.0-next.43.md',
             fileSlug: '0.1.0-next.43',
             filePathStem: '/content/release-notes/0.1.0-next.43',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-06-21T00:00:00.000Z,
             rawInput:
              '\nA single fix: wikilinks on single-language sites.\n\n---\n\n## Fixed\n\n- Wikilinks (`[[slug]]`) now resolve on single-language sites. Slug registration was gated on a multilang-only flag, so a site with no `languages` configured registered nothing and every wikilink rendered as literal text. Nothing to change on your end; they just work now.\n\n',
             url: '/release-notes/0-1-0-next-43/',
             outputPath: './dist/release-notes/0-1-0-next-43/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-06-21T00:00:00.000Z,
             dateModified: 2026-09-06T23:14:05.000Z },
          inputPath: './src/content/release-notes/0.1.0-next.43.md',
          fileSlug: '0.1.0-next.43',
          filePathStem: '/content/release-notes/0.1.0-next.43',
          date: 2026-06-21T00:00:00.000Z,
          outputPath: './dist/release-notes/0-1-0-next-43/index.html',
          url: '/release-notes/0-1-0-next-43/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/release-notes/0.1.0-next.44.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '0.1.0-next.44',
             filePathStem: '/content/release-notes/0.1.0-next.44',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nA housekeeping release: the supported Node range and the dependency versions Baseline declares.\n\n---\n\n## Changed\n\n{% stepsBlock 'compact' %}\n\n- **Node 22 is the floor now.**\n\n  `engines` moved from `>=20` to `>=22`, because Node 20 reached end-of-life in April 2026. If you are on Node 20 or 21, move to 22 or 24 (both current LTS). Nothing in the plugin needs syntax newer than Node 22 already has; this is about not advertising a dead line.\n\n- **Internal dependencies advanced to match what Baseline is built on.**\n\n  Most notably `postcss-preset-env` (10 to 11) and `markdown-it-attrs` (4 to 5). The versions the plugin declares now match the ones its own docs site has been building on, so what ships is what gets tested. If you pin Baseline's transitive dependencies yourself, note the two majors; otherwise there is nothing to do.\n\n{% endstepsBlock %}\n\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/releases.njk',
             section: [Array],
             sectionLabel: 'Release notes',
             title: 'v0.1.0-next.44',
             slug: '0-1-0-next-44',
             description:
              'A housekeeping release: the supported Node range and the dependency versions Baseline declares.',
             version: '0.1.0-next.44',
             released: '2026-07-04',
             date: '2026-07-04',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/release-notes/0.1.0-next.44.md',
             fileSlug: '0.1.0-next.44',
             filePathStem: '/content/release-notes/0.1.0-next.44',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-07-04T00:00:00.000Z,
             rawInput:
              "\nA housekeeping release: the supported Node range and the dependency versions Baseline declares.\n\n---\n\n## Changed\n\n{% stepsBlock 'compact' %}\n\n- **Node 22 is the floor now.**\n\n  `engines` moved from `>=20` to `>=22`, because Node 20 reached end-of-life in April 2026. If you are on Node 20 or 21, move to 22 or 24 (both current LTS). Nothing in the plugin needs syntax newer than Node 22 already has; this is about not advertising a dead line.\n\n- **Internal dependencies advanced to match what Baseline is built on.**\n\n  Most notably `postcss-preset-env` (10 to 11) and `markdown-it-attrs` (4 to 5). The versions the plugin declares now match the ones its own docs site has been building on, so what ships is what gets tested. If you pin Baseline's transitive dependencies yourself, note the two majors; otherwise there is nothing to do.\n\n{% endstepsBlock %}\n\n",
             url: '/release-notes/0-1-0-next-44/',
             outputPath: './dist/release-notes/0-1-0-next-44/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-07-04T00:00:00.000Z,
             dateModified: 2026-08-17T23:10:55.000Z },
          inputPath: './src/content/release-notes/0.1.0-next.44.md',
          fileSlug: '0.1.0-next.44',
          filePathStem: '/content/release-notes/0.1.0-next.44',
          date: 2026-07-04T00:00:00.000Z,
          outputPath: './dist/release-notes/0-1-0-next-44/index.html',
          url: '/release-notes/0-1-0-next-44/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/release-notes/0.1.0-next.45.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '0.1.0-next.45',
             filePathStem: '/content/release-notes/0.1.0-next.45',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nTwo strands of work in one release. Half of it is Baseline claiming something about your site that was not so: an origin anchored to the wrong place, a breadcrumb trail pointing at itself, a debug page asking to be indexed. The other half is multilingual: a page can now list its own translations without going through a collection, and the strings in your templates get somewhere to live.\n\nFour breaking changes, which is more than usual. The first one asks you to change a file before anything else works, so it goes first.\n\n---\n\n## Breaking\n\n{% stepsBlock \'compact\' %}\n\n- **Baseline no longer loads your `.env` file.**\n\n  Importing the plugin used to run `dotenv` as a side effect, which put your environment variables in place before your own files were evaluated. That is gone.\n\n  This only affects you if you keep a `.env` file. If your variables come from npm scripts or your host, nothing changes. If you do keep one, install `dotenv` and import it at the top of whichever file reads the values, normally `_data/settings.js`:\n\n  ```js\n  import \'dotenv/config\';\n  ```\n\n  Keep that import in the same file as the read rather than in `eleventy.config.js`. A file that loads its own environment works whatever imported it, in whatever order; one that relies on someone else having done it first depends on the order of two import lines.\n\n  - _Symptom: a startup warning that `settings.url` is missing, and pages built without canonical, Open Graph or JSON-LD._\n\n- **The three translation filters lost their `i18n` prefix.**\n\n  `i18nTranslationsFor`, `i18nTranslationIn` and `i18nDefaultTranslation` are now `translationsFor`, `translationIn` and `defaultTranslation`. Their arguments changed too, two entries down.\n\n  The prefix was on the wrong system. Across Hugo, the Eleventy dictionary plugins and most of npm, `i18n` means string translation, and these three answer a different question: which pages are versions of each other. The name is now free for the thing it usually means, which arrives below as `t`.\n\n- **`translationsMap` leaves are records, not pages.**\n\n  Each entry was `{ title, url, lang, isDefaultLang, data }`, where `data` was the page\'s entire resolved cascade, copied per language per key and kept alive until the build finished. It is now `{ url, lang, label, title, description, isDefaultLang }`, with `label` being that language\'s `languageName`.\n\n  - _If you read `entry.data.something`, either use `title` and `description`, or look the page up by `url`._\n\n- **`collections.translations` is gone, and the three filters no longer take a collection.**\n\n  The flat list existed only to be passed into the filters. They read the translation map directly now, so the argument went with it:\n\n  {% raw %}\n\n  ```nunjucks\n  {{ page | translationsFor }}\n  {{ page | translationIn("fr") }}\n  {{ page | defaultTranslation }}\n  ```\n\n  {% endraw %}\n\n  This also frees the word `translations` for the string tables below. If you were using the collection to list pages by language, `collections.all` grouped by `data.lang` is the replacement, and it stays yours to shape.\n\n{% endstepsBlock %}\n\n---\n\n## Changed\n\n{% stepsBlock \'compact\' %}\n\n- **Absolute URLs come from `settings.url` and nothing else.**\n\n  Baseline used to fall back to the environment when resolving the origin. If the two disagree now, settings wins and the sitemap follows it. Deploy previews are where that bites, since host variables tend to stay pointed at production.\n\n- **`settings.url` has to be an absolute http(s) URL.**\n\n  A relative value like `/`, or one missing its scheme like `localhost:8080`, used to be truthy enough to pass every internal check and then reach the JSON-LD graph as relative `@id`s. It is ignored with a warning now, and an unusable value is treated the same as an absent one: no canonical, no Open Graph, no JSON-LD.\n\n- **Breadcrumb labels come from the section\'s own index page.**\n\n  A crumb for `/docs/` used to be built out of the folder name. It now reads as the page at that URL titles itself, so a folder called `docs` holding a page called "Documentation" gives you Documentation. Sections with no index page keep the folder name, sentence-cased: `core-reference` reads as "Core reference" rather than "Core Reference". Both the visible trail and the `BreadcrumbList` change together.\n\n  Nothing to configure. Retitle a section index page and its crumb follows.\n\n- **A site-wide share card is no longer a claim about each page.**\n\n  `settings.seo.ogImage` used to feed `primaryImageOfPage` as well as `og:image`, so one card said it was the image representing every page on the site. It now fills the social tags only. Set `ogImage` on a page and that page gets `primaryImageOfPage` and a sized `ImageObject` node as before.\n\n  - _Symptom: `primaryImageOfPage` and an `ImageObject` node disappearing from pages that never set their own image. An organisation logo or person photo is unaffected; those come from `schema`._\n\n- **hreflang is built from the content graph.**\n\n  No output change. Head used to read a map assembled by a collection; it now reads the same relationships grouped from the graph, which is where they already were.\n\n{% endstepsBlock %}\n\n---\n\n## Added\n\n{% stepsBlock \'compact\' %}\n\n- **`page.translations`, the current page\'s siblings in other languages.**\n\n  A list, on the page, with no collection to pass around. Each entry carries the `url`, the `lang`, a `label` from that language\'s `languageName`, that translation\'s own `title` and `description`, and `isDefaultLang`.\n\n  {% raw %}\n\n  ```nunjucks\n  {% for entry in page.translations %}\n  \t<a href="{{ entry.url }}" hreflang="{{ entry.lang }}">{{ entry.label }}</a>\n  {% endfor %}\n  ```\n\n  {% endraw %}\n\n  The current page is left out, matching Eleventy\'s own `locale_links` and Hugo\'s `.Translations`. It is built from the content graph, so a page marked `_internal`, excluded from the graph, or not rendering to `.html` is absent here. The filters still see it.\n\n- **`t`, for translating UI strings.**\n\n  The other half of the word. Strings live in `_data/translations/<lang>.js`, one file per language, which Eleventy auto-loads. Keys are dot-paths.\n\n  {% raw %}\n\n  ```nunjucks\n  {{ "nav.home" | t }}\n  {{ "greeting" | t({ name: "Cris" }) }}\n  {{ "items" | t({ count: 7 }) }}\n  ```\n\n  {% endraw %}\n\n  The language comes from the page, falling back to your default. `{name}` placeholders are interpolated, plural forms are selected by `count` through `Intl.PluralRules`, and a key missing everywhere renders as the key itself with a warning rather than as a blank.\n\n  It is registered whether or not multilingual mode is on. A single-language site still benefits from one place for its labels.\n\n- **`homeLabel`, per language.**\n\n  The first breadcrumb was hardcoded to "Home". Set `homeLabel` on a language entry and that language\'s trail uses it. Unset, you get "Home".\n\n  ```js\n  languages: {\n    fr: { locale: \'fr\', languageName: \'Français\', homeLabel: \'Accueil\' }\n  }\n  ```\n\n- **`root` is a reserved section segment.**\n\n  A page whose `section` is `[\'root\']` sits at the site root: the segment contributes no crumb, so a top-level page gets a `Home > Page` trail without `/root/` landing in its URL. It shipped undocumented in an earlier release. Worth knowing if you have a real `root` segment, because that crumb is skipped.\n\n{% endstepsBlock %}\n\n---\n\n## Fixed\n\nThe home page no longer emits a breadcrumb trail. It was a two-item `BreadcrumbList` with the same URL in both entries. Language-aware, so `/fr/` and `/nl/` match `/`.\n\nThe navigator page renders one `<head>` instead of two nested inside each other. Its template wrapped `<baseline-head>` in a `<head>` of its own, and the placeholder is the head rather than something that goes inside one. Its styles now arrive through the head module like any other.\n\nWarnings print once. They were emitted by the content-graph pre-pass and again by the real build, because the pre-pass log gate covered `info` and not `warn`. Errors are still ungated, since a pre-pass that fails may be the only place it says so.\n\nThe navigator page is `noindex, nofollow` and out of the sitemap. It was shipping `index, follow` and a canonical, and the only way to stop it was turning the navigator off.\n\nNo more raw `fatal: not a git repository` in the build log. `dateModified` falls back to a file\'s last commit, so Baseline asks git for one, and outside a repository git writes that line straight to the terminal before throwing. Unprefixed, in the middle of Baseline\'s own output, it read as the build dying. The build was always fine and wrote every file; it is quiet now, and the date chain still degrades to `datePublished` as before.\n\n`_navigator.edges` falls back to an empty array rather than an empty object. Before the content graph exists it was `{}`, so the shape changed between the pre-pass and the real build and anything treating it as an array saw an object on the first one.\n\nDrafts render in dev again, and images transform on request again. The content-graph pre-pass runs a second Eleventy instance, and a nested instance overwrites `ELEVENTY_RUN_MODE` for the whole process. It was defaulting to `build`, so a `--serve` run stopped looking like one: `draft: true` pages vanished and the image shortcode stopped passing `transformOnRequest`. Dev only, production was always correct. True since the pre-pass landed, so next.42 through next.44.\n\nA page in a non-default language could inherit the default language\'s locale. With `languages` written as an array (`[\'en\', \'nl\']`), no entry carries a locale of its own, and the resolver reached past the page\'s own language straight to the site default, so a Dutch page reported `en`. It now derives from the page\'s language first. Object-form config with explicit locales was never affected.\n\nThe translation collections did the same walk twice per build, once each, deep-copying every translated page both times and discarding half the result each way. They share one walk now.\n\n---'... 951 more characters,
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/releases.njk',
             section: [Array],
             sectionLabel: 'Release notes',
             title: 'v0.1.0-next.45',
             slug: '0-1-0-next-45',
             description:
              'Baseline stops loading your .env, translations move onto the page, three filters lose a prefix, and a pre-pass bug that switched dev into build mode.',
             version: '0.1.0-next.45',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/release-notes/0.1.0-next.45.md',
             fileSlug: '0.1.0-next.45',
             filePathStem: '/content/release-notes/0.1.0-next.45',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              '\nTwo strands of work in one release. Half of it is Baseline claiming something about your site that was not so: an origin anchored to the wrong place, a breadcrumb trail pointing at itself, a debug page asking to be indexed. The other half is multilingual: a page can now list its own translations without going through a collection, and the strings in your templates get somewhere to live.\n\nFour breaking changes, which is more than usual. The first one asks you to change a file before anything else works, so it goes first.\n\n---\n\n## Breaking\n\n{% stepsBlock \'compact\' %}\n\n- **Baseline no longer loads your `.env` file.**\n\n  Importing the plugin used to run `dotenv` as a side effect, which put your environment variables in place before your own files were evaluated. That is gone.\n\n  This only affects you if you keep a `.env` file. If your variables come from npm scripts or your host, nothing changes. If you do keep one, install `dotenv` and import it at the top of whichever file reads the values, normally `_data/settings.js`:\n\n  ```js\n  import \'dotenv/config\';\n  ```\n\n  Keep that import in the same file as the read rather than in `eleventy.config.js`. A file that loads its own environment works whatever imported it, in whatever order; one that relies on someone else having done it first depends on the order of two import lines.\n\n  - _Symptom: a startup warning that `settings.url` is missing, and pages built without canonical, Open Graph or JSON-LD._\n\n- **The three translation filters lost their `i18n` prefix.**\n\n  `i18nTranslationsFor`, `i18nTranslationIn` and `i18nDefaultTranslation` are now `translationsFor`, `translationIn` and `defaultTranslation`. Their arguments changed too, two entries down.\n\n  The prefix was on the wrong system. Across Hugo, the Eleventy dictionary plugins and most of npm, `i18n` means string translation, and these three answer a different question: which pages are versions of each other. The name is now free for the thing it usually means, which arrives below as `t`.\n\n- **`translationsMap` leaves are records, not pages.**\n\n  Each entry was `{ title, url, lang, isDefaultLang, data }`, where `data` was the page\'s entire resolved cascade, copied per language per key and kept alive until the build finished. It is now `{ url, lang, label, title, description, isDefaultLang }`, with `label` being that language\'s `languageName`.\n\n  - _If you read `entry.data.something`, either use `title` and `description`, or look the page up by `url`._\n\n- **`collections.translations` is gone, and the three filters no longer take a collection.**\n\n  The flat list existed only to be passed into the filters. They read the translation map directly now, so the argument went with it:\n\n  {% raw %}\n\n  ```nunjucks\n  {{ page | translationsFor }}\n  {{ page | translationIn("fr") }}\n  {{ page | defaultTranslation }}\n  ```\n\n  {% endraw %}\n\n  This also frees the word `translations` for the string tables below. If you were using the collection to list pages by language, `collections.all` grouped by `data.lang` is the replacement, and it stays yours to shape.\n\n{% endstepsBlock %}\n\n---\n\n## Changed\n\n{% stepsBlock \'compact\' %}\n\n- **Absolute URLs come from `settings.url` and nothing else.**\n\n  Baseline used to fall back to the environment when resolving the origin. If the two disagree now, settings wins and the sitemap follows it. Deploy previews are where that bites, since host variables tend to stay pointed at production.\n\n- **`settings.url` has to be an absolute http(s) URL.**\n\n  A relative value like `/`, or one missing its scheme like `localhost:8080`, used to be truthy enough to pass every internal check and then reach the JSON-LD graph as relative `@id`s. It is ignored with a warning now, and an unusable value is treated the same as an absent one: no canonical, no Open Graph, no JSON-LD.\n\n- **Breadcrumb labels come from the section\'s own index page.**\n\n  A crumb for `/docs/` used to be built out of the folder name. It now reads as the page at that URL titles itself, so a folder called `docs` holding a page called "Documentation" gives you Documentation. Sections with no index page keep the folder name, sentence-cased: `core-reference` reads as "Core reference" rather than "Core Reference". Both the visible trail and the `BreadcrumbList` change together.\n\n  Nothing to configure. Retitle a section index page and its crumb follows.\n\n- **A site-wide share card is no longer a claim about each page.**\n\n  `settings.seo.ogImage` used to feed `primaryImageOfPage` as well as `og:image`, so one card said it was the image representing every page on the site. It now fills the social tags only. Set `ogImage` on a page and that page gets `primaryImageOfPage` and a sized `ImageObject` node as before.\n\n  - _Symptom: `primaryImageOfPage` and an `ImageObject` node disappearing from pages that never set their own image. An organisation logo or person photo is unaffected; those come from `schema`._\n\n- **hreflang is built from the content graph.**\n\n  No output change. Head used to read a map assembled by a collection; it now reads the same relationships grouped from the graph, which is where they already were.\n\n{% endstepsBlock %}\n\n---\n\n## Added\n\n{% stepsBlock \'compact\' %}\n\n- **`page.translations`, the current page\'s siblings in other languages.**\n\n  A list, on the page, with no collection to pass around. Each entry carries the `url`, the `lang`, a `label` from that language\'s `languageName`, that translation\'s own `title` and `description`, and `isDefaultLang`.\n\n  {% raw %}\n\n  ```nunjucks\n  {% for entry in page.translations %}\n  \t<a href="{{ entry.url }}" hreflang="{{ entry.lang }}">{{ entry.label }}</a>\n  {% endfor %}\n  ```\n\n  {% endraw %}\n\n  The current page is left out, matching Eleventy\'s own `locale_links` and Hugo\'s `.Translations`. It is built from the content graph, so a page marked `_internal`, excluded from the graph, or not rendering to `.html` is absent here. The filters still see it.\n\n- **`t`, for translating UI strings.**\n\n  The other half of the word. Strings live in `_data/translations/<lang>.js`, one file per language, which Eleventy auto-loads. Keys are dot-paths.\n\n  {% raw %}\n\n  ```nunjucks\n  {{ "nav.home" | t }}\n  {{ "greeting" | t({ name: "Cris" }) }}\n  {{ "items" | t({ count: 7 }) }}\n  ```\n\n  {% endraw %}\n\n  The language comes from the page, falling back to your default. `{name}` placeholders are interpolated, plural forms are selected by `count` through `Intl.PluralRules`, and a key missing everywhere renders as the key itself with a warning rather than as a blank.\n\n  It is registered whether or not multilingual mode is on. A single-language site still benefits from one place for its labels.\n\n- **`homeLabel`, per language.**\n\n  The first breadcrumb was hardcoded to "Home". Set `homeLabel` on a language entry and that language\'s trail uses it. Unset, you get "Home".\n\n  ```js\n  languages: {\n    fr: { locale: \'fr\', languageName: \'Français\', homeLabel: \'Accueil\' }\n  }\n  ```\n\n- **`root` is a reserved section segment.**\n\n  A page whose `section` is `[\'root\']` sits at the site root: the segment contributes no crumb, so a top-level page gets a `Home > Page` trail without `/root/` landing in its URL. It shipped undocumented in an earlier release. Worth knowing if you have a real `root` segment, because that crumb is skipped.\n\n{% endstepsBlock %}\n\n---\n\n## Fixed\n\nThe home page no longer emits a breadcrumb trail. It was a two-item `BreadcrumbList` with the same URL in both entries. Language-aware, so `/fr/` and `/nl/` match `/`.\n\nThe navigator page renders one `<head>` instead of two nested inside each other. Its template wrapped `<baseline-head>` in a `<head>` of its own, and the placeholder is the head rather than something that goes inside one. Its styles now arrive through the head module like any other.\n\nWarnings print once. They were emitted by the content-graph pre-pass and again by the real build, because the pre-pass log gate covered `info` and not `warn`. Errors are still ungated, since a pre-pass that fails may be the only place it says so.\n\nThe navigator page is `noindex, nofollow` and out of the sitemap. It was shipping `index, follow` and a canonical, and the only way to stop it was turning the navigator off.\n\nNo more raw `fatal: not a git repository` in the build log. `dateModified` falls back to a file\'s last commit, so Baseline asks git for one, and outside a repository git writes that line straight to the terminal before throwing. Unprefixed, in the middle of Baseline\'s own output, it read as the build dying. The build was always fine and wrote every file; it is quiet now, and the date chain still degrades to `datePublished` as before.\n\n`_navigator.edges` falls back to an empty array rather than an empty object. Before the content graph exists it was `{}`, so the shape changed between the pre-pass and the real build and anything treating it as an array saw an object on the first one.\n\nDrafts render in dev again, and images transform on request again. The content-graph pre-pass runs a second Eleventy instance, and a nested instance overwrites `ELEVENTY_RUN_MODE` for the whole process. It was defaulting to `build`, so a `--serve` run stopped looking like one: `draft: true` pages vanished and the image shortcode stopped passing `transformOnRequest`. Dev only, production was always correct. True since the pre-pass landed, so next.42 through next.44.\n\nA page in a non-default language could inherit the default language\'s locale. With `languages` written as an array (`[\'en\', \'nl\']`), no entry carries a locale of its own, and the resolver reached past the page\'s own language straight to the site default, so a Dutch page reported `en`. It now derives from the page\'s language first. Object-form config with explicit locales was never affected.\n\nThe translation collections did the same walk twice per build, once each, deep-copying every translated page both times and discarding half the result each way. They share one walk now.\n\n---'... 951 more characters,
             url: '/release-notes/0-1-0-next-45/',
             outputPath: './dist/release-notes/0-1-0-next-45/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-08-21T08:48:18.000Z },
          inputPath: './src/content/release-notes/0.1.0-next.45.md',
          fileSlug: '0.1.0-next.45',
          filePathStem: '/content/release-notes/0.1.0-next.45',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: './dist/release-notes/0-1-0-next-45/index.html',
          url: '/release-notes/0-1-0-next-45/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/release-notes/0.1.0-next.46.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '0.1.0-next.46',
             filePathStem: '/content/release-notes/0.1.0-next.46',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nThe biggest release so far, and it has one new feature and a lot of sharpening. The feature is page breaks: a comment in the body turns one file into several pages, an affordance WordPress has had for twenty years and static site generators have not.\n\nThe sharpening is mostly the image shortcode, which was opened up after a consumer forked a hundred and forty lines of it to get past a closed function. Three breaking changes come out of that, and one of them changes the markup on every site that renders an image.\n\nBaseline also stops narrating your build unless you ask it to.\n\n---\n\n## Breaking\n\n{% stepsBlock \'compact\' %}\n\n- **A missing `alt` now throws instead of warning.**\n\n  The build stops rather than shipping a page with an unlabelled image. This is what `eleventy-img` itself does, and a warning was the wrong tool: it scrolls past, and the page ships either way.\n\n  Use an empty string for a decorative image. `alt: ""` is a statement, and it now reaches the output intact where the attribute renderer used to drop it, which had erased the difference between a decorative image and one nobody had thought about.\n\n  - _Symptom: a build that stops naming a file and an image, where it used to print a warning you had learned to ignore._\n\n- **Five image options were removed rather than deprecated.**\n\n  `imageClass`, `containerClass`, `style`, `attrs` and `figure` are gone. Passing one is ignored, so check your call sites. Two bags replace all five: `img` for attributes on the `<img>`, `picture` for attributes on the `<picture>`, and both take anything HTML takes.\n\n  {% raw %}\n\n  ```nunjucks\n  {% image {\n  \tsrc: "/media/hero.jpg",\n  \talt: "The valley at first light",\n  \timg: { class: "u-rounded", "data-zoom": true },\n  \tpicture: { class: "c-hero__media" }\n  } %}\n  ```\n\n  {% endraw %}\n\n  The migration table is on [[image-shortcode | the image shortcode reference]]. Dropping `figure` fixes a silent data loss on the way past: `figure: false` alongside a `caption` used to return the picture alone and discard the caption, on a green build.\n\n- **`jpeg` joined the default formats, and the `<img>` fallback changed size.**\n\n  Defaults are now `[\'avif\', \'webp\', \'jpeg\']`, and the `<img>` inside the `<picture>` takes the **largest** rendition of the most compatible format rather than the smallest.\n\n  Both halves are about the same thing. The `<img>` carries no `srcset`, so its `src` is not the first of several candidates a browser picks from: it is the whole answer for anything that reads the markup without rendering it, which is feed readers, scrapers and link-preview bots. Those were being handed the smallest file, described with the largest file\'s `width` and `height`. With only avif and webp generated there was also no format a client could fall back *to*.\n\n  - _Costs a third encode per width. Drop `jpeg` from `media.image.formats` if you would rather not pay it, and the emitted markup on every existing site changes on the next build either way._\n\n{% endstepsBlock %}\n\n---\n\n## Changed\n\n- **Baseline is quiet by default.** You get the startup banner, a version line and one line naming the active modules. `verbose: true` opts into the full narrative. `verbose: false` is a third state and means silence, because saying nothing and saying no are different requests. `warn` and `error` still emit in every state, and Eleventy\'s own `--quiet` has the same effect as `false`.\n\n- **An asset that does not compile now fails the build.** There is no useful site on the other side of a stylesheet that did not parse, and the error names the file. The dev server is the exception and still degrades to a placeholder comment, because a dead watch loop is worse than a broken reload.\n\n- **`assets.esbuild` reaches esbuild whole.** It never did: the processor read `minify` and `target` off the object and dropped everything else, while the docs said otherwise. `define`, `loader`, `banner`, `external` and the rest all work now. If you have been setting a key that was quietly discarded, it takes effect on this release, and a bad value fails the build where it used to do nothing.\n\n- **A name you already defined stays yours.** Register a `markdownify` filter or an `image` shortcode of your own and Baseline leaves it alone rather than overwriting it, and says at startup which ones it skipped. Eleventy\'s own warning for this goes to a debug namespace nobody has switched on.\n\n- **The pre-pass stopped building what it throws away.** It no longer compiles the asset pipeline into a dry run whose output is discarded, and the image shortcode uses `statsOnly` there rather than encoding every rendition twice per build.\n\n---\n\n## Added\n\n- **Page breaks.** A `<!--pagebreak-->` in the body splits the page into parts, one Eleventy page each, numbered under the page\'s own URL. The grammar borrows wikilinks, so `<!--pagebreak#setup|Data files-->` names the part and gives it an entry point. Baseline emits no navigation markup: `_pagebreak` carries the parts and your layout draws the links, the same bargain as `page.translations`. See [[page-breaks | splitting a long page]].\n\n- **Project-wide image defaults.** `media: { image: { widths, formats, sizes } }` at registration, so a house style is set once rather than on every call. A single call still overrides them.\n\n- **A build cache for image renditions.** In a build, renditions are written to `.cache/media/` and copied into the output afterwards, so wiping `dist` or starting from a clean CI checkout no longer costs a re-encode. Nothing invalidates it, deliberately: clearing a cache is your maintenance, not the plugin\'s. Persisting `.cache` between deploys is one block on Netlify and automatic on Vercel and Cloudflare.\n\n- **Attributes on the inline filters.** `inlineESbuild` and `inlinePostCSS` take an `attributes` object and put it on the `<script>` or `<style>` tag, which is the only way to attach a CSP `nonce` to a bundle the filter has just produced. `true` renders a bare attribute; `false` and `null` are dropped.\n\n---\n\n## Fixed\n\n- **A media-scoped `<meta>` no longer disappears.** Dedupe keyed on `name` alone, so two `theme-color` tags differing only by media query were treated as one and the second was dropped. Media-scoped `theme-color` is the canonical use of that attribute, so any site with a dark mode hit this.\n\n- **`ogImage: false` declines a share image properly**, rather than falling through to the site default. The chain was using `??`, which passes anything that is not null or undefined, so `false` sailed through it.\n\n- **Every language root is a home page.** On a multilingual site only `/` counted, so `/nl/` and `/fr/` were treated as ordinary pages by anything reading the home flag.\n\n- **The sitemap honours `defaultLocale`.** It read `settings.defaultLanguage` directly, so a site setting only the documented alias failed the multilingual check and got one flat sitemap while multilang was running.\n\n- **`<meta name="description">` no longer falls back to the first paragraph.** A page with nothing to say about itself now says nothing, rather than repeating its opening sentence into a search result.\n\n---\n\n## Docs\n\nThe whole tree had an accuracy pass, a reconciliation pass driven from the commit history, and a voice pass, chapter by chapter. The results worth naming: ten page-level `seo.*` front-matter keys now have a reference entry where they had none, the `settings.seo` example names the four keys inside `openGraph` and `twitter`, and the reserved data keys list was two short.\n\n---\n\n## Reading list\n\nWhere to go deeper on the surfaces that changed.\n\n**Page breaks**\n\n- [[page-breaks|Splitting a long page]]\n- [[content-helpers|Content helpers]]\n- [[globals|Globals]]\n\n**Images**\n\n- [[image-shortcode|The image shortcode]]\n- [[persist-the-build-cache|Persist the build cache on your host]]\n- [[plugin-entrypoint|Plugin entrypoint]]\n\n**Assets**\n\n- [[assets|The assets module]]\n- [[customise-assets-pipeline|Customise the assets pipeline]]\n- [[filters|Filters]]\n\n**SEO front matter**\n\n- [[site-settings|Site settings]]\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/releases.njk',
             section: [Array],
             sectionLabel: 'Release notes',
             title: 'v0.1.0-next.46',
             slug: '0-1-0-next-46',
             description:
              'A page can split itself on a comment marker, the image shortcode was reworked and now caches, Baseline goes quiet by default, and a dark-mode meta tag stops disappearing.',
             version: '0.1.0-next.46',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/release-notes/0.1.0-next.46.md',
             fileSlug: '0.1.0-next.46',
             filePathStem: '/content/release-notes/0.1.0-next.46',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              '\nThe biggest release so far, and it has one new feature and a lot of sharpening. The feature is page breaks: a comment in the body turns one file into several pages, an affordance WordPress has had for twenty years and static site generators have not.\n\nThe sharpening is mostly the image shortcode, which was opened up after a consumer forked a hundred and forty lines of it to get past a closed function. Three breaking changes come out of that, and one of them changes the markup on every site that renders an image.\n\nBaseline also stops narrating your build unless you ask it to.\n\n---\n\n## Breaking\n\n{% stepsBlock \'compact\' %}\n\n- **A missing `alt` now throws instead of warning.**\n\n  The build stops rather than shipping a page with an unlabelled image. This is what `eleventy-img` itself does, and a warning was the wrong tool: it scrolls past, and the page ships either way.\n\n  Use an empty string for a decorative image. `alt: ""` is a statement, and it now reaches the output intact where the attribute renderer used to drop it, which had erased the difference between a decorative image and one nobody had thought about.\n\n  - _Symptom: a build that stops naming a file and an image, where it used to print a warning you had learned to ignore._\n\n- **Five image options were removed rather than deprecated.**\n\n  `imageClass`, `containerClass`, `style`, `attrs` and `figure` are gone. Passing one is ignored, so check your call sites. Two bags replace all five: `img` for attributes on the `<img>`, `picture` for attributes on the `<picture>`, and both take anything HTML takes.\n\n  {% raw %}\n\n  ```nunjucks\n  {% image {\n  \tsrc: "/media/hero.jpg",\n  \talt: "The valley at first light",\n  \timg: { class: "u-rounded", "data-zoom": true },\n  \tpicture: { class: "c-hero__media" }\n  } %}\n  ```\n\n  {% endraw %}\n\n  The migration table is on [[image-shortcode | the image shortcode reference]]. Dropping `figure` fixes a silent data loss on the way past: `figure: false` alongside a `caption` used to return the picture alone and discard the caption, on a green build.\n\n- **`jpeg` joined the default formats, and the `<img>` fallback changed size.**\n\n  Defaults are now `[\'avif\', \'webp\', \'jpeg\']`, and the `<img>` inside the `<picture>` takes the **largest** rendition of the most compatible format rather than the smallest.\n\n  Both halves are about the same thing. The `<img>` carries no `srcset`, so its `src` is not the first of several candidates a browser picks from: it is the whole answer for anything that reads the markup without rendering it, which is feed readers, scrapers and link-preview bots. Those were being handed the smallest file, described with the largest file\'s `width` and `height`. With only avif and webp generated there was also no format a client could fall back *to*.\n\n  - _Costs a third encode per width. Drop `jpeg` from `media.image.formats` if you would rather not pay it, and the emitted markup on every existing site changes on the next build either way._\n\n{% endstepsBlock %}\n\n---\n\n## Changed\n\n- **Baseline is quiet by default.** You get the startup banner, a version line and one line naming the active modules. `verbose: true` opts into the full narrative. `verbose: false` is a third state and means silence, because saying nothing and saying no are different requests. `warn` and `error` still emit in every state, and Eleventy\'s own `--quiet` has the same effect as `false`.\n\n- **An asset that does not compile now fails the build.** There is no useful site on the other side of a stylesheet that did not parse, and the error names the file. The dev server is the exception and still degrades to a placeholder comment, because a dead watch loop is worse than a broken reload.\n\n- **`assets.esbuild` reaches esbuild whole.** It never did: the processor read `minify` and `target` off the object and dropped everything else, while the docs said otherwise. `define`, `loader`, `banner`, `external` and the rest all work now. If you have been setting a key that was quietly discarded, it takes effect on this release, and a bad value fails the build where it used to do nothing.\n\n- **A name you already defined stays yours.** Register a `markdownify` filter or an `image` shortcode of your own and Baseline leaves it alone rather than overwriting it, and says at startup which ones it skipped. Eleventy\'s own warning for this goes to a debug namespace nobody has switched on.\n\n- **The pre-pass stopped building what it throws away.** It no longer compiles the asset pipeline into a dry run whose output is discarded, and the image shortcode uses `statsOnly` there rather than encoding every rendition twice per build.\n\n---\n\n## Added\n\n- **Page breaks.** A `<!--pagebreak-->` in the body splits the page into parts, one Eleventy page each, numbered under the page\'s own URL. The grammar borrows wikilinks, so `<!--pagebreak#setup|Data files-->` names the part and gives it an entry point. Baseline emits no navigation markup: `_pagebreak` carries the parts and your layout draws the links, the same bargain as `page.translations`. See [[page-breaks | splitting a long page]].\n\n- **Project-wide image defaults.** `media: { image: { widths, formats, sizes } }` at registration, so a house style is set once rather than on every call. A single call still overrides them.\n\n- **A build cache for image renditions.** In a build, renditions are written to `.cache/media/` and copied into the output afterwards, so wiping `dist` or starting from a clean CI checkout no longer costs a re-encode. Nothing invalidates it, deliberately: clearing a cache is your maintenance, not the plugin\'s. Persisting `.cache` between deploys is one block on Netlify and automatic on Vercel and Cloudflare.\n\n- **Attributes on the inline filters.** `inlineESbuild` and `inlinePostCSS` take an `attributes` object and put it on the `<script>` or `<style>` tag, which is the only way to attach a CSP `nonce` to a bundle the filter has just produced. `true` renders a bare attribute; `false` and `null` are dropped.\n\n---\n\n## Fixed\n\n- **A media-scoped `<meta>` no longer disappears.** Dedupe keyed on `name` alone, so two `theme-color` tags differing only by media query were treated as one and the second was dropped. Media-scoped `theme-color` is the canonical use of that attribute, so any site with a dark mode hit this.\n\n- **`ogImage: false` declines a share image properly**, rather than falling through to the site default. The chain was using `??`, which passes anything that is not null or undefined, so `false` sailed through it.\n\n- **Every language root is a home page.** On a multilingual site only `/` counted, so `/nl/` and `/fr/` were treated as ordinary pages by anything reading the home flag.\n\n- **The sitemap honours `defaultLocale`.** It read `settings.defaultLanguage` directly, so a site setting only the documented alias failed the multilingual check and got one flat sitemap while multilang was running.\n\n- **`<meta name="description">` no longer falls back to the first paragraph.** A page with nothing to say about itself now says nothing, rather than repeating its opening sentence into a search result.\n\n---\n\n## Docs\n\nThe whole tree had an accuracy pass, a reconciliation pass driven from the commit history, and a voice pass, chapter by chapter. The results worth naming: ten page-level `seo.*` front-matter keys now have a reference entry where they had none, the `settings.seo` example names the four keys inside `openGraph` and `twitter`, and the reserved data keys list was two short.\n\n---\n\n## Reading list\n\nWhere to go deeper on the surfaces that changed.\n\n**Page breaks**\n\n- [[page-breaks|Splitting a long page]]\n- [[content-helpers|Content helpers]]\n- [[globals|Globals]]\n\n**Images**\n\n- [[image-shortcode|The image shortcode]]\n- [[persist-the-build-cache|Persist the build cache on your host]]\n- [[plugin-entrypoint|Plugin entrypoint]]\n\n**Assets**\n\n- [[assets|The assets module]]\n- [[customise-assets-pipeline|Customise the assets pipeline]]\n- [[filters|Filters]]\n\n**SEO front matter**\n\n- [[site-settings|Site settings]]\n',
             url: '/release-notes/0-1-0-next-46/',
             outputPath: './dist/release-notes/0-1-0-next-46/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-09-03T09:36:19.000Z },
          inputPath: './src/content/release-notes/0.1.0-next.46.md',
          fileSlug: '0.1.0-next.46',
          filePathStem: '/content/release-notes/0.1.0-next.46',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: './dist/release-notes/0-1-0-next-46/index.html',
          url: '/release-notes/0-1-0-next-46/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] } ],
     faq:
      [ { template:
           Template {
             inputPath: './src/content/faq/01-lock-in.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01-lock-in',
             filePathStem: '/content/faq/01-lock-in',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nNo. It's a standard Eleventy plugin. Take it out and your Eleventy site still builds: you keep your content, your config, your output. Baseline adds conventions and wiring, not a cage.\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: false,
             layout: false,
             title: 'Does Baseline lock me in?',
             order: 1,
             answer:
              "No. It's a standard Eleventy plugin. Take it out and your Eleventy site still builds: you keep your content, your config, your output. Baseline adds conventions and wiring, not a cage.\n",
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: undefined,
             _backlinks: [],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/faq/01-lock-in.md',
             fileSlug: '01-lock-in',
             filePathStem: '/content/faq/01-lock-in',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              "\nNo. It's a standard Eleventy plugin. Take it out and your Eleventy site still builds: you keep your content, your config, your output. Baseline adds conventions and wiring, not a cage.\n",
             url: false,
             outputPath: false,
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-06-03T09:37:58.000Z },
          inputPath: './src/content/faq/01-lock-in.md',
          fileSlug: '01-lock-in',
          filePathStem: '/content/faq/01-lock-in',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: false,
          url: false,
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/faq/02-vs-eleventy.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '02-vs-eleventy',
             filePathStem: '/content/faq/02-vs-eleventy',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nEleventy gives you the engine and gets out of your way, which is its whole appeal. Baseline is the setup you'd otherwise wire by hand on every project, the head, the assets pipeline, multilingual routing, sitemaps, an SEO graph, crystallised into one plugin. You could write it yourself. This is the version that's already written.\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: false,
             layout: false,
             title: "Doesn't Eleventy already do all this?",
             order: 2,
             answer:
              "Eleventy gives you the engine and gets out of your way, which is its whole appeal. Baseline is the setup you'd otherwise wire by hand on every project, the head, the assets pipeline, multilingual routing, sitemaps, an SEO graph, crystallised into one plugin. You could write it yourself. This is the version that's already written.\n",
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: undefined,
             _backlinks: [],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/faq/02-vs-eleventy.md',
             fileSlug: '02-vs-eleventy',
             filePathStem: '/content/faq/02-vs-eleventy',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              "\nEleventy gives you the engine and gets out of your way, which is its whole appeal. Baseline is the setup you'd otherwise wire by hand on every project, the head, the assets pipeline, multilingual routing, sitemaps, an SEO graph, crystallised into one plugin. You could write it yourself. This is the version that's already written.\n",
             url: false,
             outputPath: false,
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-06-03T09:37:58.000Z },
          inputPath: './src/content/faq/02-vs-eleventy.md',
          fileSlug: '02-vs-eleventy',
          filePathStem: '/content/faq/02-vs-eleventy',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: false,
          url: false,
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/faq/03-production-ready.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '03-production-ready',
             filePathStem: '/content/faq/03-production-ready',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nIt's pre-1.0 and ships on a rolling 0.1.0-next.X cadence, so pin a version when you build something you care about. The ground it covers is stable and demonstrated on this very site, which runs on Baseline.\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: false,
             layout: false,
             title: 'Is it production-ready?',
             order: 3,
             answer:
              "It's pre-1.0 and ships on a rolling 0.1.0-next.X cadence, so pin a version when you build something you care about. The ground it covers is stable and demonstrated on this very site, which runs on Baseline.\n",
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: undefined,
             _backlinks: [],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/faq/03-production-ready.md',
             fileSlug: '03-production-ready',
             filePathStem: '/content/faq/03-production-ready',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              "\nIt's pre-1.0 and ships on a rolling 0.1.0-next.X cadence, so pin a version when you build something you care about. The ground it covers is stable and demonstrated on this very site, which runs on Baseline.\n",
             url: false,
             outputPath: false,
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-06-03T09:37:58.000Z },
          inputPath: './src/content/faq/03-production-ready.md',
          fileSlug: '03-production-ready',
          filePathStem: '/content/faq/03-production-ready',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: false,
          url: false,
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/faq/04-own-tooling.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '04-own-tooling',
             filePathStem: '/content/faq/04-own-tooling',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nYes. The assets pipeline is a convention, not a lock: one CSS entry through PostCSS, one JS entry through esbuild, and you say where they load. Don't want it? Don't use it; the rest of Baseline doesn't mind.\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: false,
             layout: false,
             title: 'Can I bring my own CSS and JS setup?',
             order: 4,
             answer:
              "Yes. The assets pipeline is a convention, not a lock: one CSS entry through PostCSS, one JS entry through esbuild, and you say where they load. Don't want it? Don't use it; the rest of Baseline doesn't mind.\n",
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: undefined,
             _backlinks: [],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/faq/04-own-tooling.md',
             fileSlug: '04-own-tooling',
             filePathStem: '/content/faq/04-own-tooling',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              "\nYes. The assets pipeline is a convention, not a lock: one CSS entry through PostCSS, one JS entry through esbuild, and you say where they load. Don't want it? Don't use it; the rest of Baseline doesn't mind.\n",
             url: false,
             outputPath: false,
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-06-03T09:37:58.000Z },
          inputPath: './src/content/faq/04-own-tooling.md',
          fileSlug: '04-own-tooling',
          filePathStem: '/content/faq/04-own-tooling',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: false,
          url: false,
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/faq/05-seo.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '05-seo',
             filePathStem: '/content/faq/05-seo',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nIt builds a complete schema.org graph for every page, wired with stable @id values, plus Open Graph, Twitter cards, and canonicals. You author identity once and add custom nodes through one seam. (This FAQ is one of those custom nodes.)\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: false,
             layout: false,
             title: 'What does it do for SEO?',
             order: 5,
             answer:
              'It builds a complete schema.org graph for every page, wired with stable @id values, plus Open Graph, Twitter cards, and canonicals. You author identity once and add custom nodes through one seam. (This FAQ is one of those custom nodes.)\n',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: undefined,
             _backlinks: [],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/faq/05-seo.md',
             fileSlug: '05-seo',
             filePathStem: '/content/faq/05-seo',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              '\nIt builds a complete schema.org graph for every page, wired with stable @id values, plus Open Graph, Twitter cards, and canonicals. You author identity once and add custom nodes through one seam. (This FAQ is one of those custom nodes.)\n',
             url: false,
             outputPath: false,
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-06-03T09:37:58.000Z },
          inputPath: './src/content/faq/05-seo.md',
          fileSlug: '05-seo',
          filePathStem: '/content/faq/05-seo',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: false,
          url: false,
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/faq/06-commercial-support.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '06-commercial-support',
             filePathStem: '/content/faq/06-commercial-support',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nYes. Baseline is built and maintained by a pleasant view. For priority help, a custom integration, or a site built on it, get in touch at hello@apleasantview.com.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: false,
             layout: false,
             title: 'Can I get commercial support?',
             order: 6,
             answer:
              'Yes. Baseline is built and maintained by a pleasant view. For priority help, a custom integration, or a site built on it, get in touch at hello@apleasantview.com.\n',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: undefined,
             _backlinks: [],
             _outgoing: [],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/faq/06-commercial-support.md',
             fileSlug: '06-commercial-support',
             filePathStem: '/content/faq/06-commercial-support',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-09-12T19:52:50.603Z,
             rawInput:
              '\nYes. Baseline is built and maintained by a pleasant view. For priority help, a custom integration, or a site built on it, get in touch at hello@apleasantview.com.\n',
             url: false,
             outputPath: false,
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-09-12T19:52:50.603Z,
             dateModified: 2026-06-03T09:37:58.000Z },
          inputPath: './src/content/faq/06-commercial-support.md',
          fileSlug: '06-commercial-support',
          filePathStem: '/content/faq/06-commercial-support',
          date: 2026-09-12T19:52:50.603Z,
          outputPath: false,
          url: false,
          templateContent: [Getter/Setter],
          content: [Getter/Setter] } ],
     translationsMap:
      { about:
         { en:
            { url: '/about/',
              lang: 'en',
              label: 'English',
              title: 'About Eleventy Baseline',
              description: 'How a personal client-work starter became a build framework for Eleventy.',
              isDefaultLang: true },
           fr:
            { url: '/fr/about/',
              lang: 'fr',
              label: 'Français',
              title: "À propos d'Eleventy Baseline",
              description:
               'Comment un starter personnel pour du travail client est devenu un build framework pour Eleventy.',
              isDefaultLang: false },
           nl:
            { url: '/nl/about/',
              lang: 'nl',
              label: 'Nederlands',
              title: 'Over Eleventy Baseline',
              description:
               'Hoe een persoonlijke starter voor klantenwerk uitgroeide tot een build framework voor Eleventy.',
              isDefaultLang: false } },
        'commercial-support':
         { en:
            { url: '/commercial-support/',
              lang: 'en',
              label: 'English',
              title: 'Commercial support',
              description:
               'Baseline is free and stays free. Help adopting it, extending it, or building on it runs through a pleasant view.',
              isDefaultLang: true },
           fr:
            { url: '/fr/commercial-support/',
              lang: 'fr',
              label: 'Français',
              title: 'Support commercial',
              description:
               "Baseline est gratuit et le restera. L'aide pour l'adopter, l'étendre ou construire dessus passe par a pleasant view.",
              isDefaultLang: false },
           nl:
            { url: '/nl/commercial-support/',
              lang: 'nl',
              label: 'Nederlands',
              title: 'Commerciële ondersteuning',
              description:
               'Baseline is gratis en blijft gratis. Hulp bij het adopteren, uitbreiden of erop bouwen loopt via a pleasant view.',
              isDefaultLang: false } },
        homepage:
         { en:
            { url: '/',
              lang: 'en',
              label: 'English',
              title: 'Eleventy Baseline',
              description:
               'Eleventy Baseline is a build framework for Eleventy. Assets, head tags, sitemaps and structured data, ready on the first build.',
              isDefaultLang: true },
           fr:
            { url: '/fr/',
              lang: 'fr',
              label: 'Français',
              title: 'Eleventy Baseline',
              description:
               'Eleventy Baseline est un build framework pour Eleventy. Assets, balises head, sitemaps et données structurées, prêts dès le premier build.',
              isDefaultLang: false },
           nl:
            { url: '/nl/',
              lang: 'nl',
              label: 'Nederlands',
              title: 'Eleventy Baseline',
              description:
               'Eleventy Baseline is een build framework voor Eleventy. Assets, head-tags, sitemaps en gestructureerde data, klaar bij de eerste build.',
              isDefaultLang: false } } },
     all:
      [ { template:
           Template {
             inputPath: './src/content/docs/02.feature-guide/04.sitemaps-and-drafts.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '04.sitemaps-and-drafts',
             filePathStem: '/content/docs/02.feature-guide/04.sitemaps-and-drafts',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nControl which pages end up in your sitemap, and let work-in-progress pages live alongside published ones without leaking into production. Those are separate switches, and knowing which one you want is most of the work.\n\nTwo terms used below:\n\n- **Sitemap index.** The root `sitemap.xml` that lists per-language sitemaps when multilingual is on.\n- **Drafts preprocessor.** The build-time hook Baseline registers to drop `draft: true` pages from any build (and only from builds; serving and watching keep them).\n\n---\n\n## What you will build\n\n- Pages that appear in `sitemap.xml`, and pages that don't.\n- Per-page sitemap controls: `ignore`, `changefreq`, `priority`, `lastmod`.\n- Draft pages that render in dev and quietly disappear in production.\n\n---\n\n## Prerequisites\n\n`settings.url` set, so the `<loc>` entries come out absolute. The sitemap module is on by default, so there are no new options to add.\n\n---\n\n## Page with sitemap controls\n\nCreate `src/content/pages/sitemap-demo.md`:\n\n```md\n---\ntitle: 'Sitemap Demo'\nslug: 'sitemap-demo'\ndescription: 'Control sitemap entries.'\nlayout: 'layouts/base.njk'\nsitemap:\n  changefreq: 'weekly'\n  priority: 0.7\n  lastmod: 2024-01-01\n---\n\nThis page stays in the sitemap with custom frequency, priority, and lastmod.\n```\n\n`changefreq`, `priority`, and `lastmod` are hints, not directives. Search engines treat them as suggestions, so adjust sparingly.\n\n---\n\n## Keeping a page out\n\nThe three noindex knobs are covered on the previous page, [[head-and-noindex | head and noindex]]: site-wide, per-page, and sitemap-only. The one that belongs here is the fourth, because it is a sitemap mechanic rather than a robots one:\n\n```yaml\nsitemap:\n  ignore: true\neleventyExcludeFromCollections: true\n```\n\n- `sitemap: { ignore: true }` removes the page from the sitemap; the page still renders.\n- `eleventyExcludeFromCollections: true` keeps the page out of collections, and because the sitemap reads from collections, out of the sitemap too.\n\nThe second is the blunter instrument. Reach for it when the page should not appear in any listing, not just this one.\n\n---\n\n## Drafts\n\nAdd `draft: true` in front matter:\n\n```yaml\ndraft: true\n```\n\n- In dev (`npm start`): drafts render normally.\n- In any build: drafts are skipped. The switch is Eleventy's own `ELEVENTY_RUN_MODE`, which is `build` for anything that is not serving or watching, so a bare `eleventy` run with no `--serve` or `--watch` drops them too. This is not the `ELEVENTY_ENV` your `build` script sets; that one governs CSS minification and the navigator.\n- Baseline registers its own drafts preprocessor. If you already have one, yours wins; Baseline's is guarded against double-registration.\n\n---\n\n## Run and inspect\n\n```bash\nnpm start\n```\n\n- Open pages normally.\n- Check `dist/sitemap.xml` while dev runs. It's emitted, drafts included.\n- Draft pages render in dev and show up in the dev sitemap. They drop out the moment you build rather than serve.\n\n---\n\n## Production build\n\n```bash\nnpm run build\n```\n\nThen inspect `dist/sitemap.xml`. Three things should be missing:\n\n- Pages with `sitemap.ignore: true`.\n- Every entry, if site-wide `noindex: true` is set.\n- Anything marked `draft: true`.\n\nThe `<loc>` entries are absolute, anchored to `settings.url`. If they come out relative, the origin never reached the build: [[deployment-checks | deployment checks]] covers that.\n\n---\n\n## Multilingual note\n\nWhen multilingual is on, Baseline emits a per-language sitemap (`/en/sitemap.xml`, `/nl/sitemap.xml`, and so on) plus a sitemap index at the root. The per-page `ignore`, `noindex`, and `draft` rules apply to each entry just the same.\n\n---\n\n## Next steps\n\n- Keep `settings.url` accurate in production, and set `pathPrefix` if you deploy under a subpath.\n- Use drafts freely for in-progress content. Just remember they reappear in dev.\n- Set defaults at the data layer: `_data/sitemap.js` for site-wide sitemap defaults, or directory data (e.g. `posts.11tydata.js`) to apply `sitemap` settings across a folder.\n\n---\n\n## See also\n\n- [[sitemap | Sitemap module]] - the full option list.\n- [[deploy-under-a-subpath | Deploy under a subpath]] - what `pathPrefix` does to sitemap URLs.\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Feature guide',
             title: 'Sitemaps and drafts',
             slug: 'sitemaps-and-drafts',
             description:
              'Control sitemap entries and drafts in Baseline: set per-page sitemap fields, apply noindex, and see how drafts behave in dev versus build.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/02.feature-guide/04.sitemaps-and-drafts.md',
             fileSlug: '04.sitemaps-and-drafts',
             filePathStem: '/content/docs/02.feature-guide/04.sitemaps-and-drafts',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              "\nControl which pages end up in your sitemap, and let work-in-progress pages live alongside published ones without leaking into production. Those are separate switches, and knowing which one you want is most of the work.\n\nTwo terms used below:\n\n- **Sitemap index.** The root `sitemap.xml` that lists per-language sitemaps when multilingual is on.\n- **Drafts preprocessor.** The build-time hook Baseline registers to drop `draft: true` pages from any build (and only from builds; serving and watching keep them).\n\n---\n\n## What you will build\n\n- Pages that appear in `sitemap.xml`, and pages that don't.\n- Per-page sitemap controls: `ignore`, `changefreq`, `priority`, `lastmod`.\n- Draft pages that render in dev and quietly disappear in production.\n\n---\n\n## Prerequisites\n\n`settings.url` set, so the `<loc>` entries come out absolute. The sitemap module is on by default, so there are no new options to add.\n\n---\n\n## Page with sitemap controls\n\nCreate `src/content/pages/sitemap-demo.md`:\n\n```md\n---\ntitle: 'Sitemap Demo'\nslug: 'sitemap-demo'\ndescription: 'Control sitemap entries.'\nlayout: 'layouts/base.njk'\nsitemap:\n  changefreq: 'weekly'\n  priority: 0.7\n  lastmod: 2024-01-01\n---\n\nThis page stays in the sitemap with custom frequency, priority, and lastmod.\n```\n\n`changefreq`, `priority`, and `lastmod` are hints, not directives. Search engines treat them as suggestions, so adjust sparingly.\n\n---\n\n## Keeping a page out\n\nThe three noindex knobs are covered on the previous page, [[head-and-noindex | head and noindex]]: site-wide, per-page, and sitemap-only. The one that belongs here is the fourth, because it is a sitemap mechanic rather than a robots one:\n\n```yaml\nsitemap:\n  ignore: true\neleventyExcludeFromCollections: true\n```\n\n- `sitemap: { ignore: true }` removes the page from the sitemap; the page still renders.\n- `eleventyExcludeFromCollections: true` keeps the page out of collections, and because the sitemap reads from collections, out of the sitemap too.\n\nThe second is the blunter instrument. Reach for it when the page should not appear in any listing, not just this one.\n\n---\n\n## Drafts\n\nAdd `draft: true` in front matter:\n\n```yaml\ndraft: true\n```\n\n- In dev (`npm start`): drafts render normally.\n- In any build: drafts are skipped. The switch is Eleventy's own `ELEVENTY_RUN_MODE`, which is `build` for anything that is not serving or watching, so a bare `eleventy` run with no `--serve` or `--watch` drops them too. This is not the `ELEVENTY_ENV` your `build` script sets; that one governs CSS minification and the navigator.\n- Baseline registers its own drafts preprocessor. If you already have one, yours wins; Baseline's is guarded against double-registration.\n\n---\n\n## Run and inspect\n\n```bash\nnpm start\n```\n\n- Open pages normally.\n- Check `dist/sitemap.xml` while dev runs. It's emitted, drafts included.\n- Draft pages render in dev and show up in the dev sitemap. They drop out the moment you build rather than serve.\n\n---\n\n## Production build\n\n```bash\nnpm run build\n```\n\nThen inspect `dist/sitemap.xml`. Three things should be missing:\n\n- Pages with `sitemap.ignore: true`.\n- Every entry, if site-wide `noindex: true` is set.\n- Anything marked `draft: true`.\n\nThe `<loc>` entries are absolute, anchored to `settings.url`. If they come out relative, the origin never reached the build: [[deployment-checks | deployment checks]] covers that.\n\n---\n\n## Multilingual note\n\nWhen multilingual is on, Baseline emits a per-language sitemap (`/en/sitemap.xml`, `/nl/sitemap.xml`, and so on) plus a sitemap index at the root. The per-page `ignore`, `noindex`, and `draft` rules apply to each entry just the same.\n\n---\n\n## Next steps\n\n- Keep `settings.url` accurate in production, and set `pathPrefix` if you deploy under a subpath.\n- Use drafts freely for in-progress content. Just remember they reappear in dev.\n- Set defaults at the data layer: `_data/sitemap.js` for site-wide sitemap defaults, or directory data (e.g. `posts.11tydata.js`) to apply `sitemap` settings across a folder.\n\n---\n\n## See also\n\n- [[sitemap | Sitemap module]] - the full option list.\n- [[deploy-under-a-subpath | Deploy under a subpath]] - what `pathPrefix` does to sitemap URLs.\n",
             url: '/docs/feature-guide/sitemaps-and-drafts/',
             outputPath: './dist/docs/feature-guide/sitemaps-and-drafts/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-09-03T07:37:01.000Z },
          inputPath: './src/content/docs/02.feature-guide/04.sitemaps-and-drafts.md',
          fileSlug: '04.sitemaps-and-drafts',
          filePathStem: '/content/docs/02.feature-guide/04.sitemaps-and-drafts',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/feature-guide/sitemaps-and-drafts/index.html',
          url: '/docs/feature-guide/sitemaps-and-drafts/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/03.how-to/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/03.how-to/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nRecipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.\n\n---\n\n## Index\n\n{% include "partials/chapter-toc.njk" %}\n\nPrefer a guided start? See the [[simple-baseline-site | simple Baseline site]] tutorial.\n\n---\n\n## Eleventy behaviours that catch people out\n\nNone of these is Baseline\'s, and all of them have been hit by somebody following Baseline\'s own instructions. Each is written up on the page where it applies; this is the list to scan when you have the symptom but not the page.\n\n- **A permalink function reads `undefined` from `eleventyComputed`**, warns, and the template\'s permalink quietly wins. The warning names the wrong file. → [[content-organisation | Content organisation]]\n- **A `.11tydata.js` silently beats a sibling `.11tydata.json`.** Edits to the JSON do nothing. → [[project-structure | Project structure]]\n- **Redefining a filter or shortcode warns only under `DEBUG=Eleventy:UserConfig`**, while redefining a collection throws. → [[plugin-entrypoint | Plugin entrypoint]]\n- **Your config finishes before any plugin body runs**, so a name you register directly is in place before Baseline\'s, wherever in the file you wrote it. → [[plugin-entrypoint | Plugin entrypoint]]\n- **CSS and JS asset sources are not templates.** Template syntax in them ships to the browser as typed. → [[customise-assets-pipeline | Customise the assets pipeline]]\n- **`@import-glob` only resolves in the CSS entry file**, and is ignored without error in anything imported from it. → [[customise-assets-pipeline | Customise the assets pipeline]]\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: '/docs/how-to/',
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'How-to guides',
             title: 'How-to guides',
             slug: 'how-to',
             description:
              'Recipes for the things Baseline does not do for you, plus guides on grafting it onto an Eleventy setup that already exists.',
             date: 2026-01-25T00:00:00.000Z,
             pageType: 'CollectionPage',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/03.how-to/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/03.how-to/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nRecipes for the things Baseline does not do for you, and a few guides on grafting it onto setups that already exist.\n\n---\n\n## Index\n\n{% include "partials/chapter-toc.njk" %}\n\nPrefer a guided start? See the [[simple-baseline-site | simple Baseline site]] tutorial.\n\n---\n\n## Eleventy behaviours that catch people out\n\nNone of these is Baseline\'s, and all of them have been hit by somebody following Baseline\'s own instructions. Each is written up on the page where it applies; this is the list to scan when you have the symptom but not the page.\n\n- **A permalink function reads `undefined` from `eleventyComputed`**, warns, and the template\'s permalink quietly wins. The warning names the wrong file. → [[content-organisation | Content organisation]]\n- **A `.11tydata.js` silently beats a sibling `.11tydata.json`.** Edits to the JSON do nothing. → [[project-structure | Project structure]]\n- **Redefining a filter or shortcode warns only under `DEBUG=Eleventy:UserConfig`**, while redefining a collection throws. → [[plugin-entrypoint | Plugin entrypoint]]\n- **Your config finishes before any plugin body runs**, so a name you register directly is in place before Baseline\'s, wherever in the file you wrote it. → [[plugin-entrypoint | Plugin entrypoint]]\n- **CSS and JS asset sources are not templates.** Template syntax in them ships to the browser as typed. → [[customise-assets-pipeline | Customise the assets pipeline]]\n- **`@import-glob` only resolves in the CSS entry file**, and is ignored without error in anything imported from it. → [[customise-assets-pipeline | Customise the assets pipeline]]\n',
             url: '/docs/how-to/',
             outputPath: './dist/docs/how-to/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-09-06T22:57:44.000Z },
          inputPath: './src/content/docs/03.how-to/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/03.how-to/00.index',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/index.html',
          url: '/docs/how-to/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/03.how-to/01.customise-assets-pipeline.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01.customise-assets-pipeline',
             filePathStem: '/content/docs/03.how-to/01.customise-assets-pipeline',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nWhen the fallback configs in the assets module are not enough, drop your own in. PostCSS for CSS, esbuild for JS. The module picks them up.\n\n---\n\n## Prerequisites\n\n- Baseline registered in `eleventy.config.js`.\n- Default entries in place: `src/assets/css/index.css` and `src/assets/js/index.js`.\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n\n---\n\n## PostCSS config\n\nA `postcss.config.js` at the project root replaces Baseline\'s fallback wholesale. Bring the plugins you want, gate cssnano on production, and check the output.\n\n### Install PostCSS and the plugins you plan to use\n\n```bash\nnpm install postcss postcss-import postcss-preset-env cssnano postcss-mixins\n```\n\nOnce you ship your own `postcss.config.js`, the fallback plugins are gone. Whatever you list here has to be installed explicitly.\n\n---\n\n### Add `postcss.config.js` at the project root\n\n```js\nimport postcssImport from \'postcss-import\';\nimport postcssMixins from \'postcss-mixins\';\nimport postcssPresetEnv from \'postcss-preset-env\';\nimport cssnano from \'cssnano\';\n\nconst isProd = process.env.ELEVENTY_ENV === \'production\';\n\nconst plugins = [postcssImport(), postcssMixins(), postcssPresetEnv({ stage: 1 })];\n\nif (isProd) {\n\tplugins.push(cssnano({ preset: \'default\' }));\n}\n\n/** @type {import(\'postcss-load-config\').Config} */\nexport default {\n\tmap: isProd ? false : { inline: true },\n\tplugins\n};\n```\n\n---\n\n### Exercise the config in your CSS\n\n`src/assets/css/base.css`: whatever you already have in `index.css`, moved across unchanged. The [[assets-pipeline | assets pipeline guide]] has a starting point if you need one.\n\n`src/assets/css/mixins.css`:\n\n```css\n@define-mixin linksMixin {\n\tcolor: #0f172a;\n\ttext-decoration: underline;\n\ttext-decoration-color: #fc35b9;\n\ttext-decoration-thickness: 2px;\n\ttext-underline-offset: 3px;\n\tfont-weight: 600;\n}\n```\n\n`src/assets/css/links.css`:\n\n```css\na {\n\t@mixin linksMixin;\n}\n\na:hover {\n\tcolor: #fc35b9;\n}\n```\n\n`src/assets/css/index.css`:\n\n```css\n@import \'./base.css\';\n@import \'./mixins.css\';\n@import \'./links.css\';\n```\n\n---\n\n### Run and inspect\n\n- Dev: `npm start`\n- Build: `npm run build`\n- Check `dist/assets/css/index.css`:\n  - Dev: expanded CSS with mapped imports; no minification.\n  - Prod: minified (cssnano), imports flattened, custom media resolved.\n\n### Notes\n\n- Your `postcss.config.js` fully overrides Baseline\'s fallback. Keep the entry file at `src/assets/css/index.css` and add partials via imports.\n- Reach for what you need (purge, RTL, lightningcss, others). Env guards are the cleanest way to keep dev output readable and production output optimised.\n- **Glob imports only work in the entry file.** If you use `postcss-import-ext-glob`, `@import-glob \'./components/*.css\'` resolves in `index.css` and is ignored in anything imported from it. The plugin implements PostCSS\'s `Once(root)` hook, so it runs on the entry file and never sees the partials `postcss-import` inlines afterwards. Nothing errors: the line is left as written and the files it named are absent from the output.\n- **CSS files are not templates.** Baseline does not render asset sources, so `{% raw %}{{ ... }}{% endraw %}` or `{% raw %}{% ... %}{% endraw %}` in a `.css` file reaches the browser exactly as typed. If a value has to come from data, set a custom property in the head instead.\n\n---\n\n## Esbuild targets\n\nThe JS pipeline takes more nudging than the CSS one. You may want extra entry points, different targets, or a one-off inline bundle, and esbuild is the lever for all three.\n\n---\n\n### Install and pin esbuild explicitly\n\nBaseline depends on esbuild already, but esbuild\'s own docs recommend pinning the version you build against:\n\n```bash\nnpm install --save-exact --save-dev esbuild\n```\n\n---\n\n### Add more entry points\n\nAn entry point is the file Baseline hands to esbuild as the start of a bundle. Each `index.js` under `src/assets/js/**/` is one entry point and produces one bundle in `dist/assets/js/`:\n\n```bash\nmkdir -p src/assets/js/home src/assets/js/about\necho "console.log(\'home bundle\');" > src/assets/js/home/index.js\necho "console.log(\'about bundle\');" > src/assets/js/about/index.js\n```\n\nReference them from a page\'s front matter:\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\nhead:\n  script:\n    - src: \'/assets/js/home/index.js\'\n      defer: true\n---\n```\n\n---\n\n### Inline a small script\n\nFor tiny helpers, inline the bundled output with Baseline\'s `inlineESbuild` filter. `_baseline.paths.assets` is the resolved input path to your assets directory; concatenating the relative path keeps the example portable:\n\n{% raw %}\n\n```nunjucks\n{% set jsPath = _baseline.paths.assets ~ "js/about/index.js" %}\n{{ jsPath | inlineESbuild | safe }}\n```\n\n{% endraw %}\n\nThis bundles and minifies the file with esbuild\'s `es2020` target, then injects a `<script>...</script>` tag.\n\n---\n\n### Set esbuild options for the compiled bundles\n\nPass `assets.esbuild` options when you register Baseline. They apply to every `index.js` Baseline compiles, and only to those: the `inlineESbuild` filter goes straight to the processor and keeps its own defaults.\n\nThe object reaches esbuild whole, so `define`, `loader`, `banner`, `external` and the rest all work. `minify`, `target` and `bundle` come with a Baseline default you can overrule; `entryPoints` and `write` are Baseline\'s and are applied after yours.\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\tassets: {\n\t\t\t\tesbuild: {\n\t\t\t\t\tminify: process.env.ELEVENTY_ENV === \'production\',\n\t\t\t\t\ttarget: \'es2017\'\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n---\n\n### Override target or minification for one inline script\n\nFor one-offs, pass options directly to the filter. They merge over the processor\'s own defaults (`minify: true`, `target: \'es2020\'`, `bundle: true`), which is what the filter starts from whatever you set on `assets.esbuild`:\n\n{% raw %}\n\n```nunjucks\n{% set jsPath = _baseline.paths.assets ~ "js/about/index.js" %}\n{{ jsPath | inlineESbuild({ minify: false, target: "es2018" }) | safe }}\n```\n\n{% endraw %}\n\nAttributes for the tag go in the same object, under `attributes`. They are taken out before the rest reaches esbuild:\n\n{% raw %}\n\n```nunjucks\n{{ jsPath | inlineESbuild({ attributes: { type: "module", defer: true } }) | safe }}\n```\n\n{% endraw %}\n\n`inlinePostCSS` takes the same key and nothing else:\n\n{% raw %}\n\n```nunjucks\n{{ cssPath | inlinePostCSS({ attributes: { media: "print" } }) | safe }}\n```\n\n{% endraw %}\n\n6. Verify.\n   - Dev: `npm start`\n   - Build: `npm run build`\n   - Check `dist/assets/js/**/index.js` for bundled output and size.\n   - For inlined scripts, view the page source and confirm the bundled code is present.\n\n---\n\n### Notes\n\n- Inline only for small helpers; keep larger bundles as external files so they cache.\n- A global override is yours to maintain. Revisit it whenever your browser support changes.\n- If you reach for the same inline overrides repeatedly, write your own filter that calls `inlineESbuild` with preset options and use that filter instead.\n- Do not unwrap the tag to add an attribute. `striptags` removes anything tag-shaped and minified JS is dense with `<` followed by a letter, so it cuts expressions mid-statement and leaves a green build with a broken page. `attributes` exists so that never has to be the move.\n- **JS files are not templates either.** Neither the inline filter nor the entry-point compile renders them, so `{% raw %}{{ site.title }}{% endraw %}` in a `.js` file ships to the browser verbatim and fails there. Pass the value in from the template instead, as a `data-` attribute or a small inline `<script>` the bundle reads.\n\n---\n\n## See also\n\n- [[assets | Assets module]]\n- [[globals| Globals reference]]\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'How-to guides',
             title: 'Customise the assets pipeline',
             slug: 'customise-assets-pipeline',
             description:
              "Override Baseline's fallback PostCSS config, add esbuild entry points, and set targets and minification for the assets module.",
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/03.how-to/01.customise-assets-pipeline.md',
             fileSlug: '01.customise-assets-pipeline',
             filePathStem: '/content/docs/03.how-to/01.customise-assets-pipeline',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nWhen the fallback configs in the assets module are not enough, drop your own in. PostCSS for CSS, esbuild for JS. The module picks them up.\n\n---\n\n## Prerequisites\n\n- Baseline registered in `eleventy.config.js`.\n- Default entries in place: `src/assets/css/index.css` and `src/assets/js/index.js`.\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n\n---\n\n## PostCSS config\n\nA `postcss.config.js` at the project root replaces Baseline\'s fallback wholesale. Bring the plugins you want, gate cssnano on production, and check the output.\n\n### Install PostCSS and the plugins you plan to use\n\n```bash\nnpm install postcss postcss-import postcss-preset-env cssnano postcss-mixins\n```\n\nOnce you ship your own `postcss.config.js`, the fallback plugins are gone. Whatever you list here has to be installed explicitly.\n\n---\n\n### Add `postcss.config.js` at the project root\n\n```js\nimport postcssImport from \'postcss-import\';\nimport postcssMixins from \'postcss-mixins\';\nimport postcssPresetEnv from \'postcss-preset-env\';\nimport cssnano from \'cssnano\';\n\nconst isProd = process.env.ELEVENTY_ENV === \'production\';\n\nconst plugins = [postcssImport(), postcssMixins(), postcssPresetEnv({ stage: 1 })];\n\nif (isProd) {\n\tplugins.push(cssnano({ preset: \'default\' }));\n}\n\n/** @type {import(\'postcss-load-config\').Config} */\nexport default {\n\tmap: isProd ? false : { inline: true },\n\tplugins\n};\n```\n\n---\n\n### Exercise the config in your CSS\n\n`src/assets/css/base.css`: whatever you already have in `index.css`, moved across unchanged. The [[assets-pipeline | assets pipeline guide]] has a starting point if you need one.\n\n`src/assets/css/mixins.css`:\n\n```css\n@define-mixin linksMixin {\n\tcolor: #0f172a;\n\ttext-decoration: underline;\n\ttext-decoration-color: #fc35b9;\n\ttext-decoration-thickness: 2px;\n\ttext-underline-offset: 3px;\n\tfont-weight: 600;\n}\n```\n\n`src/assets/css/links.css`:\n\n```css\na {\n\t@mixin linksMixin;\n}\n\na:hover {\n\tcolor: #fc35b9;\n}\n```\n\n`src/assets/css/index.css`:\n\n```css\n@import \'./base.css\';\n@import \'./mixins.css\';\n@import \'./links.css\';\n```\n\n---\n\n### Run and inspect\n\n- Dev: `npm start`\n- Build: `npm run build`\n- Check `dist/assets/css/index.css`:\n  - Dev: expanded CSS with mapped imports; no minification.\n  - Prod: minified (cssnano), imports flattened, custom media resolved.\n\n### Notes\n\n- Your `postcss.config.js` fully overrides Baseline\'s fallback. Keep the entry file at `src/assets/css/index.css` and add partials via imports.\n- Reach for what you need (purge, RTL, lightningcss, others). Env guards are the cleanest way to keep dev output readable and production output optimised.\n- **Glob imports only work in the entry file.** If you use `postcss-import-ext-glob`, `@import-glob \'./components/*.css\'` resolves in `index.css` and is ignored in anything imported from it. The plugin implements PostCSS\'s `Once(root)` hook, so it runs on the entry file and never sees the partials `postcss-import` inlines afterwards. Nothing errors: the line is left as written and the files it named are absent from the output.\n- **CSS files are not templates.** Baseline does not render asset sources, so `{% raw %}{{ ... }}{% endraw %}` or `{% raw %}{% ... %}{% endraw %}` in a `.css` file reaches the browser exactly as typed. If a value has to come from data, set a custom property in the head instead.\n\n---\n\n## Esbuild targets\n\nThe JS pipeline takes more nudging than the CSS one. You may want extra entry points, different targets, or a one-off inline bundle, and esbuild is the lever for all three.\n\n---\n\n### Install and pin esbuild explicitly\n\nBaseline depends on esbuild already, but esbuild\'s own docs recommend pinning the version you build against:\n\n```bash\nnpm install --save-exact --save-dev esbuild\n```\n\n---\n\n### Add more entry points\n\nAn entry point is the file Baseline hands to esbuild as the start of a bundle. Each `index.js` under `src/assets/js/**/` is one entry point and produces one bundle in `dist/assets/js/`:\n\n```bash\nmkdir -p src/assets/js/home src/assets/js/about\necho "console.log(\'home bundle\');" > src/assets/js/home/index.js\necho "console.log(\'about bundle\');" > src/assets/js/about/index.js\n```\n\nReference them from a page\'s front matter:\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\nhead:\n  script:\n    - src: \'/assets/js/home/index.js\'\n      defer: true\n---\n```\n\n---\n\n### Inline a small script\n\nFor tiny helpers, inline the bundled output with Baseline\'s `inlineESbuild` filter. `_baseline.paths.assets` is the resolved input path to your assets directory; concatenating the relative path keeps the example portable:\n\n{% raw %}\n\n```nunjucks\n{% set jsPath = _baseline.paths.assets ~ "js/about/index.js" %}\n{{ jsPath | inlineESbuild | safe }}\n```\n\n{% endraw %}\n\nThis bundles and minifies the file with esbuild\'s `es2020` target, then injects a `<script>...</script>` tag.\n\n---\n\n### Set esbuild options for the compiled bundles\n\nPass `assets.esbuild` options when you register Baseline. They apply to every `index.js` Baseline compiles, and only to those: the `inlineESbuild` filter goes straight to the processor and keeps its own defaults.\n\nThe object reaches esbuild whole, so `define`, `loader`, `banner`, `external` and the rest all work. `minify`, `target` and `bundle` come with a Baseline default you can overrule; `entryPoints` and `write` are Baseline\'s and are applied after yours.\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\tassets: {\n\t\t\t\tesbuild: {\n\t\t\t\t\tminify: process.env.ELEVENTY_ENV === \'production\',\n\t\t\t\t\ttarget: \'es2017\'\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n---\n\n### Override target or minification for one inline script\n\nFor one-offs, pass options directly to the filter. They merge over the processor\'s own defaults (`minify: true`, `target: \'es2020\'`, `bundle: true`), which is what the filter starts from whatever you set on `assets.esbuild`:\n\n{% raw %}\n\n```nunjucks\n{% set jsPath = _baseline.paths.assets ~ "js/about/index.js" %}\n{{ jsPath | inlineESbuild({ minify: false, target: "es2018" }) | safe }}\n```\n\n{% endraw %}\n\nAttributes for the tag go in the same object, under `attributes`. They are taken out before the rest reaches esbuild:\n\n{% raw %}\n\n```nunjucks\n{{ jsPath | inlineESbuild({ attributes: { type: "module", defer: true } }) | safe }}\n```\n\n{% endraw %}\n\n`inlinePostCSS` takes the same key and nothing else:\n\n{% raw %}\n\n```nunjucks\n{{ cssPath | inlinePostCSS({ attributes: { media: "print" } }) | safe }}\n```\n\n{% endraw %}\n\n6. Verify.\n   - Dev: `npm start`\n   - Build: `npm run build`\n   - Check `dist/assets/js/**/index.js` for bundled output and size.\n   - For inlined scripts, view the page source and confirm the bundled code is present.\n\n---\n\n### Notes\n\n- Inline only for small helpers; keep larger bundles as external files so they cache.\n- A global override is yours to maintain. Revisit it whenever your browser support changes.\n- If you reach for the same inline overrides repeatedly, write your own filter that calls `inlineESbuild` with preset options and use that filter instead.\n- Do not unwrap the tag to add an attribute. `striptags` removes anything tag-shaped and minified JS is dense with `<` followed by a letter, so it cuts expressions mid-statement and leaves a green build with a broken page. `attributes` exists so that never has to be the move.\n- **JS files are not templates either.** Neither the inline filter nor the entry-point compile renders them, so `{% raw %}{{ site.title }}{% endraw %}` in a `.js` file ships to the browser verbatim and fails there. Pass the value in from the template instead, as a `data-` attribute or a small inline `<script>` the bundle reads.\n\n---\n\n## See also\n\n- [[assets | Assets module]]\n- [[globals| Globals reference]]\n',
             url: '/docs/how-to/customise-assets-pipeline/',
             outputPath: './dist/docs/how-to/customise-assets-pipeline/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-09-03T07:37:09.000Z },
          inputPath: './src/content/docs/03.how-to/01.customise-assets-pipeline.md',
          fileSlug: '01.customise-assets-pipeline',
          filePathStem: '/content/docs/03.how-to/01.customise-assets-pipeline',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/customise-assets-pipeline/index.html',
          url: '/docs/how-to/customise-assets-pipeline/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/03.how-to/02.deploy-under-subpath.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '02.deploy-under-subpath',
             filePathStem: '/content/docs/03.how-to/02.deploy-under-subpath',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nServe a Baseline site from a subpath like `/docs/` without breaking links, asset paths, canonical URLs, or the sitemap on the way.\n\n---\n\n## Prerequisites\n\n- Baseline registered in `eleventy.config.js`.\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n- `settings.url` set to the production origin (no trailing slash, no subpath).\n- You deploy to a subpath (e.g. a GitHub Pages project site, a reverse proxy, or a Netlify subdirectory).\n\n---\n\n## Set `pathPrefix` in Eleventy\'s [[config-export | config export]]\n\nKeep `settings.url` pointed at the origin and put the subpath on `pathPrefix`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(baseline(settings));\n}\n\nexport const config = {\n\t...baselineConfig,\n\tpathPrefix: \'/docs/\' // include leading and trailing slash\n};\n```\n\nEleventy rewrites root-relative URLs with `pathPrefix`, and the sitemap picks it up through Eleventy\'s `htmlBaseUrl` filter.\n\n---\n\n## Keep `settings.url` clean (origin only)\n\n[[deployment-checks | Deployment checks]] covers the env shape. Sitemap entries combine `settings.url` with `pathPrefix` automatically.\n\n{% alertBlock "warning" %}\n\n### The head does not carry `pathPrefix` today.\n\nThe canonical, `og:url`, the hreflang alternates and the JSON-LD `@id` values are built from `settings.url` plus the page\'s own URL, and Eleventy\'s `HtmlBasePlugin` leaves an already-absolute URL alone. So on a site deployed under `/docs/`, in-page links and the sitemap read `https://www.example.com/docs/about/` while the canonical reads `https://www.example.com/about/`.\n\nPutting the subpath in `settings.url` instead is not the fix: it doubles the prefix on the links and the sitemap. Until this is closed, a subpath deployment ships head URLs that are one segment short.\n\n{% endalertBlock %}\n\n---\n\n## Use root-relative asset and page links\n\nReference built assets and pages with leading slashes so Eleventy applies `pathPrefix`:\n\n{% raw %}\n\n```nunjucks\n<link rel="stylesheet" href="/assets/css/index.css">\n<script src="/assets/js/index.js" defer></script>\n<a href="/getting-started/">Getting started</a>\n```\n\n{% endraw %}\n\nAvoid hardcoded full URLs with the subpath baked in.\n\n---\n\n## Build and inspect what comes out\n\n- Dev: `npm start`\n- Build: `npm run build`\n- Open `dist/sitemap.xml` and confirm URLs include `/docs/`.\n- Inspect a built page for asset and link URLs that include `/docs/`. The canonical will not, per the warning above.\n\n---\n\n## Preview under the same subpath you\'ll deploy to\n\n- Serve `dist/` from a subpath-capable server, or use Eleventy\'s preview with `--pathprefix="/docs/"` to spot broken links.\n- Click through pages and assets to confirm they resolve under `/docs/`.\n\n---\n\n## What goes wrong\n\nNearly everything that breaks a subpath deployment is a URL that `pathPrefix` could not reach. Eleventy rewrites root-relative URLs and leaves everything else alone, so a hardcoded `https://www.example.com/docs/about/` and a slashless `assets/js/index.js` fail for the same reason from opposite directions: one is already absolute and the other is relative to wherever the page happens to be. Write every link and asset path with a leading slash and the rewrite has something to work with.\n\nThe other half is a mismatch between the prefix you build with and the prefix you deploy under. Building without `pathPrefix` and serving from `/docs/` breaks every link, which is why the preview step above uses the same value you plan to ship. Going the other way, back to root hosting, means clearing `pathPrefix` again or every path gains a segment it no longer has.\n\nAnd the one that looks like a fix and is not: putting the subpath in `settings.url` as well as `pathPrefix`, which doubles it into `/docs/docs/` across links and the sitemap. The warning above has the detail.\n\n---\n\n## See also\n\n- [[plugin-entrypoint | Plugin entrypoint reference]]\n- [[build-scripts-and-cleanup | Build scripts and cleanup]]\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'How-to guides',
             title: 'Deploy under a subpath',
             slug: 'deploy-under-a-subpath',
             description:
              'Serve your Baseline site from a subpath: set pathPrefix, keep settings.url clean, use root-relative links, and verify sitemap and canonical URLs.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/03.how-to/02.deploy-under-subpath.md',
             fileSlug: '02.deploy-under-subpath',
             filePathStem: '/content/docs/03.how-to/02.deploy-under-subpath',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nServe a Baseline site from a subpath like `/docs/` without breaking links, asset paths, canonical URLs, or the sitemap on the way.\n\n---\n\n## Prerequisites\n\n- Baseline registered in `eleventy.config.js`.\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n- `settings.url` set to the production origin (no trailing slash, no subpath).\n- You deploy to a subpath (e.g. a GitHub Pages project site, a reverse proxy, or a Netlify subdirectory).\n\n---\n\n## Set `pathPrefix` in Eleventy\'s [[config-export | config export]]\n\nKeep `settings.url` pointed at the origin and put the subpath on `pathPrefix`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(baseline(settings));\n}\n\nexport const config = {\n\t...baselineConfig,\n\tpathPrefix: \'/docs/\' // include leading and trailing slash\n};\n```\n\nEleventy rewrites root-relative URLs with `pathPrefix`, and the sitemap picks it up through Eleventy\'s `htmlBaseUrl` filter.\n\n---\n\n## Keep `settings.url` clean (origin only)\n\n[[deployment-checks | Deployment checks]] covers the env shape. Sitemap entries combine `settings.url` with `pathPrefix` automatically.\n\n{% alertBlock "warning" %}\n\n### The head does not carry `pathPrefix` today.\n\nThe canonical, `og:url`, the hreflang alternates and the JSON-LD `@id` values are built from `settings.url` plus the page\'s own URL, and Eleventy\'s `HtmlBasePlugin` leaves an already-absolute URL alone. So on a site deployed under `/docs/`, in-page links and the sitemap read `https://www.example.com/docs/about/` while the canonical reads `https://www.example.com/about/`.\n\nPutting the subpath in `settings.url` instead is not the fix: it doubles the prefix on the links and the sitemap. Until this is closed, a subpath deployment ships head URLs that are one segment short.\n\n{% endalertBlock %}\n\n---\n\n## Use root-relative asset and page links\n\nReference built assets and pages with leading slashes so Eleventy applies `pathPrefix`:\n\n{% raw %}\n\n```nunjucks\n<link rel="stylesheet" href="/assets/css/index.css">\n<script src="/assets/js/index.js" defer></script>\n<a href="/getting-started/">Getting started</a>\n```\n\n{% endraw %}\n\nAvoid hardcoded full URLs with the subpath baked in.\n\n---\n\n## Build and inspect what comes out\n\n- Dev: `npm start`\n- Build: `npm run build`\n- Open `dist/sitemap.xml` and confirm URLs include `/docs/`.\n- Inspect a built page for asset and link URLs that include `/docs/`. The canonical will not, per the warning above.\n\n---\n\n## Preview under the same subpath you\'ll deploy to\n\n- Serve `dist/` from a subpath-capable server, or use Eleventy\'s preview with `--pathprefix="/docs/"` to spot broken links.\n- Click through pages and assets to confirm they resolve under `/docs/`.\n\n---\n\n## What goes wrong\n\nNearly everything that breaks a subpath deployment is a URL that `pathPrefix` could not reach. Eleventy rewrites root-relative URLs and leaves everything else alone, so a hardcoded `https://www.example.com/docs/about/` and a slashless `assets/js/index.js` fail for the same reason from opposite directions: one is already absolute and the other is relative to wherever the page happens to be. Write every link and asset path with a leading slash and the rewrite has something to work with.\n\nThe other half is a mismatch between the prefix you build with and the prefix you deploy under. Building without `pathPrefix` and serving from `/docs/` breaks every link, which is why the preview step above uses the same value you plan to ship. Going the other way, back to root hosting, means clearing `pathPrefix` again or every path gains a segment it no longer has.\n\nAnd the one that looks like a fix and is not: putting the subpath in `settings.url` as well as `pathPrefix`, which doubles it into `/docs/docs/` across links and the sitemap. The warning above has the detail.\n\n---\n\n## See also\n\n- [[plugin-entrypoint | Plugin entrypoint reference]]\n- [[build-scripts-and-cleanup | Build scripts and cleanup]]\n',
             url: '/docs/how-to/deploy-under-a-subpath/',
             outputPath: './dist/docs/how-to/deploy-under-a-subpath/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-08-25T11:39:35.000Z },
          inputPath: './src/content/docs/03.how-to/02.deploy-under-subpath.md',
          fileSlug: '02.deploy-under-subpath',
          filePathStem: '/content/docs/03.how-to/02.deploy-under-subpath',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/deploy-under-a-subpath/index.html',
          url: '/docs/how-to/deploy-under-a-subpath/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/03.how-to/05.build-scripts-and-cleanup.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '05.build-scripts-and-cleanup',
             filePathStem: '/content/docs/03.how-to/05.build-scripts-and-cleanup',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nA small set of npm scripts that take Baseline\'s dev and build commands from "works on my machine" to predictable across platforms. Three helpers do the work: `rimraf` for cleanup, `npm-run-all` for sequencing, and `cross-env` for portable env vars.\n\n---\n\n## Prerequisites\n\n- Baseline installed; `package.json` is ESM (`"type": "module"`).\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n- Install dev dependencies: `npm install rimraf npm-run-all cross-env`.\n\n---\n\n## Install helper packages:\n\n```bash\nnpm install rimraf npm-run-all cross-env\n```\n\n---\n\n## Add scripts to `package.json`\n\n```json\n{\n\t"scripts": {\n\t\t"start": "npm-run-all clean dev",\n\t\t"clean": "rimraf dist/",\n\t\t"dev": "eleventy --serve",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production eleventy",\n\t\t"build": "npm-run-all clean build:*",\n\t\t"dryrun": "eleventy --dryrun"\n\t}\n}\n```\n\n---\n\n## Run local dev with clean output:\n\n```bash\nnpm start\n```\n\nRuns `clean` (removes `dist/`), then the `dev` server.\n\n---\n\n## Run a production build:\n\n```bash\nnpm run build\n```\n\nRuns `clean`, then `build:eleventy` with `ELEVENTY_ENV=production`.\n\n---\n\n## Optional: dry run\n\n```bash\nnpm run dryrun\n```\n\nInspect what would be built without writing files.\n\n---\n\n## Gate `noindex` for preview deploys\n\nPreview and staging environments should not show up in search results. Set a `PREVIEW` (or similar) env flag in those environments and read it from data or computed data to flip `noindex` on. See [[deployment-checks | deployment checks]].\n\n---\n\n## Notes\n\n- `rimraf dist/` keeps output clean across platforms; adjust the path if you change `dir.output`.\n- `npm-run-all` sequences clean → dev/build; keep `clean` first so stale artefacts don\'t leak into builds.\n- `cross-env` sets `ELEVENTY_ENV=production` portably.\n\n---\n\n## See also\n\n- [[config-export | Config export]] - `dir.output`, and what else the forwarded config decides.\n- [[deployment-checks | Deployment checks]] - the other environment variable the build scripts carry.\n- [[simple-baseline-site | Create the project]] - where these scripts get written for the first time.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'How-to guides',
             title: 'Build scripts and cleanup',
             slug: 'build-scripts-and-cleanup',
             description:
              'Use npm-run-all, rimraf, and cross-env to keep Baseline builds clean and predictable for dev and production.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/03.how-to/05.build-scripts-and-cleanup.md',
             fileSlug: '05.build-scripts-and-cleanup',
             filePathStem: '/content/docs/03.how-to/05.build-scripts-and-cleanup',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nA small set of npm scripts that take Baseline\'s dev and build commands from "works on my machine" to predictable across platforms. Three helpers do the work: `rimraf` for cleanup, `npm-run-all` for sequencing, and `cross-env` for portable env vars.\n\n---\n\n## Prerequisites\n\n- Baseline installed; `package.json` is ESM (`"type": "module"`).\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n- Install dev dependencies: `npm install rimraf npm-run-all cross-env`.\n\n---\n\n## Install helper packages:\n\n```bash\nnpm install rimraf npm-run-all cross-env\n```\n\n---\n\n## Add scripts to `package.json`\n\n```json\n{\n\t"scripts": {\n\t\t"start": "npm-run-all clean dev",\n\t\t"clean": "rimraf dist/",\n\t\t"dev": "eleventy --serve",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production eleventy",\n\t\t"build": "npm-run-all clean build:*",\n\t\t"dryrun": "eleventy --dryrun"\n\t}\n}\n```\n\n---\n\n## Run local dev with clean output:\n\n```bash\nnpm start\n```\n\nRuns `clean` (removes `dist/`), then the `dev` server.\n\n---\n\n## Run a production build:\n\n```bash\nnpm run build\n```\n\nRuns `clean`, then `build:eleventy` with `ELEVENTY_ENV=production`.\n\n---\n\n## Optional: dry run\n\n```bash\nnpm run dryrun\n```\n\nInspect what would be built without writing files.\n\n---\n\n## Gate `noindex` for preview deploys\n\nPreview and staging environments should not show up in search results. Set a `PREVIEW` (or similar) env flag in those environments and read it from data or computed data to flip `noindex` on. See [[deployment-checks | deployment checks]].\n\n---\n\n## Notes\n\n- `rimraf dist/` keeps output clean across platforms; adjust the path if you change `dir.output`.\n- `npm-run-all` sequences clean → dev/build; keep `clean` first so stale artefacts don\'t leak into builds.\n- `cross-env` sets `ELEVENTY_ENV=production` portably.\n\n---\n\n## See also\n\n- [[config-export | Config export]] - `dir.output`, and what else the forwarded config decides.\n- [[deployment-checks | Deployment checks]] - the other environment variable the build scripts carry.\n- [[simple-baseline-site | Create the project]] - where these scripts get written for the first time.\n',
             url: '/docs/how-to/build-scripts-and-cleanup/',
             outputPath: './dist/docs/how-to/build-scripts-and-cleanup/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-08-25T11:39:35.000Z },
          inputPath: './src/content/docs/03.how-to/05.build-scripts-and-cleanup.md',
          fileSlug: '05.build-scripts-and-cleanup',
          filePathStem: '/content/docs/03.how-to/05.build-scripts-and-cleanup',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/build-scripts-and-cleanup/index.html',
          url: '/docs/how-to/build-scripts-and-cleanup/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/03.how-to/07.deployment-checks.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '07.deployment-checks',
             filePathStem: '/content/docs/03.how-to/07.deployment-checks',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nKeep your URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak `localhost` to the live site. The mechanics are mostly Eleventy and environment variables; this page is the small set of habits that keep them honest.\n\nThree terms used below:\n\n- **Canonical.** The `<link rel="canonical">` URL Baseline writes into every page\'s head.\n- **pathPrefix.** Eleventy\'s option for deploying under a subpath (e.g. `/docs/`). It reaches the links inside your pages and the sitemap. It does not reach the absolute URLs the head emits; see [[deploy-under-a-subpath | deploying under a subpath]].\n- **Preview build.** A non-production deploy (a Netlify deploy preview, for instance) where the origin differs from production.\n\n---\n\n## Prerequisites\n\nSomewhere to deploy the site to.\n\n---\n\n## Set settings.url (and, separately, pathPrefix)\n\nUse the `src/_data/settings.js` you already have from the previous tutorials. The field that matters here is `url`, the canonical origin:\n\n```js\nurl: process.env.BASELINE_URL; // one value, supplied per environment\n```\n\nIf you\'re deploying under a subpath, set `pathPrefix` in `eleventy.config.js` (e.g. `/my-site/`). It lives on the Eleventy config, not in `settings`.\n\n---\n\n## Set environment URLs (local and CI)\n\n- Dev or local preview: create a local `.env` (don\'t commit it):\n  ```text\n  ELEVENTY_ENV="development"\n  BASELINE_URL="http://localhost:8080/"\n  ```\n- Production: set `BASELINE_URL` to the live origin (e.g. `https://www.example.com`) in your hosting or CI environment.\n- Hosted previews (optional, e.g. Netlify): the host sets its own variables. `URL` points at production while `DEPLOY_PRIME_URL` points at the preview. Baseline reads neither. Pick whichever one you want the build to claim and assign it to `settings.url` yourself.\n\n`ELEVENTY_ENV` is the development-versus-production switch. What it changes is on [[project-structure | project structure]], next to the Eleventy variable it is easy to confuse it with.\n\nA `.env` file is optional. Plenty of projects never have one and set their variables in npm scripts or in the host, which works with no extra packages. If you do keep one, loading it is yours to do: install `dotenv` and import it at the top of the file that reads the value, normally `_data/settings.js`:\n\n```js\nimport \'dotenv/config\';\n```\n\nKeep that import in the same file as the read. Put it somewhere else, in `eleventy.config.js` say, and whether it has run by the time `settings.js` is evaluated depends on the order the import lines happen to be in, which fails silently. Leaving it in on a host that has no `.env` costs nothing; dotenv finds no file and moves on.\n\nThe variable name is yours: Baseline only reads `settings.url`, so whatever your host calls it, put it there.\n\n{% alertBlock "warning" %}\nPick a name nothing else has claimed. `URL` is defined by Netlify, and on a deploy preview it stays pointed at production, so a preview build would quietly claim the live domain. `BASE_URL` is reserved by Vite, which defaults it to `/`, so anything running through Vite or Vitest reads a relative value instead of yours. Both failures are silent, which is what makes them expensive. `BASELINE_URL` is the name these docs use because it is specific enough that nothing else wants it.\n{% endalertBlock %}\n\nEverything absolute in the build comes from that single value, and leaving it unset makes Baseline warn at startup rather than guess an origin. [[site-settings | Site settings]] lists what it anchors and what goes missing without it.\n\n---\n\n## Run with the right URL per environment\n\nDev: confirm your `.env` is loaded (e.g. `BASELINE_URL="http://localhost:8080/"`), then:\n\n```bash\nnpm start\n```\n\nProduction: set `BASELINE_URL` in hosting or CI to the live origin (not an inline shell export), then:\n\n```bash\nnpm run build\n```\n\nSpot-check the rendered pages: canonical and sitemap entries should use the origin you expect.\n\n---\n\n## Preview builds (optional)\n\n- On Netlify, `DEPLOY_URL` and `DEPLOY_PRIME_URL` provide the preview origin. Feed one of them to your own variable on the build command, since `netlify.toml` does not expand variables inside an `[environment]` block:\n  ```toml\n  [context.branch-deploy]\n    command = "BASELINE_URL=$DEPLOY_PRIME_URL npm run build"\n  ```\n- Other hosts differ; set an equivalent preview origin for whichever staging environment you have.\n- Confirm the rendered canonical and the sitemap root both match the preview domain.\n\n---\n\n## Verify outputs\n\n- View source on a rendered page. The `<link rel="canonical">` and every absolute link in the head should use the right origin. If `BASELINE_URL` is set in CI or production, none of them should say `localhost`.\n- Inspect `dist/sitemap.xml` (and the per-language sitemaps if multilingual is on). URLs should start with the expected origin, plus `pathPrefix` if you\'ve set one.\n\n---\n\n## Check that what robots.txt advertises exists\n\nBaseline generates sitemaps. It does not generate the `robots.txt` that points at them, which stays yours. So the two can drift apart, and the way it usually happens is adopting the sitemap module on a site that already had one: the old file is gone, the `Sitemap:` line still names it, and crawlers follow a 404 that nothing in the build complains about.\n\nEvery `Sitemap:` line should resolve to a file the build actually produced:\n\n```bash\ngrep -iE \'^Sitemap:\' dist/robots.txt | awk \'{print $2}\' | while read -r url; do\n\trest=${url#*://}\n\tpath="dist/${rest#*/}"\n\tif [ -f "$path" ]; then echo "ok      $url"; else echo "MISSING $url"; fi\ndone\n```\n\nRun it after a production build, with `BASELINE_URL` set the way production sets it, so the origin in `robots.txt` is the origin being checked.\n\nWorth generalising past sitemaps. This is the shape of any URL a build advertises but does not produce: feed autodiscovery links, a manifest, anything hand-written that names a generated file. Each one is a promise made in a file nothing validates.\n\n---\n\n## PathPrefix checklist (if applicable)\n\n## Notes\n\n- A CI check that fails the build when `BASELINE_URL` is missing in production costs one line and catches the failure this whole page is about.\n- Once multilingual is on, the hreflang alternates are built from the same origin, so a wrong `BASELINE_URL` is wrong in every language at once.\n\n---\n\n## See also\n\n- [[site-settings | Site settings]] - `settings.url` in full.\n- [[deploy-under-a-subpath | Deploy under a subpath]] - what `pathPrefix` changes, and what it does not reach.\n- [[build-scripts-and-cleanup | Build scripts and cleanup]] - where the environment variables get set.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'How-to guides',
             title: 'Deployment checks',
             slug: 'deployment-checks',
             description:
              'Keep URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak localhost to the live site.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/03.how-to/07.deployment-checks.md',
             fileSlug: '07.deployment-checks',
             filePathStem: '/content/docs/03.how-to/07.deployment-checks',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nKeep your URLs correct across dev, preview, and production, so canonicals, sitemap entries, and links never leak `localhost` to the live site. The mechanics are mostly Eleventy and environment variables; this page is the small set of habits that keep them honest.\n\nThree terms used below:\n\n- **Canonical.** The `<link rel="canonical">` URL Baseline writes into every page\'s head.\n- **pathPrefix.** Eleventy\'s option for deploying under a subpath (e.g. `/docs/`). It reaches the links inside your pages and the sitemap. It does not reach the absolute URLs the head emits; see [[deploy-under-a-subpath | deploying under a subpath]].\n- **Preview build.** A non-production deploy (a Netlify deploy preview, for instance) where the origin differs from production.\n\n---\n\n## Prerequisites\n\nSomewhere to deploy the site to.\n\n---\n\n## Set settings.url (and, separately, pathPrefix)\n\nUse the `src/_data/settings.js` you already have from the previous tutorials. The field that matters here is `url`, the canonical origin:\n\n```js\nurl: process.env.BASELINE_URL; // one value, supplied per environment\n```\n\nIf you\'re deploying under a subpath, set `pathPrefix` in `eleventy.config.js` (e.g. `/my-site/`). It lives on the Eleventy config, not in `settings`.\n\n---\n\n## Set environment URLs (local and CI)\n\n- Dev or local preview: create a local `.env` (don\'t commit it):\n  ```text\n  ELEVENTY_ENV="development"\n  BASELINE_URL="http://localhost:8080/"\n  ```\n- Production: set `BASELINE_URL` to the live origin (e.g. `https://www.example.com`) in your hosting or CI environment.\n- Hosted previews (optional, e.g. Netlify): the host sets its own variables. `URL` points at production while `DEPLOY_PRIME_URL` points at the preview. Baseline reads neither. Pick whichever one you want the build to claim and assign it to `settings.url` yourself.\n\n`ELEVENTY_ENV` is the development-versus-production switch. What it changes is on [[project-structure | project structure]], next to the Eleventy variable it is easy to confuse it with.\n\nA `.env` file is optional. Plenty of projects never have one and set their variables in npm scripts or in the host, which works with no extra packages. If you do keep one, loading it is yours to do: install `dotenv` and import it at the top of the file that reads the value, normally `_data/settings.js`:\n\n```js\nimport \'dotenv/config\';\n```\n\nKeep that import in the same file as the read. Put it somewhere else, in `eleventy.config.js` say, and whether it has run by the time `settings.js` is evaluated depends on the order the import lines happen to be in, which fails silently. Leaving it in on a host that has no `.env` costs nothing; dotenv finds no file and moves on.\n\nThe variable name is yours: Baseline only reads `settings.url`, so whatever your host calls it, put it there.\n\n{% alertBlock "warning" %}\nPick a name nothing else has claimed. `URL` is defined by Netlify, and on a deploy preview it stays pointed at production, so a preview build would quietly claim the live domain. `BASE_URL` is reserved by Vite, which defaults it to `/`, so anything running through Vite or Vitest reads a relative value instead of yours. Both failures are silent, which is what makes them expensive. `BASELINE_URL` is the name these docs use because it is specific enough that nothing else wants it.\n{% endalertBlock %}\n\nEverything absolute in the build comes from that single value, and leaving it unset makes Baseline warn at startup rather than guess an origin. [[site-settings | Site settings]] lists what it anchors and what goes missing without it.\n\n---\n\n## Run with the right URL per environment\n\nDev: confirm your `.env` is loaded (e.g. `BASELINE_URL="http://localhost:8080/"`), then:\n\n```bash\nnpm start\n```\n\nProduction: set `BASELINE_URL` in hosting or CI to the live origin (not an inline shell export), then:\n\n```bash\nnpm run build\n```\n\nSpot-check the rendered pages: canonical and sitemap entries should use the origin you expect.\n\n---\n\n## Preview builds (optional)\n\n- On Netlify, `DEPLOY_URL` and `DEPLOY_PRIME_URL` provide the preview origin. Feed one of them to your own variable on the build command, since `netlify.toml` does not expand variables inside an `[environment]` block:\n  ```toml\n  [context.branch-deploy]\n    command = "BASELINE_URL=$DEPLOY_PRIME_URL npm run build"\n  ```\n- Other hosts differ; set an equivalent preview origin for whichever staging environment you have.\n- Confirm the rendered canonical and the sitemap root both match the preview domain.\n\n---\n\n## Verify outputs\n\n- View source on a rendered page. The `<link rel="canonical">` and every absolute link in the head should use the right origin. If `BASELINE_URL` is set in CI or production, none of them should say `localhost`.\n- Inspect `dist/sitemap.xml` (and the per-language sitemaps if multilingual is on). URLs should start with the expected origin, plus `pathPrefix` if you\'ve set one.\n\n---\n\n## Check that what robots.txt advertises exists\n\nBaseline generates sitemaps. It does not generate the `robots.txt` that points at them, which stays yours. So the two can drift apart, and the way it usually happens is adopting the sitemap module on a site that already had one: the old file is gone, the `Sitemap:` line still names it, and crawlers follow a 404 that nothing in the build complains about.\n\nEvery `Sitemap:` line should resolve to a file the build actually produced:\n\n```bash\ngrep -iE \'^Sitemap:\' dist/robots.txt | awk \'{print $2}\' | while read -r url; do\n\trest=${url#*://}\n\tpath="dist/${rest#*/}"\n\tif [ -f "$path" ]; then echo "ok      $url"; else echo "MISSING $url"; fi\ndone\n```\n\nRun it after a production build, with `BASELINE_URL` set the way production sets it, so the origin in `robots.txt` is the origin being checked.\n\nWorth generalising past sitemaps. This is the shape of any URL a build advertises but does not produce: feed autodiscovery links, a manifest, anything hand-written that names a generated file. Each one is a promise made in a file nothing validates.\n\n---\n\n## PathPrefix checklist (if applicable)\n\n## Notes\n\n- A CI check that fails the build when `BASELINE_URL` is missing in production costs one line and catches the failure this whole page is about.\n- Once multilingual is on, the hreflang alternates are built from the same origin, so a wrong `BASELINE_URL` is wrong in every language at once.\n\n---\n\n## See also\n\n- [[site-settings | Site settings]] - `settings.url` in full.\n- [[deploy-under-a-subpath | Deploy under a subpath]] - what `pathPrefix` changes, and what it does not reach.\n- [[build-scripts-and-cleanup | Build scripts and cleanup]] - where the environment variables get set.\n',
             url: '/docs/how-to/deployment-checks/',
             outputPath: './dist/docs/how-to/deployment-checks/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-09-03T07:37:09.000Z },
          inputPath: './src/content/docs/03.how-to/07.deployment-checks.md',
          fileSlug: '07.deployment-checks',
          filePathStem: '/content/docs/03.how-to/07.deployment-checks',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/deployment-checks/index.html',
          url: '/docs/how-to/deployment-checks/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/04.core-reference/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/04.core-reference/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           "\nThe inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.\n\nIf you are starting out, the [[introduction | introduction]] and [[tutorial | tutorials]] are friendlier doors. Reference assumes you know the surrounding piece and want the precise detail.\n\nThis chapter is grouped to mirror Baseline's first two layers, state and runtime, plus what you reach for from inside a template.\n\n---\n\n## State\n\nWhat you configure. The plugin call, the settings argument, and the directory contract Baseline ships.\n\n- [[plugin-entrypoint]]\n- [[site-settings]]\n- [[config-export]]\n\n---\n\n## Runtime\n\nWhat runs during the build, and what the modules read.\n\n- [[page-context]]\n- [[seo-graph]]\n- [[content-graph]]\n- [[internals]]\n\n---\n\n## Templating and authoring\n\nWhat you reach for from inside a template, and the syntax Baseline adds to your Markdown.\n\n- [[filters]]\n- [[globals]]\n- [[image-shortcode]]\n- [[content-helpers]]\n\n---\n\n[[docs | Back to docs]]\n",
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: '/docs/core-reference/',
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Core reference',
             title: 'Core reference',
             slug: 'core-reference',
             description:
              'Every surface Baseline exposes: the plugin call, settings, page context, the SEO and content graphs, filters, globals, the image shortcode, and the content helpers.',
             date: 2026-01-25T00:00:00.000Z,
             pageType: 'CollectionPage',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/04.core-reference/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/04.core-reference/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              "\nThe inventory of what Baseline gives you. Each page below is a lookup target: exact options, exact shapes, exact defaults.\n\nIf you are starting out, the [[introduction | introduction]] and [[tutorial | tutorials]] are friendlier doors. Reference assumes you know the surrounding piece and want the precise detail.\n\nThis chapter is grouped to mirror Baseline's first two layers, state and runtime, plus what you reach for from inside a template.\n\n---\n\n## State\n\nWhat you configure. The plugin call, the settings argument, and the directory contract Baseline ships.\n\n- [[plugin-entrypoint]]\n- [[site-settings]]\n- [[config-export]]\n\n---\n\n## Runtime\n\nWhat runs during the build, and what the modules read.\n\n- [[page-context]]\n- [[seo-graph]]\n- [[content-graph]]\n- [[internals]]\n\n---\n\n## Templating and authoring\n\nWhat you reach for from inside a template, and the syntax Baseline adds to your Markdown.\n\n- [[filters]]\n- [[globals]]\n- [[image-shortcode]]\n- [[content-helpers]]\n\n---\n\n[[docs | Back to docs]]\n",
             url: '/docs/core-reference/',
             outputPath: './dist/docs/core-reference/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-09-06T22:57:44.000Z },
          inputPath: './src/content/docs/04.core-reference/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/04.core-reference/00.index',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/core-reference/index.html',
          url: '/docs/core-reference/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/05.module/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/05.module/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nBaseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.\n\nIf you are starting out, [[how-baseline-works | how Baseline works]] introduces the three-layer model these modules sit on top of. The [[tutorial | tutorial]] walks through the common pairings.\n\n---\n\n## The five modules\n\n{% stepsBlock compact %}\n\n**[[assets]]**: wires JS (esbuild) and CSS (PostCSS) entry points into Eleventy, with inline filters for critical-path assets.\n\n**[[head]]**: replaces a `<baseline-head>` placeholder with a sorted, deduped element list at transform-time.\n\n**[[multilang]]**: language normalisation, per-page `lang` and `locale`, `page.translations`, and the translation filters. Opt-in.\n\n**[[navigator]]**: runtime-introspection surface and public read surface. A `phpinfo()`-style virtual page for current build state, the globals and filters used to build it, and the `_navigator` global (`{ nodes, edges, backlinks }`) for cross-page reads of the [[content-graph | content graph]].\n\n**[[sitemap]]**: a single `/sitemap.xml`, or per-language sitemaps plus an index when multilang is active.\n\n{% endstepsBlock %}\n\n---\n\n## Index\n\n{% include "partials/chapter-toc.njk" %}\n\n---\n\n[[docs | Back to Docs]]\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'page',
             permalink: '/docs/modules/',
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Modules reference',
             title: 'Modules reference',
             slug: 'modules',
             description:
              'The five modules, all wired on install: assets for CSS and JS, head for meta tags and structured data, plus multilang, navigator, and sitemap.',
             date: 2026-01-25T00:00:00.000Z,
             pageType: 'CollectionPage',
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/05.module/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/05.module/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nBaseline ships as five feature modules. Each one wires a distinct concern into Eleventy and stays out of the way of the others. The pages below cover what each module does, when it activates, and the options it accepts.\n\nIf you are starting out, [[how-baseline-works | how Baseline works]] introduces the three-layer model these modules sit on top of. The [[tutorial | tutorial]] walks through the common pairings.\n\n---\n\n## The five modules\n\n{% stepsBlock compact %}\n\n**[[assets]]**: wires JS (esbuild) and CSS (PostCSS) entry points into Eleventy, with inline filters for critical-path assets.\n\n**[[head]]**: replaces a `<baseline-head>` placeholder with a sorted, deduped element list at transform-time.\n\n**[[multilang]]**: language normalisation, per-page `lang` and `locale`, `page.translations`, and the translation filters. Opt-in.\n\n**[[navigator]]**: runtime-introspection surface and public read surface. A `phpinfo()`-style virtual page for current build state, the globals and filters used to build it, and the `_navigator` global (`{ nodes, edges, backlinks }`) for cross-page reads of the [[content-graph | content graph]].\n\n**[[sitemap]]**: a single `/sitemap.xml`, or per-language sitemaps plus an index when multilang is active.\n\n{% endstepsBlock %}\n\n---\n\n## Index\n\n{% include "partials/chapter-toc.njk" %}\n\n---\n\n[[docs | Back to Docs]]\n',
             url: '/docs/modules/',
             outputPath: './dist/docs/modules/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-25T00:00:00.000Z,
             dateModified: 2026-09-06T22:57:44.000Z },
          inputPath: './src/content/docs/05.module/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/05.module/00.index',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/modules/index.html',
          url: '/docs/modules/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/02.feature-guide/05.debugging-navigator.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '05.debugging-navigator',
             filePathStem: '/content/docs/02.feature-guide/05.debugging-navigator',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nWhen something looks off in a build, Baseline\'s debug helpers let you see the data Eleventy is working with from inside any template. By the end you\'ll know which helper to reach for, when, and how to keep them out of production.\n\nThe cost of leaving them in dev is essentially nothing; the cost of shipping them is real.\n\nThe navigator is Baseline\'s built-in inspection surface, and it comes in three flavours. The debug filters (`_inspect`, `_json`, `_keys`) and the runtime helpers (`_runtime()`, `_ctx()`) are always available, in every environment, the difference between them being that the helpers return live snapshots rather than formatting something you already hold. The navigator template is the one with a switch on it: a virtual page Baseline registers at `/navigator-core.html`, on in dev by default and off in production.\n\n{% alertBlock %}\n\nA snapshot, in this context, is a structured dump of state at the moment it\'s read.\n\n{% endalertBlock %}\n\n---\n\n## What you will build\n\n- A debug page that prints selected data through Baseline\'s filters.\n- An inline section using `_runtime()`, `_ctx()`, and `_snapshot`.\n- Optionally, the navigator template enabled for a one-page view of the cascade.\n\n---\n\n## Prerequisites\n\nAt least one page to inspect.\n\n---\n\n## Enable (or skip) the navigator template\n\nThe navigator template is on by default in development and off in production. If that suits you, skip ahead to the debug page; no configuration needed.\n\nTo control it explicitly, the `navigator` option takes either a boolean or an object:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\tnavigator: {\n\t\t\t\ttemplate: true,\n\t\t\t\tinspectorDepth: 2\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n`inspectorDepth` is the depth the navigator page inspects to, here set to 2. It belongs to that page alone: the `_inspect` filter has its own default of 4 and does not read the option. Per-call options win in either place, so {% raw %}`{{ page | _inspect({ depth: 4 }) }}`{% endraw %} is depth 4 wherever you write it.\n\n---\n\n## Add a debug page\n\nCreate `src/content/pages/debug-playground.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Debug Playground\'\ndescription: \'Inspect data with Baseline debug helpers.\'\nslug: \'debug-playground\'\nlayout: \'layouts/base.njk\'\n---\n\n## Collections (first 3)\n\n<pre>\n{% for item in collections.all.slice(0, 3) %}\n- {{ item.url }}\n{% endfor %}\n</pre>\n\n## Page keys\n\n<pre>{{ _pageContext | _keys }}</pre>\n\n## Page data (inspect)\n\n<pre>{{ _pageContext | _inspect({ getters: true, depth: 2 }) }}</pre>\n\n## Page data (json)\n\n<pre>{{ _pageContext | _json(2) }}</pre>\n```\n\n{% endraw %}\n\n---\n\n## Use the runtime and context helpers inline\n\nBoth helpers return live state at render time:\n\n- `_runtime()` returns `{ env, ctx, globals }`: environment data, the current render context, and registered globals.\n- `_ctx()` returns just the current render context (the same `ctx` you\'d find inside `_runtime()`).\n\n{% raw %}\n\n```nunjucks\n<h2>Runtime (env + ctx + globals)</h2>\n<pre>{{ _runtime() | _inspect() }}</pre>\n\n<h2>Render context only</h2>\n<pre>{{ _ctx() | _inspect({ depth: 2 }) }}</pre>\n```\n\n{% endraw %}\n\nThese dumps can be large. Use them locally; remove or guard them before shipping.\n\n---\n\n## Read the `_snapshot` global\n\n`_snapshot` is a computed global with the shape `{ contentMap, pageContext, seoGraph }`. The content map is the per-build inventory of pages; `pageContext` is the full normalised map of all your content and modules read from internally; `seoGraph` is the resolved SEO handle for every page, the same one the head emits from.\n\n{% raw %}\n\n```nunjucks\n<h2>Content map</h2>\n<pre>{{ _snapshot.contentMap | _json(2) }}</pre>\n\n<h2>Page context</h2>\n<pre>{{ _snapshot.pageContext | _json(2) }}</pre>\n```\n\n{% endraw %}\n\nOne quirk worth knowing: `_snapshot.contentMap` is null on the navigator template itself, because the content-map event hasn\'t fired yet at that point in the lifecycle. Read it from any ordinary page instead.\n\n---\n\n## Run and inspect\n\n```bash\nnpm start\n```\n\nOpen `/debug-playground/` to see the filters and global outputs.\n\n---\n\n## Visit the navigator template (optional)\n\nWith `navigator.template: true`, Baseline registers a virtual page at `/navigator-core.html`. It renders the same kind of snapshot as `_runtime()`, but as its own page rather than embedded in one of yours. Keep it disabled in production.\n\n---\n\n## Production considerations\n\n- Set `navigator: false` for production builds.\n- `_runtime()` and `_ctx()` expose the full render context, including data-layer values you don\'t want public. Remove them from any template you ship.\n- `_inspect` and `_json` are safe to leave registered, but watch what you pipe into them on a production page.\n\n---\n\n## Next steps\n\n- Mark debug pages with `draft: true` so they stay out of production automatically. The [[sitemaps-and-drafts | sitemaps and drafts tutorial]] covers the rest of the draft story.\n- Narrow your inspection by slicing collections or selecting specific data keys before piping them into a filter. Bigger dumps aren\'t always more useful.\n\n---\n\n## See also\n\n- [[navigator | Navigator module]] - the full option shape.\n- [[globals | Globals]] - `_snapshot` and `_baseline.features`.\n- [[filters | Filters]] - the debug filters in full.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'Feature guide',
             title: 'Debugging with the navigator',
             slug: 'debugging-navigator',
             description:
              'Use Baseline debug filters and the navigator to inspect Eleventy data, render context, and the page-context snapshot without shipping debug tools to production.',
             date: 2026-01-26T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/02.feature-guide/05.debugging-navigator.md',
             fileSlug: '05.debugging-navigator',
             filePathStem: '/content/docs/02.feature-guide/05.debugging-navigator',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-26T00:00:00.000Z,
             rawInput:
              '\nWhen something looks off in a build, Baseline\'s debug helpers let you see the data Eleventy is working with from inside any template. By the end you\'ll know which helper to reach for, when, and how to keep them out of production.\n\nThe cost of leaving them in dev is essentially nothing; the cost of shipping them is real.\n\nThe navigator is Baseline\'s built-in inspection surface, and it comes in three flavours. The debug filters (`_inspect`, `_json`, `_keys`) and the runtime helpers (`_runtime()`, `_ctx()`) are always available, in every environment, the difference between them being that the helpers return live snapshots rather than formatting something you already hold. The navigator template is the one with a switch on it: a virtual page Baseline registers at `/navigator-core.html`, on in dev by default and off in production.\n\n{% alertBlock %}\n\nA snapshot, in this context, is a structured dump of state at the moment it\'s read.\n\n{% endalertBlock %}\n\n---\n\n## What you will build\n\n- A debug page that prints selected data through Baseline\'s filters.\n- An inline section using `_runtime()`, `_ctx()`, and `_snapshot`.\n- Optionally, the navigator template enabled for a one-page view of the cascade.\n\n---\n\n## Prerequisites\n\nAt least one page to inspect.\n\n---\n\n## Enable (or skip) the navigator template\n\nThe navigator template is on by default in development and off in production. If that suits you, skip ahead to the debug page; no configuration needed.\n\nTo control it explicitly, the `navigator` option takes either a boolean or an object:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport settings from \'./src/_data/settings.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\tnavigator: {\n\t\t\t\ttemplate: true,\n\t\t\t\tinspectorDepth: 2\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n`inspectorDepth` is the depth the navigator page inspects to, here set to 2. It belongs to that page alone: the `_inspect` filter has its own default of 4 and does not read the option. Per-call options win in either place, so {% raw %}`{{ page | _inspect({ depth: 4 }) }}`{% endraw %} is depth 4 wherever you write it.\n\n---\n\n## Add a debug page\n\nCreate `src/content/pages/debug-playground.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Debug Playground\'\ndescription: \'Inspect data with Baseline debug helpers.\'\nslug: \'debug-playground\'\nlayout: \'layouts/base.njk\'\n---\n\n## Collections (first 3)\n\n<pre>\n{% for item in collections.all.slice(0, 3) %}\n- {{ item.url }}\n{% endfor %}\n</pre>\n\n## Page keys\n\n<pre>{{ _pageContext | _keys }}</pre>\n\n## Page data (inspect)\n\n<pre>{{ _pageContext | _inspect({ getters: true, depth: 2 }) }}</pre>\n\n## Page data (json)\n\n<pre>{{ _pageContext | _json(2) }}</pre>\n```\n\n{% endraw %}\n\n---\n\n## Use the runtime and context helpers inline\n\nBoth helpers return live state at render time:\n\n- `_runtime()` returns `{ env, ctx, globals }`: environment data, the current render context, and registered globals.\n- `_ctx()` returns just the current render context (the same `ctx` you\'d find inside `_runtime()`).\n\n{% raw %}\n\n```nunjucks\n<h2>Runtime (env + ctx + globals)</h2>\n<pre>{{ _runtime() | _inspect() }}</pre>\n\n<h2>Render context only</h2>\n<pre>{{ _ctx() | _inspect({ depth: 2 }) }}</pre>\n```\n\n{% endraw %}\n\nThese dumps can be large. Use them locally; remove or guard them before shipping.\n\n---\n\n## Read the `_snapshot` global\n\n`_snapshot` is a computed global with the shape `{ contentMap, pageContext, seoGraph }`. The content map is the per-build inventory of pages; `pageContext` is the full normalised map of all your content and modules read from internally; `seoGraph` is the resolved SEO handle for every page, the same one the head emits from.\n\n{% raw %}\n\n```nunjucks\n<h2>Content map</h2>\n<pre>{{ _snapshot.contentMap | _json(2) }}</pre>\n\n<h2>Page context</h2>\n<pre>{{ _snapshot.pageContext | _json(2) }}</pre>\n```\n\n{% endraw %}\n\nOne quirk worth knowing: `_snapshot.contentMap` is null on the navigator template itself, because the content-map event hasn\'t fired yet at that point in the lifecycle. Read it from any ordinary page instead.\n\n---\n\n## Run and inspect\n\n```bash\nnpm start\n```\n\nOpen `/debug-playground/` to see the filters and global outputs.\n\n---\n\n## Visit the navigator template (optional)\n\nWith `navigator.template: true`, Baseline registers a virtual page at `/navigator-core.html`. It renders the same kind of snapshot as `_runtime()`, but as its own page rather than embedded in one of yours. Keep it disabled in production.\n\n---\n\n## Production considerations\n\n- Set `navigator: false` for production builds.\n- `_runtime()` and `_ctx()` expose the full render context, including data-layer values you don\'t want public. Remove them from any template you ship.\n- `_inspect` and `_json` are safe to leave registered, but watch what you pipe into them on a production page.\n\n---\n\n## Next steps\n\n- Mark debug pages with `draft: true` so they stay out of production automatically. The [[sitemaps-and-drafts | sitemaps and drafts tutorial]] covers the rest of the draft story.\n- Narrow your inspection by slicing collections or selecting specific data keys before piping them into a filter. Bigger dumps aren\'t always more useful.\n\n---\n\n## See also\n\n- [[navigator | Navigator module]] - the full option shape.\n- [[globals | Globals]] - `_snapshot` and `_baseline.features`.\n- [[filters | Filters]] - the debug filters in full.\n',
             url: '/docs/feature-guide/debugging-navigator/',
             outputPath: './dist/docs/feature-guide/debugging-navigator/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-26T00:00:00.000Z,
             dateModified: 2026-09-03T07:37:01.000Z },
          inputPath: './src/content/docs/02.feature-guide/05.debugging-navigator.md',
          fileSlug: '05.debugging-navigator',
          filePathStem: '/content/docs/02.feature-guide/05.debugging-navigator',
          date: 2026-01-26T00:00:00.000Z,
          outputPath: './dist/docs/feature-guide/debugging-navigator/index.html',
          url: '/docs/feature-guide/debugging-navigator/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/03.how-to/04.multilingual-index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '04.multilingual-index',
             filePathStem: '/content/docs/03.how-to/04.multilingual-index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nA small index page that groups every page on the site by language. Useful when you have a multilingual site and want a single landing point that fans out to each language\'s content.\n\n---\n\n## Prerequisites\n\n- Multilingual switched on, with per-language directory data declaring `lang` for your content. The [[multilingual-baseline-site | multilingual site tutorial]] walks through both.\n- Pages include `translationKey` in their front matter if you want sibling links.\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n- `settings.url` set; use `pathPrefix` if you deploy under a subpath.\n\n---\n\n## Create the index page\n\n`src/content/pages/languages-index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Languages Index\'\npermalink: \'/languages-index/\'\nlayout: \'layouts/base.njk\'\n---\n\n{% set t = collections.all | groupby("data.lang") %}\n{% for lang, items in t %}\n\n<p><strong>{{ settings.languages[lang].languageName }}</strong></p>\n<ul>\n{% for item in items %}\n  <li><a href="{{ item.page.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n{% endfor %}\n```\n\n{% endraw %}\n\n---\n\n## Verify\n\n- Dev: `npm start`\n- Build: `npm run build`\n- Open the index page and confirm pages are grouped under each language.\n\n---\n\n## Two things to get right\n\nNeither of these is optional, and both are easy to leave out because the page still renders without them.\n\n**Guard `item.url` inside the loop.** `collections.all` also carries records with `permalink: false`, which arrive with `url: false` and would otherwise render as `href="false"`. The same check is where you filter drafts or `noindex` out:\n\n{% raw %}\n\n```nunjucks\n{% if item.url and not item.data.draft and not item.data.noindex %}\n```\n\n{% endraw %}\n\n**Honour `pathPrefix` in permalinks** when deploying under a subpath, or every link in the index is one segment short. [[deploy-under-a-subpath | Deploy under a subpath]] has the shape.\n\n---\n\n## Notes\n\n- Content layout typically uses per-language folders (e.g. `src/content/en/`, `src/content/nl/`) with a per-folder `.11tydata.js` setting `lang`.\n- Grouping by `data.lang` keeps this example simple, and `collections.all` gives you the pages themselves rather than records, which is what an index page wants.\n- For sibling links rather than a full index, `page.translations` lists the current page\'s other-language versions directly. `collections.translationsMap` is the site-wide view of the same relationships, keyed by `translationKey`.\n\n---\n\n## See also\n\n- [[multilang | Multilang module]]\n- [[plugin-entrypoint | Plugin entrypoint reference]]\n- [[multilingual-baseline-site | Multilingual site tutorial]]\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             navigation: [Object],
             schema: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: [Object],
             _sitemap: {},
             _snapshot: [Object],
             _segments: {},
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             type: 'article',
             permalink: [Function: permalink],
             lang: 'en',
             layout: 'layouts/docs.njk',
             articleType: 'TechArticle',
             section: [Array],
             sectionLabel: 'How-to guides',
             title: 'Multilingual index',
             slug: 'multilingual-index',
             description:
              "List your site's pages grouped by language using Baseline's multilingual setup, with a small Nunjucks template.",
             date: 2026-01-26T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1],
             _pagebreak: undefined,
             _pageContext: [Object],
             _seoGraph: [Object],
             _node: [Object],
             _backlinks: [Array],
             _outgoing: [Array],
             sitemap: [Object],
             head: [Object] },
          page:
           { inputPath: './src/content/docs/03.how-to/04.multilingual-index.md',
             fileSlug: '04.multilingual-index',
             filePathStem: '/content/docs/03.how-to/04.multilingual-index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-26T00:00:00.000Z,
             rawInput:
              '\nA small index page that groups every page on the site by language. Useful when you have a multilingual site and want a single landing point that fans out to each language\'s content.\n\n---\n\n## Prerequisites\n\n- Multilingual switched on, with per-language directory data declaring `lang` for your content. The [[multilingual-baseline-site | multilingual site tutorial]] walks through both.\n- Pages include `translationKey` in their front matter if you want sibling links.\n- `package.json` with `"type": "module"` and scripts (`start`, `build`).\n- `settings.url` set; use `pathPrefix` if you deploy under a subpath.\n\n---\n\n## Create the index page\n\n`src/content/pages/languages-index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Languages Index\'\npermalink: \'/languages-index/\'\nlayout: \'layouts/base.njk\'\n---\n\n{% set t = collections.all | groupby("data.lang") %}\n{% for lang, items in t %}\n\n<p><strong>{{ settings.languages[lang].languageName }}</strong></p>\n<ul>\n{% for item in items %}\n  <li><a href="{{ item.page.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n{% endfor %}\n```\n\n{% endraw %}\n\n---\n\n## Verify\n\n- Dev: `npm start`\n- Build: `npm run build`\n- Open the index page and confirm pages are grouped under each language.\n\n---\n\n## Two things to get right\n\nNeither of these is optional, and both are easy to leave out because the page still renders without them.\n\n**Guard `item.url` inside the loop.** `collections.all` also carries records with `permalink: false`, which arrive with `url: false` and would otherwise render as `href="false"`. The same check is where you filter drafts or `noindex` out:\n\n{% raw %}\n\n```nunjucks\n{% if item.url and not item.data.draft and not item.data.noindex %}\n```\n\n{% endraw %}\n\n**Honour `pathPrefix` in permalinks** when deploying under a subpath, or every link in the index is one segment short. [[deploy-under-a-subpath | Deploy under a subpath]] has the shape.\n\n---\n\n## Notes\n\n- Content layout typically uses per-language folders (e.g. `src/content/en/`, `src/content/nl/`) with a per-folder `.11tydata.js` setting `lang`.\n- Grouping by `data.lang` keeps this example simple, and `collections.all` gives you the pages themselves rather than records, which is what an index page wants.\n- For sibling links rather than a full index, `page.translations` lists the current page\'s other-language versions directly. `collections.translationsMap` is the site-wide view of the same relationships, keyed by `translationKey`.\n\n---\n\n## See also\n\n- [[multilang | Multilang module]]\n- [[plugin-entrypoint | Plugin entrypoint reference]]\n- [[multilingual-baseline-site | Multilingual site tutorial]]\n',
             url: '/docs/how-to/multilingual-index/',
             outputPath: './dist/docs/how-to/multilingual-index/index.html',
             lang: 'en',
             locale: 'en',
             translationKey: undefined,
             isDefaultLang: true,
             translations: [],
             sitemap: [Object],
             datePublished: 2026-01-26T00:00:00.000Z,
             dateModified: 2026-08-25T11:39:35.000Z },
          inputPath: './src/content/docs/03.how-to/04.multilingual-index.md',
          fileSlug: '04.multilingual-index',
          filePathStem: '/content/docs/03.how-to/04.multilingual-index',
          date: 2026-01-26T00:00:00.000Z,
          outputPath: './dist/docs/how-to/multilingual-index/index.html',
          url: '/docs/how-to/multilingual-index/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        ... 73 more items ] },
  _pagebreak: undefined,
  _pageContext:
   { site:
      { title: 'Eleventy Baseline',
        tagline: 'Start building your site and skip the setup work.',
        description: '',
        url: 'https://www.eleventy-baseline.dev/',
        noindex: false },
     page:
      { part: undefined,
        inputPath: './src/navigator-core.html',
        fileSlug: 'navigator-core',
        filePathStem: '/navigator-core',
        outputFileExtension: 'html',
        templateSyntax: 'njk',
        date: 2026-09-12T21:27:59.338Z,
        url: '/navigator-core.html',
        outputPath: './dist/navigator-core.html',
        lang: 'en',
        locale: 'en',
        translationKey: undefined,
        isDefaultLang: true,
        sitemap: { ignore: true, changefreq: '', priority: -1 } },
     entry:
      { title: 'Navigator Core',
        description: 'Eleventy + Baseline internals',
        excerpt: undefined,
        slug: 'navigator-core',
        section: undefined,
        type: undefined,
        head: { style: [ [Object] ] },
        breadcrumbs: [] },
     query: { isHome: false },
     meta:
      { title: 'Navigator Core | Eleventy Baseline',
        description: 'Eleventy + Baseline internals',
        canonical: undefined,
        robots: 'noindex, nofollow',
        noindex: true },
     render: { generator: 'Eleventy v3.1.6' },
     head:
      { link:
         [ { rel: 'stylesheet', href: '/assets/css/index.css' },
           { rel: 'me', href: 'https://mastodon.social/@crisverstraeten' },
           { rel: 'icon', type: 'image/png', href: '/favicon-96x96.png', sizes: '96x96' },
           { rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
           { rel: 'shortcut icon', href: '/favicon.ico' },
           { rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
           { rel: 'manifest', href: '/site.webmanifest' } ],
        script:
         [ { content:
              "var t=localStorage.getItem('theme');if(t==='light'||t==='dark')document.documentElement.dataset.theme=t;" },
           { src: '/assets/js/index.js', defer: true },
           { src: '/assets/js/vendor/index.js', defer: true } ],
        style:
         [ { content:
              '._navigator__wrapper:not(#\\#):not(#\\#) {box-sizing: content-box;max-width: 60rem;padding-inline: clamp(1rem, 0.2083rem + 3.5185vw, 3.375rem);margin-inline: auto;}._navigator__wrapper:not(#\\#):not(#\\#) > * + * {margin-block-start: 1.25rem;}' } ],
        meta:
         [ { name: 'color-scheme', content: 'light dark' },
           { name: 'theme-color', content: '#ffffff' } ] } },
  _seoGraph:
   { schema:
      [ { '@type': 'WebSite',
          '@id': 'https://www.eleventy-baseline.dev/#/schema.org/WebSite',
          url: 'https://www.eleventy-baseline.dev/',
          name: 'Eleventy Baseline',
          publisher:
           { '@id': 'https://www.eleventy-baseline.dev/#/schema.org/Organization/a-pleasant-view' },
          inLanguage: [ 'en', 'nl', 'fr' ] },
        { '@type': 'Organization',
          name: 'a pleasant view',
          url: 'https://www.apleasantview.com/',
          email: 'hello@apleasantview.com',
          taxID: '60532955',
          sameAs:
           [ 'https://mastodon.social/@crisverstraeten',
             'https://github.com/apleasantview',
             'https://www.linkedin.com/company/apleasantview' ],
          knowsAbout:
           [ 'Eleventy',
             'Static site generators',
             'Plugin architecture',
             'Web standards',
             'Open source software' ],
          '@id': 'https://www.eleventy-baseline.dev/#/schema.org/Organization/a-pleasant-view',
          logo: { '@id': 'https://www.eleventy-baseline.dev/#logo' },
          image: { '@id': 'https://www.eleventy-baseline.dev/#logo' } },
        { '@type': 'Person',
          name: 'Cristovao Verstraeten',
          givenName: 'Cristovao',
          familyName: 'Verstraeten',
          url: 'https://www.apleasantview.com/about/',
          jobTitle: 'Independent software developer',
          sameAs:
           [ 'https://mastodon.social/@crisverstraeten',
             'https://github.com/cristovaov',
             'https://www.linkedin.com/in/cristovaoverstraeten/' ],
          '@id': 'https://www.apleasantview.com/about/#/schema.org/Person' },
        { '@type': 'ImageObject',
          '@id': 'https://www.eleventy-baseline.dev/#logo',
          url: 'https://www.eleventy-baseline.dev/logo.png',
          contentUrl: 'https://www.eleventy-baseline.dev/logo.png',
          width: 400,
          height: 400 },
        { '@type': 'WebPage',
          '@id': 'https://www.eleventy-baseline.dev/navigator-core.html',
          url: 'https://www.eleventy-baseline.dev/navigator-core.html',
          name: 'Navigator Core',
          isPartOf: { '@id': 'https://www.eleventy-baseline.dev/#/schema.org/WebSite' },
          potentialAction: [ [Object] ],
          description: 'Eleventy + Baseline internals',
          inLanguage: 'en',
          datePublished: '2026-09-12T21:27:59.338Z',
          dateModified: '2026-09-12T21:27:59.338Z' } ],
     openGraph:
      { title: 'Navigator Core',
        type: 'website',
        url: 'https://www.eleventy-baseline.dev/navigator-core.html',
        locale: 'en',
        description: 'Eleventy + Baseline internals',
        siteName: 'Eleventy Baseline',
        image: 'https://www.eleventy-baseline.dev/og.jpg',
        imageAlt: 'Eleventy Baseline',
        imageWidth: 1200,
        imageHeight: 630 },
     twitter: { card: 'summary_large_image' } },
  _node:
   { title: 'Navigator Core',
     slug: 'navigator-core',
     description: 'Eleventy + Baseline internals',
     section: undefined,
     breadcrumbs: [],
     type: undefined,
     lang: 'en',
     locale: 'en',
     translationKey: undefined,
     isDefaultLang: true,
     part: undefined,
     date: 2026-09-12T21:27:57.164Z,
     url: '/navigator-core.html',
     excerpt: '← Go back',
     headings: [ { level: 2, text: 'Navigator', id: 'navigator' } ],
     sections: [],
     images: [] },
  _backlinks:
   [ { internal: true,
       from: '/docs/modules/navigator/',
       to: '/navigator-core.html',
       text: 'in action',
       rel: [] } ],
  _outgoing:
   [ { internal: false, from: '/navigator-core.html', to: '', text: '← Go back', rel: [] } ] }
globals
{ range: [Function: range],
  cycler: [Function: cycler],
  joiner: [Function: joiner],
  date: { toUTCISO: [Function: toUTCISO] },
  _runtime: [Function: fn],
  _ctx: [Function: fn] }