Forge social images in your pipeline.
og-forge renders crisp 1200×630 Open Graph cards for any repo or site — straight from a workflow step. Satori draws the SVG, resvg bakes the PNG, fonts ship vendored in the box. No Puppeteer, no Chrome, no external service. Commit the image; every share looks intentional.
Three layouts. Light and dark. Rendered, not mocked.
Every card below is a real PNG produced by node render.mjs — the exact
code the Action runs. Point the template and theme inputs at whichever fits the page.






Paste one job. Get an image on every push.
Drop this into .github/workflows/. og-forge writes the PNG into your
workspace; upload it, commit it, or attach it to a release — your call.
name: forge-og on: [push] jobs: og: runs-on: ubuntu-latest steps: - uses: percymcn/og-forge@v0.1 with: title: "Why we killed the headless browser" description: "Satori + resvg, 40ms a card." template: blog # default | blog | article theme: dark # dark | light domain: blog.example.dev tag: ENGINEERING author: Dana Okafor output: public/og.png # -> then commit public/og.png, or upload-artifact, etc.
Reference the Action
One uses: line pins og-forge at a released tag. No install, no service key.
Pass your copy
Title, template, theme and a few labels. Everything else has sane defaults.
Ship the PNG
The image lands in your workspace at output. Commit it and set <meta og:image>.
Boring tech, on purpose.
satori lays out the card as an SVG from plain style objects. resvg rasterizes it to a pixel-perfect PNG. Fonts (Noto Serif · Noto Sans · JetBrains Mono, all SIL OFL) are committed to the repo, so a render is byte-for-byte reproducible on any runner with zero network calls. The whole engine is a few hundred lines you can read in one sitting.