Что сказать
«В App Router я не рендерю head tags — экспортирую metadata. Static values — в export const metadata; data-driven — в generateMetadata с route params; fetch dedupe с page, title и OG image из CMS без лишнего round-trip. Layouts задают title.template вроде %s · Acme и shared OG defaults; leaf pages override shallow merge per key. Ставлю metadataBase, чтобы canonical и OG стали absolute, добавляю alternates.canonical против duplicate content, использую file conventions — sitemap.ts, robots.ts, opengraph-image.tsx с ImageResponse для social cards. JSON-LD рендерю script в body — structured data не часть Metadata API. Next флашит head до streaming body, SEO не застревает за Suspense.»
Итог
Фрейминг: declarative metadata + dedupe + file conventions + JSON-LD в body — полный SEO stack App Router.