Opinion Open Graph Image Template
An opinion card with a columnist byline, bold stance title, and footer.
An opinion card with a columnist byline, bold stance title, and footer.
Every Open Graph image template is included with Basic and Pro. Pick a plan to copy the code, install with the CLI, and download the raw SVG.
Already purchased? Log in
Use the Opinion template for columns where the stance is the whole point. The columnist avatar and name sit up top with an Opinion pill across from them, the argument fills the card as a 72px headline, and the publication and date close it out.
This template is a metadata image route for the Next.js App Router. The file exports size, contentType, and alt values plus a default async function that returns an ImageResponse. When a page in the segment is shared, satori converts the JSX into an SVG document, the runtime rasterizes that SVG into a 1200 by 630 PNG, and Next.js serves the result and wires the og:image and twitter:image tags into the page head automatically. The stance sits in the middle at the largest size on the card, so a short headline carries the layout.
Install with the shadcn CLI using your Shadcn UI Blocks API key:
npx shadcn@latest add @shadcn-ui-blocks/og-image-opinion
The file lands at app/opengraph-image.tsx, which makes it the site wide share card. For a column you will usually move it into the opinion segment instead, for example app/opinion/[slug]/opengraph-image.tsx. You can also copy the code from this page straight into your project.
The card renders text with Inter, read from assets/fonts at your project root with node:fs so the font files never ship to the browser. Download the latin woff files for weights 400, 500, 600, and 700 from Fontsource and save them as assets/fonts/inter-latin-400-normal.woff and so on.
The content object holds the label pill, the columnist fields author, role, and initials, the stance title, the publication, and the date. This template carries no logo or url; the byline avatar and the publication footer do that work instead. The title is the loudest element at 72px, so keep it to a handful of words up to two lines, and let role describe the beat in three or four words. Swap the initials avatar for an img at an absolute URL for a columnist photo; satori fetches it at render time.
satori supports a focused subset of CSS: flexbox layout only, flat colors, and an explicit display: flex on any element with multiple children. Keep those rules in mind if you rework the layout.