ctx
{ helpers: { buildCommit: [Function: buildCommit] },
navigation:
{ en:
{ main:
[ { label: 'Documentation', url: '/docs/' }, { label: 'About', url: '/about/' } ],
footer:
[ { label: 'Navigator', url: '/navigator-core.html' },
{ label: 'Internal links', url: '/system/internal-links/' },
{ label: 'Outgoing links', url: '/system/outgoing-links/' } ] },
nl:
{ main:
[ { label: 'Documentatie', url: '/docs/' }, { label: 'Over', url: '/nl/about/' } ],
footer:
[ { label: 'Navigator', url: '/navigator-core.html' },
{ label: 'Interne links', url: '/system/internal-links/' },
{ label: 'Uitgaande links', url: '/system/outgoing-links/' } ] },
fr:
{ main:
[ { label: 'Documentation', url: '/docs/' },
{ label: 'À propos', url: '/fr/about/' } ],
footer:
[ { label: 'Navigator', url: '/navigator-core.html' },
{ label: 'Liens internes', url: '/system/internal-links/' },
{ label: 'Liens sortants', url: '/system/outgoing-links/' } ] } },
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.' },
nl:
{ contentDir: 'content/nl/',
locale: 'nl',
languageName: 'Nederlands',
title: 'Eleventy Baseline',
tagline: 'Start met het bouwen aan je site en sla de setup over.' },
fr:
{ contentDir: 'content/fr/',
locale: 'fr',
languageName: 'Français',
title: 'Eleventy Baseline',
tagline: 'Commencez à construire votre site sans vous occuper de la configuration.' } },
head:
{ link:
[ { rel: 'stylesheet',
href: 'https://www.eleventy-baseline.dev/assets/css/index.css' },
{ rel: 'me', href: 'https://mastodon.social/@crisverstraeten' },
{ rel: 'icon',
type: 'image/png',
href: 'https://www.eleventy-baseline.dev/favicon-96x96.png',
sizes: '96x96' },
{ rel: 'icon',
type: 'image/svg+xml',
href: 'https://www.eleventy-baseline.dev/favicon.svg' },
{ rel: 'shortcut icon', href: 'https://www.eleventy-baseline.dev/favicon.ico' },
{ rel: 'apple-touch-icon',
href: 'https://www.eleventy-baseline.dev/apple-touch-icon.png' },
{ rel: 'manifest', href: 'https://www.eleventy-baseline.dev/site.webmanifest' } ],
script:
[ { 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.44',
name: 'Eleventy Baseline',
env: { mode: 'production', package: '@apleasantview/eleventy-plugin-baseline' },
options:
{ verbose: true,
multilang: true,
sitemap: true,
navigator: true,
head: { titleSeparator: ' | ', showGenerator: true },
assets: { esbuild: {} } },
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,
date: 2026-08-01T07:33:52.859Z,
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: undefined,
breadcrumbs: [],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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: [] },
'/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: undefined,
breadcrumbs: [],
type: 'page',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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],
[Object],
[Object] ],
sections: [ [Object], [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: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-04-28T00:00:00.000Z,
url: '/docs/introduction/',
excerpt:
'Start here. The overview is what Baseline is and whether it is for you. The quickstart gets you a running site.',
headings: [ [Object], [Object] ],
sections: [ [Object] ],
images: [] },
'/docs/introduction/overview/':
{ title: 'Overview',
slug: 'overview',
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,
date: 2026-04-28T00:00:00.000Z,
url: '/docs/introduction/overview/',
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,
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], [Object] ],
sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
images: [] },
'/docs/introduction/quickstart/':
{ title: 'Quickstart',
slug: 'quickstart',
description: 'The minimum working setup: install, configure, run.',
section: [ 'docs', 'introduction' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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',
slug: 'tutorial',
description:
'Two end-to-end tutorials: build a simple Baseline site from scratch, then add a second language with hreflang and per-language sitemaps.',
section: [ 'docs', 'tutorial' ],
breadcrumbs: [ [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-01-25T00:00:00.000Z,
url: '/docs/tutorial/',
excerpt:
'These are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the feature guides chapter.',
headings: [ [Object], [Object] ],
sections: [ [Object] ],
images: [] },
'/docs/tutorial/simple-baseline-site/':
{ title: 'Build a simple site',
slug: 'simple-baseline-site',
description:
'Create a single-language Eleventy site with Baseline defaults, head extras driven by settings, minimal CSS/JS, and an auto sitemap.',
section: [ 'docs', 'tutorial' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-01-25T00:00:00.000Z,
url: '/docs/tutorial/simple-baseline-site/',
excerpt:
"The shortest path from an empty folder to a working Baseline site. By the end you'll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself.",
headings:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 4 more items ],
sections:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 3 more items ],
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,
date: 2026-01-26T00: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],
[Object],
[Object],
[Object],
[Object],
[Object],
... 5 more items ],
sections:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 4 more items ],
images: [] },
'/docs/feature-guide/':
{ title: 'Feature guides',
slug: 'feature-guide',
description:
'Seven guides that build on each other: assets, images, head and noindex, sitemaps and drafts, deployment checks, custom schema, and debugging.',
section: [ 'docs', 'feature-guide' ],
breadcrumbs: [ [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-05-03T00:00:00.000Z,
url: '/docs/feature-guide/',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off.",
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,
date: 2026-04-13T00:00:00.000Z,
url: '/docs/feature-guide/assets-pipeline/',
excerpt:
"Ship CSS and JS through Baseline's assets module. By the end you'll have one CSS entry going through PostCSS, one JS entry going through esbuild, and a handle on the inline filters when you need them.",
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/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,
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] ],
sections:
[ [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,
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. By the end you'll have site-wide metadata, per-page head extras flowing through settings.head and front matter, and a proper canonical and robots story.",
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/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,
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. By the end you'll have per-page sitemap controls, a working noindex story, and a draft workflow that behaves differently in dev and build, the way you'd want.",
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/deployment-url-checks/':
{ title: 'Deployment URL checks',
slug: 'deployment-url-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', 'feature-guide' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-01-25T00:00:00.000Z,
url: '/docs/feature-guide/deployment-url-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 chapter is the small set of habits that keep them honest.',
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/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,
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 of this chapter 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],
... 1 more item ],
sections:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object] ],
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,
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] ],
sections: [ [Object], [Object], [Object], [Object], [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: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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] ],
sections: [ [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,
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,
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],
[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,
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 and the translationsMap collection.",
section: [ 'docs', 'how-to' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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] ],
sections: [ [Object], [Object], [Object], [Object], [Object] ],
images: [] },
'/docs/how-to/integrate-eleventy-base-blog/':
{ title: 'Integrate with Eleventy Base Blog',
slug: 'integrate-eleventy-base-blog',
description:
'Add @apleasantview/eleventy-plugin-baseline to eleventy-base-blog: install, wire config, align data and assets, migrate head extras, and verify the build.',
section: [ 'docs', 'how-to' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-01-25T00:00:00.000Z,
url: '/docs/how-to/integrate-eleventy-base-blog/',
excerpt: 'This article is planned for revision, its content might be stale.',
headings:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 7 more items ],
sections:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 6 more items ],
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,
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] ],
sections:
[ [Object], [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, and the image shortcode.',
section: [ 'docs', 'core-reference' ],
breadcrumbs: [ [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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,
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] ],
sections: [ [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,
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] ],
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,
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] ],
sections: [ [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,
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] ],
sections: [ [Object], [Object], [Object], [Object] ],
images: [] },
'/docs/core-reference/seo-graph/':
{ title: 'SEO graph',
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,
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,
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],
... 3 more items ],
sections:
[ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
images: [] },
'/docs/core-reference/internals/':
{ title: 'Internals',
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,
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',
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,
date: 2026-04-28T00: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],
... 8 more items ],
sections: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
images: [] },
'/docs/core-reference/globals/':
{ title: 'Globals',
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,
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],
... 3 more items ],
sections: [ [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,
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] ],
sections: [ [Object], [Object], [Object], [Object], [Object] ],
images: [] },
'/docs/module/':
{ title: 'Modules reference',
slug: 'module',
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', 'module' ],
breadcrumbs: [ [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-01-25T00:00:00.000Z,
url: '/docs/module/',
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/module/assets/':
{ title: 'assets',
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', 'module' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-04-13T00:00:00.000Z,
url: '/docs/module/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/module/head/':
{ title: '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', 'module' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-04-15T00:00:00.000Z,
url: '/docs/module/head/',
excerpt: "INTERNAL_KEY: '_head'",
headings:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 5 more items ],
sections:
[ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
images: [] },
'/docs/module/multilang/':
{ title: 'multilang',
slug: 'multilang',
description:
'Language infrastructure: normalises language config, attaches per-page locale data, builds translation collections, and exposes i18n filters. Opt-in.',
section: [ 'docs', 'module' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-04-15T00:00:00.000Z,
url: '/docs/module/multilang/',
excerpt: "INTERNAL_KEY: '_multilang'",
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/module/navigator/':
{ title: 'navigator',
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', 'module' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-04-15T00:00:00.000Z,
url: '/docs/module/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/module/sitemap/':
{ title: 'sitemap',
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', 'module' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-04-15T00:00:00.000Z,
url: '/docs/module/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: [] },
'/docs/concept/':
{ title: 'Concepts',
slug: 'concept',
description:
'The mental model behind Baseline: project structure, content organisation, content helpers, and the three-layer architecture.',
section: [ 'docs', 'concept' ],
breadcrumbs: [ [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-04-28T00:00:00.000Z,
url: '/docs/concept/',
excerpt:
'The concept overview is the mental model behind the plugin. Project structure are 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/concept-overview/':
{ title: 'Concept overview',
slug: 'concept-overview',
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,
date: 2026-04-28T00:00:00.000Z,
url: '/docs/concept/concept-overview/',
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, how the plugin call looks, which environment variables matter, and the seams it owns.',
section: [ 'docs', 'concept' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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 the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, which environment variables matter, and the few seams Baseline expects to own.",
headings:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 3 more items ],
sections:
[ [Object],
[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,
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/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', 'concept' ],
breadcrumbs: [ [Object], [Object], [Object], [Object] ],
type: 'article',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
date: 2026-05-02T00:00:00.000Z,
url: '/docs/concept/content-helpers/',
excerpt:
'This section covers the small but important pieces that keep content predictable as it scales.',
headings:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object] ],
sections: [ [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,
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: [] },
'/about/':
{ title: 'About Eleventy Baseline',
slug: 'about',
description: 'How a personal client-work starter became a build framework for Eleventy.',
section: undefined,
breadcrumbs: [],
type: 'about',
lang: 'en',
locale: 'en',
translationKey: 'about',
isDefaultLang: true,
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: 'Static discovery surfaces for AI agents and integrations.',
section: undefined,
breadcrumbs: [],
type: 'page',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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: undefined,
breadcrumbs: [],
type: 'page',
lang: 'en',
locale: 'en',
translationKey: 'commercial-support',
isDefaultLang: true,
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: [] },
'/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: undefined,
breadcrumbs: [],
type: 'about',
lang: 'fr',
locale: 'fr',
translationKey: 'about',
isDefaultLang: false,
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: undefined,
breadcrumbs: [],
type: 'page',
lang: 'fr',
locale: 'fr',
translationKey: 'commercial-support',
isDefaultLang: false,
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: undefined,
breadcrumbs: [],
type: 'about',
lang: 'nl',
locale: 'nl',
translationKey: 'about',
isDefaultLang: false,
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: undefined,
breadcrumbs: [],
type: 'page',
lang: 'nl',
locale: 'nl',
translationKey: 'commercial-support',
isDefaultLang: false,
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: 'FAQ',
slug: 'faq',
description:
'Does Baseline lock you in? Is it production-ready? Answers on scope, tooling, SEO, and where to get help.',
section: undefined,
breadcrumbs: [],
type: 'page',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
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',
slug: 'home',
description:
'Eleventy Baseline is a build framework for Eleventy. Assets, head tags, sitemaps and structured data, ready on the first build.',
section: undefined,
breadcrumbs: [],
type: 'page',
lang: 'en',
locale: 'en',
translationKey: 'homepage',
isDefaultLang: true,
date: 2026-05-17T00:00:00.000Z,
url: '/',
excerpt: 'v0.1.0-next.44 shipped',
headings:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 1 more item ],
sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
images: [] },
'/fr/':
{ title: 'Eleventy Baseline',
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: undefined,
breadcrumbs: [],
type: 'page',
lang: 'fr',
locale: 'fr',
translationKey: 'homepage',
isDefaultLang: false,
date: 2026-05-17T00:00:00.000Z,
url: '/fr/',
excerpt: 'v0.1.0-next.44 est sortie',
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',
slug: 'home',
description:
'Eleventy Baseline is een build framework voor Eleventy. Assets, head-tags, sitemaps en gestructureerde data, klaar bij de eerste build.',
section: undefined,
breadcrumbs: [],
type: 'page',
lang: 'nl',
locale: 'nl',
translationKey: 'homepage',
isDefaultLang: false,
date: 2026-05-17T00:00:00.000Z,
url: '/nl/',
excerpt: 'v0.1.0-next.44 uitgebracht',
headings:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
... 1 more item ],
sections: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ],
images: [] } },
edges:
[ { internal: true,
from: '/navigator-core.html',
to: '/navigator-core.html',
text: '← Go back',
rel: [] },
{ internal: true,
from: '/docs/',
to: '/docs/introduction/',
text: 'Introduction',
rel: [] },
{ internal: true, from: '/docs/', to: '/docs/concept/', text: 'Concepts', rel: [] },
{ internal: true, from: '/docs/', to: '/docs/tutorial/', text: 'Tutorials', 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/module/',
text: 'Modules reference',
rel: [] },
{ internal: true,
from: '/docs/',
to: '/docs/introduction/',
text: 'introduction',
rel: [] },
{ internal: true,
from: '/docs/',
to: '/docs/core-reference/',
text: 'core reference',
rel: [] },
{ internal: true, from: '/docs/', to: '/docs/module/', text: 'modules', rel: [] },
... 370 more items ],
backlinks:
{ '/navigator-core.html':
[ { url: '/navigator-core.html', title: 'Navigator Core', excerpt: '← Go back' },
{ url: '/docs/module/navigator/',
title: 'navigator',
excerpt: "INTERNAL_KEY: '_navigator'" } ],
'/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', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
{ url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/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. The overview is what Baseline is and whether it is for you. The quickstart gets you a running site.' },
{ url: '/docs/introduction/overview/',
title: 'Overview',
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/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/module/',
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/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/overview/',
title: 'Overview',
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/module/':
[ { 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/core-reference/seo-graph/':
[ { 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: '/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/module/head/', title: 'head', excerpt: "INTERNAL_KEY: '_head'" } ],
'/docs/feature-guide/custom-schema/':
[ { 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: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." },
{ 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/seo-graph/',
title: '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.' } ],
'/docs/module/head/':
[ { 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: '/docs/introduction/overview/',
title: 'Overview',
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. By the end you'll have site-wide metadata, per-page head extras flowing through settings.head and front matter, and a proper canonical and robots story." },
{ 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/how-to/integrate-eleventy-base-blog/',
title: 'Integrate with Eleventy Base Blog',
excerpt: 'This article is planned for revision, its content might be stale.' },
{ 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: '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.' },
{ url: '/docs/module/',
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/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" },
... 2 more items ],
'/docs/core-reference/site-settings/':
[ { 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: '/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. By the end you'll have site-wide metadata, per-page head extras flowing through settings.head and front matter, and a proper canonical and robots story." },
{ 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." },
{ url: '/docs/core-reference/seo-graph/',
title: '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.' },
{ 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/module/head/', title: 'head', excerpt: "INTERNAL_KEY: '_head'" },
{ url: '/docs/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" },
... 3 more items ],
'/docs/core-reference/content-graph/':
[ { 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: '/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/concept/architecture-snapshot/',
title: 'Architecture snapshot',
excerpt: 'The plugin is built in three concentric layers, each with one strict job.' } ],
'/docs/module/navigator/':
[ { 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: '/docs/introduction/overview/',
title: 'Overview',
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 of this chapter you'll know which helper to reach for, when, and how to keep them out of production." },
{ url: '/docs/how-to/integrate-eleventy-base-blog/',
title: 'Integrate with Eleventy Base Blog',
excerpt: 'This article is planned for revision, its content might be stale.' },
{ 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',
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: '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.' },
{ url: '/docs/module/',
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/globals/':
[ { 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: '/docs/introduction/overview/',
title: 'Overview',
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 of this chapter you'll know which helper to reach for, when, and how to keep them out of production." },
{ 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/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: '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.' },
{ 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: '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.' },
... 5 more items ],
'/docs/module/multilang/':
[ { 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: '/docs/introduction/overview/',
title: 'Overview',
excerpt:
'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
{ 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/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/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/filters/',
title: 'Filters',
excerpt:
'Eleventy filters Baseline registers. Some are always available; the rest come on with the module that registers them.' },
{ url: '/docs/module/',
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/module/head/', title: 'head', excerpt: "INTERNAL_KEY: '_head'" },
{ url: '/docs/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" },
{ url: '/docs/module/navigator/',
title: 'navigator',
excerpt: "INTERNAL_KEY: '_navigator'" },
... 1 more item ],
'/docs/core-reference/filters/':
[ { 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: '/docs/introduction/overview/',
title: 'Overview',
excerpt:
'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
{ 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/feature-guide/assets-pipeline/',
title: 'Assets pipeline quickstart',
excerpt:
"Ship CSS and JS through Baseline's assets module. By the end you'll have one CSS entry going through PostCSS, one JS entry going through esbuild, and a handle on the inline filters when you need them." },
{ 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 of this chapter 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/module/assets/', title: 'assets', excerpt: "INTERNAL_KEY: '_assets'" },
{ url: '/docs/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" },
{ url: '/docs/module/navigator/',
title: 'navigator',
excerpt: "INTERNAL_KEY: '_navigator'" } ],
'/docs/introduction/overview/':
[ { url: '/docs/introduction/',
title: 'Introduction',
excerpt:
'Start here. The overview is what Baseline is and whether it is for you. The quickstart gets you a running site.' },
{ 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',
excerpt:
'These are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the feature guides chapter.' },
{ url: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." },
{ url: '/docs/concept/project-structure/',
title: 'Project structure',
excerpt:
"The folder structure that keeps Baseline out of your way. If you've read the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, which environment variables matter, and the few seams Baseline expects to own." } ],
'/docs/introduction/quickstart/':
[ { url: '/docs/introduction/',
title: 'Introduction',
excerpt:
'Start here. The overview is what Baseline is and whether it is for you. The quickstart gets you a running site.' },
{ url: '/docs/introduction/overview/',
title: 'Overview',
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',
excerpt:
'These are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the feature guides chapter.' },
{ url: '/docs/concept/project-structure/',
title: 'Project structure',
excerpt:
"The folder structure that keeps Baseline out of your way. If you've read the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, 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', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
{ url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/docs/introduction/what-is-eleventy/':
[ { url: '/docs/introduction/',
title: 'Introduction',
excerpt:
'Start here. The overview is what Baseline is and whether it is for you. The quickstart gets you a running site.' } ],
'/docs/module/assets/':
[ { url: '/docs/introduction/overview/',
title: 'Overview',
excerpt:
'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
{ url: '/docs/feature-guide/assets-pipeline/',
title: 'Assets pipeline quickstart',
excerpt:
"Ship CSS and JS through Baseline's assets module. By the end you'll have one CSS entry going through PostCSS, one JS entry going through esbuild, and a handle on the inline filters when you need them." },
{ 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/how-to/integrate-eleventy-base-blog/',
title: 'Integrate with Eleventy Base Blog',
excerpt: 'This article is planned for revision, its content might be stale.' },
{ url: '/docs/core-reference/filters/',
title: 'Filters',
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/module/',
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/module/navigator/',
title: 'navigator',
excerpt: "INTERNAL_KEY: '_navigator'" },
{ url: '/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
... 1 more item ],
'/docs/module/sitemap/':
[ { url: '/docs/introduction/overview/',
title: 'Overview',
excerpt:
'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
{ 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. By the end you'll have per-page sitemap controls, a working noindex story, and a draft workflow that behaves differently in dev and build, the way you'd want." },
{ url: '/docs/module/',
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/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" },
{ url: '/docs/module/navigator/',
title: 'navigator',
excerpt: "INTERNAL_KEY: '_navigator'" } ],
'/docs/core-reference/page-context/':
[ { url: '/docs/introduction/overview/',
title: 'Overview',
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: '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.' },
{ 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: '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.' },
{ url: '/docs/core-reference/globals/',
title: '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.' },
{ url: '/docs/module/head/', title: 'head', excerpt: "INTERNAL_KEY: '_head'" },
{ url: '/docs/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" },
... 4 more items ],
'/docs/core-reference/image-shortcode/':
[ { url: '/docs/introduction/overview/',
title: 'Overview',
excerpt:
'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
{ url: '/docs/feature-guide/image-shortcode-basics/',
title: 'Image shortcode basics',
excerpt: 'Render a responsive image with one line of template code.' },
{ 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/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/module/assets/', title: 'assets', excerpt: "INTERNAL_KEY: '_assets'" },
{ url: '/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
{ url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/docs/tutorial/simple-baseline-site/':
[ { url: '/docs/introduction/overview/',
title: 'Overview',
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',
excerpt:
'These are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the feature guides chapter.' },
{ 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/feature-guide/assets-pipeline/',
title: 'Assets pipeline quickstart',
excerpt:
"Ship CSS and JS through Baseline's assets module. By the end you'll have one CSS entry going through PostCSS, one JS entry going through esbuild, and a handle on the inline filters when you need them." },
{ 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. By the end you'll have site-wide metadata, per-page head extras flowing through settings.head and front matter, and a proper canonical and robots story." },
{ 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/integrate-eleventy-base-blog/',
title: 'Integrate with Eleventy Base Blog',
excerpt: 'This article is planned for revision, its content might be stale.' },
{ url: '/docs/concept/concept-overview/',
title: 'Concept overview',
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/concept/architecture-snapshot/':
[ { url: '/docs/introduction/overview/',
title: 'Overview',
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',
excerpt:
'The concept overview is the mental model behind the plugin. Project structure are 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/concept-overview/',
title: 'Concept overview',
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/how-to/integrate-eleventy-base-blog/':
[ { url: '/docs/introduction/overview/',
title: 'Overview',
excerpt:
'Baseline is an Eleventy plugin that handles the scaffolding every Eleventy site ends up needing.' },
{ 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/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/simple-baseline-site/',
title: 'Build a simple site',
excerpt:
"The shortest path from an empty folder to a working Baseline site. By the end you'll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself." },
{ url: '/docs/feature-guide/deployment-url-checks/',
title: 'Deployment URL 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 chapter is the small set of habits that keep them honest.' },
{ url: '/docs/how-to/integrate-eleventy-base-blog/',
title: 'Integrate with Eleventy Base Blog',
excerpt: 'This article is planned for revision, its content might be stale.' },
{ 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: '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.' },
{ url: '/docs/core-reference/globals/',
title: '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.' },
{ url: '/docs/concept/concept-overview/',
title: 'Concept overview',
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 the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, which environment variables matter, and the few seams Baseline expects to own." } ],
'/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',
excerpt:
'These are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the feature guides chapter.' },
{ 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. By the end you'll have site-wide metadata, per-page head extras flowing through settings.head and front matter, and a proper canonical and robots story." },
{ url: '/docs/feature-guide/deployment-url-checks/',
title: 'Deployment URL 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 chapter is the small set of habits that keep them honest.' },
{ 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/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" },
{ url: '/docs/concept/project-structure/',
title: 'Project structure',
excerpt:
"The folder structure that keeps Baseline out of your way. If you've read the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, which environment variables matter, and the few seams Baseline expects to own." } ],
'/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/simple-baseline-site/',
title: 'Build a simple site',
excerpt:
"The shortest path from an empty folder to a working Baseline site. By the end you'll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself." },
{ url: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." },
{ url: '/docs/module/head/', title: 'head', excerpt: "INTERNAL_KEY: '_head'" } ],
'/docs/feature-guide/':
[ { url: '/docs/tutorial/',
title: 'Tutorials',
excerpt:
'These are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the feature guides chapter.' } ],
'/docs/feature-guide/assets-pipeline/':
[ { url: '/docs/tutorial/simple-baseline-site/',
title: 'Build a simple site',
excerpt:
"The shortest path from an empty folder to a working Baseline site. By the end you'll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself." },
{ url: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." },
{ url: '/docs/module/assets/', title: 'assets', excerpt: "INTERNAL_KEY: '_assets'" },
{ url: '/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
{ url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/docs/feature-guide/image-shortcode-basics/':
[ { url: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." } ],
'/docs/feature-guide/sitemaps-and-drafts/':
[ { url: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." },
{ 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 of this chapter you'll know which helper to reach for, when, and how to keep them out of production." },
{ url: '/docs/module/sitemap/',
title: 'sitemap',
excerpt: "INTERNAL_KEY: '_sitemap'" } ],
'/docs/feature-guide/deployment-url-checks/':
[ { url: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." },
{ 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.` } ],
'/docs/feature-guide/debugging-navigator/':
[ { url: '/docs/feature-guide/',
title: 'Feature guides',
excerpt:
"These feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off." },
{ url: '/docs/module/navigator/',
title: 'navigator',
excerpt: "INTERNAL_KEY: '_navigator'" } ],
'/docs/how-to/deploy-under-a-subpath/':
[ { url: '/docs/feature-guide/deployment-url-checks/',
title: 'Deployment URL 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 chapter is the small set of habits that keep them honest.' },
{ 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/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/module/assets/', title: 'assets', excerpt: "INTERNAL_KEY: '_assets'" },
{ url: '/docs/concept/project-structure/',
title: 'Project structure',
excerpt:
"The folder structure that keeps Baseline out of your way. If you've read the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, which environment variables matter, and the few seams Baseline expects to own." } ],
'/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/concept/content-helpers/',
title: 'Content helpers',
excerpt:
'This section covers the small but important pieces that keep content predictable as it scales.' } ],
'/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/module/multilang/',
title: 'multilang',
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/integrate-eleventy-base-blog/',
title: 'Integrate with Eleventy Base Blog',
excerpt: 'This article is planned for revision, its content might be stale.' } ],
'/docs/core-reference/plugin-entrypoint/':
[ { 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',
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: '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.' },
{ 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/concept-overview/',
title: 'Concept overview',
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 the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, which environment variables matter, and the few seams Baseline expects to own." },
... 1 more item ],
'/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: '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.' },
{ url: '/docs/core-reference/globals/',
title: '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.' },
{ url: '/docs/module/head/', title: 'head', excerpt: "INTERNAL_KEY: '_head'" },
{ url: '/docs/module/navigator/',
title: 'navigator',
excerpt: "INTERNAL_KEY: '_navigator'" },
{ url: '/docs/concept/architecture-snapshot/',
title: 'Architecture snapshot',
excerpt: 'The plugin is built in three concentric layers, each with one strict job.' } ],
'/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/module/',
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/concept/content-helpers/':
[ { 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/concept/',
title: 'Concepts',
excerpt:
'The concept overview is the mental model behind the plugin. Project structure are the small set of rules that keep Baseline out of your way, and content organisation is the page-data pattern those rules assume.' },
{ url: '/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
{ url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/docs/core-reference/internals/_baseline/core/registry.js':
[ { url: '/docs/core-reference/internals/',
title: '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.' } ],
'/docs/concept/concept-overview/':
[ { url: '/docs/module/',
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/concept/',
title: 'Concepts',
excerpt:
'The concept overview is the mental model behind the plugin. Project structure are 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 the overview and the concept overview, you already have the shape. This page is the practical companion: where files go, how the call looks, which environment variables matter, and the few seams Baseline expects to own." } ],
'/docs/module/assets/_baseline/modules/assets/processors/esbuild-process.js':
[ { url: '/docs/module/assets/', title: 'assets', excerpt: "INTERNAL_KEY: '_assets'" } ],
'/docs/module/multilang/_baseline/core/utils/normalize-language-map.js':
[ { url: '/docs/module/multilang/',
title: 'multilang',
excerpt: "INTERNAL_KEY: '_multilang'" } ],
'/docs/module/sitemap/_baseline/core/utils/normalize-languages.js':
[ { url: '/docs/module/sitemap/',
title: 'sitemap',
excerpt: "INTERNAL_KEY: '_sitemap'" } ],
'/docs/concept/project-structure/':
[ { url: '/docs/concept/',
title: 'Concepts',
excerpt:
'The concept overview is the mental model behind the plugin. Project structure are 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/concept-overview/',
title: 'Concept overview',
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/concept/content-organisation/':
[ { url: '/docs/concept/',
title: 'Concepts',
excerpt:
'The concept overview is the mental model behind the plugin. Project structure are 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/concept-overview/',
title: 'Concept overview',
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: '/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." },
{ 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." },
{ 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.' } ],
'/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', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
{ url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/about/': [ { url: '/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 shipped' } ],
'/commercial-support/': [ { url: '/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 shipped' } ],
'/release-notes/':
[ { url: '/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 shipped' },
{ url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' },
{ url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/fr/about/':
[ { url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' } ],
'/fr/commercial-support/':
[ { url: '/fr/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 est sortie' } ],
'/nl/about/':
[ { url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ],
'/nl/commercial-support/':
[ { url: '/nl/', title: 'Eleventy Baseline', excerpt: 'v0.1.0-next.44 uitgebracht' } ] } },
_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:
{ inputPath: './src/navigator-core.html',
fileSlug: 'navigator-core',
filePathStem: '/navigator-core',
outputFileExtension: 'html',
templateSyntax: 'njk',
date: 2026-08-01T07:33:54.947Z,
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: undefined,
breadcrumbs: [] },
query: { isHome: false },
meta:
{ title: 'Navigator Core | Eleventy Baseline',
description: 'Eleventy + Baseline internals',
canonical: 'https://www.eleventy-baseline.dev/navigator-core.html',
robots: 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1',
noindex: false },
render: { generator: 'Eleventy v3.1.6' },
head: { link: [Array], script: [Array], style: [], meta: [Array] } } },
seoGraph:
{ '/navigator-core.html':
{ url: 'https://www.eleventy-baseline.dev/navigator-core.html',
schema: [ [Object], [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' } } } },
eleventyComputed:
{ _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)],
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: 'npx @11ty/eleventy --serve',
'dev-next': 'npx @11ty/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 npx @11ty/eleventy',
'build:pagefind': 'pagefind --site dist',
'build:eleventy-next':
'cross-env ELEVENTY_ENV=production npx @11ty/eleventy --config=eleventy.config.next.js',
dryrun: 'npx @11ty/eleventy --dryrun',
'dryrun:prod': 'cross-env ELEVENTY_ENV=production npx @11ty/eleventy --dryrun',
'dryrun:next': 'npx @11ty/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* npx @11ty/eleventy --dryrun',
'debug:eleventy-logged': 'cross-env DEBUG=Eleventy* npx @11ty/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: 'npx @11ty/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': '^6.0.4',
'@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',
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,
inspectorDepth: 4,
page:
{ inputPath: './src/navigator-core.html',
fileSlug: 'navigator-core',
filePathStem: '/navigator-core',
outputFileExtension: 'html',
templateSyntax: 'njk',
date: 2026-08-01T07:33:54.947Z,
rawInput:
'\n<!DOCTYPE html>\n<html lang="{{ lang | default(settings.defaultLanguage) }}">\n\n<head>\n\t<baseline-head></baseline-head>\n\t<style>\n\t\t._navigator__wrapper:not(#\\#):not(#\\#) {\n\t\t\tbox-sizing: content-box;\n\t\t\tmax-width: 60rem;\n\t\t\tpadding-inline: clamp(1rem, 0.2083rem + 3.5185vw, 3.375rem);\n\t\t\tmargin-inline: auto;\n\t\t}\n\n\t\t._navigator__wrapper:not(#\\#):not(#\\#) > * + * {\n\t\t\tmargin-block-start: 1.25rem;\n\t\t}\n\t</style>\n</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;">←</span> 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,
sitemap: { ignore: false, 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- **[[concept]]**: The mental model, community-seeded conventions and a snapshot of the inner workings.\n- **[[tutorial]]**: guided walks through real builds, end to end.\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- **[[module]]**: per-module reference for the five feature modules (assets, head, multilang, navigator, sitemap).\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 [[module | modules]] chapters are the lookup view.\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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: '/docs/',
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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,
page: [Object],
collections: [Circular *1],
_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- **[[concept]]**: The mental model, community-seeded conventions and a snapshot of the inner workings.\n- **[[tutorial]]**: guided walks through real builds, end to end.\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- **[[module]]**: per-module reference for the five feature modules (assets, head, multilang, navigator, sitemap).\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 [[module | modules]] chapters are the lookup view.\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,
sitemap: [Object],
datePublished: 2026-04-28T00:00:00.000Z,
dateModified: 2026-07-31T08:54:16.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. The [[overview | overview]] is what Baseline is and whether it is for you. The [[quickstart | quickstart]] gets you a running site.\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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: '/docs/introduction/',
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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,
page: [Object],
collections: [Circular *1],
_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. The [[overview | overview]] is what Baseline is and whether it is for you. The [[quickstart | quickstart]] gets you a running site.\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,
sitemap: [Object],
datePublished: 2026-04-28T00:00:00.000Z,
dateModified: 2026-07-31T08:54:16.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. The plugin is shaped in three layers:\n\n- **State** is your settings and options, normalised once at startup.\n- **Runtime**: state in motion, plus a per-page context and a registry that lets the modules read what they need without reaching across to each other.\n- **Modules** are the five feature plugins, self-contained slices of behaviour backed by the runtime.\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, or a starter repo that forks once and goes stale.\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 drift. Starter repos fork once and rot. Frameworks impose more than they solve.\n\nInstead of hunting through six tutorials and reconciling them by hand each time if Eleventy defaults changes or patterns shift, you get the new version of Baseline on `npm install`.\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. Per-language collections, hreflang, a translation map, and the standard i18n 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), the globals and filters used to build it, and the `_navigator` global (`{ nodes, edges, backlinks }`) for cross-page reads of the 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`. 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 and WebP, responsive widths, lazy loading. Alt text is required; the build warns if you skip it.\n\n{% endstepsBlock %}\n\nAnd three behaviours that need no configuration at all:\n\n{% stepsBlock "compact" %}\n\n- A **drafts preprocessor**: any template with `draft: true` in front matter is excluded from production builds.\n- A **dev image pipeline**: `eleventy-img` is wired up for in-flight transforms during `--serve`.\n- **Passthrough copy** for the `static/` directory: anything in there is copied to the site root as-is.\n\n{% endstepsBlock %}\n\nThe 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 and community-seeded conventions.\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 a deeper look at the three layers if you want it.\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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Introduction',
title: 'Overview',
description:
'What Baseline is, who it is for, why it is a plugin, and what it gives you out of the box.',
slug: 'overview',
date: 2026-04-28T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_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. The plugin is shaped in three layers:\n\n- **State** is your settings and options, normalised once at startup.\n- **Runtime**: state in motion, plus a per-page context and a registry that lets the modules read what they need without reaching across to each other.\n- **Modules** are the five feature plugins, self-contained slices of behaviour backed by the runtime.\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, or a starter repo that forks once and goes stale.\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 drift. Starter repos fork once and rot. Frameworks impose more than they solve.\n\nInstead of hunting through six tutorials and reconciling them by hand each time if Eleventy defaults changes or patterns shift, you get the new version of Baseline on `npm install`.\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. Per-language collections, hreflang, a translation map, and the standard i18n 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), the globals and filters used to build it, and the `_navigator` global (`{ nodes, edges, backlinks }`) for cross-page reads of the 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`. 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 and WebP, responsive widths, lazy loading. Alt text is required; the build warns if you skip it.\n\n{% endstepsBlock %}\n\nAnd three behaviours that need no configuration at all:\n\n{% stepsBlock "compact" %}\n\n- A **drafts preprocessor**: any template with `draft: true` in front matter is excluded from production builds.\n- A **dev image pipeline**: `eleventy-img` is wired up for in-flight transforms during `--serve`.\n- **Passthrough copy** for the `static/` directory: anything in there is copied to the site root as-is.\n\n{% endstepsBlock %}\n\nThe 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 and community-seeded conventions.\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 a deeper look at the three layers if you want it.\n\nAlready have an Eleventy site you want to graft Baseline onto? See [[integrate-eleventy-base-blog]].\n',
url: '/docs/introduction/overview/',
outputPath: './dist/docs/introduction/overview/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-04-28T00:00:00.000Z,
dateModified: 2026-06-02T10:23:27.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/overview/index.html',
url: '/docs/introduction/overview/',
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. It is not a flaw in Eleventy. It is the direct cost of the flexibility that made you choose it.\n\n---\n\n## Where Baseline comes in\n\nBaseline makes those decisions and ships them as a plugin.\n\nAsset pipeline, image handling, head tags, sitemaps, structured data, multiple languages: already decided, already fitted together, following the conventions Eleventy already has. You install it, you write content, you get a working site.\n\nYou still own the parts that make the site yours. Your layouts, your CSS, your content, your structure. Baseline does not have opinions about how your site looks or what it says.\n\nAnd because it is a plugin rather than a template you copy, it can be updated. A starter repo forks the day you download it and never improves again. This gets better underneath you.\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\n---\n\n## Where to go next\n\n- The [[overview | overview]] for what Baseline is 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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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],
_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. It is not a flaw in Eleventy. It is the direct cost of the flexibility that made you choose it.\n\n---\n\n## Where Baseline comes in\n\nBaseline makes those decisions and ships them as a plugin.\n\nAsset pipeline, image handling, head tags, sitemaps, structured data, multiple languages: already decided, already fitted together, following the conventions Eleventy already has. You install it, you write content, you get a working site.\n\nYou still own the parts that make the site yours. Your layouts, your CSS, your content, your structure. Baseline does not have opinions about how your site looks or what it says.\n\nAnd because it is a plugin rather than a template you copy, it can be updated. A starter repo forks the day you download it and never improves again. This gets better underneath you.\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\n---\n\n## Where to go next\n\n- The [[overview | overview]] for what Baseline is 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,
sitemap: [Object],
datePublished: 2026-07-30T00:00:00.000Z,
dateModified: 2026-07-30T18:29:56.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\n{% stepsBlock %}\n\n- Node 22 or newer, and npm.\n- A `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": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n- A `.env` for environment-specific values:\n ```text\n ELEVENTY_ENV="development"\n URL="http://localhost:8080/"\n ```\n Baseline reads `ELEVENTY_ENV` to decide what to enable in development versus production. `URL` becomes the canonical site URL when set. The other entries you might add are project-specific.\n\n{% endstepsBlock %}\n\n---\n\n## 1) Install\n\n```bash\nmkdir baseline-quickstart\ncd baseline-quickstart\nnpm init -y\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n---\n\n## 2) 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.URL,\n\tdefaultLanguage: \'en\'\n};\n\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\tsitemap: true,\n\t\t\tnavigator: true\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\nTwo things to notice:\n\n{% stepsBlock %}\n\n- `baseline()` takes two arguments. `settings` is the site identity (title, url, languages, head extras); `options` is runtime behaviour (which modules are on, log verbosity, per-module options).\n- The `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).\n\n{% endstepsBlock %}\n\n{% alertBlock "info" %}\n\n### Why Baseline re-exports `config`.\n\nEleventy reads its directory configuration before any plugin runs, so a plugin cannot set those for you from inside `addPlugin()`. The [[config-export | config-export reference]] has the full version.\n\n{% endalertBlock %}\n\n---\n\n## 3) Project files\n\nCreate the rest of the project files:\n\n{% stepsBlock %}\n\n- `src/_data/settings.js`: site identity (`title`, `url`, `defaultLanguage`, `languages`, `head` extras).\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- `src/content/pages/index.md`: a starter page with front matter and a body.\n- `src/assets/assets.11tydata.js`, `src/assets/css/index.css`, `src/assets/js/index.js`: asset entry points (one CSS, one JS).\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{% endstepsBlock %}\n\n---\n\n## 4) Run and build\n\n{% stepsBlock %}\n\n- Development:\n ```bash\n npm start\n ```\n Open http://localhost:8080/. Check `dist/` for output, including `dist/sitemap.xml`.\n- Production build: \n Change `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n ```bash\n npm run build\n ```\n Inspect `dist/` for the final files. Remember to reset `URL` in `.env` to "http://localhost:8080/".\n\n{% endstepsBlock %}\n\nThe **drafts preprocessor** (a build-time filter that drops templates marked `draft: true`) is on automatically: drafts are excluded from production builds (`npm run build`) and included in development (`npm start`).\n\n---\n\n## Next steps\n\n- The [[concept | concept chapter]] 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]] tutorial 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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Introduction',
title: 'Quickstart',
description: 'The minimum working setup: install, configure, run.',
slug: 'quickstart',
date: 2026-04-28T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_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\n{% stepsBlock %}\n\n- Node 22 or newer, and npm.\n- A `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": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n- A `.env` for environment-specific values:\n ```text\n ELEVENTY_ENV="development"\n URL="http://localhost:8080/"\n ```\n Baseline reads `ELEVENTY_ENV` to decide what to enable in development versus production. `URL` becomes the canonical site URL when set. The other entries you might add are project-specific.\n\n{% endstepsBlock %}\n\n---\n\n## 1) Install\n\n```bash\nmkdir baseline-quickstart\ncd baseline-quickstart\nnpm init -y\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n---\n\n## 2) 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.URL,\n\tdefaultLanguage: \'en\'\n};\n\nexport default async function (eleventyConfig) {\n\tawait eleventyConfig.addPlugin(\n\t\tbaseline(settings, {\n\t\t\tsitemap: true,\n\t\t\tnavigator: true\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\nTwo things to notice:\n\n{% stepsBlock %}\n\n- `baseline()` takes two arguments. `settings` is the site identity (title, url, languages, head extras); `options` is runtime behaviour (which modules are on, log verbosity, per-module options).\n- The `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).\n\n{% endstepsBlock %}\n\n{% alertBlock "info" %}\n\n### Why Baseline re-exports `config`.\n\nEleventy reads its directory configuration before any plugin runs, so a plugin cannot set those for you from inside `addPlugin()`. The [[config-export | config-export reference]] has the full version.\n\n{% endalertBlock %}\n\n---\n\n## 3) Project files\n\nCreate the rest of the project files:\n\n{% stepsBlock %}\n\n- `src/_data/settings.js`: site identity (`title`, `url`, `defaultLanguage`, `languages`, `head` extras).\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- `src/content/pages/index.md`: a starter page with front matter and a body.\n- `src/assets/assets.11tydata.js`, `src/assets/css/index.css`, `src/assets/js/index.js`: asset entry points (one CSS, one JS).\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{% endstepsBlock %}\n\n---\n\n## 4) Run and build\n\n{% stepsBlock %}\n\n- Development:\n ```bash\n npm start\n ```\n Open http://localhost:8080/. Check `dist/` for output, including `dist/sitemap.xml`.\n- Production build: \n Change `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n ```bash\n npm run build\n ```\n Inspect `dist/` for the final files. Remember to reset `URL` in `.env` to "http://localhost:8080/".\n\n{% endstepsBlock %}\n\nThe **drafts preprocessor** (a build-time filter that drops templates marked `draft: true`) is on automatically: drafts are excluded from production builds (`npm run build`) and included in development (`npm start`).\n\n---\n\n## Next steps\n\n- The [[concept | concept chapter]] 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]] tutorial 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,
sitemap: [Object],
datePublished: 2026-04-28T00:00:00.000Z,
dateModified: 2026-07-28T10:49:02.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:
'\nThese are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the [[feature-guide | feature guides]] chapter.\n\nNew to Baseline? The [[overview | overview]] covers what it is and who it is for.\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',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: '/docs/tutorial/',
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Tutorials',
title: 'Tutorials',
description:
'Two end-to-end tutorials: build a simple Baseline site from scratch, then add a second language with hreflang and per-language sitemaps.',
slug: 'tutorial',
date: 2026-01-25T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_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-01-25T00:00:00.000Z,
rawInput:
'\nThese are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the [[feature-guide | feature guides]] chapter.\n\nNew to Baseline? The [[overview | overview]] covers what it is and who it is for.\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',
url: '/docs/tutorial/',
outputPath: './dist/docs/tutorial/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:54:16.000Z },
inputPath: './src/content/docs/01.tutorial/00.index.md',
fileSlug: '00.index',
filePathStem: '/content/docs/01.tutorial/00.index',
date: 2026-01-25T00: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:
'\nThe shortest path from an empty folder to a working Baseline site. By the end you\'ll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself.\n\nThis is the tutorial every other tutorial builds on.\n\n---\n\n## What you will build\n\n- An Eleventy site with one page.\n- Baseline wired with default options: `multilingual` off, `sitemap` on, `navigator` on in dev and off in production.\n- A small stylesheet flowing through Baseline\'s assets pipeline, and an auto-generated `sitemap.xml` next to it.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer.\n- npm.\n- A terminal.\n\n---\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\nOpen `package.json` and set `"type": "module"` (Baseline expects ESM):\n\n```json\n{\n\t"name": "simple-baseline-site",\n\t"type": "module",\n\t"scripts": {\n\t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n\t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n\t}\n}\n```\n\nThose two scripts are the only commands you need. From here on, `npm start` is local development and `npm run build` is the production build.\n\n---\n\n## 2) Install required packages\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img # Eleventy and 11ty Image\nnpm install rimraf cross-env # Helper packages\nnpm install @apleasantview/eleventy-plugin-baseline # Finally, install Baseline\n```\n\n---\n\n## 3) Configure Eleventy to use Baseline\n\nCreate `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---\n\nTwo things are worth a sentence:\n\n- `baseline(settings, options)` takes two arguments. `settings` is your site\'s identity (title, languages, head extras); `options` is runtime behaviour. Passing settings only leaves every option at its default, which is exactly what you want here.\n- `export const config = baselineConfig;` re-exports Baseline\'s directory contract, so Eleventy knows where to read input from and where to write output to. The [[config-export | config export reference]] explains why it has to be exported separately rather than set from inside the plugin.\n\n---\n\nBaseline wires Eleventy\'s `HtmlBasePlugin` to `process.env.URL` for you, which is what keeps canonical URLs and the sitemap pointing at the right origin.\n\nCreate a local `.env` for development, and set `URL` in your hosting environment for production. Baseline loads `dotenv` itself, so `process.env.URL` is available in both `_data/settings.js` and `eleventy.config.js`:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n---\n\n## 4) Required site data\n\nCreate `src/_data/settings.js`. This is the canonical home for everything that identifies the site: title, production URL, indexing preferences, and the head extras (the `<link>`, `<script>`, and `<meta>` tags Baseline injects into every page).\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\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\nThe `head.link[]`, `head.script[]`, and `head.meta[]` arrays are how you add to the head from settings. Anything you put here lands on every page, alongside the defaults Baseline already produces (charset, viewport, title, description, canonical, robots).\n\nOne stylesheet link, one script tag, one colour-scheme hint is enough to get started.\n\n---\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`. Notice `<baseline-head></baseline-head>`: that is the placeholder. Baseline replaces it with a full `<head>` element at build time, so your layout never writes one of its own.\n\nIt sits as a sibling of `<body>`, not nested inside another head.\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(settings.defaultLanguage) }}">\n <baseline-head></baseline-head>\n <body>\n <main id="main">\n <h1>{{ title }}</h1>\n {{ content | safe }}\n {% if page.url !== "/" %}\n <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">←</span> Go back</a></p>\n {% endif %}\n </main>\n <script>\n const backBtn = document.getElementById("go-back");\n if ( backBtn ) {\n backBtn.addEventListener("click", (event) => {\n event.preventDefault();\n history.back();\n });\n }\n </script>\n </body>\n</html>\n```\n\n{% endraw %}\n\n---\n\n## 6) Define your content directory\n\nEleventy uses directory data files to set repeating templating data, including permalinks for content files. We\'ll create one for our tutorial site. Inside `src`, create the content directory and its data file: `src/content/pages/pages.11tydata.js`.\n\nA convention in Baseline is to use the `slug` front matter field and generate permalinks from them. Setting the permalink field is reserved for the homepage ("/") and whenever control is warranted.\n\n```js\nexport default {\n\tlayout: \'layouts/base.njk\',\n\n\t// Ensure we have a value to work wih 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\n{% alertBlock %}\n\nIt would be tempting to use `eleventyCompute` for creating the permalink but this would always take precedence over the front matter field if set. The permalink function does plenty, including still allowing us to overwrite the field if needed.\n\n{% endalertBlock %}\n\n---\n\n## 7) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\nslug: \'simple-baseline-site\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou are looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n---\n\n## 8) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Howdy!\');\n});\n```\n\n---\n\n## 9) Run the site locally\n\n```bash\nnpm start\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see the page title rendered as a heading.\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files, including `sitemap.xml`.\n\n{% alertBlock "info" %}\n\nEleventy never cleans `dist/` for you. If a rebuild looks stale, stop the server and run `npm start` again.\n\n{% endalertBlock %}\n\n---\n\n## 10) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically because the sitemap module is on by default.\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\nIf you are looking to build a multilingual site, it\'s next up.\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- Once you have a production URL, update `src/_data/settings.js` so canonical URLs and the sitemap match.\n- The natural next chapter is the [[assets-pipeline | assets pipeline tutorial]], which adds PostCSS and esbuild entries. After that, the [[head-and-noindex | head and noindex tutorial]] covers what Baseline injects into every page and how to extend it.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Tutorials',
title: 'Build a simple site',
description:
'Create a single-language Eleventy site with Baseline defaults, head extras driven by settings, minimal CSS/JS, and an auto sitemap.',
slug: 'simple-baseline-site',
date: 2026-01-25T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_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-01-25T00:00:00.000Z,
rawInput:
'\nThe shortest path from an empty folder to a working Baseline site. By the end you\'ll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself.\n\nThis is the tutorial every other tutorial builds on.\n\n---\n\n## What you will build\n\n- An Eleventy site with one page.\n- Baseline wired with default options: `multilingual` off, `sitemap` on, `navigator` on in dev and off in production.\n- A small stylesheet flowing through Baseline\'s assets pipeline, and an auto-generated `sitemap.xml` next to it.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer.\n- npm.\n- A terminal.\n\n---\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\nOpen `package.json` and set `"type": "module"` (Baseline expects ESM):\n\n```json\n{\n\t"name": "simple-baseline-site",\n\t"type": "module",\n\t"scripts": {\n\t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n\t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n\t}\n}\n```\n\nThose two scripts are the only commands you need. From here on, `npm start` is local development and `npm run build` is the production build.\n\n---\n\n## 2) Install required packages\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img # Eleventy and 11ty Image\nnpm install rimraf cross-env # Helper packages\nnpm install @apleasantview/eleventy-plugin-baseline # Finally, install Baseline\n```\n\n---\n\n## 3) Configure Eleventy to use Baseline\n\nCreate `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---\n\nTwo things are worth a sentence:\n\n- `baseline(settings, options)` takes two arguments. `settings` is your site\'s identity (title, languages, head extras); `options` is runtime behaviour. Passing settings only leaves every option at its default, which is exactly what you want here.\n- `export const config = baselineConfig;` re-exports Baseline\'s directory contract, so Eleventy knows where to read input from and where to write output to. The [[config-export | config export reference]] explains why it has to be exported separately rather than set from inside the plugin.\n\n---\n\nBaseline wires Eleventy\'s `HtmlBasePlugin` to `process.env.URL` for you, which is what keeps canonical URLs and the sitemap pointing at the right origin.\n\nCreate a local `.env` for development, and set `URL` in your hosting environment for production. Baseline loads `dotenv` itself, so `process.env.URL` is available in both `_data/settings.js` and `eleventy.config.js`:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n---\n\n## 4) Required site data\n\nCreate `src/_data/settings.js`. This is the canonical home for everything that identifies the site: title, production URL, indexing preferences, and the head extras (the `<link>`, `<script>`, and `<meta>` tags Baseline injects into every page).\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\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\nThe `head.link[]`, `head.script[]`, and `head.meta[]` arrays are how you add to the head from settings. Anything you put here lands on every page, alongside the defaults Baseline already produces (charset, viewport, title, description, canonical, robots).\n\nOne stylesheet link, one script tag, one colour-scheme hint is enough to get started.\n\n---\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`. Notice `<baseline-head></baseline-head>`: that is the placeholder. Baseline replaces it with a full `<head>` element at build time, so your layout never writes one of its own.\n\nIt sits as a sibling of `<body>`, not nested inside another head.\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(settings.defaultLanguage) }}">\n <baseline-head></baseline-head>\n <body>\n <main id="main">\n <h1>{{ title }}</h1>\n {{ content | safe }}\n {% if page.url !== "/" %}\n <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">←</span> Go back</a></p>\n {% endif %}\n </main>\n <script>\n const backBtn = document.getElementById("go-back");\n if ( backBtn ) {\n backBtn.addEventListener("click", (event) => {\n event.preventDefault();\n history.back();\n });\n }\n </script>\n </body>\n</html>\n```\n\n{% endraw %}\n\n---\n\n## 6) Define your content directory\n\nEleventy uses directory data files to set repeating templating data, including permalinks for content files. We\'ll create one for our tutorial site. Inside `src`, create the content directory and its data file: `src/content/pages/pages.11tydata.js`.\n\nA convention in Baseline is to use the `slug` front matter field and generate permalinks from them. Setting the permalink field is reserved for the homepage ("/") and whenever control is warranted.\n\n```js\nexport default {\n\tlayout: \'layouts/base.njk\',\n\n\t// Ensure we have a value to work wih 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\n{% alertBlock %}\n\nIt would be tempting to use `eleventyCompute` for creating the permalink but this would always take precedence over the front matter field if set. The permalink function does plenty, including still allowing us to overwrite the field if needed.\n\n{% endalertBlock %}\n\n---\n\n## 7) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\nslug: \'simple-baseline-site\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou are looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n---\n\n## 8) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Howdy!\');\n});\n```\n\n---\n\n## 9) Run the site locally\n\n```bash\nnpm start\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see the page title rendered as a heading.\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files, including `sitemap.xml`.\n\n{% alertBlock "info" %}\n\nEleventy never cleans `dist/` for you. If a rebuild looks stale, stop the server and run `npm start` again.\n\n{% endalertBlock %}\n\n---\n\n## 10) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically because the sitemap module is on by default.\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\nIf you are looking to build a multilingual site, it\'s next up.\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- Once you have a production URL, update `src/_data/settings.js` so canonical URLs and the sitemap match.\n- The natural next chapter is the [[assets-pipeline | assets pipeline tutorial]], which adds PostCSS and esbuild entries. After that, the [[head-and-noindex | head and noindex tutorial]] covers what Baseline injects into every page and how to extend it.\n',
url: '/docs/tutorial/simple-baseline-site/',
outputPath: './dist/docs/tutorial/simple-baseline-site/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-30T20:01:49.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-01-25T00: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.multilingual-site.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: '02.multilingual-site',
filePathStem: '/content/docs/01.tutorial/02.multilingual-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:
'\nAdd 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.\n\nMultilingual is opt-in. Most projects don\'t need it; if yours does, this chapter is the full setup.\n\nBy the end you\'ll have an English and Dutch site sharing a single Eleventy build, with Baseline doing the hreflang and sitemap wiring on its own.\n\n---\n\n## What you will build\n\n- Pages in English and Dutch sharing one Eleventy build.\n- Baseline configured with multilingual on, plus `defaultLanguage` and `languages` set in `_data/settings.js`.\n- Hreflang links (the `<link rel="alternate" hreflang="...">` tags that point search engines at a page\'s translations) written automatically, and a per-language sitemap for each language.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer, and npm.\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts from the [[simple-baseline-site | simple site tutorial]]:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## How activation works\n\nMultilingual mode requires three things, all present:\n\n- `options.multilingual: true` passed to `baseline()` in `eleventy.config.js`.\n- `defaultLanguage` set in `_data/settings.js`.\n- A non-empty `languages` map in `_data/settings.js`.\n\n{% alertBlock "warning" %}\n\nSetting `defaultLanguage` and `languages` is the site\'s identity. Turning `multilingual` on is the runtime decision. Both halves are needed; Baseline won\'t infer one from the other.\n\n{% endalertBlock %}\n\n---\n\n## 1) Install required packages\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img # Eleventy and 11ty Image\nnpm install rimraf cross-env # Helper packages\nnpm install @apleasantview/eleventy-plugin-baseline # Finally, install Baseline\n```\n\n---\n\n## 2) Configure Eleventy with multilingual on\n\nCreate `eleventy.config.js`:\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\tmultilingual: true,\n\t\t\thead: {\n\t\t\t\ttitleSeparator: \' | \',\n\t\t\t\tshowGenerator: true\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\nCreate a local `.env` so canonical URLs, hreflang, and sitemaps use a real origin during development. In production, set `URL` in your hosting environment so the same outputs reach for the live domain instead.\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n{% alertBlock "info" %}\n\nBaseline\'s multilingual support is a thin layer over Eleventy\'s built-in i18n plugin. The [Eleventy i18n docs](https://www.11ty.dev/docs/plugins/i18n/) cover the mechanics underneath.\n\n{% endalertBlock %}\n\n---\n\n## 3) Site data and languages\n\nOpen `src/_data/settings.js` from the previous tutorials and add `defaultLanguage` and the `languages` map. Everything else (title, url, head extras) carries forward; the merged file looks like the below.\n\nEach language\'s `contentDir` points at its per-language source folder under `src/`. Baseline reads the map to know which languages exist, and uses `defaultLanguage` to mark the canonical one.\n\n```js\nexport default {\n\ttitle: \'Multilingual Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline (i18n)\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tnoindex: false,\n\n\tdefaultLanguage: \'en\',\n\tlanguages: {\n\t\ten: {\n\t\t\tcontentDir: \'content/en/\',\n\t\t\tlocale: \'en\',\n\t\t\tlanguageName: \'English\',\n\t\t\ttitle: \'Baseline (EN)\',\n\t\t\ttagline: \'Hello\'\n\t\t},\n\t\tnl: {\n\t\t\tcontentDir: \'content/nl/\',\n\t\t\tlocale: \'nl\',\n\t\t\tlanguageName: \'Nederlands\',\n\t\t\ttitle: \'Baseline (NL)\',\n\t\t\ttagline: \'Hallo\'\n\t\t}\n\t},\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---\n\n## 4) Per-language directory data\n\nTell Eleventy which language each content folder belongs to. Baseline reads `lang` on each page to group translations and emit hreflang.\n\n`src/content/en/en.11tydata.js`:\n\n```js\nexport default { lang: \'en\' };\n```\n\n`src/content/nl/nl.11tydata.js`:\n\n```js\nexport default { lang: \'nl\' };\n```\n\n---\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`. The `<baseline-head>` placeholder is what Baseline replaces with the rendered `<head>` at build time.\n\nWith multilingual on and a `translationKey` on each page (next step), the hreflang links go in automatically. No `for` loop in your layout.\n\nRefer to the minimal layout step in the [[simple-baseline-site | simple site]] tutorial.\n\n---\n\n## 6) Add localized pages\n\nA `translationKey` is the string that ties translations of the same page together. Pages with the same key across languages are recognised as translations of one another, and that\'s what lets Baseline emit the right hreflang.\n\nDelete the permalink field from `src/content/pages/index.md`.\n\n`src/content/en/pages/index.md`:\n\n```md\n---\ntitle: \'Hello Baseline (EN)\'\nslug: \'multilingual-site-en\'\ndescription: \'English home\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelcome to the English home page.\n```\n\n`src/content/nl/pages/index.md`:\n\n```md\n---\ntitle: \'Hallo Baseline (NL)\'\nslug: \'multilingual-site-nl\'\ndescription: \'Nederlandse home\'\npermalink: \'/nl/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelkom op de Nederlandse homepagina.\n```\n\n---\n\n## 7) Minimal assets (reuse from prior tutorial)\n\nThe asset side is unchanged, so reuse what you already have from the [[simple-baseline-site | simple site]] tutorial:\n\n- `src/assets/css/index.css` with the same minimal styles as before.\n- `src/assets/js/index.js`, optionally a small script (a `DOMContentLoaded` log is plenty).\n\n## 8) Hreflang\n\nHreflang is the set of `<link rel="alternate" hreflang="...">` tags that point search engines at a page\'s translations. Baseline emits them automatically once two things are in place:\n\n1. Multilingual mode is on (`options.multilingual: true` plus `defaultLanguage` and `languages` in settings).\n2. The page has a `translationKey` in its front matter, matched by its translations.\n\nWith both pages in place from the previous step and multilingual on, the rendered `<head>` for the homepage will contain:\n\n```html\n<link rel="alternate" hreflang="en" href="http://localhost:8080/" />\n<link rel="alternate" hreflang="nl" href="http://localhost:8080/nl/" />\n<link rel="alternate" hreflang="x-default" href="http://localhost:8080/" />\n```\n\n## 9) Run the site locally\n\n```bash\nnpm start\n```\n\n- Visit `/` for English (the default-language permalinks are unprefixed) and `/nl/` for Dutch.\n- View page source on either side. You should see `<link rel="alternate" hreflang="en" href="...">`, `<link rel="alternate" hreflang="nl" href="...">`, and the `x-default` entry. Baseline emits all three because both pages share `translationKey: \'homepage\'` and multilingual is on.\n- Dev writes to `dist/` while it runs, so the generated sitemap index at `/sitemap.xml` plus per-language sitemaps (`dist/en/sitemap.xml`, `dist/nl/sitemap.xml`) are inspectable while the server is up.\n\n---\n\n## 10) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Check `dist/` for per-language output.\n- `dist/sitemap.xml` is now the sitemap index, with the per-language sitemaps (`dist/en/sitemap.xml`, `dist/nl/sitemap.xml`) listed inside.\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\n- Add more pages under `src/content/en/` and `src/content/nl/`, matching `translationKey` values so the translations stay linked.\n- Localise labels (nav text and similar) through data files keyed by `lang`.\n- Set `pathPrefix` if you deploy under a subpath, and keep `settings.url` pointing at the production origin so canonicals and sitemap links match.\n- The [[multilang | multilang module]] reference has the full activation rules and helpers; the [[filters | filters]] reference covers the translation-aware filters.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Tutorials',
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.',
date: 2026-01-26T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/docs/01.tutorial/02.multilingual-site.md',
fileSlug: '02.multilingual-site',
filePathStem: '/content/docs/01.tutorial/02.multilingual-site',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-01-26T00:00:00.000Z,
rawInput:
'\nAdd 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.\n\nMultilingual is opt-in. Most projects don\'t need it; if yours does, this chapter is the full setup.\n\nBy the end you\'ll have an English and Dutch site sharing a single Eleventy build, with Baseline doing the hreflang and sitemap wiring on its own.\n\n---\n\n## What you will build\n\n- Pages in English and Dutch sharing one Eleventy build.\n- Baseline configured with multilingual on, plus `defaultLanguage` and `languages` set in `_data/settings.js`.\n- Hreflang links (the `<link rel="alternate" hreflang="...">` tags that point search engines at a page\'s translations) written automatically, and a per-language sitemap for each language.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer, and npm.\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts from the [[simple-baseline-site | simple site tutorial]]:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## How activation works\n\nMultilingual mode requires three things, all present:\n\n- `options.multilingual: true` passed to `baseline()` in `eleventy.config.js`.\n- `defaultLanguage` set in `_data/settings.js`.\n- A non-empty `languages` map in `_data/settings.js`.\n\n{% alertBlock "warning" %}\n\nSetting `defaultLanguage` and `languages` is the site\'s identity. Turning `multilingual` on is the runtime decision. Both halves are needed; Baseline won\'t infer one from the other.\n\n{% endalertBlock %}\n\n---\n\n## 1) Install required packages\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img # Eleventy and 11ty Image\nnpm install rimraf cross-env # Helper packages\nnpm install @apleasantview/eleventy-plugin-baseline # Finally, install Baseline\n```\n\n---\n\n## 2) Configure Eleventy with multilingual on\n\nCreate `eleventy.config.js`:\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\tmultilingual: true,\n\t\t\thead: {\n\t\t\t\ttitleSeparator: \' | \',\n\t\t\t\tshowGenerator: true\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\nCreate a local `.env` so canonical URLs, hreflang, and sitemaps use a real origin during development. In production, set `URL` in your hosting environment so the same outputs reach for the live domain instead.\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n{% alertBlock "info" %}\n\nBaseline\'s multilingual support is a thin layer over Eleventy\'s built-in i18n plugin. The [Eleventy i18n docs](https://www.11ty.dev/docs/plugins/i18n/) cover the mechanics underneath.\n\n{% endalertBlock %}\n\n---\n\n## 3) Site data and languages\n\nOpen `src/_data/settings.js` from the previous tutorials and add `defaultLanguage` and the `languages` map. Everything else (title, url, head extras) carries forward; the merged file looks like the below.\n\nEach language\'s `contentDir` points at its per-language source folder under `src/`. Baseline reads the map to know which languages exist, and uses `defaultLanguage` to mark the canonical one.\n\n```js\nexport default {\n\ttitle: \'Multilingual Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline (i18n)\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tnoindex: false,\n\n\tdefaultLanguage: \'en\',\n\tlanguages: {\n\t\ten: {\n\t\t\tcontentDir: \'content/en/\',\n\t\t\tlocale: \'en\',\n\t\t\tlanguageName: \'English\',\n\t\t\ttitle: \'Baseline (EN)\',\n\t\t\ttagline: \'Hello\'\n\t\t},\n\t\tnl: {\n\t\t\tcontentDir: \'content/nl/\',\n\t\t\tlocale: \'nl\',\n\t\t\tlanguageName: \'Nederlands\',\n\t\t\ttitle: \'Baseline (NL)\',\n\t\t\ttagline: \'Hallo\'\n\t\t}\n\t},\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---\n\n## 4) Per-language directory data\n\nTell Eleventy which language each content folder belongs to. Baseline reads `lang` on each page to group translations and emit hreflang.\n\n`src/content/en/en.11tydata.js`:\n\n```js\nexport default { lang: \'en\' };\n```\n\n`src/content/nl/nl.11tydata.js`:\n\n```js\nexport default { lang: \'nl\' };\n```\n\n---\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`. The `<baseline-head>` placeholder is what Baseline replaces with the rendered `<head>` at build time.\n\nWith multilingual on and a `translationKey` on each page (next step), the hreflang links go in automatically. No `for` loop in your layout.\n\nRefer to the minimal layout step in the [[simple-baseline-site | simple site]] tutorial.\n\n---\n\n## 6) Add localized pages\n\nA `translationKey` is the string that ties translations of the same page together. Pages with the same key across languages are recognised as translations of one another, and that\'s what lets Baseline emit the right hreflang.\n\nDelete the permalink field from `src/content/pages/index.md`.\n\n`src/content/en/pages/index.md`:\n\n```md\n---\ntitle: \'Hello Baseline (EN)\'\nslug: \'multilingual-site-en\'\ndescription: \'English home\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelcome to the English home page.\n```\n\n`src/content/nl/pages/index.md`:\n\n```md\n---\ntitle: \'Hallo Baseline (NL)\'\nslug: \'multilingual-site-nl\'\ndescription: \'Nederlandse home\'\npermalink: \'/nl/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelkom op de Nederlandse homepagina.\n```\n\n---\n\n## 7) Minimal assets (reuse from prior tutorial)\n\nThe asset side is unchanged, so reuse what you already have from the [[simple-baseline-site | simple site]] tutorial:\n\n- `src/assets/css/index.css` with the same minimal styles as before.\n- `src/assets/js/index.js`, optionally a small script (a `DOMContentLoaded` log is plenty).\n\n## 8) Hreflang\n\nHreflang is the set of `<link rel="alternate" hreflang="...">` tags that point search engines at a page\'s translations. Baseline emits them automatically once two things are in place:\n\n1. Multilingual mode is on (`options.multilingual: true` plus `defaultLanguage` and `languages` in settings).\n2. The page has a `translationKey` in its front matter, matched by its translations.\n\nWith both pages in place from the previous step and multilingual on, the rendered `<head>` for the homepage will contain:\n\n```html\n<link rel="alternate" hreflang="en" href="http://localhost:8080/" />\n<link rel="alternate" hreflang="nl" href="http://localhost:8080/nl/" />\n<link rel="alternate" hreflang="x-default" href="http://localhost:8080/" />\n```\n\n## 9) Run the site locally\n\n```bash\nnpm start\n```\n\n- Visit `/` for English (the default-language permalinks are unprefixed) and `/nl/` for Dutch.\n- View page source on either side. You should see `<link rel="alternate" hreflang="en" href="...">`, `<link rel="alternate" hreflang="nl" href="...">`, and the `x-default` entry. Baseline emits all three because both pages share `translationKey: \'homepage\'` and multilingual is on.\n- Dev writes to `dist/` while it runs, so the generated sitemap index at `/sitemap.xml` plus per-language sitemaps (`dist/en/sitemap.xml`, `dist/nl/sitemap.xml`) are inspectable while the server is up.\n\n---\n\n## 10) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Check `dist/` for per-language output.\n- `dist/sitemap.xml` is now the sitemap index, with the per-language sitemaps (`dist/en/sitemap.xml`, `dist/nl/sitemap.xml`) listed inside.\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\n- Add more pages under `src/content/en/` and `src/content/nl/`, matching `translationKey` values so the translations stay linked.\n- Localise labels (nav text and similar) through data files keyed by `lang`.\n- Set `pathPrefix` if you deploy under a subpath, and keep `settings.url` pointing at the production origin so canonicals and sitemap links match.\n- The [[multilang | multilang module]] reference has the full activation rules and helpers; the [[filters | filters]] reference covers the translation-aware filters.\n',
url: '/docs/tutorial/multilingual-baseline-site/',
outputPath: './dist/docs/tutorial/multilingual-baseline-site/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-26T00:00:00.000Z,
dateModified: 2026-07-31T08:04:54.000Z },
inputPath: './src/content/docs/01.tutorial/02.multilingual-site.md',
fileSlug: '02.multilingual-site',
filePathStem: '/content/docs/01.tutorial/02.multilingual-site',
date: 2026-01-26T00:00:00.000Z,
outputPath: './dist/docs/tutorial/multilingual-baseline-site/index.html',
url: '/docs/tutorial/multilingual-baseline-site/',
templateContent: [Getter/Setter],
content: [Getter/Setter] },
{ template:
Template {
inputPath: './src/content/docs/02.feature-guide/00.index.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: '00.index',
filePathStem: '/content/docs/02.feature-guide/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:
`\nThese feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off.\n\nNew to Baseline? The [[overview | overview]] covers what it is and who it is for.\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## Index\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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: '/docs/feature-guide/',
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Feature guides',
title: 'Feature guides',
slug: 'feature-guide',
description:
'Seven guides that build on each other: assets, images, head and noindex, sitemaps and drafts, deployment checks, custom schema, and debugging.',
date: 2026-05-03T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/docs/02.feature-guide/00.index.md',
fileSlug: '00.index',
filePathStem: '/content/docs/02.feature-guide/00.index',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-05-03T00:00:00.000Z,
rawInput:
`\nThese feature tutorials build on each other. Starting from the simple site; you'll fill it in with assets, images, and head extras, then publish it through sitemaps and deployment. Debugging comes last, as the tool you reach for when something is off.\n\nNew to Baseline? The [[overview | overview]] covers what it is and who it is for.\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## Index\n\n{% include "partials/chapter-toc.njk" %}\n`,
url: '/docs/feature-guide/',
outputPath: './dist/docs/feature-guide/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-05-03T00:00:00.000Z,
dateModified: 2026-07-31T08:54:16.000Z },
inputPath: './src/content/docs/02.feature-guide/00.index.md',
fileSlug: '00.index',
filePathStem: '/content/docs/02.feature-guide/00.index',
date: 2026-05-03T00:00:00.000Z,
outputPath: './dist/docs/feature-guide/index.html',
url: '/docs/feature-guide/',
templateContent: [Getter/Setter],
content: [Getter/Setter] },
{ template:
Template {
inputPath: './src/content/docs/02.feature-guide/01.assets-pipeline.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: '01.assets-pipeline',
filePathStem: '/content/docs/02.feature-guide/01.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:
'\nShip CSS and JS through Baseline\'s assets module. By the end you\'ll have one CSS entry going through PostCSS, one JS entry going through esbuild, and a handle on the inline filters when you need them.\n\nThat, taken together, is what Baseline calls the assets pipeline.\n\nThe assets module is always on. PostCSS and esbuild are its processors, the small adapters that wire each pipeline into Eleventy. Bring your own configs, or let Baseline fall back to its defaults.\n\n---\n\n## What you will build\n\n- `src/assets/css/index.css` bundled through PostCSS, using your config or Baseline\'s fallback.\n- `src/assets/js/index.js` bundled through esbuild, minified for production.\n- Optionally, the same content inlined into a template through `inlinePostCSS` and `inlineESbuild`.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer, and npm.\n- Baseline already installed and configured, as in the [[simple-baseline-site|simple site tutorial]].\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js`:\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---\n\n## 2) Add a page that links assets\n\nCreate `src/content/pages/assets-quickstart.md`:\n\n```md\n---\ntitle: \'Assets Quickstart\'\nslug: \'assets-quickstart\'\ndescription: \'CSS and JS bundled by Baseline.\'\nlayout: \'layouts/base.njk\'\n---\n\nCSS should style this page, and JS should log to the console. Here is a small badge:\n\n<span class="pill">Pending</span>\n```\n\nThe `<link rel="stylesheet">` and `<script>` tags come from `settings.head` (set up in the simple site tutorial), so the layout never needs to know they exist. Baseline injects them into every page.\n\n---\n\n## 3) Author the CSS entry\n\nCreate `src/assets/css/index.css`:\n\n```css\n:root {\n\tcolor-scheme: light;\n}\n\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n\n.pill {\n\tdisplay: inline-block;\n\tpadding: 0.25rem 0.75rem;\n\tborder-radius: 999px;\n\tbackground: #e0f2fe;\n\tcolor: #0f172a;\n\tfont-weight: 600;\n}\n```\n\nIf a `postcss.config.js` exists at the project root, Baseline picks it up. Otherwise it falls back to its built-in config.\n\n---\n\n## 4) Author the JS entry\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Baseline assets: JS is loaded\');\n\tconst pill = document.querySelector(\'.pill\');\n\tif (pill) {\n\t\tpill.textContent = \'Bundled JS is running\';\n\t}\n});\n```\n\n---\n\n## 5) Run the site locally\n\n```bash\nnpm start\n```\n\n- Open the local URL (default http://localhost:8080/). Confirm the styles apply and the console log fires.\n- Dev writes to `dist/` as it runs, so `dist/assets/css/index.css` and `dist/assets/js/index.js` are inspectable while the server is up.\n- Image-format changes (png, jpg, webp, gif, avif, svg) under `src/assets/` also trigger a rebuild during `npm run dev`.\n\nEleventy never cleans `dist/` for you. Clear it with `npx rimraf dist/` whenever a rebuild looks stale.\n\n## 6) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Check `dist/assets/css/index.css` (PostCSS output) and `dist/assets/js/index.js` (bundled and minified).\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\n- Drop a `postcss.config.js` at the project root when you want to bring your own plugins.\n- Add more entry points as the site grows; section-specific `index.css` files under subfolders work the same way.\n- Reach for `inlinePostCSS` and `inlineESbuild` on critical snippets only. Inlining a full bundle defeats the point.\n- See the [[assets | assets module]] reference for the full option list, and the [[filters | filters]] reference for `inlineESbuild` and `inlinePostCSS`.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Feature guides',
title: 'Assets pipeline quickstart',
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.",
slug: 'assets-pipeline',
date: 2026-04-13T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/docs/02.feature-guide/01.assets-pipeline.md',
fileSlug: '01.assets-pipeline',
filePathStem: '/content/docs/02.feature-guide/01.assets-pipeline',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-04-13T00:00:00.000Z,
rawInput:
'\nShip CSS and JS through Baseline\'s assets module. By the end you\'ll have one CSS entry going through PostCSS, one JS entry going through esbuild, and a handle on the inline filters when you need them.\n\nThat, taken together, is what Baseline calls the assets pipeline.\n\nThe assets module is always on. PostCSS and esbuild are its processors, the small adapters that wire each pipeline into Eleventy. Bring your own configs, or let Baseline fall back to its defaults.\n\n---\n\n## What you will build\n\n- `src/assets/css/index.css` bundled through PostCSS, using your config or Baseline\'s fallback.\n- `src/assets/js/index.js` bundled through esbuild, minified for production.\n- Optionally, the same content inlined into a template through `inlinePostCSS` and `inlineESbuild`.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer, and npm.\n- Baseline already installed and configured, as in the [[simple-baseline-site|simple site tutorial]].\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js`:\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---\n\n## 2) Add a page that links assets\n\nCreate `src/content/pages/assets-quickstart.md`:\n\n```md\n---\ntitle: \'Assets Quickstart\'\nslug: \'assets-quickstart\'\ndescription: \'CSS and JS bundled by Baseline.\'\nlayout: \'layouts/base.njk\'\n---\n\nCSS should style this page, and JS should log to the console. Here is a small badge:\n\n<span class="pill">Pending</span>\n```\n\nThe `<link rel="stylesheet">` and `<script>` tags come from `settings.head` (set up in the simple site tutorial), so the layout never needs to know they exist. Baseline injects them into every page.\n\n---\n\n## 3) Author the CSS entry\n\nCreate `src/assets/css/index.css`:\n\n```css\n:root {\n\tcolor-scheme: light;\n}\n\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n\n.pill {\n\tdisplay: inline-block;\n\tpadding: 0.25rem 0.75rem;\n\tborder-radius: 999px;\n\tbackground: #e0f2fe;\n\tcolor: #0f172a;\n\tfont-weight: 600;\n}\n```\n\nIf a `postcss.config.js` exists at the project root, Baseline picks it up. Otherwise it falls back to its built-in config.\n\n---\n\n## 4) Author the JS entry\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Baseline assets: JS is loaded\');\n\tconst pill = document.querySelector(\'.pill\');\n\tif (pill) {\n\t\tpill.textContent = \'Bundled JS is running\';\n\t}\n});\n```\n\n---\n\n## 5) Run the site locally\n\n```bash\nnpm start\n```\n\n- Open the local URL (default http://localhost:8080/). Confirm the styles apply and the console log fires.\n- Dev writes to `dist/` as it runs, so `dist/assets/css/index.css` and `dist/assets/js/index.js` are inspectable while the server is up.\n- Image-format changes (png, jpg, webp, gif, avif, svg) under `src/assets/` also trigger a rebuild during `npm run dev`.\n\nEleventy never cleans `dist/` for you. Clear it with `npx rimraf dist/` whenever a rebuild looks stale.\n\n## 6) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Check `dist/assets/css/index.css` (PostCSS output) and `dist/assets/js/index.js` (bundled and minified).\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\n- Drop a `postcss.config.js` at the project root when you want to bring your own plugins.\n- Add more entry points as the site grows; section-specific `index.css` files under subfolders work the same way.\n- Reach for `inlinePostCSS` and `inlineESbuild` on critical snippets only. Inlining a full bundle defeats the point.\n- See the [[assets | assets module]] reference for the full option list, and the [[filters | filters]] reference for `inlineESbuild` and `inlinePostCSS`.\n',
url: '/docs/feature-guide/assets-pipeline/',
outputPath: './dist/docs/feature-guide/assets-pipeline/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-04-13T00:00:00.000Z,
dateModified: 2026-07-31T08:04:54.000Z },
inputPath: './src/content/docs/02.feature-guide/01.assets-pipeline.md',
fileSlug: '01.assets-pipeline',
filePathStem: '/content/docs/02.feature-guide/01.assets-pipeline',
date: 2026-04-13T00:00:00.000Z,
outputPath: './dist/docs/feature-guide/assets-pipeline/index.html',
url: '/docs/feature-guide/assets-pipeline/',
templateContent: [Getter/Setter],
content: [Getter/Setter] },
... 36 more items ],
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],
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],
_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-08-01T07:33:41.115Z,
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,
sitemap: [Object],
datePublished: 2026-08-01T07:33:41.115Z,
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-08-01T07:33:41.115Z,
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],
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],
_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-08-01T07:33:41.115Z,
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,
sitemap: [Object],
datePublished: 2026-08-01T07:33:41.115Z,
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-08-01T07:33:41.115Z,
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],
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],
_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-08-01T07:33:41.115Z,
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,
sitemap: [Object],
datePublished: 2026-08-01T07:33:41.115Z,
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-08-01T07:33:41.115Z,
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],
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],
_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-08-01T07:33:41.115Z,
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,
sitemap: [Object],
datePublished: 2026-08-01T07:33:41.115Z,
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-08-01T07:33:41.115Z,
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],
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],
_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-08-01T07:33:41.115Z,
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,
sitemap: [Object],
datePublished: 2026-08-01T07:33:41.115Z,
dateModified: 2026-06-03T09:37:58.000Z },
inputPath: './src/content/faq/05-seo.md',
fileSlug: '05-seo',
filePathStem: '/content/faq/05-seo',
date: 2026-08-01T07:33:41.115Z,
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],
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],
_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-08-01T07:33:41.115Z,
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,
sitemap: [Object],
datePublished: 2026-08-01T07:33:41.115Z,
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-08-01T07:33:41.115Z,
outputPath: false,
url: false,
templateContent: [Getter/Setter],
content: [Getter/Setter] } ],
translationsMap:
{ about:
{ en:
{ title: 'About Eleventy Baseline',
url: '/about/',
lang: 'en',
isDefaultLang: true,
data: [Object] },
fr:
{ title: "À propos d'Eleventy Baseline",
url: '/fr/about/',
lang: 'fr',
isDefaultLang: false,
data: [Object] },
nl:
{ title: 'Over Eleventy Baseline',
url: '/nl/about/',
lang: 'nl',
isDefaultLang: false,
data: [Object] } },
'commercial-support':
{ en:
{ title: 'Commercial support',
url: '/commercial-support/',
lang: 'en',
isDefaultLang: true,
data: [Object] },
fr:
{ title: 'Support commercial',
url: '/fr/commercial-support/',
lang: 'fr',
isDefaultLang: false,
data: [Object] },
nl:
{ title: 'Commerciële ondersteuning',
url: '/nl/commercial-support/',
lang: 'nl',
isDefaultLang: false,
data: [Object] } },
homepage:
{ en:
{ title: 'Eleventy Baseline',
url: '/',
lang: 'en',
isDefaultLang: true,
data: [Object] },
fr:
{ title: 'Eleventy Baseline',
url: '/fr/',
lang: 'fr',
isDefaultLang: false,
data: [Object] },
nl:
{ title: 'Eleventy Baseline',
url: '/nl/',
lang: 'nl',
isDefaultLang: false,
data: [Object] } } },
translations:
[ { template:
Template {
inputPath: './src/content/en/pages/about.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'about',
filePathStem: '/content/en/pages/about',
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_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](/)._\n\n_This page is the longer, more honest story._\n\n---\n\n## From starter to plugin\n\nBaseline started as my hundredth attempt at making a starter for client work, this time trying to be properly serious about it. The first version sat dormant for a while, but I kept coming back to it. It had one eye on the patterns and tooling already (silently) established in the Eleventy community.\n\nThe other eye was on what was missing for me: keeping client sites in sync without copying and rewriting files across projects, the per-language sitemaps I missed from Hugo, the single settings shape that WordPress gets right.\n\nThe shape clicked while I was thinking about something Zach Leatherman, Eleventy\'s creator, has said: that everything in Eleventy is essentially a plugin. I\'m paraphrasing, but that was the moment it stopped being a starter in my head.\n\nThe rewrite landed on the 1st of December 2025 as a single commit, "Rewrite baseline as a plugin." I announced the project on the Eleventy Discord shortly after, on the chance it might be useful to other people too.\n\nThat shift changed what the project needed to be. A personal starter can be implicit. You know why things are the way they are because you put them there. A plugin can\'t coast on that. Other people need to understand the choices, or at least trust them enough to get started.\n\nThe system has grown through use. Modules added when the project needed them, each with its own decisions, each leaning on the others. The starter became a system. Gradually, then all at once.\n\nThe framing shifted along with it. The earlier description called Baseline a "thin, optional wiring layer." That was true once. By April 2026 it had become an opinionated starting point. The value isn\'t that it\'s thin. The value is that these decisions are made, they work together, and the path to change one is clear when you disagree.\n\nWhat\'s in Baseline now is most of what I\'ve learned about building with Eleventy, and underneath that, fifteen years of working in tech, mostly but not only on the web. The decisions, the workarounds, the small conveniences that compound over hundreds of pages.\n\nIt evolved into its own thing along the way, but it grew out of an itch every Eleventy developer recognises: wiring up the same things on the third new project and wondering if there\'s a better way to keep that work.\n\nPutting the knowledge into code is the easier half. Finding the right shape for it, what to name, what to group, what belongs in the plugin and what belongs in the docs, is the harder one, and it\'s still in motion.\n\nToday Baseline is a working plugin handling structural decisions for an Eleventy project: things like responsive image widths, the head tags every site needs, per-language sitemaps with `x-default`, drafts kept out of production.\n\nIt ships continuously on npm as `0.1.0-next.X` and runs in production on its own docs site, on [a pleasant view](https://www.apleasantview.com), and on client sites. The code is stable. The architecture is settled. The words around it are still catching up.\n\n---\n\n## Eleventy and the educational gap\n\nAround the time the plugin idea was forming, I tried to be more active in the Eleventy Discord, chipping in on the support channel. Old tech-support reflexes came back, and so did an old frustrations. Community members run sixty-message threads to help an OP through. It\'s commendable. It\'s also exhausting. My recent coping move is to drop documentation links.\n\nBut the 11ty docs are hard to navigate if you don\'t know what you\'re looking for. Partly because Eleventy is so unopinionated about site structure that there\'s no canonical path through. And partly because the docs are a monolith that doesn\'t get fixed by an opportunistic pull request. They\'d need an active maintainer discussion to restructure.\n\nEleventy leaves its structural decisions open on purpose. That\'s its strength for experienced developers and its wall for everyone else. Baseline can be the thing that fills that gap: here\'s one good way to do it, here\'s why, and here\'s where to change it when you\'re ready.\n\nThe comparison isn\'t other Eleventy plugins. It\'s Nuxt, Astro, Hugo. Tools that shorten the distance between "installed" and "building."\n\n---\n\n## Where it\'s heading\n\nThe architecture keeps reshaping itself alongside the features: founding pieces get promoted to first-class layers, module boundaries get clearer, things get renamed. Each piece starts small and intentional, and evolves along what the project actually needs.\n\nOne other thing has nagged me for a while: Eleventy almost never gets named alongside Astro and Hugo, and Astro arrived later and overtook it almost immediately. The plugin doesn\'t fix that. But the hunch driving the work is that the gap isn\'t about capability. It\'s about that same distance, the one between "I\'ve installed it" and "I\'ve got a site running." Astro closes it out of the box. Baseline tries to close it for Eleventy.\n\nThe SEO layer landed in June: `<baseline-head>` now emits the structured-data graph, the social tags and the canonical with no per-site wiring. Next on the horizon: a media management module.\n\n---\n\nIf any of this sounds useful, the docs are at [eleventy-baseline.dev](https://www.eleventy-baseline.dev/). The plugin is on npm as `@apleasantview/eleventy-plugin-baseline`. Releases roll continuously as `0.1.0-next.X`. Pin a version when you build something serious on top.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'about',
permalink: '/about/',
lang: 'en',
layout: 'layouts/page.njk',
title: 'About Eleventy Baseline',
slug: 'about',
description: 'How a personal client-work starter became a build framework for Eleventy.',
date: 2026-05-23T00:00:00.000Z,
translationKey: 'about',
pageType: 'AboutPage',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/en/pages/about.md',
fileSlug: 'about',
filePathStem: '/content/en/pages/about',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-05-23T00:00:00.000Z,
rawInput:
'\n_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](/)._\n\n_This page is the longer, more honest story._\n\n---\n\n## From starter to plugin\n\nBaseline started as my hundredth attempt at making a starter for client work, this time trying to be properly serious about it. The first version sat dormant for a while, but I kept coming back to it. It had one eye on the patterns and tooling already (silently) established in the Eleventy community.\n\nThe other eye was on what was missing for me: keeping client sites in sync without copying and rewriting files across projects, the per-language sitemaps I missed from Hugo, the single settings shape that WordPress gets right.\n\nThe shape clicked while I was thinking about something Zach Leatherman, Eleventy\'s creator, has said: that everything in Eleventy is essentially a plugin. I\'m paraphrasing, but that was the moment it stopped being a starter in my head.\n\nThe rewrite landed on the 1st of December 2025 as a single commit, "Rewrite baseline as a plugin." I announced the project on the Eleventy Discord shortly after, on the chance it might be useful to other people too.\n\nThat shift changed what the project needed to be. A personal starter can be implicit. You know why things are the way they are because you put them there. A plugin can\'t coast on that. Other people need to understand the choices, or at least trust them enough to get started.\n\nThe system has grown through use. Modules added when the project needed them, each with its own decisions, each leaning on the others. The starter became a system. Gradually, then all at once.\n\nThe framing shifted along with it. The earlier description called Baseline a "thin, optional wiring layer." That was true once. By April 2026 it had become an opinionated starting point. The value isn\'t that it\'s thin. The value is that these decisions are made, they work together, and the path to change one is clear when you disagree.\n\nWhat\'s in Baseline now is most of what I\'ve learned about building with Eleventy, and underneath that, fifteen years of working in tech, mostly but not only on the web. The decisions, the workarounds, the small conveniences that compound over hundreds of pages.\n\nIt evolved into its own thing along the way, but it grew out of an itch every Eleventy developer recognises: wiring up the same things on the third new project and wondering if there\'s a better way to keep that work.\n\nPutting the knowledge into code is the easier half. Finding the right shape for it, what to name, what to group, what belongs in the plugin and what belongs in the docs, is the harder one, and it\'s still in motion.\n\nToday Baseline is a working plugin handling structural decisions for an Eleventy project: things like responsive image widths, the head tags every site needs, per-language sitemaps with `x-default`, drafts kept out of production.\n\nIt ships continuously on npm as `0.1.0-next.X` and runs in production on its own docs site, on [a pleasant view](https://www.apleasantview.com), and on client sites. The code is stable. The architecture is settled. The words around it are still catching up.\n\n---\n\n## Eleventy and the educational gap\n\nAround the time the plugin idea was forming, I tried to be more active in the Eleventy Discord, chipping in on the support channel. Old tech-support reflexes came back, and so did an old frustrations. Community members run sixty-message threads to help an OP through. It\'s commendable. It\'s also exhausting. My recent coping move is to drop documentation links.\n\nBut the 11ty docs are hard to navigate if you don\'t know what you\'re looking for. Partly because Eleventy is so unopinionated about site structure that there\'s no canonical path through. And partly because the docs are a monolith that doesn\'t get fixed by an opportunistic pull request. They\'d need an active maintainer discussion to restructure.\n\nEleventy leaves its structural decisions open on purpose. That\'s its strength for experienced developers and its wall for everyone else. Baseline can be the thing that fills that gap: here\'s one good way to do it, here\'s why, and here\'s where to change it when you\'re ready.\n\nThe comparison isn\'t other Eleventy plugins. It\'s Nuxt, Astro, Hugo. Tools that shorten the distance between "installed" and "building."\n\n---\n\n## Where it\'s heading\n\nThe architecture keeps reshaping itself alongside the features: founding pieces get promoted to first-class layers, module boundaries get clearer, things get renamed. Each piece starts small and intentional, and evolves along what the project actually needs.\n\nOne other thing has nagged me for a while: Eleventy almost never gets named alongside Astro and Hugo, and Astro arrived later and overtook it almost immediately. The plugin doesn\'t fix that. But the hunch driving the work is that the gap isn\'t about capability. It\'s about that same distance, the one between "I\'ve installed it" and "I\'ve got a site running." Astro closes it out of the box. Baseline tries to close it for Eleventy.\n\nThe SEO layer landed in June: `<baseline-head>` now emits the structured-data graph, the social tags and the canonical with no per-site wiring. Next on the horizon: a media management module.\n\n---\n\nIf any of this sounds useful, the docs are at [eleventy-baseline.dev](https://www.eleventy-baseline.dev/). The plugin is on npm as `@apleasantview/eleventy-plugin-baseline`. Releases roll continuously as `0.1.0-next.X`. Pin a version when you build something serious on top.\n',
url: '/about/',
outputPath: './dist/about/index.html',
lang: 'en',
locale: 'en',
translationKey: 'about',
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-05-23T00:00:00.000Z,
dateModified: 2026-07-30T12:28:12.000Z },
inputPath: './src/content/en/pages/about.md',
fileSlug: 'about',
filePathStem: '/content/en/pages/about',
date: 2026-05-23T00:00:00.000Z,
outputPath: './dist/about/index.html',
url: '/about/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'en',
locale: 'en',
translationKey: 'about',
isDefaultLang: true },
{ template:
Template {
inputPath: './src/content/en/pages/commercial-support.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'commercial-support',
filePathStem: '/content/en/pages/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],
computedData: [ComputedData],
_usePermalinkRoot: undefined },
rawInput:
'\nBaseline 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.\n\n## Who\n\nBaseline is built and maintained by Cristovao Verstraeten at [a pleasant view](https://www.apleasantview.com), a web consultancy. The plugin, the docs site you are reading, and the client sites it runs on are all the same pair of hands.\n\n## What I can help with\n\n- **Adopting Baseline.** Setting it up on a new project, or wiring it into an Eleventy site you already have.\n- **Migrating onto it.** Moving an existing site across, including the parts Baseline does not decide for you.\n- **Extending it.** Custom modules, schema for your own content types, and integrations with the rest of your stack.\n- **Structured data.** Getting a correct, complete JSON-LD graph out of your site, and keeping it that way.\n- **Agent discovery.** Making your content readable by AI agents and LLM crawlers without them parsing your HTML: `llms.txt`, JSON-LD corpora, markdown alternates, a discovery manifest. All of it is live on this site.\n- **Building the whole site.** Designed and built on Baseline, start to finish.\n- **Priority support.** Direct access when something is blocking you.\n\n## Get in touch\n\nWrite to [hello@apleasantview.com](mailto:hello@apleasantview.com) with what you are working on.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'page',
permalink: '/commercial-support/',
lang: 'en',
layout: 'layouts/page.njk',
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.',
date: 2026-07-29T00:00:00.000Z,
translationKey: 'commercial-support',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/en/pages/commercial-support.md',
fileSlug: 'commercial-support',
filePathStem: '/content/en/pages/commercial-support',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-07-29T00:00:00.000Z,
rawInput:
'\nBaseline 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.\n\n## Who\n\nBaseline is built and maintained by Cristovao Verstraeten at [a pleasant view](https://www.apleasantview.com), a web consultancy. The plugin, the docs site you are reading, and the client sites it runs on are all the same pair of hands.\n\n## What I can help with\n\n- **Adopting Baseline.** Setting it up on a new project, or wiring it into an Eleventy site you already have.\n- **Migrating onto it.** Moving an existing site across, including the parts Baseline does not decide for you.\n- **Extending it.** Custom modules, schema for your own content types, and integrations with the rest of your stack.\n- **Structured data.** Getting a correct, complete JSON-LD graph out of your site, and keeping it that way.\n- **Agent discovery.** Making your content readable by AI agents and LLM crawlers without them parsing your HTML: `llms.txt`, JSON-LD corpora, markdown alternates, a discovery manifest. All of it is live on this site.\n- **Building the whole site.** Designed and built on Baseline, start to finish.\n- **Priority support.** Direct access when something is blocking you.\n\n## Get in touch\n\nWrite to [hello@apleasantview.com](mailto:hello@apleasantview.com) with what you are working on.\n',
url: '/commercial-support/',
outputPath: './dist/commercial-support/index.html',
lang: 'en',
locale: 'en',
translationKey: 'commercial-support',
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-07-29T00:00:00.000Z,
dateModified: 2026-07-30T12:28:35.000Z },
inputPath: './src/content/en/pages/commercial-support.md',
fileSlug: 'commercial-support',
filePathStem: '/content/en/pages/commercial-support',
date: 2026-07-29T00:00:00.000Z,
outputPath: './dist/commercial-support/index.html',
url: '/commercial-support/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'en',
locale: 'en',
translationKey: 'commercial-support',
isDefaultLang: true },
{ template:
Template {
inputPath: './src/content/en/pages/homepage.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'homepage',
filePathStem: '/content/en/pages/homepage',
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<small><a href="/release-notes">v{{ _baseline.version }} shipped</a></small>\n\n# The build framework for Eleventy sites.\n\n{{ settings.languages[lang].tagline }} {style="--flow-space-heading:0.5em"}\n\nEleventy is a static site generator that leaves the structural decisions to you. Most Eleventy projects end up making the same ones: an asset pipeline, images, head tags, structured data, multilingual support, sitemaps.\n\nBaseline is those decisions already made and fitted together in one plugin, following Eleventy\'s own conventions. A framework in what it decides, a plugin in how it installs.\n\n---\n\n## Install and start\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nInstall the packages, register Baseline in your Eleventy config, and run the dev server. The [[quickstart | quickstart]] walks through the full setup.\n\nIf you are new to Eleventy, the [[introduction | introduction chapter]] will get you on your way.\n\n---\n\n## What you get\n\n### Assets\n\nThe asset pipeline, wired. One entry point per asset directory: `index.css` runs through PostCSS, `index.js` through esbuild. Images render at the right widths in modern formats, lazy by default.\n\n### SEO\n\nThe head tags fill from one settings file, with page-level overrides where needed. `<baseline-head>` emits a canonical link, Open Graph, Twitter Cards and a JSON-LD structured-data graph, with no per-page wiring.\n\nThe structured-data construction follows the model of `seo-graph-core`, by Joost de Valk of Yoast.\n\n### Multilingual\n\nDirectory-based multilingual support: per-language collections, translation mapping, hreflang, and i18n filters. Sitemaps come per language, with an index on top.\n\n---\n\n## One content graph underneath\n\nBacklinks, wikilinks that survive a folder move, breadcrumbs and the structured data in the head are all projections of one content graph.\n\nWithout it, each of those is a thing you maintain by hand: a backlinks index built from filenames, a table of contents re-parsed from Markdown, structured data written page by page. All of it drifting the moment you rename a file.\n\nBaseline builds that graph from the HTML after it renders, so it is always what you actually shipped.\n\n---\n\n## Built on standards and conventions\n\nBaseline sits on Eleventy rather than around it. The data cascade, the template languages and the plugin API stay exactly as documented, so what you already know still applies. Markdown and front matter are the source of truth, Nunjucks where a page needs logic. HTML first, then CSS, then JavaScript where the page earns it.\n\nBaseline does not prescribe components, a CSS methodology or a frontend framework, and it ships no client-side runtime.\n\nUnder the hood: [Eleventy](https://www.11ty.dev/) · [[image-shortcode | eleventy-img]] · [[content-helpers | Markdown]] · [[globals | Nunjucks]] · [[assets-pipeline | PostCSS]] · [[assets | esbuild]]\n\n---\n\n## Running on Baseline\n\nThe site you are reading runs on Baseline. Open any docs page: the table of contents is built from the rendered HTML, the "Linked from" footer reads the content graph, and the structured data in the head is that same graph, projected for search engines.\n\nView source. Browse the repo. Run it locally.\n\n[[about | Read the longer story behind it]].\n\n---\n\n## Open source\n\nBaseline is MIT-licensed and free, developed in the open and maintained by [a pleasant view](https://www.apleasantview.com).\n\nFor community support and questions about Eleventy itself, join the [Eleventy Discord](https://www.11ty.dev/blog/discord/) server.\n\n[[commercial-support | Commercial support]] is available directly from the maintainer.\n\n## Rolling releases\n\nBaseline ships continuously. Each release advances the work, marked `0.1.0-next.X`. Breaking changes arrive with the line you have to change, written out in the [release notes](/release-notes/). Pin a version when you build something serious on top.\n\nFor bugs or doc errors, Please [open an issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues). If something in the docs claims a behaviour you cannot reproduce, the docs are probably wrong. \n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'page',
permalink: '/',
lang: 'en',
layout: 'layouts/home.njk',
title: 'Eleventy Baseline',
slug: 'home',
description:
'Eleventy Baseline is a build framework for Eleventy. Assets, head tags, sitemaps and structured data, ready on the first build.',
date: 2026-05-17T00:00:00.000Z,
translationKey: 'homepage',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/en/pages/homepage.md',
fileSlug: 'homepage',
filePathStem: '/content/en/pages/homepage',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-05-17T00:00:00.000Z,
rawInput:
'\n<small><a href="/release-notes">v{{ _baseline.version }} shipped</a></small>\n\n# The build framework for Eleventy sites.\n\n{{ settings.languages[lang].tagline }} {style="--flow-space-heading:0.5em"}\n\nEleventy is a static site generator that leaves the structural decisions to you. Most Eleventy projects end up making the same ones: an asset pipeline, images, head tags, structured data, multilingual support, sitemaps.\n\nBaseline is those decisions already made and fitted together in one plugin, following Eleventy\'s own conventions. A framework in what it decides, a plugin in how it installs.\n\n---\n\n## Install and start\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nInstall the packages, register Baseline in your Eleventy config, and run the dev server. The [[quickstart | quickstart]] walks through the full setup.\n\nIf you are new to Eleventy, the [[introduction | introduction chapter]] will get you on your way.\n\n---\n\n## What you get\n\n### Assets\n\nThe asset pipeline, wired. One entry point per asset directory: `index.css` runs through PostCSS, `index.js` through esbuild. Images render at the right widths in modern formats, lazy by default.\n\n### SEO\n\nThe head tags fill from one settings file, with page-level overrides where needed. `<baseline-head>` emits a canonical link, Open Graph, Twitter Cards and a JSON-LD structured-data graph, with no per-page wiring.\n\nThe structured-data construction follows the model of `seo-graph-core`, by Joost de Valk of Yoast.\n\n### Multilingual\n\nDirectory-based multilingual support: per-language collections, translation mapping, hreflang, and i18n filters. Sitemaps come per language, with an index on top.\n\n---\n\n## One content graph underneath\n\nBacklinks, wikilinks that survive a folder move, breadcrumbs and the structured data in the head are all projections of one content graph.\n\nWithout it, each of those is a thing you maintain by hand: a backlinks index built from filenames, a table of contents re-parsed from Markdown, structured data written page by page. All of it drifting the moment you rename a file.\n\nBaseline builds that graph from the HTML after it renders, so it is always what you actually shipped.\n\n---\n\n## Built on standards and conventions\n\nBaseline sits on Eleventy rather than around it. The data cascade, the template languages and the plugin API stay exactly as documented, so what you already know still applies. Markdown and front matter are the source of truth, Nunjucks where a page needs logic. HTML first, then CSS, then JavaScript where the page earns it.\n\nBaseline does not prescribe components, a CSS methodology or a frontend framework, and it ships no client-side runtime.\n\nUnder the hood: [Eleventy](https://www.11ty.dev/) · [[image-shortcode | eleventy-img]] · [[content-helpers | Markdown]] · [[globals | Nunjucks]] · [[assets-pipeline | PostCSS]] · [[assets | esbuild]]\n\n---\n\n## Running on Baseline\n\nThe site you are reading runs on Baseline. Open any docs page: the table of contents is built from the rendered HTML, the "Linked from" footer reads the content graph, and the structured data in the head is that same graph, projected for search engines.\n\nView source. Browse the repo. Run it locally.\n\n[[about | Read the longer story behind it]].\n\n---\n\n## Open source\n\nBaseline is MIT-licensed and free, developed in the open and maintained by [a pleasant view](https://www.apleasantview.com).\n\nFor community support and questions about Eleventy itself, join the [Eleventy Discord](https://www.11ty.dev/blog/discord/) server.\n\n[[commercial-support | Commercial support]] is available directly from the maintainer.\n\n## Rolling releases\n\nBaseline ships continuously. Each release advances the work, marked `0.1.0-next.X`. Breaking changes arrive with the line you have to change, written out in the [release notes](/release-notes/). Pin a version when you build something serious on top.\n\nFor bugs or doc errors, Please [open an issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues). If something in the docs claims a behaviour you cannot reproduce, the docs are probably wrong. \n',
url: '/',
outputPath: './dist/index.html',
lang: 'en',
locale: 'en',
translationKey: 'homepage',
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-05-17T00:00:00.000Z,
dateModified: 2026-08-01T07:33:32.000Z },
inputPath: './src/content/en/pages/homepage.md',
fileSlug: 'homepage',
filePathStem: '/content/en/pages/homepage',
date: 2026-05-17T00:00:00.000Z,
outputPath: './dist/index.html',
url: '/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'en',
locale: 'en',
translationKey: 'homepage',
isDefaultLang: true },
{ template:
Template {
inputPath: './src/content/fr/pages/about.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'about',
filePathStem: '/content/fr/pages/about',
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_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](/fr/)._\n\n_Cette page, c'est l'histoire plus longue et plus honnête._\n\n---\n\n## Du starter au plugin\n\nBaseline a commencé comme ma centième tentative de starter pour du travail client, cette fois en essayant d'être vraiment sérieux. La première version est restée dormante un moment, mais j'y revenais sans cesse. Avec un œil sur les patterns et les outils déjà (silencieusement) établis dans la communauté Eleventy.\n\nL'autre œil était sur ce qui me manquait : garder les sites clients synchronisés sans copier et réécrire des fichiers d'un projet à l'autre, les sitemaps par langue que je regrettais de Hugo, la forme unique de réglages que WordPress réussit bien.\n\nLa forme s'est mise en place pendant que je réfléchissais à une remarque de Zach Leatherman, le créateur d'Eleventy : que dans Eleventy, tout est essentiellement un plugin. Je paraphrase, mais c'est le moment où, dans ma tête, ce n'était plus un starter.\n\nLa réécriture est arrivée le 1er décembre 2025 en un seul commit, « Rewrite baseline as a plugin ». J'ai annoncé le projet sur le Discord d'Eleventy peu après, au cas où il serait utile à d'autres.\n\nCe basculement a changé ce que le projet devait être. Un starter personnel peut rester implicite. Vous savez pourquoi les choses sont comme elles sont, puisque c'est vous qui les avez mises là. Un plugin ne peut pas se reposer là-dessus. D'autres gens doivent comprendre les choix, ou du moins leur faire assez confiance pour démarrer.\n\nLe système a grandi par l'usage. Des modules ajoutés quand le projet en avait besoin, chacun avec ses propres décisions, chacun s'appuyant sur les autres. Le starter est devenu un système. Progressivement, puis d'un coup.\n\nLe cadrage a suivi. L'ancienne description parlait de Baseline comme d'une « couche de câblage fine et optionnelle ». C'était vrai à une époque. En avril 2026, c'était devenu un point de départ assumé. La valeur n'est pas dans la finesse. La valeur, c'est que ces décisions sont prises, qu'elles fonctionnent ensemble, et que le chemin pour en changer une est clair quand vous n'êtes pas d'accord.\n\nCe qu'il y a dans Baseline aujourd'hui, c'est l'essentiel de ce que j'ai appris en construisant avec Eleventy, et en dessous, quinze ans de travail dans la tech, principalement mais pas uniquement sur le web. Les décisions, les contournements, les petites commodités qui s'accumulent sur des centaines de pages.\n\nC'est devenu sa propre chose en chemin, mais c'est né d'une démangeaison que tout développeur Eleventy reconnaît : recâbler les mêmes choses sur son troisième nouveau projet et se demander s'il n'y a pas une meilleure façon de conserver ce travail.\n\nMettre la connaissance en code est la moitié facile. Lui trouver la bonne forme, quoi nommer, quoi regrouper, ce qui appartient au plugin et ce qui appartient à la documentation, c'est la moitié difficile, et elle est toujours en mouvement.\n\nAujourd'hui, Baseline est un plugin opérationnel qui gère les décisions structurelles d'un projet Eleventy : des choses comme les largeurs d'images responsives, les balises `head` dont chaque site a besoin, les sitemaps par langue avec `x-default`, les brouillons tenus hors production.\n\nIl est livré en continu sur npm en `0.1.0-next.X` et tourne en production sur son propre site de documentation, sur [a pleasant view](https://www.apleasantview.com), et sur des sites clients. Le code est stable. L'architecture est posée. Les mots autour rattrapent encore leur retard.\n\n---\n\n## Eleventy et le fossé pédagogique\n\nÀ l'époque où l'idée du plugin prenait forme, j'ai essayé d'être plus actif sur le Discord d'Eleventy, en donnant un coup de main sur le canal support. De vieux réflexes de support technique sont revenus, et de vieilles frustrations aussi. Des membres de la communauté déroulent des fils de soixante messages pour aider quelqu'un à s'en sortir. C'est admirable. C'est aussi épuisant. Ma parade récente, c'est de déposer des liens vers la documentation.\n\nMais la documentation d'11ty est difficile à parcourir si vous ne savez pas ce que vous cherchez. En partie parce qu'Eleventy est si peu directif sur la structure d'un site qu'il n'existe pas de chemin canonique. Et en partie parce que la documentation est un monolithe qu'une pull request opportuniste ne répare pas. Il faudrait une vraie discussion entre mainteneurs pour la restructurer.\n\nEleventy laisse ses décisions structurelles ouvertes, volontairement. C'est sa force pour les développeurs expérimentés et son mur pour tous les autres. Baseline peut être ce qui comble ce fossé : voici une bonne façon de faire, voici pourquoi, et voici où la changer quand vous serez prêt.\n\nLa comparaison ne se fait pas avec les autres plugins Eleventy. C'est Nuxt, Astro, Hugo. Des outils qui raccourcissent la distance entre « installé » et « en train de construire ».\n\n---\n\n## Où cela va\n\nL'architecture continue de se remodeler en même temps que les fonctionnalités : des pièces fondatrices sont promues au rang de couches à part entière, les frontières entre modules se précisent, des choses sont renommées. Chaque pièce commence petite et intentionnelle, et évolue avec ce dont le projet a réellement besoin.\n\nAutre chose me travaille depuis un moment : Eleventy n'est presque jamais cité aux côtés d'Astro et de Hugo, et Astro est arrivé plus tard pour le dépasser presque aussitôt. Le plugin ne règle pas ça. Mais l'intuition qui porte ce travail, c'est que l'écart n'est pas une question de capacité. C'est cette même distance, celle entre « je l'ai installé » et « j'ai un site qui tourne ». Astro la referme d'emblée. Baseline essaie de la refermer pour Eleventy.\n\nLa couche SEO a atterri en juin : `<baseline-head>` émet désormais le graphe de données structurées, les balises sociales et le lien canonique, sans câblage par site. Prochaine étape à l'horizon : un module de gestion des médias.\n\n---\n\nSi tout cela vous semble utile, la documentation est sur [eleventy-baseline.dev](https://www.eleventy-baseline.dev/). Le plugin est sur npm sous `@apleasantview/eleventy-plugin-baseline`. Les versions sortent en continu en `0.1.0-next.X`. Épinglez une version quand vous construisez quelque chose de sérieux par-dessus.\n",
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'about',
permalink: '/fr/about/',
lang: 'fr',
layout: 'layouts/page.njk',
title: "À propos d'Eleventy Baseline",
slug: 'about',
description:
'Comment un starter personnel pour du travail client est devenu un build framework pour Eleventy.',
date: 2026-05-23T00:00:00.000Z,
translationKey: 'about',
pageType: 'AboutPage',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/fr/pages/about.md',
fileSlug: 'about',
filePathStem: '/content/fr/pages/about',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-05-23T00:00:00.000Z,
rawInput:
"\n_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](/fr/)._\n\n_Cette page, c'est l'histoire plus longue et plus honnête._\n\n---\n\n## Du starter au plugin\n\nBaseline a commencé comme ma centième tentative de starter pour du travail client, cette fois en essayant d'être vraiment sérieux. La première version est restée dormante un moment, mais j'y revenais sans cesse. Avec un œil sur les patterns et les outils déjà (silencieusement) établis dans la communauté Eleventy.\n\nL'autre œil était sur ce qui me manquait : garder les sites clients synchronisés sans copier et réécrire des fichiers d'un projet à l'autre, les sitemaps par langue que je regrettais de Hugo, la forme unique de réglages que WordPress réussit bien.\n\nLa forme s'est mise en place pendant que je réfléchissais à une remarque de Zach Leatherman, le créateur d'Eleventy : que dans Eleventy, tout est essentiellement un plugin. Je paraphrase, mais c'est le moment où, dans ma tête, ce n'était plus un starter.\n\nLa réécriture est arrivée le 1er décembre 2025 en un seul commit, « Rewrite baseline as a plugin ». J'ai annoncé le projet sur le Discord d'Eleventy peu après, au cas où il serait utile à d'autres.\n\nCe basculement a changé ce que le projet devait être. Un starter personnel peut rester implicite. Vous savez pourquoi les choses sont comme elles sont, puisque c'est vous qui les avez mises là. Un plugin ne peut pas se reposer là-dessus. D'autres gens doivent comprendre les choix, ou du moins leur faire assez confiance pour démarrer.\n\nLe système a grandi par l'usage. Des modules ajoutés quand le projet en avait besoin, chacun avec ses propres décisions, chacun s'appuyant sur les autres. Le starter est devenu un système. Progressivement, puis d'un coup.\n\nLe cadrage a suivi. L'ancienne description parlait de Baseline comme d'une « couche de câblage fine et optionnelle ». C'était vrai à une époque. En avril 2026, c'était devenu un point de départ assumé. La valeur n'est pas dans la finesse. La valeur, c'est que ces décisions sont prises, qu'elles fonctionnent ensemble, et que le chemin pour en changer une est clair quand vous n'êtes pas d'accord.\n\nCe qu'il y a dans Baseline aujourd'hui, c'est l'essentiel de ce que j'ai appris en construisant avec Eleventy, et en dessous, quinze ans de travail dans la tech, principalement mais pas uniquement sur le web. Les décisions, les contournements, les petites commodités qui s'accumulent sur des centaines de pages.\n\nC'est devenu sa propre chose en chemin, mais c'est né d'une démangeaison que tout développeur Eleventy reconnaît : recâbler les mêmes choses sur son troisième nouveau projet et se demander s'il n'y a pas une meilleure façon de conserver ce travail.\n\nMettre la connaissance en code est la moitié facile. Lui trouver la bonne forme, quoi nommer, quoi regrouper, ce qui appartient au plugin et ce qui appartient à la documentation, c'est la moitié difficile, et elle est toujours en mouvement.\n\nAujourd'hui, Baseline est un plugin opérationnel qui gère les décisions structurelles d'un projet Eleventy : des choses comme les largeurs d'images responsives, les balises `head` dont chaque site a besoin, les sitemaps par langue avec `x-default`, les brouillons tenus hors production.\n\nIl est livré en continu sur npm en `0.1.0-next.X` et tourne en production sur son propre site de documentation, sur [a pleasant view](https://www.apleasantview.com), et sur des sites clients. Le code est stable. L'architecture est posée. Les mots autour rattrapent encore leur retard.\n\n---\n\n## Eleventy et le fossé pédagogique\n\nÀ l'époque où l'idée du plugin prenait forme, j'ai essayé d'être plus actif sur le Discord d'Eleventy, en donnant un coup de main sur le canal support. De vieux réflexes de support technique sont revenus, et de vieilles frustrations aussi. Des membres de la communauté déroulent des fils de soixante messages pour aider quelqu'un à s'en sortir. C'est admirable. C'est aussi épuisant. Ma parade récente, c'est de déposer des liens vers la documentation.\n\nMais la documentation d'11ty est difficile à parcourir si vous ne savez pas ce que vous cherchez. En partie parce qu'Eleventy est si peu directif sur la structure d'un site qu'il n'existe pas de chemin canonique. Et en partie parce que la documentation est un monolithe qu'une pull request opportuniste ne répare pas. Il faudrait une vraie discussion entre mainteneurs pour la restructurer.\n\nEleventy laisse ses décisions structurelles ouvertes, volontairement. C'est sa force pour les développeurs expérimentés et son mur pour tous les autres. Baseline peut être ce qui comble ce fossé : voici une bonne façon de faire, voici pourquoi, et voici où la changer quand vous serez prêt.\n\nLa comparaison ne se fait pas avec les autres plugins Eleventy. C'est Nuxt, Astro, Hugo. Des outils qui raccourcissent la distance entre « installé » et « en train de construire ».\n\n---\n\n## Où cela va\n\nL'architecture continue de se remodeler en même temps que les fonctionnalités : des pièces fondatrices sont promues au rang de couches à part entière, les frontières entre modules se précisent, des choses sont renommées. Chaque pièce commence petite et intentionnelle, et évolue avec ce dont le projet a réellement besoin.\n\nAutre chose me travaille depuis un moment : Eleventy n'est presque jamais cité aux côtés d'Astro et de Hugo, et Astro est arrivé plus tard pour le dépasser presque aussitôt. Le plugin ne règle pas ça. Mais l'intuition qui porte ce travail, c'est que l'écart n'est pas une question de capacité. C'est cette même distance, celle entre « je l'ai installé » et « j'ai un site qui tourne ». Astro la referme d'emblée. Baseline essaie de la refermer pour Eleventy.\n\nLa couche SEO a atterri en juin : `<baseline-head>` émet désormais le graphe de données structurées, les balises sociales et le lien canonique, sans câblage par site. Prochaine étape à l'horizon : un module de gestion des médias.\n\n---\n\nSi tout cela vous semble utile, la documentation est sur [eleventy-baseline.dev](https://www.eleventy-baseline.dev/). Le plugin est sur npm sous `@apleasantview/eleventy-plugin-baseline`. Les versions sortent en continu en `0.1.0-next.X`. Épinglez une version quand vous construisez quelque chose de sérieux par-dessus.\n",
url: '/fr/about/',
outputPath: './dist/fr/about/index.html',
lang: 'fr',
locale: 'fr',
translationKey: 'about',
isDefaultLang: false,
sitemap: [Object],
datePublished: 2026-05-23T00:00:00.000Z,
dateModified: 2026-07-30T12:28:12.000Z },
inputPath: './src/content/fr/pages/about.md',
fileSlug: 'about',
filePathStem: '/content/fr/pages/about',
date: 2026-05-23T00:00:00.000Z,
outputPath: './dist/fr/about/index.html',
url: '/fr/about/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'fr',
locale: 'fr',
translationKey: 'about',
isDefaultLang: false },
{ template:
Template {
inputPath: './src/content/fr/pages/commercial-support.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'commercial-support',
filePathStem: '/content/fr/pages/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],
computedData: [ComputedData],
_usePermalinkRoot: undefined },
rawInput:
"\nBaseline 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.\n\n## Qui\n\nBaseline est développé et maintenu par Cristovao Verstraeten chez [a pleasant view](https://www.apleasantview.com), un cabinet de conseil web. Le plugin, le site de documentation que vous lisez et les sites clients qui tournent dessus sont tous de la même main.\n\n## Comment je peux aider\n\n- **Adopter Baseline.** L'installer sur un nouveau projet, ou l'intégrer à un site Eleventy existant.\n- **Migrer vers Baseline.** Faire basculer un site existant, y compris les parties que Baseline ne décide pas à votre place.\n- **L'étendre.** Modules sur mesure, schema pour vos propres types de contenu, et intégrations avec le reste de votre stack.\n- **Données structurées.** Obtenir un graphe JSON-LD correct et complet, et le maintenir ainsi.\n- **Découverte par les agents.** Rendre votre contenu lisible par les agents IA et les crawlers de LLM sans qu'ils aient à analyser votre HTML : `llms.txt`, corpus JSON-LD, alternatives markdown, un manifeste de découverte. Tout cela est en ligne sur ce site.\n- **Construire le site entier.** Conçu et construit sur Baseline, du début à la fin.\n- **Support prioritaire.** Un accès direct quand quelque chose vous bloque.\n\n## Me contacter\n\nÉcrivez à [hello@apleasantview.com](mailto:hello@apleasantview.com) en décrivant votre projet.\n",
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'page',
permalink: '/fr/commercial-support/',
lang: 'fr',
layout: 'layouts/page.njk',
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.",
date: 2026-07-29T00:00:00.000Z,
translationKey: 'commercial-support',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/fr/pages/commercial-support.md',
fileSlug: 'commercial-support',
filePathStem: '/content/fr/pages/commercial-support',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-07-29T00:00:00.000Z,
rawInput:
"\nBaseline 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.\n\n## Qui\n\nBaseline est développé et maintenu par Cristovao Verstraeten chez [a pleasant view](https://www.apleasantview.com), un cabinet de conseil web. Le plugin, le site de documentation que vous lisez et les sites clients qui tournent dessus sont tous de la même main.\n\n## Comment je peux aider\n\n- **Adopter Baseline.** L'installer sur un nouveau projet, ou l'intégrer à un site Eleventy existant.\n- **Migrer vers Baseline.** Faire basculer un site existant, y compris les parties que Baseline ne décide pas à votre place.\n- **L'étendre.** Modules sur mesure, schema pour vos propres types de contenu, et intégrations avec le reste de votre stack.\n- **Données structurées.** Obtenir un graphe JSON-LD correct et complet, et le maintenir ainsi.\n- **Découverte par les agents.** Rendre votre contenu lisible par les agents IA et les crawlers de LLM sans qu'ils aient à analyser votre HTML : `llms.txt`, corpus JSON-LD, alternatives markdown, un manifeste de découverte. Tout cela est en ligne sur ce site.\n- **Construire le site entier.** Conçu et construit sur Baseline, du début à la fin.\n- **Support prioritaire.** Un accès direct quand quelque chose vous bloque.\n\n## Me contacter\n\nÉcrivez à [hello@apleasantview.com](mailto:hello@apleasantview.com) en décrivant votre projet.\n",
url: '/fr/commercial-support/',
outputPath: './dist/fr/commercial-support/index.html',
lang: 'fr',
locale: 'fr',
translationKey: 'commercial-support',
isDefaultLang: false,
sitemap: [Object],
datePublished: 2026-07-29T00:00:00.000Z,
dateModified: 2026-07-30T12:28:35.000Z },
inputPath: './src/content/fr/pages/commercial-support.md',
fileSlug: 'commercial-support',
filePathStem: '/content/fr/pages/commercial-support',
date: 2026-07-29T00:00:00.000Z,
outputPath: './dist/fr/commercial-support/index.html',
url: '/fr/commercial-support/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'fr',
locale: 'fr',
translationKey: 'commercial-support',
isDefaultLang: false },
{ template:
Template {
inputPath: './src/content/fr/pages/homepage.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'homepage',
filePathStem: '/content/fr/pages/homepage',
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<small><a href="/release-notes">v{{ _baseline.version }} est sortie</a></small>\n\n# Le build framework pour les sites Eleventy.\n\n{{ settings.languages[lang].tagline }} {style="--flow-space-heading:0.5em"}\n\nEleventy est un générateur de sites statiques qui vous laisse les décisions structurelles. La plupart des projets Eleventy finissent par prendre les mêmes : un pipeline d\'assets, les images, les balises head, les données structurées, le multilingue, les sitemaps.\n\nBaseline, ce sont ces décisions déjà prises et assemblées dans un seul plugin, en suivant les conventions d\'Eleventy. Un framework par ce qu\'il décide, un plugin par sa façon de s\'installer.\n\n---\n\n## Installer et démarrer\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nInstallez les paquets, enregistrez Baseline dans votre configuration Eleventy, et lancez le serveur de développement. Le [[quickstart | guide de démarrage rapide]] détaille l\'installation complète.\n\nSi vous débutez avec Eleventy, le [[introduction | chapitre d\'introduction]] vous met sur les rails.\n\n---\n\n## Ce que vous obtenez\n\n### Assets\n\nLe pipeline d\'assets, déjà branché. Un point d\'entrée par dossier d\'assets : `index.css` passe par PostCSS, `index.js` par esbuild. Les images sont rendues aux bonnes largeurs dans des formats modernes, en lazy loading par défaut.\n\n### SEO\n\nLes balises `head` se remplissent depuis un seul fichier de réglages, avec des surcharges au niveau de la page là où c\'est nécessaire. `<baseline-head>` émet un lien canonique, l\'Open Graph, les Twitter Cards et un graphe JSON-LD de données structurées, sans câblage page par page.\n\nLa construction des données structurées suit le modèle de `seo-graph-core`, de Joost de Valk, de Yoast.\n\n### Multilingue\n\nSupport multilingue basé sur les dossiers : collections par langue, table de traductions, hreflang et filtres i18n. Les sitemaps arrivent par langue, avec un index par-dessus.\n\n---\n\n## Un seul graphe de contenu en dessous\n\nLes backlinks, les wikilinks qui survivent au déplacement d\'un dossier, le fil d\'Ariane et les données structurées dans le `head` sont tous des projections d\'un même graphe de contenu.\n\nSans lui, chacun d\'eux devient une chose à maintenir à la main : un index de backlinks construit à partir des noms de fichiers, une table des matières reparsée depuis le Markdown, des données structurées écrites page par page. Tout cela se désynchronise dès que vous renommez un fichier.\n\nBaseline construit ce graphe à partir du HTML une fois rendu : il correspond donc toujours à ce que vous avez réellement livré.\n\n---\n\n## Construit sur des standards et des conventions\n\nBaseline se pose sur Eleventy plutôt qu\'autour. La data cascade, les langages de template et l\'API de plugins restent exactement tels que documentés : ce que vous savez déjà s\'applique toujours. Le Markdown et le front matter sont la source de vérité, Nunjucks là où une page a besoin de logique. D\'abord le HTML, puis le CSS, puis le JavaScript là où la page le mérite.\n\nBaseline n\'impose ni composants, ni méthodologie CSS, ni framework frontend, et ne livre aucun runtime côté client.\n\nSous le capot : [Eleventy](https://www.11ty.dev/) · [[image-shortcode | eleventy-img]] · [[content-helpers | Markdown]] · [[globals | Nunjucks]] · [[assets-pipeline | PostCSS]] · [[assets | esbuild]]\n\n---\n\n## Tourne sur Baseline\n\nLe site que vous lisez tourne sur Baseline. Ouvrez n\'importe quelle page de la documentation : la table des matières est construite à partir du HTML rendu, le pied de page "Linked from" lit le graphe de contenu, et les données structurées dans le `head` sont ce même graphe, projeté pour les moteurs de recherche.\n\nRegardez le code source. Parcourez le dépôt. Lancez-le en local.\n\n[[about:fr | Lisez l\'histoire qui va avec]].\n\n---\n\n## Open source\n\nBaseline est sous licence MIT et gratuit, développé au grand jour et maintenu par [a pleasant view](https://www.apleasantview.com).\n\nUn [[commercial-support:fr | support commercial]] est disponible directement auprès du mainteneur.\n\n## Versions glissantes\n\nBaseline est livré en continu. Chaque version fait avancer le travail, étiquetée `0.1.0-next.X`. Les changements cassants arrivent avec la ligne que vous devez modifier, écrite noir sur blanc dans les [notes de version](/release-notes/). Épinglez une version quand vous construisez quelque chose de sérieux par-dessus.\n\nSi la documentation décrit un comportement que vous n\'arrivez pas à reproduire, c\'est probablement la documentation qui a tort. Merci d\'[ouvrir une issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues).\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'page',
permalink: '/fr/',
lang: 'fr',
layout: 'layouts/home.njk',
title: 'Eleventy Baseline',
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.',
date: 2026-05-17T00:00:00.000Z,
translationKey: 'homepage',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/fr/pages/homepage.md',
fileSlug: 'homepage',
filePathStem: '/content/fr/pages/homepage',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-05-17T00:00:00.000Z,
rawInput:
'\n<small><a href="/release-notes">v{{ _baseline.version }} est sortie</a></small>\n\n# Le build framework pour les sites Eleventy.\n\n{{ settings.languages[lang].tagline }} {style="--flow-space-heading:0.5em"}\n\nEleventy est un générateur de sites statiques qui vous laisse les décisions structurelles. La plupart des projets Eleventy finissent par prendre les mêmes : un pipeline d\'assets, les images, les balises head, les données structurées, le multilingue, les sitemaps.\n\nBaseline, ce sont ces décisions déjà prises et assemblées dans un seul plugin, en suivant les conventions d\'Eleventy. Un framework par ce qu\'il décide, un plugin par sa façon de s\'installer.\n\n---\n\n## Installer et démarrer\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nInstallez les paquets, enregistrez Baseline dans votre configuration Eleventy, et lancez le serveur de développement. Le [[quickstart | guide de démarrage rapide]] détaille l\'installation complète.\n\nSi vous débutez avec Eleventy, le [[introduction | chapitre d\'introduction]] vous met sur les rails.\n\n---\n\n## Ce que vous obtenez\n\n### Assets\n\nLe pipeline d\'assets, déjà branché. Un point d\'entrée par dossier d\'assets : `index.css` passe par PostCSS, `index.js` par esbuild. Les images sont rendues aux bonnes largeurs dans des formats modernes, en lazy loading par défaut.\n\n### SEO\n\nLes balises `head` se remplissent depuis un seul fichier de réglages, avec des surcharges au niveau de la page là où c\'est nécessaire. `<baseline-head>` émet un lien canonique, l\'Open Graph, les Twitter Cards et un graphe JSON-LD de données structurées, sans câblage page par page.\n\nLa construction des données structurées suit le modèle de `seo-graph-core`, de Joost de Valk, de Yoast.\n\n### Multilingue\n\nSupport multilingue basé sur les dossiers : collections par langue, table de traductions, hreflang et filtres i18n. Les sitemaps arrivent par langue, avec un index par-dessus.\n\n---\n\n## Un seul graphe de contenu en dessous\n\nLes backlinks, les wikilinks qui survivent au déplacement d\'un dossier, le fil d\'Ariane et les données structurées dans le `head` sont tous des projections d\'un même graphe de contenu.\n\nSans lui, chacun d\'eux devient une chose à maintenir à la main : un index de backlinks construit à partir des noms de fichiers, une table des matières reparsée depuis le Markdown, des données structurées écrites page par page. Tout cela se désynchronise dès que vous renommez un fichier.\n\nBaseline construit ce graphe à partir du HTML une fois rendu : il correspond donc toujours à ce que vous avez réellement livré.\n\n---\n\n## Construit sur des standards et des conventions\n\nBaseline se pose sur Eleventy plutôt qu\'autour. La data cascade, les langages de template et l\'API de plugins restent exactement tels que documentés : ce que vous savez déjà s\'applique toujours. Le Markdown et le front matter sont la source de vérité, Nunjucks là où une page a besoin de logique. D\'abord le HTML, puis le CSS, puis le JavaScript là où la page le mérite.\n\nBaseline n\'impose ni composants, ni méthodologie CSS, ni framework frontend, et ne livre aucun runtime côté client.\n\nSous le capot : [Eleventy](https://www.11ty.dev/) · [[image-shortcode | eleventy-img]] · [[content-helpers | Markdown]] · [[globals | Nunjucks]] · [[assets-pipeline | PostCSS]] · [[assets | esbuild]]\n\n---\n\n## Tourne sur Baseline\n\nLe site que vous lisez tourne sur Baseline. Ouvrez n\'importe quelle page de la documentation : la table des matières est construite à partir du HTML rendu, le pied de page "Linked from" lit le graphe de contenu, et les données structurées dans le `head` sont ce même graphe, projeté pour les moteurs de recherche.\n\nRegardez le code source. Parcourez le dépôt. Lancez-le en local.\n\n[[about:fr | Lisez l\'histoire qui va avec]].\n\n---\n\n## Open source\n\nBaseline est sous licence MIT et gratuit, développé au grand jour et maintenu par [a pleasant view](https://www.apleasantview.com).\n\nUn [[commercial-support:fr | support commercial]] est disponible directement auprès du mainteneur.\n\n## Versions glissantes\n\nBaseline est livré en continu. Chaque version fait avancer le travail, étiquetée `0.1.0-next.X`. Les changements cassants arrivent avec la ligne que vous devez modifier, écrite noir sur blanc dans les [notes de version](/release-notes/). Épinglez une version quand vous construisez quelque chose de sérieux par-dessus.\n\nSi la documentation décrit un comportement que vous n\'arrivez pas à reproduire, c\'est probablement la documentation qui a tort. Merci d\'[ouvrir une issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues).\n',
url: '/fr/',
outputPath: './dist/fr/index.html',
lang: 'fr',
locale: 'fr',
translationKey: 'homepage',
isDefaultLang: false,
sitemap: [Object],
datePublished: 2026-05-17T00:00:00.000Z,
dateModified: 2026-07-30T19:43:03.000Z },
inputPath: './src/content/fr/pages/homepage.md',
fileSlug: 'homepage',
filePathStem: '/content/fr/pages/homepage',
date: 2026-05-17T00:00:00.000Z,
outputPath: './dist/fr/index.html',
url: '/fr/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'fr',
locale: 'fr',
translationKey: 'homepage',
isDefaultLang: false },
{ template:
Template {
inputPath: './src/content/nl/pages/about.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'about',
filePathStem: '/content/nl/pages/about',
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_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](/nl/)._\n\n_Deze pagina is het langere, eerlijkere verhaal._\n\n---\n\n## Van starter naar plugin\n\nBaseline begon als mijn honderdste poging om een starter voor klantenwerk te maken, deze keer met de bedoeling het echt goed te doen. De eerste versie lag een tijd stil, maar ik bleef erop terugkomen. Met één oog op de patronen en tooling die in de Eleventy-community al (stilzwijgend) waren ontstaan.\n\nHet andere oog lag op wat er voor mij ontbrak: klantensites in sync houden zonder bestanden tussen projecten te kopiëren en te herschrijven, de sitemaps per taal die ik miste uit Hugo, de ene settings-vorm die WordPress goed heeft.\n\nDe vorm viel op zijn plek terwijl ik nadacht over iets wat Zach Leatherman, de maker van Eleventy, ooit zei: dat in Eleventy eigenlijk alles een plugin is. Ik parafraseer, maar dat was het moment waarop het in mijn hoofd geen starter meer was.\n\nDe herschrijving landde op 1 december 2025 als één commit, "Rewrite baseline as a plugin." Kort daarna kondigde ik het project aan op de Eleventy Discord, voor het geval het ook voor anderen nuttig zou zijn.\n\nDie verschuiving veranderde wat het project moest zijn. Een persoonlijke starter mag impliciet blijven. Je weet waarom dingen zijn zoals ze zijn, want jij hebt ze er zo neergezet. Een plugin kan daar niet op teren. Anderen moeten de keuzes begrijpen, of ze op zijn minst genoeg vertrouwen om te beginnen.\n\nHet systeem is gegroeid door gebruik. Modules toegevoegd wanneer het project ze nodig had, elk met eigen beslissingen, elk leunend op de andere. De starter werd een systeem. Geleidelijk, en toen ineens.\n\nDe framing schoof mee. De oudere omschrijving noemde Baseline een "dunne, optionele bedradingslaag." Dat klopte ooit. Tegen april 2026 was het een uitgesproken vertrekpunt geworden. De waarde zit hem niet in dun zijn. De waarde is dat deze beslissingen genomen zijn, dat ze samenwerken, en dat het pad om er één te veranderen duidelijk is wanneer je het er niet mee eens bent.\n\nWat er nu in Baseline zit is grotendeels wat ik geleerd heb over bouwen met Eleventy, en daaronder vijftien jaar werken in tech, vooral maar niet alleen op het web. De beslissingen, de omwegen, de kleine gemakken die over honderden pagina\'s optellen.\n\nHet is onderweg zijn eigen ding geworden, maar het kwam voort uit een jeuk die elke Eleventy-ontwikkelaar herkent: dezelfde dingen aansluiten op je derde nieuwe project en je afvragen of er geen betere manier is om dat werk te bewaren.\n\nDe kennis in code gieten is de makkelijke helft. De juiste vorm ervoor vinden, wat te benoemen, wat te groeperen, wat in de plugin thuishoort en wat in de documentatie, is de moeilijke, en die is nog volop in beweging.\n\nVandaag is Baseline een werkende plugin die de structurele beslissingen voor een Eleventy-project afhandelt: dingen als responsieve afbeeldingsbreedtes, de head-tags die elke site nodig heeft, sitemaps per taal met `x-default`, concepten die uit productie blijven.\n\nHet verschijnt doorlopend op npm als `0.1.0-next.X` en draait in productie op zijn eigen documentatiesite, op [a pleasant view](https://www.apleasantview.com), en op klantensites. De code is stabiel. De architectuur ligt vast. De woorden eromheen lopen nog achter.\n\n---\n\n## Eleventy en de educatieve kloof\n\nRond de tijd dat het plugin-idee vorm kreeg, probeerde ik actiever te zijn op de Eleventy Discord, meehelpen in het supportkanaal. Oude tech-supportreflexen kwamen terug, en oude frustraties ook. Communityleden draaien threads van zestig berichten om iemand erdoorheen te helpen. Dat is prijzenswaardig. Het is ook uitputtend. Mijn recente overlevingsstrategie is documentatielinks droppen.\n\nMaar de 11ty-documentatie is lastig te doorzoeken als je niet weet waar je naar zoekt. Deels omdat Eleventy zo weinig uitgesproken is over sitestructuur dat er geen vanzelfsprekend pad doorheen loopt. En deels omdat de documentatie een monoliet is die je niet met een opportunistische pull request repareert. Daar zou een actieve maintainersdiscussie voor nodig zijn om te herstructureren.\n\nEleventy laat zijn structurele beslissingen bewust open. Dat is zijn kracht voor ervaren ontwikkelaars en zijn muur voor iedereen anders. Baseline kan het ding zijn dat die kloof vult: hier is één goede manier, hier is waarom, en hier verander je het wanneer je eraan toe bent.\n\nDe vergelijking is niet met andere Eleventy-plugins. Het is Nuxt, Astro, Hugo. Tools die de afstand verkleinen tussen "geïnstalleerd" en "aan het bouwen."\n\n---\n\n## Waar het heen gaat\n\nDe architectuur blijft zichzelf hervormen naast de functionaliteit: fundamentele stukken worden gepromoveerd tot volwaardige lagen, modulegrenzen worden scherper, dingen krijgen andere namen. Elk stuk begint klein en bedoeld, en evolueert mee met wat het project echt nodig heeft.\n\nNog iets knaagt al een tijdje: Eleventy wordt bijna nooit in één adem genoemd met Astro en Hugo, en Astro kwam later en haalde het bijna meteen in. De plugin lost dat niet op. Maar het vermoeden dat dit werk aandrijft, is dat de kloof niet over capaciteit gaat. Het gaat over diezelfde afstand, die tussen "ik heb het geïnstalleerd" en "ik heb een site draaien." Astro dicht die uit de doos. Baseline probeert dat voor Eleventy te doen.\n\nDe SEO-laag landde in juni: `<baseline-head>` zendt nu de graph met gestructureerde data, de social tags en de canonical uit, zonder bedrading per site. Volgende op de horizon: een module voor mediabeheer.\n\n---\n\nAls dit alles nuttig klinkt: de documentatie staat op [eleventy-baseline.dev](https://www.eleventy-baseline.dev/). De plugin staat op npm als `@apleasantview/eleventy-plugin-baseline`. Releases rollen doorlopend als `0.1.0-next.X`. Pin een versie als je er iets serieus bovenop bouwt.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'about',
permalink: '/nl/about/',
lang: 'nl',
layout: 'layouts/page.njk',
title: 'Over Eleventy Baseline',
slug: 'about',
description:
'Hoe een persoonlijke starter voor klantenwerk uitgroeide tot een build framework voor Eleventy.',
date: 2026-05-23T00:00:00.000Z,
translationKey: 'about',
pageType: 'AboutPage',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/nl/pages/about.md',
fileSlug: 'about',
filePathStem: '/content/nl/pages/about',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-05-23T00:00:00.000Z,
rawInput:
'\n_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](/nl/)._\n\n_Deze pagina is het langere, eerlijkere verhaal._\n\n---\n\n## Van starter naar plugin\n\nBaseline begon als mijn honderdste poging om een starter voor klantenwerk te maken, deze keer met de bedoeling het echt goed te doen. De eerste versie lag een tijd stil, maar ik bleef erop terugkomen. Met één oog op de patronen en tooling die in de Eleventy-community al (stilzwijgend) waren ontstaan.\n\nHet andere oog lag op wat er voor mij ontbrak: klantensites in sync houden zonder bestanden tussen projecten te kopiëren en te herschrijven, de sitemaps per taal die ik miste uit Hugo, de ene settings-vorm die WordPress goed heeft.\n\nDe vorm viel op zijn plek terwijl ik nadacht over iets wat Zach Leatherman, de maker van Eleventy, ooit zei: dat in Eleventy eigenlijk alles een plugin is. Ik parafraseer, maar dat was het moment waarop het in mijn hoofd geen starter meer was.\n\nDe herschrijving landde op 1 december 2025 als één commit, "Rewrite baseline as a plugin." Kort daarna kondigde ik het project aan op de Eleventy Discord, voor het geval het ook voor anderen nuttig zou zijn.\n\nDie verschuiving veranderde wat het project moest zijn. Een persoonlijke starter mag impliciet blijven. Je weet waarom dingen zijn zoals ze zijn, want jij hebt ze er zo neergezet. Een plugin kan daar niet op teren. Anderen moeten de keuzes begrijpen, of ze op zijn minst genoeg vertrouwen om te beginnen.\n\nHet systeem is gegroeid door gebruik. Modules toegevoegd wanneer het project ze nodig had, elk met eigen beslissingen, elk leunend op de andere. De starter werd een systeem. Geleidelijk, en toen ineens.\n\nDe framing schoof mee. De oudere omschrijving noemde Baseline een "dunne, optionele bedradingslaag." Dat klopte ooit. Tegen april 2026 was het een uitgesproken vertrekpunt geworden. De waarde zit hem niet in dun zijn. De waarde is dat deze beslissingen genomen zijn, dat ze samenwerken, en dat het pad om er één te veranderen duidelijk is wanneer je het er niet mee eens bent.\n\nWat er nu in Baseline zit is grotendeels wat ik geleerd heb over bouwen met Eleventy, en daaronder vijftien jaar werken in tech, vooral maar niet alleen op het web. De beslissingen, de omwegen, de kleine gemakken die over honderden pagina\'s optellen.\n\nHet is onderweg zijn eigen ding geworden, maar het kwam voort uit een jeuk die elke Eleventy-ontwikkelaar herkent: dezelfde dingen aansluiten op je derde nieuwe project en je afvragen of er geen betere manier is om dat werk te bewaren.\n\nDe kennis in code gieten is de makkelijke helft. De juiste vorm ervoor vinden, wat te benoemen, wat te groeperen, wat in de plugin thuishoort en wat in de documentatie, is de moeilijke, en die is nog volop in beweging.\n\nVandaag is Baseline een werkende plugin die de structurele beslissingen voor een Eleventy-project afhandelt: dingen als responsieve afbeeldingsbreedtes, de head-tags die elke site nodig heeft, sitemaps per taal met `x-default`, concepten die uit productie blijven.\n\nHet verschijnt doorlopend op npm als `0.1.0-next.X` en draait in productie op zijn eigen documentatiesite, op [a pleasant view](https://www.apleasantview.com), en op klantensites. De code is stabiel. De architectuur ligt vast. De woorden eromheen lopen nog achter.\n\n---\n\n## Eleventy en de educatieve kloof\n\nRond de tijd dat het plugin-idee vorm kreeg, probeerde ik actiever te zijn op de Eleventy Discord, meehelpen in het supportkanaal. Oude tech-supportreflexen kwamen terug, en oude frustraties ook. Communityleden draaien threads van zestig berichten om iemand erdoorheen te helpen. Dat is prijzenswaardig. Het is ook uitputtend. Mijn recente overlevingsstrategie is documentatielinks droppen.\n\nMaar de 11ty-documentatie is lastig te doorzoeken als je niet weet waar je naar zoekt. Deels omdat Eleventy zo weinig uitgesproken is over sitestructuur dat er geen vanzelfsprekend pad doorheen loopt. En deels omdat de documentatie een monoliet is die je niet met een opportunistische pull request repareert. Daar zou een actieve maintainersdiscussie voor nodig zijn om te herstructureren.\n\nEleventy laat zijn structurele beslissingen bewust open. Dat is zijn kracht voor ervaren ontwikkelaars en zijn muur voor iedereen anders. Baseline kan het ding zijn dat die kloof vult: hier is één goede manier, hier is waarom, en hier verander je het wanneer je eraan toe bent.\n\nDe vergelijking is niet met andere Eleventy-plugins. Het is Nuxt, Astro, Hugo. Tools die de afstand verkleinen tussen "geïnstalleerd" en "aan het bouwen."\n\n---\n\n## Waar het heen gaat\n\nDe architectuur blijft zichzelf hervormen naast de functionaliteit: fundamentele stukken worden gepromoveerd tot volwaardige lagen, modulegrenzen worden scherper, dingen krijgen andere namen. Elk stuk begint klein en bedoeld, en evolueert mee met wat het project echt nodig heeft.\n\nNog iets knaagt al een tijdje: Eleventy wordt bijna nooit in één adem genoemd met Astro en Hugo, en Astro kwam later en haalde het bijna meteen in. De plugin lost dat niet op. Maar het vermoeden dat dit werk aandrijft, is dat de kloof niet over capaciteit gaat. Het gaat over diezelfde afstand, die tussen "ik heb het geïnstalleerd" en "ik heb een site draaien." Astro dicht die uit de doos. Baseline probeert dat voor Eleventy te doen.\n\nDe SEO-laag landde in juni: `<baseline-head>` zendt nu de graph met gestructureerde data, de social tags en de canonical uit, zonder bedrading per site. Volgende op de horizon: een module voor mediabeheer.\n\n---\n\nAls dit alles nuttig klinkt: de documentatie staat op [eleventy-baseline.dev](https://www.eleventy-baseline.dev/). De plugin staat op npm als `@apleasantview/eleventy-plugin-baseline`. Releases rollen doorlopend als `0.1.0-next.X`. Pin een versie als je er iets serieus bovenop bouwt.\n',
url: '/nl/about/',
outputPath: './dist/nl/about/index.html',
lang: 'nl',
locale: 'nl',
translationKey: 'about',
isDefaultLang: false,
sitemap: [Object],
datePublished: 2026-05-23T00:00:00.000Z,
dateModified: 2026-07-30T12:28:12.000Z },
inputPath: './src/content/nl/pages/about.md',
fileSlug: 'about',
filePathStem: '/content/nl/pages/about',
date: 2026-05-23T00:00:00.000Z,
outputPath: './dist/nl/about/index.html',
url: '/nl/about/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'nl',
locale: 'nl',
translationKey: 'about',
isDefaultLang: false },
{ template:
Template {
inputPath: './src/content/nl/pages/commercial-support.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'commercial-support',
filePathStem: '/content/nl/pages/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],
computedData: [ComputedData],
_usePermalinkRoot: undefined },
rawInput:
'\nBaseline 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.\n\n## Wie\n\nBaseline wordt gebouwd en onderhouden door Cristovao Verstraeten bij [a pleasant view](https://www.apleasantview.com), een webconsultancy. De plugin, de documentatiesite die je nu leest en de klantensites waarop het draait zijn allemaal van dezelfde hand.\n\n## Waarmee ik kan helpen\n\n- **Baseline adopteren.** Opzetten in een nieuw project, of inbouwen in een Eleventy-site die je al hebt.\n- **Ernaartoe migreren.** Een bestaande site overzetten, inclusief de delen die Baseline niet voor je beslist.\n- **Uitbreiden.** Eigen modules, schema voor je eigen contenttypes, en integraties met de rest van je stack.\n- **Gestructureerde data.** Een correcte, volledige JSON-LD-graph uit je site krijgen, en die zo houden.\n- **Agent discovery.** Je content leesbaar maken voor AI-agents en LLM-crawlers zonder dat ze je HTML moeten parsen: `llms.txt`, JSON-LD-corpora, markdown-alternatieven, een discovery-manifest. Het staat allemaal live op deze site.\n- **De hele site bouwen.** Ontworpen en gebouwd op Baseline, van begin tot eind.\n- **Prioritaire ondersteuning.** Rechtstreeks contact wanneer iets je blokkeert.\n\n## Contact\n\nMail naar [hello@apleasantview.com](mailto:hello@apleasantview.com) met waar je aan werkt.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'page',
permalink: '/nl/commercial-support/',
lang: 'nl',
layout: 'layouts/page.njk',
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.',
date: 2026-07-29T00:00:00.000Z,
translationKey: 'commercial-support',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/nl/pages/commercial-support.md',
fileSlug: 'commercial-support',
filePathStem: '/content/nl/pages/commercial-support',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-07-29T00:00:00.000Z,
rawInput:
'\nBaseline 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.\n\n## Wie\n\nBaseline wordt gebouwd en onderhouden door Cristovao Verstraeten bij [a pleasant view](https://www.apleasantview.com), een webconsultancy. De plugin, de documentatiesite die je nu leest en de klantensites waarop het draait zijn allemaal van dezelfde hand.\n\n## Waarmee ik kan helpen\n\n- **Baseline adopteren.** Opzetten in een nieuw project, of inbouwen in een Eleventy-site die je al hebt.\n- **Ernaartoe migreren.** Een bestaande site overzetten, inclusief de delen die Baseline niet voor je beslist.\n- **Uitbreiden.** Eigen modules, schema voor je eigen contenttypes, en integraties met de rest van je stack.\n- **Gestructureerde data.** Een correcte, volledige JSON-LD-graph uit je site krijgen, en die zo houden.\n- **Agent discovery.** Je content leesbaar maken voor AI-agents en LLM-crawlers zonder dat ze je HTML moeten parsen: `llms.txt`, JSON-LD-corpora, markdown-alternatieven, een discovery-manifest. Het staat allemaal live op deze site.\n- **De hele site bouwen.** Ontworpen en gebouwd op Baseline, van begin tot eind.\n- **Prioritaire ondersteuning.** Rechtstreeks contact wanneer iets je blokkeert.\n\n## Contact\n\nMail naar [hello@apleasantview.com](mailto:hello@apleasantview.com) met waar je aan werkt.\n',
url: '/nl/commercial-support/',
outputPath: './dist/nl/commercial-support/index.html',
lang: 'nl',
locale: 'nl',
translationKey: 'commercial-support',
isDefaultLang: false,
sitemap: [Object],
datePublished: 2026-07-29T00:00:00.000Z,
dateModified: 2026-07-30T12:28:35.000Z },
inputPath: './src/content/nl/pages/commercial-support.md',
fileSlug: 'commercial-support',
filePathStem: '/content/nl/pages/commercial-support',
date: 2026-07-29T00:00:00.000Z,
outputPath: './dist/nl/commercial-support/index.html',
url: '/nl/commercial-support/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'nl',
locale: 'nl',
translationKey: 'commercial-support',
isDefaultLang: false },
{ template:
Template {
inputPath: './src/content/nl/pages/homepage.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: 'homepage',
filePathStem: '/content/nl/pages/homepage',
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<small><a href="/release-notes">v{{ _baseline.version }} uitgebracht</a></small>\n\n# Het build framework voor Eleventy-sites.\n\n{{ settings.languages[lang].tagline }} {style="--flow-space-heading:0.5em"}\n\nEleventy is een static site generator die de structurele beslissingen aan jou overlaat. De meeste Eleventy-projecten nemen uiteindelijk dezelfde beslissingen: een asset pipeline, afbeeldingen, head-tags, gestructureerde data, meertaligheid, sitemaps.\n\nBaseline bundelt die beslissingen, al gemaakt en op elkaar afgestemd, in één plugin die de conventies van Eleventy zelf volgt. Een framework in wat het beslist, een plugin in hoe het installeert.\n\n---\n\n## Installeren en starten\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nInstalleer de packages, registreer Baseline in je Eleventy-config en start de dev-server. De [[quickstart | quickstart]] loopt de volledige setup door.\n\nBen je nieuw met Eleventy, dan helpt het [[introduction | introductiehoofdstuk]] je op weg.\n\n---\n\n## Wat je krijgt\n\n### Assets\n\nDe asset pipeline, aangesloten. Eén entry point per assetmap: `index.css` loopt via PostCSS, `index.js` via esbuild. Afbeeldingen renderen in de juiste breedtes en moderne formaten, standaard lazy.\n\n### SEO\n\nDe head-tags worden gevuld vanuit één settings-bestand, met overrides op paginaniveau waar nodig. `<baseline-head>` zendt een canonical link uit, Open Graph, Twitter Cards en een JSON-LD-graph met gestructureerde data, zonder bedrading per pagina.\n\nDe opbouw van de gestructureerde data volgt het model van `seo-graph-core`, van Joost de Valk van Yoast.\n\n### Meertaligheid\n\nMeertaligheid op basis van mappen: collecties per taal, vertalingsmapping, hreflang en i18n-filters. Sitemaps komen per taal, met een index erbovenop.\n\n---\n\n## Eén content graph eronder\n\nBacklinks, wikilinks die een mapverplaatsing overleven, breadcrumbs en de gestructureerde data in de head zijn allemaal projecties van één content graph.\n\nZonder die graph onderhoud je elk daarvan met de hand: een backlinks-index op basis van bestandsnamen, een inhoudsopgave die opnieuw uit de Markdown wordt geparset, gestructureerde data pagina per pagina geschreven. Allemaal loopt het uit de pas zodra je een bestand hernoemt.\n\nBaseline bouwt die graph uit de HTML nadat die gerenderd is, dus hij is altijd wat je echt hebt uitgeleverd.\n\n---\n\n## Gebouwd op standaarden en conventies\n\nBaseline zit op Eleventy, niet eromheen. De data cascade, de templatetalen en de plugin-API blijven precies zoals gedocumenteerd, dus wat je al weet geldt nog steeds. Markdown en front matter zijn de bron van waarheid, Nunjucks waar een pagina logica nodig heeft. Eerst HTML, dan CSS, dan JavaScript waar de pagina het verdient.\n\nBaseline schrijft geen componenten, CSS-methodologie of frontend framework voor, en levert geen client-side runtime.\n\nOnder de motorkap: [Eleventy](https://www.11ty.dev/) · [[image-shortcode | eleventy-img]] · [[content-helpers | Markdown]] · [[globals | Nunjucks]] · [[assets-pipeline | PostCSS]] · [[assets | esbuild]]\n\n---\n\n## Draait op Baseline\n\nDe site die je nu leest draait op Baseline. Open een willekeurige docs-pagina: de inhoudsopgave wordt gebouwd uit de gerenderde HTML, de "Linked from"-footer leest de content graph, en de gestructureerde data in de head is diezelfde graph, geprojecteerd voor zoekmachines.\n\nBekijk de broncode. Blader door de repo. Draai het lokaal.\n\n[[about:nl | Lees het langere verhaal erachter]].\n\n---\n\n## Open source\n\nBaseline is MIT-gelicentieerd en gratis, ontwikkeld in de openbaarheid en onderhouden door [a pleasant view](https://www.apleasantview.com).\n\n[[commercial-support:nl | Commerciële ondersteuning]] krijg je rechtstreeks van de maintainer.\n\n## Doorlopende releases\n\nBaseline verschijnt doorlopend. Elke release brengt het werk verder, gemarkeerd als `0.1.0-next.X`. Breaking changes komen met de regel die je moet aanpassen, uitgeschreven in de [release notes](/release-notes/). Pin een versie als je er iets serieus bovenop bouwt.\n\nAls de docs een gedrag beweren dat je niet kunt reproduceren, dan kloppen de docs waarschijnlijk niet. [Open dan een issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues).\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'page',
permalink: '/nl/',
lang: 'nl',
layout: 'layouts/home.njk',
title: 'Eleventy Baseline',
slug: 'home',
description:
'Eleventy Baseline is een build framework voor Eleventy. Assets, head-tags, sitemaps en gestructureerde data, klaar bij de eerste build.',
date: 2026-05-17T00:00:00.000Z,
translationKey: 'homepage',
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/nl/pages/homepage.md',
fileSlug: 'homepage',
filePathStem: '/content/nl/pages/homepage',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-05-17T00:00:00.000Z,
rawInput:
'\n<small><a href="/release-notes">v{{ _baseline.version }} uitgebracht</a></small>\n\n# Het build framework voor Eleventy-sites.\n\n{{ settings.languages[lang].tagline }} {style="--flow-space-heading:0.5em"}\n\nEleventy is een static site generator die de structurele beslissingen aan jou overlaat. De meeste Eleventy-projecten nemen uiteindelijk dezelfde beslissingen: een asset pipeline, afbeeldingen, head-tags, gestructureerde data, meertaligheid, sitemaps.\n\nBaseline bundelt die beslissingen, al gemaakt en op elkaar afgestemd, in één plugin die de conventies van Eleventy zelf volgt. Een framework in wat het beslist, een plugin in hoe het installeert.\n\n---\n\n## Installeren en starten\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\nInstalleer de packages, registreer Baseline in je Eleventy-config en start de dev-server. De [[quickstart | quickstart]] loopt de volledige setup door.\n\nBen je nieuw met Eleventy, dan helpt het [[introduction | introductiehoofdstuk]] je op weg.\n\n---\n\n## Wat je krijgt\n\n### Assets\n\nDe asset pipeline, aangesloten. Eén entry point per assetmap: `index.css` loopt via PostCSS, `index.js` via esbuild. Afbeeldingen renderen in de juiste breedtes en moderne formaten, standaard lazy.\n\n### SEO\n\nDe head-tags worden gevuld vanuit één settings-bestand, met overrides op paginaniveau waar nodig. `<baseline-head>` zendt een canonical link uit, Open Graph, Twitter Cards en een JSON-LD-graph met gestructureerde data, zonder bedrading per pagina.\n\nDe opbouw van de gestructureerde data volgt het model van `seo-graph-core`, van Joost de Valk van Yoast.\n\n### Meertaligheid\n\nMeertaligheid op basis van mappen: collecties per taal, vertalingsmapping, hreflang en i18n-filters. Sitemaps komen per taal, met een index erbovenop.\n\n---\n\n## Eén content graph eronder\n\nBacklinks, wikilinks die een mapverplaatsing overleven, breadcrumbs en de gestructureerde data in de head zijn allemaal projecties van één content graph.\n\nZonder die graph onderhoud je elk daarvan met de hand: een backlinks-index op basis van bestandsnamen, een inhoudsopgave die opnieuw uit de Markdown wordt geparset, gestructureerde data pagina per pagina geschreven. Allemaal loopt het uit de pas zodra je een bestand hernoemt.\n\nBaseline bouwt die graph uit de HTML nadat die gerenderd is, dus hij is altijd wat je echt hebt uitgeleverd.\n\n---\n\n## Gebouwd op standaarden en conventies\n\nBaseline zit op Eleventy, niet eromheen. De data cascade, de templatetalen en de plugin-API blijven precies zoals gedocumenteerd, dus wat je al weet geldt nog steeds. Markdown en front matter zijn de bron van waarheid, Nunjucks waar een pagina logica nodig heeft. Eerst HTML, dan CSS, dan JavaScript waar de pagina het verdient.\n\nBaseline schrijft geen componenten, CSS-methodologie of frontend framework voor, en levert geen client-side runtime.\n\nOnder de motorkap: [Eleventy](https://www.11ty.dev/) · [[image-shortcode | eleventy-img]] · [[content-helpers | Markdown]] · [[globals | Nunjucks]] · [[assets-pipeline | PostCSS]] · [[assets | esbuild]]\n\n---\n\n## Draait op Baseline\n\nDe site die je nu leest draait op Baseline. Open een willekeurige docs-pagina: de inhoudsopgave wordt gebouwd uit de gerenderde HTML, de "Linked from"-footer leest de content graph, en de gestructureerde data in de head is diezelfde graph, geprojecteerd voor zoekmachines.\n\nBekijk de broncode. Blader door de repo. Draai het lokaal.\n\n[[about:nl | Lees het langere verhaal erachter]].\n\n---\n\n## Open source\n\nBaseline is MIT-gelicentieerd en gratis, ontwikkeld in de openbaarheid en onderhouden door [a pleasant view](https://www.apleasantview.com).\n\n[[commercial-support:nl | Commerciële ondersteuning]] krijg je rechtstreeks van de maintainer.\n\n## Doorlopende releases\n\nBaseline verschijnt doorlopend. Elke release brengt het werk verder, gemarkeerd als `0.1.0-next.X`. Breaking changes komen met de regel die je moet aanpassen, uitgeschreven in de [release notes](/release-notes/). Pin een versie als je er iets serieus bovenop bouwt.\n\nAls de docs een gedrag beweren dat je niet kunt reproduceren, dan kloppen de docs waarschijnlijk niet. [Open dan een issue](https://github.com/apleasantview/eleventy-plugin-baseline/issues).\n',
url: '/nl/',
outputPath: './dist/nl/index.html',
lang: 'nl',
locale: 'nl',
translationKey: 'homepage',
isDefaultLang: false,
sitemap: [Object],
datePublished: 2026-05-17T00:00:00.000Z,
dateModified: 2026-07-30T19:43:03.000Z },
inputPath: './src/content/nl/pages/homepage.md',
fileSlug: 'homepage',
filePathStem: '/content/nl/pages/homepage',
date: 2026-05-17T00:00:00.000Z,
outputPath: './dist/nl/index.html',
url: '/nl/',
templateContent: [Getter/Setter],
content: [Getter/Setter],
lang: 'nl',
locale: 'nl',
translationKey: 'homepage',
isDefaultLang: false } ],
all:
[ { 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:
'\nThese are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the [[feature-guide | feature guides]] chapter.\n\nNew to Baseline? The [[overview | overview]] covers what it is and who it is for.\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',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: '/docs/tutorial/',
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Tutorials',
title: 'Tutorials',
description:
'Two end-to-end tutorials: build a simple Baseline site from scratch, then add a second language with hreflang and per-language sitemaps.',
slug: 'tutorial',
date: 2026-01-25T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_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-01-25T00:00:00.000Z,
rawInput:
'\nThese are end-to-end tutorials guiding you through a simple site and a multilingual site. Features are covered in the [[feature-guide | feature guides]] chapter.\n\nNew to Baseline? The [[overview | overview]] covers what it is and who it is for.\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',
url: '/docs/tutorial/',
outputPath: './dist/docs/tutorial/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:54:16.000Z },
inputPath: './src/content/docs/01.tutorial/00.index.md',
fileSlug: '00.index',
filePathStem: '/content/docs/01.tutorial/00.index',
date: 2026-01-25T00: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:
'\nThe shortest path from an empty folder to a working Baseline site. By the end you\'ll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself.\n\nThis is the tutorial every other tutorial builds on.\n\n---\n\n## What you will build\n\n- An Eleventy site with one page.\n- Baseline wired with default options: `multilingual` off, `sitemap` on, `navigator` on in dev and off in production.\n- A small stylesheet flowing through Baseline\'s assets pipeline, and an auto-generated `sitemap.xml` next to it.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer.\n- npm.\n- A terminal.\n\n---\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\nOpen `package.json` and set `"type": "module"` (Baseline expects ESM):\n\n```json\n{\n\t"name": "simple-baseline-site",\n\t"type": "module",\n\t"scripts": {\n\t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n\t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n\t}\n}\n```\n\nThose two scripts are the only commands you need. From here on, `npm start` is local development and `npm run build` is the production build.\n\n---\n\n## 2) Install required packages\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img # Eleventy and 11ty Image\nnpm install rimraf cross-env # Helper packages\nnpm install @apleasantview/eleventy-plugin-baseline # Finally, install Baseline\n```\n\n---\n\n## 3) Configure Eleventy to use Baseline\n\nCreate `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---\n\nTwo things are worth a sentence:\n\n- `baseline(settings, options)` takes two arguments. `settings` is your site\'s identity (title, languages, head extras); `options` is runtime behaviour. Passing settings only leaves every option at its default, which is exactly what you want here.\n- `export const config = baselineConfig;` re-exports Baseline\'s directory contract, so Eleventy knows where to read input from and where to write output to. The [[config-export | config export reference]] explains why it has to be exported separately rather than set from inside the plugin.\n\n---\n\nBaseline wires Eleventy\'s `HtmlBasePlugin` to `process.env.URL` for you, which is what keeps canonical URLs and the sitemap pointing at the right origin.\n\nCreate a local `.env` for development, and set `URL` in your hosting environment for production. Baseline loads `dotenv` itself, so `process.env.URL` is available in both `_data/settings.js` and `eleventy.config.js`:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n---\n\n## 4) Required site data\n\nCreate `src/_data/settings.js`. This is the canonical home for everything that identifies the site: title, production URL, indexing preferences, and the head extras (the `<link>`, `<script>`, and `<meta>` tags Baseline injects into every page).\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\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\nThe `head.link[]`, `head.script[]`, and `head.meta[]` arrays are how you add to the head from settings. Anything you put here lands on every page, alongside the defaults Baseline already produces (charset, viewport, title, description, canonical, robots).\n\nOne stylesheet link, one script tag, one colour-scheme hint is enough to get started.\n\n---\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`. Notice `<baseline-head></baseline-head>`: that is the placeholder. Baseline replaces it with a full `<head>` element at build time, so your layout never writes one of its own.\n\nIt sits as a sibling of `<body>`, not nested inside another head.\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(settings.defaultLanguage) }}">\n <baseline-head></baseline-head>\n <body>\n <main id="main">\n <h1>{{ title }}</h1>\n {{ content | safe }}\n {% if page.url !== "/" %}\n <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">←</span> Go back</a></p>\n {% endif %}\n </main>\n <script>\n const backBtn = document.getElementById("go-back");\n if ( backBtn ) {\n backBtn.addEventListener("click", (event) => {\n event.preventDefault();\n history.back();\n });\n }\n </script>\n </body>\n</html>\n```\n\n{% endraw %}\n\n---\n\n## 6) Define your content directory\n\nEleventy uses directory data files to set repeating templating data, including permalinks for content files. We\'ll create one for our tutorial site. Inside `src`, create the content directory and its data file: `src/content/pages/pages.11tydata.js`.\n\nA convention in Baseline is to use the `slug` front matter field and generate permalinks from them. Setting the permalink field is reserved for the homepage ("/") and whenever control is warranted.\n\n```js\nexport default {\n\tlayout: \'layouts/base.njk\',\n\n\t// Ensure we have a value to work wih 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\n{% alertBlock %}\n\nIt would be tempting to use `eleventyCompute` for creating the permalink but this would always take precedence over the front matter field if set. The permalink function does plenty, including still allowing us to overwrite the field if needed.\n\n{% endalertBlock %}\n\n---\n\n## 7) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\nslug: \'simple-baseline-site\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou are looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n---\n\n## 8) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Howdy!\');\n});\n```\n\n---\n\n## 9) Run the site locally\n\n```bash\nnpm start\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see the page title rendered as a heading.\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files, including `sitemap.xml`.\n\n{% alertBlock "info" %}\n\nEleventy never cleans `dist/` for you. If a rebuild looks stale, stop the server and run `npm start` again.\n\n{% endalertBlock %}\n\n---\n\n## 10) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically because the sitemap module is on by default.\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\nIf you are looking to build a multilingual site, it\'s next up.\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- Once you have a production URL, update `src/_data/settings.js` so canonical URLs and the sitemap match.\n- The natural next chapter is the [[assets-pipeline | assets pipeline tutorial]], which adds PostCSS and esbuild entries. After that, the [[head-and-noindex | head and noindex tutorial]] covers what Baseline injects into every page and how to extend it.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Tutorials',
title: 'Build a simple site',
description:
'Create a single-language Eleventy site with Baseline defaults, head extras driven by settings, minimal CSS/JS, and an auto sitemap.',
slug: 'simple-baseline-site',
date: 2026-01-25T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_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-01-25T00:00:00.000Z,
rawInput:
'\nThe shortest path from an empty folder to a working Baseline site. By the end you\'ll have a single page rendering through Eleventy, a tiny stylesheet bundled automatically, and a sitemap that updates itself.\n\nThis is the tutorial every other tutorial builds on.\n\n---\n\n## What you will build\n\n- An Eleventy site with one page.\n- Baseline wired with default options: `multilingual` off, `sitemap` on, `navigator` on in dev and off in production.\n- A small stylesheet flowing through Baseline\'s assets pipeline, and an auto-generated `sitemap.xml` next to it.\n\n---\n\n## Prerequisites\n\n- Node 22 or newer.\n- npm.\n- A terminal.\n\n---\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\nOpen `package.json` and set `"type": "module"` (Baseline expects ESM):\n\n```json\n{\n\t"name": "simple-baseline-site",\n\t"type": "module",\n\t"scripts": {\n\t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n\t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n\t}\n}\n```\n\nThose two scripts are the only commands you need. From here on, `npm start` is local development and `npm run build` is the production build.\n\n---\n\n## 2) Install required packages\n\n```bash\nnpm install @11ty/eleventy @11ty/eleventy-img # Eleventy and 11ty Image\nnpm install rimraf cross-env # Helper packages\nnpm install @apleasantview/eleventy-plugin-baseline # Finally, install Baseline\n```\n\n---\n\n## 3) Configure Eleventy to use Baseline\n\nCreate `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---\n\nTwo things are worth a sentence:\n\n- `baseline(settings, options)` takes two arguments. `settings` is your site\'s identity (title, languages, head extras); `options` is runtime behaviour. Passing settings only leaves every option at its default, which is exactly what you want here.\n- `export const config = baselineConfig;` re-exports Baseline\'s directory contract, so Eleventy knows where to read input from and where to write output to. The [[config-export | config export reference]] explains why it has to be exported separately rather than set from inside the plugin.\n\n---\n\nBaseline wires Eleventy\'s `HtmlBasePlugin` to `process.env.URL` for you, which is what keeps canonical URLs and the sitemap pointing at the right origin.\n\nCreate a local `.env` for development, and set `URL` in your hosting environment for production. Baseline loads `dotenv` itself, so `process.env.URL` is available in both `_data/settings.js` and `eleventy.config.js`:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n---\n\n## 4) Required site data\n\nCreate `src/_data/settings.js`. This is the canonical home for everything that identifies the site: title, production URL, indexing preferences, and the head extras (the `<link>`, `<script>`, and `<meta>` tags Baseline injects into every page).\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\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\nThe `head.link[]`, `head.script[]`, and `head.meta[]` arrays are how you add to the head from settings. Anything you put here lands on every page, alongside the defaults Baseline already produces (charset, viewport, title, description, canonical, robots).\n\nOne stylesheet link, one script tag, one colour-scheme hint is enough to get started.\n\n---\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`. Notice `<baseline-head></baseline-head>`: that is the placeholder. Baseline replaces it with a full `<head>` element at build time, so your layout never writes one of its own.\n\nIt sits as a sibling of `<body>`, not nested inside another head.\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(settings.defaultLanguage) }}">\n <baseline-head></baseline-head>\n <body>\n <main id="main">\n <h1>{{ title }}</h1>\n {{ content | safe }}\n {% if page.url !== "/" %}\n <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">←</span> Go back</a></p>\n {% endif %}\n </main>\n <script>\n const backBtn = document.getElementById("go-back");\n if ( backBtn ) {\n backBtn.addEventListener("click", (event) => {\n event.preventDefault();\n history.back();\n });\n }\n </script>\n </body>\n</html>\n```\n\n{% endraw %}\n\n---\n\n## 6) Define your content directory\n\nEleventy uses directory data files to set repeating templating data, including permalinks for content files. We\'ll create one for our tutorial site. Inside `src`, create the content directory and its data file: `src/content/pages/pages.11tydata.js`.\n\nA convention in Baseline is to use the `slug` front matter field and generate permalinks from them. Setting the permalink field is reserved for the homepage ("/") and whenever control is warranted.\n\n```js\nexport default {\n\tlayout: \'layouts/base.njk\',\n\n\t// Ensure we have a value to work wih 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\n{% alertBlock %}\n\nIt would be tempting to use `eleventyCompute` for creating the permalink but this would always take precedence over the front matter field if set. The permalink function does plenty, including still allowing us to overwrite the field if needed.\n\n{% endalertBlock %}\n\n---\n\n## 7) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\nslug: \'simple-baseline-site\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou are looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n---\n\n## 8) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Howdy!\');\n});\n```\n\n---\n\n## 9) Run the site locally\n\n```bash\nnpm start\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see the page title rendered as a heading.\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files, including `sitemap.xml`.\n\n{% alertBlock "info" %}\n\nEleventy never cleans `dist/` for you. If a rebuild looks stale, stop the server and run `npm start` again.\n\n{% endalertBlock %}\n\n---\n\n## 10) Production build and inspect output\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically because the sitemap module is on by default.\n- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## Next steps\n\nIf you are looking to build a multilingual site, it\'s next up.\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- Once you have a production URL, update `src/_data/settings.js` so canonical URLs and the sitemap match.\n- The natural next chapter is the [[assets-pipeline | assets pipeline tutorial]], which adds PostCSS and esbuild entries. After that, the [[head-and-noindex | head and noindex tutorial]] covers what Baseline injects into every page and how to extend it.\n',
url: '/docs/tutorial/simple-baseline-site/',
outputPath: './dist/docs/tutorial/simple-baseline-site/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-30T20:01:49.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-01-25T00: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/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. By the end you\'ll have per-page sitemap controls, a working `noindex` story, and a draft workflow that behaves differently in dev and build, the way you\'d want.\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 production builds (and only from production builds).\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- Baseline installed and loaded (defaults keep the sitemap on).\n- Set `settings.url` to your production URL for correct sitemap and canonical links (use localhost while testing).\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## 1) Ensure the sitemap module is on (default)\n\nSitemap is on by default, so the eleventy.config.js from the previous tutorial is enough - no new options needed:\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\thead: {\n\t\t\t\ttitleSeparator: \' | \',\n\t\t\t\tshowGenerator: true\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n---\n\n## 2) 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## 3) Noindex (site-wide and per-page)\n\nThree knobs, in widening order of scope:\n\n- Site-wide: set `noindex: true` in `_data/settings.js`. The whole sitemap is skipped.\n- Per-page: set `noindex: true` in front matter. The page renders a `robots` noindex tag and drops out of the sitemap.\n- Sitemap-only: use `sitemap: { ignore: true }` when the page should render normally but stay out of the sitemap.\n\n ```yaml\n sitemap:\n ignore: true\n eleventyExcludeFromCollections: true\n ```\n\n Two flags, two scopes worth distinguishing:\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\n---\n\n## 4) 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 build (`npm run build`, which sets `ELEVENTY_ENV=production`): drafts are skipped.\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## 5) 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 as soon as you build for production, since `npm run build` sets `ELEVENTY_ENV=production`.\n\n---\n\n## 6) Production build\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\nThen inspect `dist/sitemap.xml`. A few 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- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## 7) 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- The [[sitemap | sitemap module reference]] has the full option list.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Feature guides',
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],
_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. By the end you\'ll have per-page sitemap controls, a working `noindex` story, and a draft workflow that behaves differently in dev and build, the way you\'d want.\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 production builds (and only from production builds).\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- Baseline installed and loaded (defaults keep the sitemap on).\n- Set `settings.url` to your production URL for correct sitemap and canonical links (use localhost while testing).\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## 1) Ensure the sitemap module is on (default)\n\nSitemap is on by default, so the eleventy.config.js from the previous tutorial is enough - no new options needed:\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\thead: {\n\t\t\t\ttitleSeparator: \' | \',\n\t\t\t\tshowGenerator: true\n\t\t\t}\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n---\n\n## 2) 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## 3) Noindex (site-wide and per-page)\n\nThree knobs, in widening order of scope:\n\n- Site-wide: set `noindex: true` in `_data/settings.js`. The whole sitemap is skipped.\n- Per-page: set `noindex: true` in front matter. The page renders a `robots` noindex tag and drops out of the sitemap.\n- Sitemap-only: use `sitemap: { ignore: true }` when the page should render normally but stay out of the sitemap.\n\n ```yaml\n sitemap:\n ignore: true\n eleventyExcludeFromCollections: true\n ```\n\n Two flags, two scopes worth distinguishing:\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\n---\n\n## 4) 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 build (`npm run build`, which sets `ELEVENTY_ENV=production`): drafts are skipped.\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## 5) 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 as soon as you build for production, since `npm run build` sets `ELEVENTY_ENV=production`.\n\n---\n\n## 6) Production build\n\nChange `URL` in `.env` to an absolute URL. On a deployed site that\'s your real production URL; for this exercise, any absolute URL (e.g. `https://www.example.com/`) works to verify the output. Then run:\n\n```bash\nnpm run build\n```\n\nThen inspect `dist/sitemap.xml`. A few 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- Reset `URL` in `.env` to "http://localhost:8080/".\n\n---\n\n## 7) 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- The [[sitemap | sitemap module reference]] has the full option list.\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,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:04:54.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/02.feature-guide/05.deployment-url-checks.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: '05.deployment-url-checks',
filePathStem: '/content/docs/02.feature-guide/05.deployment-url-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 chapter 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/`). Baseline\'s head and sitemap modules respect it.\n- **Preview build.** A non-production deploy (a Netlify deploy preview, for instance) where the origin differs from production.\n\n---\n\n## What you will build\n\n- A Baseline site that picks up the right origin for whichever environment it\'s in.\n- Canonical and sitemap URLs pointing at the expected domain, preview included.\n\n---\n\n## Prerequisites\n\n- Baseline installed and loaded.\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## 1) Set settings.url (and, separately, pathPrefix)\n\nUse the `src/_data/settings.js` you already have from the previous tutorials. The field that matters for this chapter is `url`, the canonical origin:\n\n```js\nurl: process.env.URL || \'http://localhost:8080/\'; // override per env\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`. Baseline\'s head and sitemap output respect it without further wiring.\n\n---\n\n## 2) Set environment URLs (local and CI)\n\n- Dev or local preview: create a local `.env` (don\'t commit it):\n ```txt\n ELEVENTY_ENV="development"\n URL="http://localhost:8080/"\n ```\n- Production: set `URL` to the live origin (e.g. `https://www.example.com`) in your hosting or CI environment.\n- Hosted previews (optional, e.g. Netlify): `URL` usually points to production while `DEPLOY_URL` and `DEPLOY_PRIME_URL` point to the preview. Baseline falls back to those when `URL` is missing. Skip if previews aren\'t part of your workflow.\n\nBaseline loads `dotenv` for you, so `process.env.URL` works in both `_data/settings.js` and `eleventy.config.js`. The `HtmlBasePlugin` and the sitemap module both read it (and `pathPrefix`, if set).\n\n---\n\n## 3) Run with the right URL per environment\n\nDev: confirm your `.env` is loaded (e.g. `URL="http://localhost:8080/"`), then:\n\n```bash\nnpm start\n```\n\nProduction: set `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## 4) Preview builds (optional)\n\n- On Netlify, `DEPLOY_URL` and `DEPLOY_PRIME_URL` provide the preview origin, while `URL` stays set to the live site for production builds. Other hosts differ; set an equivalent preview URL env var for whichever staging environment you have.\n- Confirm the rendered canonical and the sitemap root both match the preview domain.\n\n---\n\n## 5) 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 `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## 6) PathPrefix checklist (if applicable)\n\nFor the full subpath setup, see [[deploy-under-a-subpath | Deploy Under a Subpath]].\n\n---\n\n## Next steps\n\n- Add a CI check that fails the build if `URL` is missing in production. One small step, lots of headaches saved.\n- Pair with the [[multilingual-baseline-site | multilingual site tutorial]] to confirm hreflang URLs use the correct origin once multilingual is on.\n- The [[config-export | config export reference]] covers `URL` and `pathPrefix` behaviour in full.\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'Feature guides',
title: 'Deployment URL checks',
slug: 'deployment-url-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],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/docs/02.feature-guide/05.deployment-url-checks.md',
fileSlug: '05.deployment-url-checks',
filePathStem: '/content/docs/02.feature-guide/05.deployment-url-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 chapter 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/`). Baseline\'s head and sitemap modules respect it.\n- **Preview build.** A non-production deploy (a Netlify deploy preview, for instance) where the origin differs from production.\n\n---\n\n## What you will build\n\n- A Baseline site that picks up the right origin for whichever environment it\'s in.\n- Canonical and sitemap URLs pointing at the expected domain, preview included.\n\n---\n\n## Prerequisites\n\n- Baseline installed and loaded.\n- `package.json` with `"type": "module"` and the `dev`/`build` scripts:\n ```json\n {\n \t"name": "simple-baseline-site",\n \t"type": "module",\n \t"scripts": {\n \t\t"start": "rimraf dist/ && npx @11ty/eleventy --serve",\n \t\t"build": "rimraf dist/ && cross-env ELEVENTY_ENV=production npx @11ty/eleventy"\n \t}\n }\n ```\n\n---\n\n## 1) Set settings.url (and, separately, pathPrefix)\n\nUse the `src/_data/settings.js` you already have from the previous tutorials. The field that matters for this chapter is `url`, the canonical origin:\n\n```js\nurl: process.env.URL || \'http://localhost:8080/\'; // override per env\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`. Baseline\'s head and sitemap output respect it without further wiring.\n\n---\n\n## 2) Set environment URLs (local and CI)\n\n- Dev or local preview: create a local `.env` (don\'t commit it):\n ```txt\n ELEVENTY_ENV="development"\n URL="http://localhost:8080/"\n ```\n- Production: set `URL` to the live origin (e.g. `https://www.example.com`) in your hosting or CI environment.\n- Hosted previews (optional, e.g. Netlify): `URL` usually points to production while `DEPLOY_URL` and `DEPLOY_PRIME_URL` point to the preview. Baseline falls back to those when `URL` is missing. Skip if previews aren\'t part of your workflow.\n\nBaseline loads `dotenv` for you, so `process.env.URL` works in both `_data/settings.js` and `eleventy.config.js`. The `HtmlBasePlugin` and the sitemap module both read it (and `pathPrefix`, if set).\n\n---\n\n## 3) Run with the right URL per environment\n\nDev: confirm your `.env` is loaded (e.g. `URL="http://localhost:8080/"`), then:\n\n```bash\nnpm start\n```\n\nProduction: set `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## 4) Preview builds (optional)\n\n- On Netlify, `DEPLOY_URL` and `DEPLOY_PRIME_URL` provide the preview origin, while `URL` stays set to the live site for production builds. Other hosts differ; set an equivalent preview URL env var for whichever staging environment you have.\n- Confirm the rendered canonical and the sitemap root both match the preview domain.\n\n---\n\n## 5) 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 `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## 6) PathPrefix checklist (if applicable)\n\nFor the full subpath setup, see [[deploy-under-a-subpath | Deploy Under a Subpath]].\n\n---\n\n## Next steps\n\n- Add a CI check that fails the build if `URL` is missing in production. One small step, lots of headaches saved.\n- Pair with the [[multilingual-baseline-site | multilingual site tutorial]] to confirm hreflang URLs use the correct origin once multilingual is on.\n- The [[config-export | config export reference]] covers `URL` and `pathPrefix` behaviour in full.\n',
url: '/docs/feature-guide/deployment-url-checks/',
outputPath: './dist/docs/feature-guide/deployment-url-checks/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:04:54.000Z },
inputPath: './src/content/docs/02.feature-guide/05.deployment-url-checks.md',
fileSlug: '05.deployment-url-checks',
filePathStem: '/content/docs/02.feature-guide/05.deployment-url-checks',
date: 2026-01-25T00:00:00.000Z,
outputPath: './dist/docs/feature-guide/deployment-url-checks/index.html',
url: '/docs/feature-guide/deployment-url-checks/',
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',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: '/docs/how-to/',
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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,
page: [Object],
collections: [Circular *1],
_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',
url: '/docs/how-to/',
outputPath: './dist/docs/how-to/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:54:16.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### 1) 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### 2) 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### 3) Exercise the config in your CSS (imports and mixins):\n\n`src/assets/css/base.css`:\n\n```css\n:root {\n\tcolor-scheme: light;\n}\n\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n\n.pill {\n\tdisplay: inline-block;\n\tpadding: 0.25rem 0.75rem;\n\tborder-radius: 999px;\n\tbackground: #e0f2fe;\n\tcolor: #0f172a;\n\tfont-weight: 600;\n}\n```\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### 4) Run and inspect.\n\n- Dev: `npx rimraf dist/ && npm run dev`\n- Build: `npx rimraf dist/ && 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\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### 1) 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### 2) Add additional 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### 3) 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### 4) Set default target and minification for all bundles.\n\nPass `assets.esbuild` options when you register Baseline:\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### 5) Override target or minification for a specific inline script.\n\nFor one-offs, pass options directly to the filter. They merge over your defaults from `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\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- Baseline\'s default JS bundling: any `index.js` under `src/assets/js/**/` is bundled, minified, and targeted to `es2020`.\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\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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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],
_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### 1) 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### 2) 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### 3) Exercise the config in your CSS (imports and mixins):\n\n`src/assets/css/base.css`:\n\n```css\n:root {\n\tcolor-scheme: light;\n}\n\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n\n.pill {\n\tdisplay: inline-block;\n\tpadding: 0.25rem 0.75rem;\n\tborder-radius: 999px;\n\tbackground: #e0f2fe;\n\tcolor: #0f172a;\n\tfont-weight: 600;\n}\n```\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### 4) Run and inspect.\n\n- Dev: `npx rimraf dist/ && npm run dev`\n- Build: `npx rimraf dist/ && 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\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### 1) 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### 2) Add additional 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### 3) 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### 4) Set default target and minification for all bundles.\n\nPass `assets.esbuild` options when you register Baseline:\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### 5) Override target or minification for a specific inline script.\n\nFor one-offs, pass options directly to the filter. They merge over your defaults from `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\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- Baseline\'s default JS bundling: any `index.js` under `src/assets/js/**/` is bundled, minified, and targeted to `es2020`.\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\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,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:04:54.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## 1) Set `pathPrefix` in Eleventy\'s 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 Baseline\'s head and sitemap modules read it via Eleventy.\n\n---\n\n## 2) Keep `settings.url` clean (origin only).\n\nThe [[deployment-url-checks | Deployment URL Checks tutorial]] covers the env shape; canonicals and sitemap entries combine `settings.url` with `pathPrefix` automatically.\n\n---\n\n## 3) 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## 4) 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 `<link rel="canonical">` and asset URLs that include `/docs/`.\n\n---\n\n## 5) 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## Notes\n\n- If you move back to root hosting, clear `pathPrefix` to avoid double paths.\n- Watch for hardcoded absolute URLs; prefer root-relative so Eleventy can rewrite with `pathPrefix`.\n\n---\n\n## Common pitfalls\n\n- Mixing the subpath into `settings.url` and also setting `pathPrefix` produces double `/docs/docs/` in links and the sitemap.\n- Hardcoded absolute URLs (e.g. `https://www.example.com/docs/...`) won\'t get rewritten; prefer root-relative.\n- Missing leading slashes on assets and links (`assets/js/index.js` instead of `/assets/js/index.js`) prevents `pathPrefix` from applying.\n- Building without `pathPrefix` and then deploying under a subpath breaks links. Build and preview with the same `pathPrefix` you plan to deploy under.\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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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],
_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## 1) Set `pathPrefix` in Eleventy\'s 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 Baseline\'s head and sitemap modules read it via Eleventy.\n\n---\n\n## 2) Keep `settings.url` clean (origin only).\n\nThe [[deployment-url-checks | Deployment URL Checks tutorial]] covers the env shape; canonicals and sitemap entries combine `settings.url` with `pathPrefix` automatically.\n\n---\n\n## 3) 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## 4) 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 `<link rel="canonical">` and asset URLs that include `/docs/`.\n\n---\n\n## 5) 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## Notes\n\n- If you move back to root hosting, clear `pathPrefix` to avoid double paths.\n- Watch for hardcoded absolute URLs; prefer root-relative so Eleventy can rewrite with `pathPrefix`.\n\n---\n\n## Common pitfalls\n\n- Mixing the subpath into `settings.url` and also setting `pathPrefix` produces double `/docs/docs/` in links and the sitemap.\n- Hardcoded absolute URLs (e.g. `https://www.example.com/docs/...`) won\'t get rewritten; prefer root-relative.\n- Missing leading slashes on assets and links (`assets/js/index.js` instead of `/assets/js/index.js`) prevents `pathPrefix` from applying.\n- Building without `pathPrefix` and then deploying under a subpath breaks links. Build and preview with the same `pathPrefix` you plan to deploy under.\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,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:04:54.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.integrate-eleventy-base-blog.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: '05.integrate-eleventy-base-blog',
filePathStem: '/content/docs/03.how-to/05.integrate-eleventy-base-blog',
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{% alertBlock "info" %}\n\nThis article is planned for revision, its content might be stale.\n\n{% endalertBlock %}\n\nAdd Baseline to the official `eleventy-base-blog` starter with as little disruption as the starter\'s existing wiring allows. The work splits into four pieces: bring Baseline in, line the starter\'s directories up with Baseline\'s contract, migrate the starter\'s hand-rolled `<head>` into Baseline\'s head pipeline, and confirm the output.\n\nIf you don\'t already have a project to integrate into, the [[simple-baseline-site | simple site tutorial]] is the lighter starting point.\n\n---\n\n## Prerequisites\n\n- You have `eleventy-base-blog` cloned and running (`npm install`, `npm run dev` works).\n- Eleventy 3.x; `package.json` has `dev` and `build` scripts.\n- `settings.url` will be set via env (`URL`) for production.\n\n---\n\n## 1) Install Baseline\n\n```bash\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\n---\n\n## 2) Wire Baseline into `eleventy.config.js`\n\nIn your existing config:\n\n{% stepsBlock "compact" %}\n\n- Remove the `HtmlBasePlugin` import and call. Baseline registers its own.\n\n- Import Baseline and the Baseline directory contract; add the plugin last so it sees the rest of your config:\n\n ```js\n import baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n import settings from \'./src/_data/settings.js\';\n\n export default async function (eleventyConfig) {\n \t// ...your existing config\n\n \tawait eleventyConfig.addPlugin(baseline(settings));\n }\n\n export const config = baselineConfig; // spread to override if needed\n ```\n\n- Update `passthroughCopy` inputs to `./src/static/` and `./src/content/feed/pretty-atom-feed.xsl`.\n\n- Remove watch targets for CSS or images if present (Baseline handles them).\n\n- Point CSS and JS bundle `toFileDirectory` to `assets/css` and `assets/js` respectively.\n\n- Set `base` to `process.env.URL`.\n\n{% endstepsBlock %}\n\nThe full file is in the [`eleventy-base-blog` fork](https://github.com/apleasantview/eleventy-baseline-blog/blob/baseline-edition/eleventy.config.js).\n\n---\n\n## 3) Add a local `.env` for development\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080"\n```\n\nIn CI and production, set `URL` to your live origin (e.g. `https://www.example.com`); Baseline uses it for canonical URLs and the sitemap.\n\n---\n\n## 4) Move Eleventy Base Blog folders under `src/`\n\nMove the following folders to match Baseline\'s defaults:\n\n- `_data` → `src/_data`\n- `_includes` → `src/_includes`\n- `content` → `src/content`\n- `css` → `src/assets/css`\n- `public` → `src/static`\n\nThe last move has an asymmetry worth knowing upfront. Baseline\'s directory contract sets `public: \'static\'`, so the virtual key on `eleventyConfig.directories` is `public` but the folder on disk stays `static/`. The [[config-export | config-export reference]] covers the same split.\n\nUpdate layouts and includes to resolve from `src/`, and content from `src/content/`. Delete `sitemap.xml.njk` in `src/content/`; Baseline\'s sitemap module handles it.\n\n---\n\n## 5) Add the required data file\n\n`src/_data/settings.js` is the single source for site identity and head extras. The starter\'s `_data/head.js` is no longer in play once Baseline is wired; head extras move onto `settings.head` instead (step 7 walks through the migration):\n\n```js\nexport default {\n\ttitle: \'Eleventy Base Blog (Baseline Edition)\',\n\ttagline: \'Baseline + Eleventy Base Blog\',\n\turl: process.env.URL || \'http://localhost:8080/\',\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}\n};\n```\n\n---\n\n## 6) Align assets\n\nMake sure these exist (or create minimal stubs):\n\n- `src/assets/css/index.css`: import your base CSS or start empty.\n- `src/assets/js/index.js`: optional JS entry; can be empty.\n- `src/assets/assets.11tydata.js` to keep the assets directory out of collections:\n ```js\n export default {\n \televentyExcludeFromCollections: true\n };\n ```\n\n---\n\n## 7) Migrate the starter\'s head children\n\nThe starter\'s `base.njk` writes a `<head>` with three extras Baseline does not render for you: an Atom feed `<link>`, an inline `<style>` produced by `eleventy-plugin-bundle`, and a `@zachleat/heading-anchors` `<script type="module">`.\n\nWith Baseline, you do not author your own `<head>`; you push these into the head pipeline. One pattern per extra, in the same order:\n\n{% stepsBlock %}\n\n**Atom feed link → `settings.head.link[]`.** Site-wide static link. Add it to `src/_data/settings.js`:\n\n```js\nhead: {\n\tlink: [\n\t\t{ rel: \'stylesheet\', href: \'/assets/css/index.css\' },\n\t\t{\n\t\t\trel: \'alternate\',\n\t\t\ttype: \'application/atom+xml\',\n\t\t\ttitle: \'Eleventy Base Blog\',\n\t\t\thref: \'/feed/feed.xml\'\n\t\t}\n\t];\n}\n```\n\n<br>\n\n**`@zachleat/heading-anchors` script → `settings.head.script[]` plus an entry point.** Re-export the module from a small entry under `src/assets/js/heading-anchors/index.js`:\n\n```js\nimport \'@zachleat/heading-anchors\';\n```\n\nBaseline\'s assets pipeline bundles it to `dist/assets/js/heading-anchors/index.js`. Reference it in head extras:\n\n```js\nscript: [\n\t{ src: \'/assets/js/index.js\', defer: true },\n\t{ src: \'/assets/js/heading-anchors/index.js\', type: \'module\' }\n];\n```\n\n<br>\n\n**Per-page bundled CSS → `getBundle("css")` style block.** This is the non-trivial migration. The starter collects per-page CSS through `eleventy-plugin-bundle` and inlines the result. Baseline has no head-extras shape for inline `<style>`, so two approaches work depending on what the bundle is for:\n\n- **If the styles are page-specific and small**, keep the bundle plugin and inline them from the layout body (after `<baseline-head>`), with the small caveat that they sit outside the `<head>`. Most browsers handle this fine, but it\'s not strictly compliant.\n- **If the styles are reusable**, consolidate them into files under `src/assets/css/` and inline with Baseline\'s `inlinePostCSS` filter, called inside an inlineable head fragment that the layout includes:\n\n {% raw %}\n\n ```nunjucks\n {% set cssPath = _baseline.paths.assets ~ "css/post.css" %}\n {{ cssPath | inlinePostCSS | safe }}\n ```\n\n {% endraw %}\n\n This belongs at the top of the layout body, not inside `<baseline-head>` (which Baseline replaces wholesale). The placeholder is your `<head>`; everything else goes in the body.\n\n{% endstepsBlock %}\n\n---\n\n## 8) Add `<baseline-head>` to `base.njk`\n\nThe placeholder sits inside `<html>`, as a sibling of `<body>`. Baseline replaces it with the rendered `<head>` element at build time. Don\'t author your own `<head>` around it:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="en">\n <baseline-head></baseline-head>\n <body>\n ...\n </body>\n</html>\n```\n\n{% endraw %}\n\n---\n\n## 9) Organise content and set permalinks.\n\nMove the following files to `src/content/pages/` and set their permalinks as needed:\n\n- `404.md`, `about.md`, `blog.njk`, `index.njk`, `tag-pages.njk`, `tags.njk`\n\nExample `index.njk`:\n\n{% raw %}\n\n```nunjucks\n---js\nconst permalink = "/";\n---\n```\n\n{% endraw %}\n\nAdd the permalink function in `blog.11tydata.js`:\n\n```js\nexport default {\n\t// Keep tags and layout keys.\n\tpermalink: function ({ page }) {\n\t\tif (page.inputPath.includes(\'11tydata.js\')) {\n\t\t\treturn false;\n\t\t}\n\t\treturn `/blog/${this.slugify(page.fileSlug)}/`;\n\t}\n};\n```\n\n---\n\n## 10) Use Baseline\'s inline-asset filters where it makes sense.\n\n Replace direct CSS link-tags in `src/_includes/layouts/post.njk` and `src/_includes/layouts/home.njk` with the inline PostCSS filter. `_baseline.paths.assets` resolves to your assets input directory:\n\n {% raw %}\n\n ```nunjucks\n {% set cssPath = _baseline.paths.assets ~ "css/message-box.css" %}\n {{ cssPath | inlinePostCSS | safe }}\n ```\n\n {% endraw %}\n\n---\n\n## 11) Verify head, meta, and sitemap.\n\n - Dev: `npx rimraf dist/ && npm run dev`\n - Build: `npx rimraf dist/ && npm run build`\n - Check a page\'s `<head>` for `<title>`, `<meta name="description">`, `<link rel="canonical">`, and (if multilingual) hreflang alternates.\n - Inspect `dist/sitemap.xml` for correct URLs (uses `settings.url` and `pathPrefix` if set).\n\n---\n\n## 12) Optional: navigator and debug filters.\n\n - Set `navigator: true` in the plugin options if you want the navigator page (dev only).\n - Use the `_inspect`, `_json`, and `_keys` filters on a debug page to inspect data.\n\n---\n\n## Next steps\n\n- Add recommended build scripts and helper packages: [[build-scripts-and-cleanup | Build Scripts and Cleanup]].\n\n---\n\n## Notes\n\n- Keep `settings.url` origin-only; use `pathPrefix` if you deploy under a subpath.\n- Baseline\'s assets pipeline uses `src/assets/css/index.css` and `src/assets/js/index.js` as the default entry points.\n- If you have other CSS or JS paths, either point `settings.head.link[]` and `settings.head.script[]` at the Baseline output paths or mirror the files into `src/assets/`.\n\n---\n\n## See also\n\n- [[config-export | Config export reference]]\n- [[assets | Assets module]]\n- [[head | Head module]]\n- [[navigator | Navigator module]]\n',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
section: [Array],
sectionLabel: 'How-to guides',
title: 'Integrate with Eleventy Base Blog',
slug: 'integrate-eleventy-base-blog',
description:
'Add @apleasantview/eleventy-plugin-baseline to eleventy-base-blog: install, wire config, align data and assets, migrate head extras, and verify the build.',
date: 2026-01-25T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/docs/03.how-to/05.integrate-eleventy-base-blog.md',
fileSlug: '05.integrate-eleventy-base-blog',
filePathStem: '/content/docs/03.how-to/05.integrate-eleventy-base-blog',
outputFileExtension: 'html',
templateSyntax: 'njk,md',
date: 2026-01-25T00:00:00.000Z,
rawInput:
'\n{% alertBlock "info" %}\n\nThis article is planned for revision, its content might be stale.\n\n{% endalertBlock %}\n\nAdd Baseline to the official `eleventy-base-blog` starter with as little disruption as the starter\'s existing wiring allows. The work splits into four pieces: bring Baseline in, line the starter\'s directories up with Baseline\'s contract, migrate the starter\'s hand-rolled `<head>` into Baseline\'s head pipeline, and confirm the output.\n\nIf you don\'t already have a project to integrate into, the [[simple-baseline-site | simple site tutorial]] is the lighter starting point.\n\n---\n\n## Prerequisites\n\n- You have `eleventy-base-blog` cloned and running (`npm install`, `npm run dev` works).\n- Eleventy 3.x; `package.json` has `dev` and `build` scripts.\n- `settings.url` will be set via env (`URL`) for production.\n\n---\n\n## 1) Install Baseline\n\n```bash\nnpm install @apleasantview/eleventy-plugin-baseline\n```\n\n---\n\n## 2) Wire Baseline into `eleventy.config.js`\n\nIn your existing config:\n\n{% stepsBlock "compact" %}\n\n- Remove the `HtmlBasePlugin` import and call. Baseline registers its own.\n\n- Import Baseline and the Baseline directory contract; add the plugin last so it sees the rest of your config:\n\n ```js\n import baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n import settings from \'./src/_data/settings.js\';\n\n export default async function (eleventyConfig) {\n \t// ...your existing config\n\n \tawait eleventyConfig.addPlugin(baseline(settings));\n }\n\n export const config = baselineConfig; // spread to override if needed\n ```\n\n- Update `passthroughCopy` inputs to `./src/static/` and `./src/content/feed/pretty-atom-feed.xsl`.\n\n- Remove watch targets for CSS or images if present (Baseline handles them).\n\n- Point CSS and JS bundle `toFileDirectory` to `assets/css` and `assets/js` respectively.\n\n- Set `base` to `process.env.URL`.\n\n{% endstepsBlock %}\n\nThe full file is in the [`eleventy-base-blog` fork](https://github.com/apleasantview/eleventy-baseline-blog/blob/baseline-edition/eleventy.config.js).\n\n---\n\n## 3) Add a local `.env` for development\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080"\n```\n\nIn CI and production, set `URL` to your live origin (e.g. `https://www.example.com`); Baseline uses it for canonical URLs and the sitemap.\n\n---\n\n## 4) Move Eleventy Base Blog folders under `src/`\n\nMove the following folders to match Baseline\'s defaults:\n\n- `_data` → `src/_data`\n- `_includes` → `src/_includes`\n- `content` → `src/content`\n- `css` → `src/assets/css`\n- `public` → `src/static`\n\nThe last move has an asymmetry worth knowing upfront. Baseline\'s directory contract sets `public: \'static\'`, so the virtual key on `eleventyConfig.directories` is `public` but the folder on disk stays `static/`. The [[config-export | config-export reference]] covers the same split.\n\nUpdate layouts and includes to resolve from `src/`, and content from `src/content/`. Delete `sitemap.xml.njk` in `src/content/`; Baseline\'s sitemap module handles it.\n\n---\n\n## 5) Add the required data file\n\n`src/_data/settings.js` is the single source for site identity and head extras. The starter\'s `_data/head.js` is no longer in play once Baseline is wired; head extras move onto `settings.head` instead (step 7 walks through the migration):\n\n```js\nexport default {\n\ttitle: \'Eleventy Base Blog (Baseline Edition)\',\n\ttagline: \'Baseline + Eleventy Base Blog\',\n\turl: process.env.URL || \'http://localhost:8080/\',\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}\n};\n```\n\n---\n\n## 6) Align assets\n\nMake sure these exist (or create minimal stubs):\n\n- `src/assets/css/index.css`: import your base CSS or start empty.\n- `src/assets/js/index.js`: optional JS entry; can be empty.\n- `src/assets/assets.11tydata.js` to keep the assets directory out of collections:\n ```js\n export default {\n \televentyExcludeFromCollections: true\n };\n ```\n\n---\n\n## 7) Migrate the starter\'s head children\n\nThe starter\'s `base.njk` writes a `<head>` with three extras Baseline does not render for you: an Atom feed `<link>`, an inline `<style>` produced by `eleventy-plugin-bundle`, and a `@zachleat/heading-anchors` `<script type="module">`.\n\nWith Baseline, you do not author your own `<head>`; you push these into the head pipeline. One pattern per extra, in the same order:\n\n{% stepsBlock %}\n\n**Atom feed link → `settings.head.link[]`.** Site-wide static link. Add it to `src/_data/settings.js`:\n\n```js\nhead: {\n\tlink: [\n\t\t{ rel: \'stylesheet\', href: \'/assets/css/index.css\' },\n\t\t{\n\t\t\trel: \'alternate\',\n\t\t\ttype: \'application/atom+xml\',\n\t\t\ttitle: \'Eleventy Base Blog\',\n\t\t\thref: \'/feed/feed.xml\'\n\t\t}\n\t];\n}\n```\n\n<br>\n\n**`@zachleat/heading-anchors` script → `settings.head.script[]` plus an entry point.** Re-export the module from a small entry under `src/assets/js/heading-anchors/index.js`:\n\n```js\nimport \'@zachleat/heading-anchors\';\n```\n\nBaseline\'s assets pipeline bundles it to `dist/assets/js/heading-anchors/index.js`. Reference it in head extras:\n\n```js\nscript: [\n\t{ src: \'/assets/js/index.js\', defer: true },\n\t{ src: \'/assets/js/heading-anchors/index.js\', type: \'module\' }\n];\n```\n\n<br>\n\n**Per-page bundled CSS → `getBundle("css")` style block.** This is the non-trivial migration. The starter collects per-page CSS through `eleventy-plugin-bundle` and inlines the result. Baseline has no head-extras shape for inline `<style>`, so two approaches work depending on what the bundle is for:\n\n- **If the styles are page-specific and small**, keep the bundle plugin and inline them from the layout body (after `<baseline-head>`), with the small caveat that they sit outside the `<head>`. Most browsers handle this fine, but it\'s not strictly compliant.\n- **If the styles are reusable**, consolidate them into files under `src/assets/css/` and inline with Baseline\'s `inlinePostCSS` filter, called inside an inlineable head fragment that the layout includes:\n\n {% raw %}\n\n ```nunjucks\n {% set cssPath = _baseline.paths.assets ~ "css/post.css" %}\n {{ cssPath | inlinePostCSS | safe }}\n ```\n\n {% endraw %}\n\n This belongs at the top of the layout body, not inside `<baseline-head>` (which Baseline replaces wholesale). The placeholder is your `<head>`; everything else goes in the body.\n\n{% endstepsBlock %}\n\n---\n\n## 8) Add `<baseline-head>` to `base.njk`\n\nThe placeholder sits inside `<html>`, as a sibling of `<body>`. Baseline replaces it with the rendered `<head>` element at build time. Don\'t author your own `<head>` around it:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="en">\n <baseline-head></baseline-head>\n <body>\n ...\n </body>\n</html>\n```\n\n{% endraw %}\n\n---\n\n## 9) Organise content and set permalinks.\n\nMove the following files to `src/content/pages/` and set their permalinks as needed:\n\n- `404.md`, `about.md`, `blog.njk`, `index.njk`, `tag-pages.njk`, `tags.njk`\n\nExample `index.njk`:\n\n{% raw %}\n\n```nunjucks\n---js\nconst permalink = "/";\n---\n```\n\n{% endraw %}\n\nAdd the permalink function in `blog.11tydata.js`:\n\n```js\nexport default {\n\t// Keep tags and layout keys.\n\tpermalink: function ({ page }) {\n\t\tif (page.inputPath.includes(\'11tydata.js\')) {\n\t\t\treturn false;\n\t\t}\n\t\treturn `/blog/${this.slugify(page.fileSlug)}/`;\n\t}\n};\n```\n\n---\n\n## 10) Use Baseline\'s inline-asset filters where it makes sense.\n\n Replace direct CSS link-tags in `src/_includes/layouts/post.njk` and `src/_includes/layouts/home.njk` with the inline PostCSS filter. `_baseline.paths.assets` resolves to your assets input directory:\n\n {% raw %}\n\n ```nunjucks\n {% set cssPath = _baseline.paths.assets ~ "css/message-box.css" %}\n {{ cssPath | inlinePostCSS | safe }}\n ```\n\n {% endraw %}\n\n---\n\n## 11) Verify head, meta, and sitemap.\n\n - Dev: `npx rimraf dist/ && npm run dev`\n - Build: `npx rimraf dist/ && npm run build`\n - Check a page\'s `<head>` for `<title>`, `<meta name="description">`, `<link rel="canonical">`, and (if multilingual) hreflang alternates.\n - Inspect `dist/sitemap.xml` for correct URLs (uses `settings.url` and `pathPrefix` if set).\n\n---\n\n## 12) Optional: navigator and debug filters.\n\n - Set `navigator: true` in the plugin options if you want the navigator page (dev only).\n - Use the `_inspect`, `_json`, and `_keys` filters on a debug page to inspect data.\n\n---\n\n## Next steps\n\n- Add recommended build scripts and helper packages: [[build-scripts-and-cleanup | Build Scripts and Cleanup]].\n\n---\n\n## Notes\n\n- Keep `settings.url` origin-only; use `pathPrefix` if you deploy under a subpath.\n- Baseline\'s assets pipeline uses `src/assets/css/index.css` and `src/assets/js/index.js` as the default entry points.\n- If you have other CSS or JS paths, either point `settings.head.link[]` and `settings.head.script[]` at the Baseline output paths or mirror the files into `src/assets/`.\n\n---\n\n## See also\n\n- [[config-export | Config export reference]]\n- [[assets | Assets module]]\n- [[head | Head module]]\n- [[navigator | Navigator module]]\n',
url: '/docs/how-to/integrate-eleventy-base-blog/',
outputPath: './dist/docs/how-to/integrate-eleventy-base-blog/index.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-30T20:01:49.000Z },
inputPath: './src/content/docs/03.how-to/05.integrate-eleventy-base-blog.md',
fileSlug: '05.integrate-eleventy-base-blog',
filePathStem: '/content/docs/03.how-to/05.integrate-eleventy-base-blog',
date: 2026-01-25T00:00:00.000Z,
outputPath: './dist/docs/how-to/integrate-eleventy-base-blog/index.html',
url: '/docs/how-to/integrate-eleventy-base-blog/',
templateContent: [Getter/Setter],
content: [Getter/Setter] },
{ template:
Template {
inputPath: './src/content/docs/03.how-to/06.build-scripts-and-cleanup.md',
parsed: [Object],
extraOutputSubdirectory: '',
templateData: [TemplateData],
fileSlug: [TemplateFileSlug],
fileSlugStr: '06.build-scripts-and-cleanup',
filePathStem: '/content/docs/03.how-to/06.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## 1) Install helper packages:\n\n```bash\nnpm install rimraf npm-run-all cross-env\n```\n\n---\n\n## 2) 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": "npx @11ty/eleventy --serve",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production npx @11ty/eleventy",\n\t\t"build": "npm-run-all clean build:*",\n\t\t"dryrun": "npx @11ty/eleventy --dryrun"\n\t}\n}\n```\n\n---\n\n## 3) 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## 4) 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## 5) Optional: dry run.\n\n```bash\nnpm run dryrun\n```\n\nInspect what would be built without writing files.\n\n---\n\n## 6) 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. The [[deployment-url-checks | deployment URL checks tutorial]] covers the full URL and env story alongside it.\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',
groupNumber: 0,
data:
{ helpers: [Object],
navigation: [Object],
schema: [Object],
settings: [Object],
_baseline: [Object],
_assets: {},
_head: {},
_multilang: {},
_navigator: [Object],
_sitemap: {},
_snapshot: [Object],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: [Function: permalink],
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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],
_pageContext: [Object],
_seoGraph: [Object],
_node: [Object],
_backlinks: [Array],
_outgoing: [Array],
sitemap: [Object],
head: [Object] },
page:
{ inputPath: './src/content/docs/03.how-to/06.build-scripts-and-cleanup.md',
fileSlug: '06.build-scripts-and-cleanup',
filePathStem: '/content/docs/03.how-to/06.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## 1) Install helper packages:\n\n```bash\nnpm install rimraf npm-run-all cross-env\n```\n\n---\n\n## 2) 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": "npx @11ty/eleventy --serve",\n\t\t"build:eleventy": "cross-env ELEVENTY_ENV=production npx @11ty/eleventy",\n\t\t"build": "npm-run-all clean build:*",\n\t\t"dryrun": "npx @11ty/eleventy --dryrun"\n\t}\n}\n```\n\n---\n\n## 3) 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## 4) 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## 5) Optional: dry run.\n\n```bash\nnpm run dryrun\n```\n\nInspect what would be built without writing files.\n\n---\n\n## 6) 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. The [[deployment-url-checks | deployment URL checks tutorial]] covers the full URL and env story alongside it.\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',
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,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:04:54.000Z },
inputPath: './src/content/docs/03.how-to/06.build-scripts-and-cleanup.md',
fileSlug: '06.build-scripts-and-cleanup',
filePathStem: '/content/docs/03.how-to/06.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/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 two first layers and templating globals.\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\n\nWhat you reach for from inside a template.\n\n- [[filters]]\n- [[globals]]\n- [[image-shortcode]]\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],
eleventyComputed: [Object],
eleventy: [Object],
pkg: [Object],
type: 'article',
permalink: '/docs/core-reference/',
lang: 'en',
layout: 'layouts/docs.njk',
articleType: 'TechArticle',
random: 'Random string',
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, and the image shortcode.',
date: 2026-01-25T00:00:00.000Z,
page: [Object],
collections: [Circular *1],
_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 two first layers and templating globals.\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\n\nWhat you reach for from inside a template.\n\n- [[filters]]\n- [[globals]]\n- [[image-shortcode]]\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,
sitemap: [Object],
datePublished: 2026-01-25T00:00:00.000Z,
dateModified: 2026-07-31T08:54:16.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] },
... 54 more items ] },
_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:
{ inputPath: './src/navigator-core.html',
fileSlug: 'navigator-core',
filePathStem: '/navigator-core',
outputFileExtension: 'html',
templateSyntax: 'njk',
date: 2026-08-01T07:33:54.947Z,
url: '/navigator-core.html',
outputPath: './dist/navigator-core.html',
lang: 'en',
locale: 'en',
translationKey: undefined,
isDefaultLang: true,
sitemap: { ignore: false, changefreq: '', priority: -1 } },
entry:
{ title: 'Navigator Core',
description: 'Eleventy + Baseline internals',
excerpt: undefined,
slug: 'navigator-core',
section: undefined,
type: undefined,
head: undefined,
breadcrumbs: [] },
query: { isHome: false },
meta:
{ title: 'Navigator Core | Eleventy Baseline',
description: 'Eleventy + Baseline internals',
canonical: 'https://www.eleventy-baseline.dev/navigator-core.html',
robots: 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1',
noindex: false },
render: { generator: 'Eleventy v3.1.6' },
head:
{ link:
[ { rel: 'stylesheet',
href: 'https://www.eleventy-baseline.dev/assets/css/index.css' },
{ rel: 'me', href: 'https://mastodon.social/@crisverstraeten' },
{ rel: 'icon',
type: 'image/png',
href: 'https://www.eleventy-baseline.dev/favicon-96x96.png',
sizes: '96x96' },
{ rel: 'icon',
type: 'image/svg+xml',
href: 'https://www.eleventy-baseline.dev/favicon.svg' },
{ rel: 'shortcut icon', href: 'https://www.eleventy-baseline.dev/favicon.ico' },
{ rel: 'apple-touch-icon',
href: 'https://www.eleventy-baseline.dev/apple-touch-icon.png' },
{ rel: 'manifest', href: 'https://www.eleventy-baseline.dev/site.webmanifest' } ],
script:
[ { src: '/assets/js/index.js', defer: true },
{ src: '/assets/js/vendor/index.js', defer: true } ],
style: [],
meta:
[ { name: 'color-scheme', content: 'light dark' },
{ name: 'theme-color', content: '#ffffff' } ] } },
_seoGraph:
{ url: 'https://www.eleventy-baseline.dev/navigator-core.html',
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': 'ImageObject',
'@id': 'https://www.eleventy-baseline.dev/navigator-core.html#primaryimage',
url: 'https://www.eleventy-baseline.dev/og.jpg',
contentUrl: 'https://www.eleventy-baseline.dev/og.jpg',
width: 1200,
height: 630,
caption: 'Eleventy Baseline' },
{ '@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] ],
primaryImageOfPage: { '@id': 'https://www.eleventy-baseline.dev/navigator-core.html#primaryimage' },
description: 'Eleventy + Baseline internals',
inLanguage: 'en',
datePublished: '2026-08-01T07:33:54.947Z',
dateModified: '2026-08-01T07:33:54.947Z' } ],
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,
date: 2026-08-01T07:33:52.859Z,
url: '/navigator-core.html',
excerpt: '← Go back',
headings: [ { level: 2, text: 'Navigator', id: 'navigator' } ],
sections: [],
images: [] },
_backlinks:
[ { internal: true,
from: '/navigator-core.html',
to: '/navigator-core.html',
text: '← Go back',
rel: [] },
{ internal: true,
from: '/docs/module/navigator/',
to: '/navigator-core.html',
text: 'in action',
rel: [] } ],
_outgoing:
[ { internal: true,
from: '/navigator-core.html',
to: '/navigator-core.html',
text: '← Go back',
rel: [] } ] }