You're viewing OG Image v6 beta documentation. For stable docs, switch to v5. Release Notes
Og Image

Renderers

Last updated by Harlan Wilton in feat!: rename chromium renderer to browser, add cloudflare support (#461) * feat!: rename chromium renderer to browser, add cloudflare support BREAKING CHANGES: - Renamed `chromium` renderer to `browser` - Component suffix `.chromium.vue` → `.browser.vue` - Config `chromium: 'playwright'` → `browser: { provider: 'playwright' }` - Internal: `useChromiumRenderer()` → `useBrowserRenderer()` New features: - Cloudflare Browser Rendering support via `@cloudflare/puppeteer` - New config: `browser: { provider: 'cloudflare', binding: 'BROWSER' }` - Auto-fallback for cloudflare provider: chrome-launcher (dev), playwright (prerender), cloudflare (runtime) - Playwright/Puppeteer API compatibility layer in screenshot.ts * docs: add chromium→browser migration and cloudflare support docs - Add chromium→browser rename section to v6 migration guide - Document cloudflare browser rendering setup in browser renderer docs - Add configuration examples for cloudflare provider * fix: resolve type errors for browser renderer refactor - Update ProviderName type: 'chromium' → 'browser' in dependencies.ts - Add BrowserConfig import and browser property to ModuleOptions - Update createBrowser type declaration to accept optional H3Event - Fix cloudflare binding to use lazy-loaded puppeteer with local types - Fix colorPreference comparison (remove impossible 'no-preference' check) - Update defineOgImageScreenshot renderer to 'browser' - Update client/pages/index.vue chromium → browser in templates * chore: remove working files that should not be committed.

Nuxt OG Image supports three rendering engines, each with different trade-offs.

Comparison

FeatureSatoriTakumiBrowser
SpeedFastFastest (2-10x)Slow
Edge Runtime
CSS SupportPartialLimitedFull
Gradients
Opacity
Complex FlexboxPartial
ShadowsPartial
Emoji✅ 6 families✅ COLR fonts
FontsGoogle Fonts, localWOFF2, variableAny
DependenciesBuilt-in@takumi-rs/coreplaywright
Best ForDefault, most templatesHigh-throughput, simple templatesComplex designs, prerender only

Environment Compatibility

EnvironmentSatoriTakumiBrowser
Node.js@takumi-rs/coreplaywright
Prerender / CI✅ Auto-installs
AWS Lambda❌ Binary too large
Vercel
Vercel Edge✅ WASM✅ WASM
Netlify
Netlify Edge✅ WASM✅ WASM
Cloudflare Workers✅ WASM✅ WASM
Cloudflare Pages✅ WASM✅ WASM
StackBlitz✅ WASM✅ WASM

Binding Types

Each renderer can use different bindings depending on the environment:

  • node - Default Node.js binding, best performance
  • wasm - WebAssembly binding for edge runtimes and workers
  • wasm-fs - WebAssembly with filesystem access (dev environments like StackBlitz)
  • false - Disabled

Provider Notes

AWS Lambda, Netlify, Vercel (Serverless)

  • Browser unavailable (binary too large)
  • Sharp unavailable (post-install script issues)

Vercel Edge, Netlify Edge, Cloudflare Pages

  • Satori and Takumi use WASM automatically
  • Browser and Sharp unavailable

Cloudflare Workers

  • Satori and Takumi use WASM automatically
  • Browser and Sharp unavailable
  • Some limitations with custom fonts and images (issue #63)

Overriding Compatibility

You can override the default compatibility settings:

nuxt.config.ts
export default defineNuxtConfig({
  ogImage: {
    compatibility: {
      // disable browser for prerendering (skips install in CI)
      prerender: {
        browser: false
      },
      // force WASM binding at runtime
      runtime: {
        resvg: 'wasm'
      }
    }
  }
})

Component Naming Convention

OG Image components must include the renderer in their filename:

components/OgImage/
  MyTemplate.satori.vue    # Satori renderer
  MyTemplate.takumi.vue    # Takumi renderer
  Screenshot.browser.vue   # Browser renderer

This enables:

  • Automatic renderer detection - no need to specify renderer in defineOgImage()
  • Tree-shaking - unused renderer code is excluded from production builds
Multiple renderers for the same component name are supported.You can create both MyTemplate.satori.vue and MyTemplate.takumi.vue. When calling defineOgImage({ component: 'MyTemplate' }), the first registered variant is used. To select a specific renderer, use dot notation:
defineOgImage({ component: 'MyTemplate.takumi' })
You can also use PascalCase: 'MyTemplateTakumi'.

Choosing a Renderer

The renderer is determined by the component filename suffix — there is no global defaults.renderer config.

Use Satori (Default)

Satori works for most use cases. Create your component with a .satori.vue suffix:

components/OgImage/MyTemplate.satori.vue

Use Takumi

Choose Takumi when you need maximum performance with simple templates that use solid colors:

components/OgImage/MyTemplate.takumi.vue

Use Browser

Choose Browser when you need full CSS support and are prerendering all images at build time:

components/OgImage/MyTemplate.browser.vue
Browser is slow and doesn't work on most hosting providers at runtime. Only use it for prerendering.

Zero Runtime Mode

If you're prerendering all OG images at build time, enable Zero Runtime mode to remove all renderer code from your production bundle (81% smaller Nitro output).

nuxt.config.ts
export default defineNuxtConfig({
  ogImage: {
    zeroRuntime: true
  }
})

This works with any renderer and is ideal when your OG images don't change dynamically.

Did this page help you?