Compare / Satori and @vercel/og
MintRender vs Satori and @vercel/og
Satori is an open-source library that turns HTML and CSS written as JSX into an SVG. @vercel/og uses Satori and Resvg to make PNG images, for example Open Graph images, in a Vercel function.
Facts checked in the projects' own docs on 1 November 2026. Each one links its source. MintRender is not connected with these projects.
Build it yourself when
- You are a developer, your site runs on Vercel or Next.js, and you want OG images in your own code at no extra cost.
- Your team is happy to change the design in JSX and to deploy each change.
Pick MintRender when
- People who do not write code change the design in an editor, and a change needs no deploy.
- You need JPEG, WebP or PDF as well as PNG and SVG, or QR codes, barcodes and charts.
- You do not want to load font files by hand: MintRender loads any Google font by its name.
- You want signed links, batches from a CSV file and one bill per file, in any language or no-code tool.
What you get
| What it makes | Satori returns an SVG string; @vercel/og turns it into a PNG with Resvg. The pages state no JPEG or PDF output. source source |
| Layout | Satori's README: flexbox, grid (not subgrid or masonry) and block layout. Vercel's docs: only flexbox; grid will not work. source source |
| Fonts | You load each font file yourself and pass its bytes; @vercel/og includes only Noto Sans. Satori's README lists TTF, OTF, WOFF and WOFF2; Vercel's docs list TTF, OTF and WOFF. source source |
| Bundle limit | @vercel/og: at most 500 KB, including your JSX, CSS, fonts and images. source |
| Not supported | React hooks such as useState, :hover, unicodeBidi; Satori says its SVG does not always match the browser. source |
| Licence | MPL-2.0. source |
What it costs to run
- The library is free. You pay for the functions that run it and the traffic; @vercel/og adds cache headers so the CDN keeps each image. source
MintRender's Free plan: 100 files a month, every month, no card. Paid plans start at $19 a month for 2,000 files (pricing).
The same image both ways
Satori and @vercel/og source
// app/api/og/route.tsximport { ImageResponse } from 'next/og'; export async function GET() { return new ImageResponse( ( <div style={{ fontSize: 40, background: 'white', width: '100%', height: '100%', justifyContent: 'center', alignItems: 'center' }}> 👋 Hello </div> ), { width: 1200, height: 630 }, );}MintRender
<!-- A signed link in your page; no route to deploy --><meta property="og:image" content="https://img.mintrender.com/YOUR_TEMPLATE_ID/main.png?title=Hello&s=SIGNATURE">- With MintRender the design lives in a template, and your server only signs the link (see the signed links docs). The image is made the first time someone opens it, then comes from the cache.
- To make the same image from code instead, call the render API:
curl -X POST https://mintrender.com/v1/render \ -H "Authorization: Bearer $MINTRENDER_KEY" \ -H "Content-Type: application/json" \ -d '{ "template": "YOUR_TEMPLATE_ID", "data": { "title": "Hello" }, "format": "png" }'