export const metadata — One Object, Whole `<head>`
The Metadata API
Export a metadata object from a layout or page and Next renders the matching title, description, OG, and Twitter tags into `<head>`.
What you'll learn
- Export `const metadata`
- Use `generateMetadata` for dynamic per-route metadata
- Set up a title template per segment
The Metadata API turns one TypeScript object into a full set of <head> tags. No more
hand-stamping <title>, <meta name="description">, OG tags, and Twitter cards.
Static Metadata
// app/page.tsx
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: 'My Site',
description: 'A great app.',
openGraph: {
title: 'My Site',
description: 'A great app.',
images: ['/og.png'],
},
}
export default function Page() {
return <h1>Home</h1>
} Dynamic Metadata
When you need metadata per route param, export generateMetadata:
// app/posts/[slug]/page.tsx
import type { Metadata } from 'next'
export async function generateMetadata({
params,
}: {
params: Promise<{ slug: string }>
}): Promise<Metadata> {
const { slug } = await params
const post = await db.post.findUnique({ where: { slug } })
return {
title: post?.title ?? 'Post',
description: post?.excerpt,
}
} Title Templates
A RootLayout can set a template so every child page gets a suffix automatically:
// app/layout.tsx
export const metadata = {
title: { template: '%s | My Site', default: 'My Site' },
}
// app/about/page.tsx
export const metadata = { title: 'About' }
// final: "About | My Site" Child metadata merges into the parent’s — title templates from the layout apply to every page below.
OpenGraph Images →