# OG Image Generation
Dynamic Open Graph image generation using Vue components.
## Quick Start
```ts
// Component-first (recommended)
defineOgImage('NuxtSeo', { title: 'My Page Title' })
// Object syntax
defineOgImage({ component: 'NuxtSeo', title: 'My Page Title' })
// Disable OG image
defineOgImage(false)
```
## Built-in Template
The `NuxtSeo` template supports:
```ts
defineOgImage('NuxtSeo', {
title: 'Hello World',
description: 'My description',
theme: '#3b82f6',
colorMode: 'dark',
icon: 'carbon:cloud',
siteName: 'My Site',
siteLogo: '/logo.png'
})
```
## Multiple Images Per Page
Use `key` for platform-specific images:
```ts
// Default OG image (1200x600)
defineOgImage('NuxtSeo', { title: 'Default' })
// Square for WhatsApp (800x800)
defineOgImage('NuxtSeo', {
title: 'Square',
key: 'square',
width: 800,
height: 800
})
```
## Custom Vue Components
Create in `components/OgImage/`:
```vue
{{ title }}
By {{ author }}
```
Use in pages:
```ts
defineOgImage('OgImageBlog', { title: 'My Post', author: 'John' })
```
## Renderers
| Renderer | Speed | CSS Support | Edge | Best For |
| -------- | ----- | ----------- | ---- | -------------------------- |
| satori | Fast | Partial | ✅ | Default, most templates |
| chromium | Slow | Full | ❌ | Complex designs, prerender |
```ts
export default defineNuxtConfig({
ogImage: {
defaults: { renderer: 'satori' }
}
})
```
### Satori Limitations
- No `display: grid` - use `flex`
- No `position: absolute` without explicit dimensions
- Fonts: use `@nuxt/fonts` with `global: true` for best results
## Configuration
```ts
export default defineNuxtConfig({
ogImage: {
defaults: {
component: 'NuxtSeo',
width: 1200,
height: 600,
cacheMaxAgeSeconds: 60 * 60 * 24 * 3 // 3 days
},
// For static sites
zeroRuntime: true
}
})
```
## Nuxt Content
Frontmatter:
```yaml
---
ogImage:
component: OgImageBlog
props:
author: John Doe
---
```
With `asSeoCollection()` (see main SKILL.md):
```vue
```
## Debug
- Preview: `/__og-image__/image/[path]/og.png`
- Inspector: Enable `ogImage: { debug: true }` in config
## Screenshots
Capture page as OG image (requires Chromium):
```ts
defineOgImageScreenshot({
colorScheme: 'dark',
mask: '.navigation, .footer',
selector: '.article-content'
})
```
## Route Rules
```ts
export default defineNuxtConfig({
routeRules: {
'/blog/**': { ogImage: { component: 'OgImageBlog' } },
'/admin/**': { ogImage: false }
}
})
```
## Deployment
Community templates are dev-only. Before deploying, eject:
```bash
npx nuxt-og-image eject NuxtSeo
```