Use 1200×630 pixels (1.91:1 aspect ratio) as the universal default OpenGraph image size in 2026. It renders correctly on Facebook, LinkedIn, Slack, Discord, iMessage, WhatsApp, and Telegram, and falls back acceptably on X. Go to 1200×675 (16:9) only if X is your primary channel.
The universal safe size: 1200×630
1200×630 is a 1.91:1 aspect ratio. It was defined by Facebook in its sharing best practices documentation around 2013, and every other unfurler adopted the same shape to match the dominant platform. Even X — which prefers 16:9 — renders 1200×630 correctly, just with a small vertical crop.
Why this exact size? 1200×630 hits the Facebook minimum of 600×315 at 2× density, is large enough to look crisp on retina screens, and small enough to stay well under platform file-size limits (Facebook 8 MB, X 5 MB, LinkedIn 5 MB).
Per-platform sizes in 2026
- Recommended: 1200×630, 1.91:1
- Minimum: 200×200 (rejected below this)
- Warning threshold: 600×315 (shown as "may render poorly")
- Max file size: 8 MB
- Mobile crop: shows full 1.91:1, no crop
- Recommended: 1200×627, 1.91:1 (LinkedIn's published number; 1200×630 works identically in practice)
- Max file size: 5 MB
- Mobile crop: 1.91:1, trimmed edges on narrow viewports
- Cache: 7 days — use Post Inspector to force re-scrape after changes
X (summary_large_image)
- Recommended: 1200×675, 16:9
- Minimum: 300×157
- Max file size: 5 MB
- Accepts: PNG, JPEG, WebP, GIF (static first frame)
- If you supply 1200×630, X crops a thin strip from top and bottom
X (summary)
- Recommended: 144×144 minimum, square (1:1)
- Shown as a small thumbnail next to text — use only for compact cards
Slack
- Recommended: 1200×630, 1.91:1
- Max file size: 5 MB
- Cache: 24 hours
- Requires a valid Content-Type header on the image response
Discord
- Recommended: 1280×640, 2:1
- Also accepts: 1200×630, 1.91:1
- Max file size: 8 MB
- Requires og:image:width and og:image:height to render inline previews correctly
- Older desktop clients reject WebP — use PNG or JPEG
iMessage
- Recommended: 1200×630, 1.91:1
- Max file size: 5 MB
- Square-crops to a tile on the iOS lock screen, so keep key content centered
- Recommended: 1200×630, 1.91:1
- Soft cap ~300 KB — larger images are sometimes downgraded or skipped
- Requires og:image to be absolute HTTPS; HTTP is silently ignored
Telegram
- Recommended: 1200×630, 1.91:1
- Max file size: 5 MB
- Honors og:image:width and og:image:height for layout before the image finishes downloading
Why aspect ratio matters more than pixel count
Every platform scales the image to fit its preview card. What it can't fix is the aspect ratio — if you supply a square image to Facebook, it letterboxes or crops heavily. Key content (headline, logo, key visual) should live in the center 66% of the image to survive every platform's crop.
X crops a 1200×630 image top and bottom to hit 16:9. Slack on mobile sometimes square-crops to a thumbnail when space is tight. iMessage on lock screen always square-crops. Designing with a center-safe zone avoids surprises.
File format: PNG vs JPEG vs WebP
| Format | Best for | Compatibility |
|---|---|---|
| PNG | Graphics with text, logos, UI screenshots | Universal |
| JPEG | Photos, gradients, full-bleed imagery | Universal |
| WebP | Smaller file size for the same quality | Breaks on older Slack and Discord clients |
| GIF | Not recommended — first frame only, wastes bytes | Universal but inefficient |
| AVIF | Newer format, tiny files | Not supported by most unfurlers yet |
Recommendation: PNG for anything with text (crisp edges), JPEG for photos. Skip WebP and AVIF until the ecosystem catches up.
File size limits
- Facebook: 8 MB hard cap
- X: 5 MB hard cap
- LinkedIn: 5 MB hard cap
- Discord: 8 MB hard cap
- WhatsApp: 300 KB soft cap (above this, downgrades or skips)
- Practical universal target: under 1 MB for fast unfurls and no surprises
Dynamic OpenGraph images with Satori or @vercel/og
If you have a lot of pages (blog posts, user profiles, product pages), generating OG images by hand is a chore. The modern approach is to render them programmatically with Satori — Vercel's library that turns JSX into SVG, then rasterises to PNG. It runs at the edge in Vercel, Cloudflare Workers, or Node.
import satori from 'satori';
import { Resvg } from '@resvg/resvg-js';
const svg = await satori(
<div style={{ display: 'flex', background: '#0b0d0f', width: 1200, height: 630, color: '#fff' }}>
<h1 style={{ margin: 'auto', fontSize: 72 }}>Hello, OpenGraph</h1>
</div>,
{ width: 1200, height: 630, fonts: [{ name: 'Inter', data: interBuffer, weight: 700 }] }
);
const png = new Resvg(svg).render().asPng();Two constraints to know: Satori uses flexbox only (no grid), and the WASM bundle for Resvg is ~6 MB, which won't fit in strict edge runtimes. For Cloudflare Workers, generate at build time and ship PNG assets — that's the approach env.dev itself uses.
Testing at different sizes
Chrome DevTools' device mode shows how your preview will look, but the ground truth is always the platform's own validator. Use the Facebook Sharing Debugger and LinkedIn Post Inspector for authoritative rendering. For Slack, Discord, and iMessage: paste the link into a test channel or DM to yourself.
Ready to implement? The Meta Tag Generator produces a full tag set with the right og:image:width / og:image:height declarations, and the OpenGraph cheatsheet is the one-page reference.