SEO & Metadata
A page's meta property controls everything rendered into the document <head>. Values support $record.* and $frontmatter.* substitution, so collection and markdown pages produce per-record SEO without a second configuration pass.
pages:
- name: Blog Post
path: /blog/:slug
collection: { table: posts, slugField: slug }
meta:
title: '$record.title'
description: '$record.excerpt'
canonical: 'https://example.com/blog/$record.slug'
openGraph: { type: article, image: '$record.cover' }
twitter: { card: summary_large_image }Core Metadata
| Property | Description |
|---|---|
title |
Required. Maximum 60 characters — a longer title fails validation, not just the SERP. |
description |
Maximum 160 characters, likewise enforced. |
keywords |
Comma-separated keywords. |
author |
Page author or organization. |
canonical |
Canonical URL, to consolidate duplicate content. |
robots |
Robot directives, e.g. noindex, nofollow. |
noindex |
Shorthand for robots: noindex. |
lang |
Language code. Auto-detected when omitted. |
og:site_name |
Site name — shorthand for openGraph.siteName. |
favicon |
Single icon path, relative and ending .ico, .png or .svg. |
stylesheet |
Path to an additional stylesheet. |
googleFonts |
Google Fonts URL. |
analytics |
Per-page analytics configuration. |
i18n |
Localized title and description per language code. |
The character limits are schema constraints, not advice. title over 60 characters or description over 160 fails sovrium validate. This catches a runaway $record.title binding offline rather than in a search result.
Localized metadata is keyed by language code, and each entry carries the same limits:
meta:
title: 'Pricing'
i18n:
fr: { title: 'Tarifs', description: 'Des tarifs simples et transparents.' }openGraph
Open Graph metadata for rich social previews.
| Property | Description |
|---|---|
type |
Object type, e.g. website, article. |
title |
Title, when it should differ from the page title. |
description |
Description. |
url |
Canonical URL for this object. |
image |
Sharing image. 1200×630 is the safe size. |
imageAlt |
Alternative text for that image. |
siteName |
Name of the overall site. |
locale |
Locale in language_TERRITORY form. |
determiner |
The word preceding the title in a sentence, e.g. a, the. |
video |
Video URL, when sharing video. |
audio |
Audio URL, when sharing audio. |
twitter
Twitter/X card metadata. card is the only required property.
| Property | Description |
|---|---|
card |
Required. summary, summary_large_image, app, or player. |
title |
Card title. Maximum 70 characters. |
description |
Card description. Maximum 200 characters. |
image |
Image URL. |
imageAlt |
Alternative text. Maximum 420 characters. |
site |
The site's @username. |
creator |
The author's @username. |
player |
Player URL, with playerWidth and playerHeight alongside it. |
appName / appId / appUrl |
App-card details, each { iPhone, iPad, googlePlay }. |
The limits here are tighter than the core title and description limits, which is why they are separate properties rather than inherited ones.
structuredData
JSON-LD moved to Structured Data & Favicons.
favicons
Favicon configuration moved to Structured Data & Favicons.
Performance Hints
preload, dnsPrefetch and customElements moved to Structured Data & Favicons.
Related Pages
- Structured Data & Favicons — JSON-LD, icons, resource hints.
- Pages Overview —
sitemapandrss, which complementmeta. - Collection & Markdown Pages — per-record and per-article metadata.
- Languages — the language codes
i18nis keyed by. - Media Components — the images these tags reference.
Last updated August 11, 2026
This documentation was written with AI, so errors or outdated content are possible. Sovrium is in beta. Contributions and corrections are welcome.