Next.js Metadata (2025): App Router SEO that scales
Master nextjs metadata with App Router. Learn file-based config, generateMetadata, social cards, JSON-LD, canonical/robots, sitemaps, i18n, and performance-safe patterns for large sites.
Coverage
SEO primitives
DX
File-based control
Safety
No FOUC/CSR only
What is Next.js metadata?
In the App Router, nextjs metadata is a typed API to define SEO and social tags at the file system level. You can return metadata from generateMetadata (server) or place a metadata.ts file next to a page/layout. Client-only pages can still set tags via <Head> as shown here.
<Head> only when a page must be a client component.App Router metadata model
| Where | What | Notes |
|---|---|---|
| layout.tsx | Site-wide defaults (title template, OG, twitter) | Inherit down the tree |
| page.tsx (server) | Route-specific metadata via generateMetadata | Fetch data to build dynamic tags |
| metadata.ts | Static metadata object | Tree-shakable, fast |
| client page | <Head> fall-back | Avoid heavy runtime logic |
generateMetadata vs metadata.ts
Dynamic metadata
Per request
// app/blog/[slug]/page.tsx (server component)
export async function generateMetadata({ params }) {
const post = await fetchPost(params.slug);
return {
title: post.title,
description: post.excerpt,
openGraph: { images: [{ url: post.ogImage }] },
alternates: { canonical: 'https://example.com/blog/' + params.slug }
};
}Ideal for blogs, products, and anything data-backed.
JSON-LD patterns
Keep JSON-LD minimal, valid, and aligned with the visible content. Prefer server-side injection via generateMetadata.
<script type="application/ld+json">
{ "@" : "schema", "fixed": "Keep valid JSON here" }
</script>Canonicals, robots & sitemaps
- Set
alternates.canonicalor a canonical link in<Head>. - Use
robotsto control index/follow and preview settings. - Create
app/sitemap.tsor an API route for dynamic sitemaps.
Performance & caching
generateMetadata. Cache requests, precompute OG, and donβt overuse client <Head>updates that cause re-hydration work.i18n alternates & OG locales
Provide alternates.languages and match localized OG titles/descriptions. Keep canonical pointing to the primary language.
CLI snippets & validation
Validate tags
Quick checks
# Check HTML head quickly curl -s https://example.com | grep -Ei 'og:|twitter:|canonical|ld\+json' | sed -e 's/^/β’ /'
Pre-publish checklist
Ship with confidence
- Title/description unique & within length
- Absolute OG image URLs; 200 OK
- Canonical set; no conflicting canonicals
- Robots/sitemap present; hreflang correct
Image privacy for social cards
Social images often originate from photos or design exports that can carry hidden EXIF data. Before committing OG/Twitter images to your repo or CDN, scrub EXIF/GPS and authoring traces to avoid leaking locations or device info.
FAQ
Ship great SEO β protect user privacy
Nail your Next.js metadata stack (OG, Twitter, JSON-LD, canonicals). For images, scrub hidden EXIF before pushing to your CDN.
Open Graph & Twitter
OG essentials
Title, description, image
twitter:card=summary_large_imageProgrammatic images
Edge functions / Satori
Generate dynamic OG images using edge renderers. Cache aggressively and reuse templates to keep TTFB low.