Every page you share on Bluesky, Twitter/X, Slack, Discord, LinkedIn or Facebook gets judged by its og:image โ and making one per page is the chore everyone postpones. The classic fixes all cost something: opening an image editor for every post, deploying an image-generation function (@vercel/og is great, but it's JSX + a deployment + font files), or paying a card-rendering SaaS.
Mockbird gives you a dynamic og:image URL instead. Put your title in a query string, paste the URL into a <meta> tag, done โ no signup, no deploy, no watermark:
# a 1200x630 PNG social card โ this URL works right now
curl -o card.png "https://mockbird.mockbird.workers.dev/m/demo/og?title=My+launch+post"
# title + muted subtitle + footer with your site name
curl -o card.png "https://mockbird.mockbird.workers.dev/m/demo/og?title=Ship+week&subtitle=everything+we+released+in+May&site=example.com"
And in your page head:
<meta property="og:image"
content="https://mockbird.mockbird.workers.dev/m/demo/og?title=My+launch+post&site=example.com">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
Prefer clicking to typing? The image playground has an OG card tab โ build the URL live with an instant preview.
This is the one endpoint where raster isn't optional: social scrapers don't render SVG. Facebook's crawler, Twitter/X cards, Slack unfurls, Discord embeds and Bluesky link cards all expect PNG/JPEG/GIF/WebP โ an SVG og:image simply shows nothing. So /og serves real PNG bytes by default (8-bit RGBA, decodes anywhere), and keeps an SVG twin behind .svg / ?format=svg for previews and oversized use. Details on where SVG fails: the PNG placeholder guide.
| Param | What it does |
|---|---|
title | the big text โ up to 120 chars, word-wrapped onto up to 4 lines, auto-sized |
subtitle / desc | smaller muted text under the title โ up to 200 chars, up to 3 lines |
site | small footer text with an accent square โ your domain or brand name |
logo=<seed> | deterministic 5ร5 identicon mark bottom-right, in the accent color (same seed โ same mark forever; see identicon API) |
theme | dark (default) or light |
bg / fg / accent | 3- or 6-digit hex without # โ full brand-color control |
seed | picks the accent color deterministically from a palette (otherwise the title picks it) |
/og/:WxH | size override, 120โ2000 per side โ /og/800x418, /og/600x600 square; PNG capped at 1,000,000 px (the default 1200ร630 fits) |
?format=svg or .svg | vector twin โ real system font, any size |
# light theme
curl -o card.png "https://mockbird.mockbird.workers.dev/m/demo/og?title=Light+mode&theme=light"
# brand colors + identicon logo
curl -o card.png "https://mockbird.mockbird.workers.dev/m/demo/og?title=Brand+colors&bg=0b1220&accent=22d3ee&logo=myapp&site=myapp.dev"
# other sizes: 800x418, square, whatever your platform wants
curl -o card.png "https://mockbird.mockbird.workers.dev/m/demo/og/800x418?title=Other+sizes"
Because the card is just a URL, "one og:image per page" stops being a build step. Interpolate the title in whatever renders your pages:
<!-- blog template (any templating language) -->
<meta property="og:image"
content="https://mockbird.mockbird.workers.dev/m/demo/og?title={{ post.title | urlencode }}&site=blog.example.com&logo=blog">
Deterministic + Cache-Control: public means scrapers and CDNs cache each card and identical titles never re-render differently.
The other use is the inverse: you're building the consumer โ a link-preview unfurler, a feed reader, a social app โ and need pages whose og:image is predictable. Point your test fixtures at /og URLs: any title you want, byte-identical on every fetch, no flaky third-party image host. (Your fixtures' pages can be mocked too: custom routes serve HTML with whatever meta tags you like.)
| Mockbird /og | @vercel/og (satori) | card-rendering SaaS | static image per page | |
|---|---|---|---|---|
| Setup | none โ paste a URL | deploy a function, JSX templates, font files | signup + template editor; free tiers are small, then paid | image editor every time |
| Typography | blocky pixel font on PNG (distinctive, legible โ see samples above) | real fonts, full CSS โ wins on brand polish | real fonts, designed templates | anything you can draw |
| Images/screenshots in card | โ (identicon mark only) | โ | โ | โ |
| Dynamic per URL | โ | โ | โ | โ |
| Deterministic bytes | โ | depends on your code | usually | โ |
| Cost | free, no key | free (your hosting) | free tier โ paid | your time |
Being upfront: if you want brand-perfect typography, product screenshots in the card, or complex layouts, @vercel/og (or a paid template service) is the right tool โ satori renders real CSS with real fonts, and this endpoint doesn't try to compete with that. Mockbird's /og is the zero-setup placeholder tier: the dev/staging default, the side project that never got card art, the "unblock me today, polish later" URL. It's also honest about being a pixel font โ which reads as a deliberate aesthetic more often than you'd think.
demo project and work forever. Want your own namespace (and a full mock REST API + placeholder/avatar endpoints alongside it)? One click creates a project โ no signup.Full reference in the docs. More image guides: placeholder image API ยท PNG placeholder API ยท chart image API ยท avatar API ยท identicon API ยท picsum alternative. Create your API โ