Release notes
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.
Install from npm:
npm install @apleasantview/eleventy-plugin-baseline --save-exact
v0.1.0-next.42
Mostly an SEO release. <baseline-head> now emits the structured data, social tags, and canonical link that used to be hand-wired per site. A handful of shapes changed to make room for it.
Breaking
-
If you hand-wired SEO, unplug it first.
<baseline-head>now emits the JSON-LD graph, Open Graph, Twitter, and canonical itself (see Added).If your site still injects its own, the two coexist rather than replace, so remove your hand-wired SEO from the cascade and let the plugin own it.
- Symptom: two
<script type="application/ld+json">blocks in one<head>.
- Symptom: two
-
Content graph edges dropped
type.It only ever mirrored
internal, so read that instead:!edge.internalwhere you hadedge.type === 'external',edge.internalwhere you hadedge.type === 'link'.Edges now carry
rel, the link'sreltokens as a lowercased array, for link-audit and SEO use. -
The SEO identity file moved.
If you kept site identity (
organization/person) in_data/seo.js, rename the file to_data/schema.jsand its cascade key fromseotoschema. Site-wide SEO defaults (ogImage, Open Graph, Twitter) now live undersettings.seo. This is only the identity.The per-page
seo:presentation keys (seo.title,seo.description,seo.ogImage,seo.canonical, and the rest) are unchanged and stay underseo. Rename those toschemaand your title and description overrides go silently empty. -
page.localeis a string now.It used to be an object; it is a BCP 47 tag (
'en-US'). The three values it held are top-level:page.lang(the short code),page.translationKey, andpage.isDefaultLang.In settings,
settings.languages.<code>gains alocalefield and dropslanguageCode. Update any template readingpage.locale.langtopage.lang, and the same for.translationKey/.isDefaultLang.The content-graph node flattened identically:
node.localeis a string, withnode.lang,node.translationKey, andnode.isDefaultLangtop-level.- Symptom:
og:localeorinLanguagefalling back to the site default on a non-default-language page.
- Symptom:
-
Graph membership gates on
_internal, noteleventyExcludeFromCollections.A page kept out of collections can now appear in the graph, which is usually what you want.
To keep a page out of the graph, set
baselineExcludeFromGraph: true(or_internal: truefor synthetic templates).Audit any page that used
eleventyExcludeFromCollectionsalone to stay out of the graph (404s, utility pages): they now reach the graph and the JSON-LD corpus until you add the flag.- Symptom: a 404 or utility page in
_navigator.nodesor emitting its own WebPage JSON-LD.
- Symptom: a 404 or utility page in
-
JSON-LD
@ids are keyed on the canonical URL.Per-page and corpus graphs moved together, so they stay internally consistent. Any external consumer keyed on the old
#webpagefragments needs re-keying.
Added
-
<baseline-head>emits the SEO surface.With no per-site wiring, the head now writes:
- a JSON-LD
@graph: WebSite, Organization or Person, WebPage, Article, BreadcrumbList, with translation links between language versions - Open Graph and Twitter Card meta tags
- the canonical link (omitted on noindex pages)
The graph construction is an adapter to Joost de Valk's
@jdevalk/seo-graph-core.Identity comes from
_data/schema.jsandsettings.seo. Per page,pageTypeandarticleTypeoverride the schema@type, andogImagesets the share image (the object form{ url, width, height, alt }emits a dimensioned image). Keep social image URLs absolute: the graph sits in a script tag the base-URL transform can't reach. - a JSON-LD
-
node.sectionson the content graph.Each node now carries
sections, one{ heading, text }record per H2. Heading-and-prose pairs make FAQPage, HowTo, and Speakable schemas derivable without re-parsing the rendered HTML. -
Breadcrumbs.
Each content-graph node carries a
breadcrumbstrail built from its section path, and Baseline emits a matchingBreadcrumbListin the page's JSON-LD. Nothing to wire. -
datePublishedanddateModifiedfront-matter keys.Optional. Baseline resolves a publish/modified chain for the structured data (front matter, then the git last-commit date, then
page.date). Sites that set neither are unchanged. -
Configurable title templates.
New
head.titleTemplateoption and a per-pagetitleTemplate. Tokens:%s(the page title),%siteTitle%,%tagline%. Set it tonullon a page for a bare title. With no template set, the oldPage - Sitecomposition is reproduced exactly. -
topicsfront matter for keywords.Lists in
topicsemit schema.orgkeywords(andog:article:tagon articles). Separate from Eleventy'stags, which stays untouched. Bring your own taxonomy. -
settings.defaultLocale.Set a BCP 47 site default (e.g.
'en-US') as the preferred site-default key;defaultLanguagestays valid as its short-code alias. Either one activates multilingual mode.
Fixed
- Same-host links with different
rel(apreconnectand adns-prefetchto one host) are no longer collapsed to one in the head. - The sitemap and the markdown alternates skip
permalink:falserecords instead of throwing on them. - An object-form page-level
seo.ogImagenow also emits a JSON-LD ImageObject, not just theog:imagetag, so the graph and the social tag share one image.
Reading list
Where to go deeper on the surfaces that changed.
SEO
Content graph
Multilingual