Why it matters
Link previews in Slack, LinkedIn, iMessage, X and chat assistants fall back to guesses or no card at all.
How to fix it
Set openGraph in metadata (with metadataBase) and add an opengraph-image file.
Example
// app/blog/[slug]/opengraph-image.tsx — 1200×630 PNG, referenced automatically as og:image
import { ImageResponse } from 'next/og'
export const alt = 'Acme blog post'
export const size = { width: 1200, height: 630 }
export const contentType = 'image/png'
export default async function Image({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params
const post = await getPost(slug)
return new ImageResponse(<div style={{ display: 'flex', width: '100%', height: '100%', padding: 80, fontSize: 72 }}>{post.title}</div>, size)
}References
More seo rules
void seo reports 60 rules in this category. What search engines need from the raw response: status codes, titles and descriptions in <head>, self-referencing canonicals, one h1, crawlable links, Open Graph, icons, robots.txt and a sitemap with real dates.
broken-linksInternal links return 4xx/5xx (or go through redirects)trailing-slashBoth trailing-slash and non-slash URLs serve 200hreflang-invalidhreflang uses invalid codes or relative URLshreflang-not-reciprocalhreflang set isn't self-referencing and reciprocalog-incompleteog:description / og:site_name missing, or og:url ≠ canonicalog-image-invalidog:image isn't a reachable, absolute, raster image within size limitsog-image-sizeog:image is smaller than 1200×630 or far from 1.91:1og-image-metaog:image:width/height missing or wrong, or og:image:alt missing