Skip to main content
View as Markdown

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.

app.yaml
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.

Localized metadata is keyed by language code, and each entry carries the same limits:

app.yaml
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.

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.

Built with Sovrium