Skip to content

SEO & structured data

Every article in the feed already carries what a search engine wants — an SEO title, a description, a canonical URL, a cover image, and a structured byline. This guide maps those fields to the on-page tags that rank. The conceptual reasoning lives in SEO and JSON-LD; this is the practical “which field goes where.”

FieldDrivesNotes
seoTitle<title>, og:titleA string — falls back to title server-side, so it’s always set.
seoDescription<meta name="description">, og:descriptionnull when none — omit the tag and let the engine derive one.
canonicalUrl<link rel="canonical">, og:urlAbsolute, or null if the site has no URL set. See Custom domain & canonical.
imageog:image, twitter:card, JSON-LD imagenull when the article has no cover; use summary instead of summary_large_image.
inLanguage<html lang>, JSON-LD inLanguageBCP-47 tag, e.g. "en".
publishedAt / updatedAtarticle:published_time / article:modified_time, JSON-LD datePublished / dateModifiedISO-8601 strings.
authorJSON-LD author + sameAsSee JSON-LD below.
tagsarticle:tagPossibly empty.

JSON-LD: the author kind decides the schema

Section titled “JSON-LD: the author kind decides the schema”

The byline’s author.kind chooses the schema.org type:

  • "real" → a Person (with jobTitle and sameAs when present). A real human wrote it.
  • "persona" → an Organization byline — a brand voice, never a fabricated human.
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "",
"datePublished": "2026-01-01T…",
"dateModified": "2026-01-02T…",
"inLanguage": "en",
"author": { "@type": "Person", "name": "", "jobTitle": "", "sameAs": [""] }
}

Export generateMetadata on the article route and a app/sitemap.ts. Map seoTitletitle, seoDescriptiondescription, canonicalUrlalternates.canonical, and imageopenGraph.images. Emit the JSON-LD as a <script type="application/ld+json"> in the page body. The complete, copy-pasteable recipe is in SEO metadata & sitemap.