Metadata
The head tags every page renders — title, description, canonical, Open Graph and X card tags — and how to override them per page from frontmatter.
Every page renders the standard <head> tags from your config and frontmatter — no configuration needed. Where a value can be tuned it lives under the seo key in blume.config.ts or under seo in a page’s frontmatter.
<title>— the page title plus your sitetitle.<meta name="description">andog:description— the pagedescription, falling back to the sitedescription.og:titleandog:site_name— the page title and your sitetitle.<link rel="canonical">andog:url— the page’s absolute URL (whendeployment.siteis set).og:type—articleon blog posts and changelog entries,websiteelsewhere. Article pages also emitarticle:published_timeandarticle:modified_timefrom the page’sdateand last-modified timestamp.og:image— the OG image for the page. A generated card also declares itsog:image:width,og:image:height,og:image:type, andog:image:alt, so a crawler can lay the card out without fetching it first; anseo.imageyou supply yourself declares none of these, since its size and format are unknown.twitter:card,twitter:title,twitter:description,twitter:image— the X card. Pages with an image get the widesummary_large_imagevariant; pages without one still get the compactsummarycard rather than rendering as a bare link.
X attribution
X reads everything else on the card from the og:* tags, so the only values it can’t infer are the accounts to credit. Set them under seo.x and Blume emits twitter:site (your site’s account) and twitter:creator (the author’s). The @ is optional — acme and @acme both work.
seo: {
x: { handle: "@acme", creator: "@jane" },
}
A page can claim its own author, which is what you want for a guest post:
---
title: How we shipped it
seo:
x:
creator: "@guestauthor"
---
Your own tags
For anything Blume has no setting for, add tags under seo.metatags and every page carries them, custom pages and API references included. It suits site-verification tokens from Google, Bing, or Facebook, a theme-color, or an app banner:
seo: {
metatags: {
"google-site-verification": "abc123",
"msvalidate.01": "def456",
"theme-color": "#0b5fff",
"apple-itunes-app": "app-id=123456789",
},
}
Each key is the tag’s name and each value its content. Open Graph families (og:, fb:, article:, and the rest) render with property, as the protocol names them, and everything else with name. The tags Blume writes itself, listed at the top of this page, can’t be set here, so a page never carries two values for one tag. The build names the setting that controls each: og:image comes from seo.og or a page’s seo.image, and robots from a page’s seo.noindex.
Per-page overrides
Override any of the other tags per page with seo frontmatter:
---
title: Pricing
description: Plans and pricing for every team size.
seo:
title: Plans and pricing
canonical: https://acme.com/pricing
noindex: false
---
seo.title?string
Replace the page's title in <title>, og:title, and twitter:title. Your site title is still appended: on a site titled Acme Docs, the example above renders “Plans and pricing - Acme Docs”.
stringseo.description?string
Override the meta + og:description.
stringseo.image?string
Custom social image (see Open Graph images).
stringseo.canonical?string
Override the canonical URL.
stringseo.noindex?boolean
Emit robots noindex and skip structured data.
booleanseo.x.creator?string
Credit this page to an X account (twitter:creator), overriding seo.x.creator from your config.
stringA noindex page also drops out of the sitemap and skips structured data.