CommunityImagengithub.com

og-image-kit

Genera imágenes de Open Graph / Twitter (X) para cada página de un sitio web, configura las etiquetas og:* y twitter:*, y verifica la vista previa social. Compatible con Next.js App Router, Astro y sitios estáticos.

¿Qué es og-image-kit?

og-image-kit es una habilidad especializada para generar y verificar imágenes de tarjetas sociales (Open Graph y Twitter Card) de 1200×630 píxeles para cada página pública de un sitio web. Su principal ventaja es que no solo crea las imágenes, sino que también configura todas las etiquetas meta necesarias (og:title, og:description, og:image, twitter:card) y las verifica automáticamente con un script de Python, asegurando que los enlaces se vean correctamente en plataformas como X (Twitter), LinkedIn, Slack y WeChat. Soporta tres stacks: Next.js App Router (usando opengraph-image.tsx con ImageResponse), Astro (generación en tiempo de compilación con satori + resvg) y cualquier sitio estático (usando un script Python con Pillow). La habilidad detecta automáticamente el stack del proyecto, configura los archivos necesarios, y ejecuta un verificador que comprueba que cada imagen sea accesible, tenga el tamaño correcto y cumpla con las especificaciones de las plataformas. Es ideal para usar antes del lanzamiento de un sitio o cuando un usuario reporta que sus enlaces se ven mal en redes sociales.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/getpaidskills/skills/tree/HEAD/skills/og-image-kit

Installed? Explore more Imagen skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace og-image-kit?

Objetivo: que cada página pública tenga una imagen de 1200×630 píxeles y las etiquetas og:* / twitter:* correctas, y que hayas verificado todo con scripts/check_og.py, no solo escrito el código.

Paso 1 — Detectar el stack

Revisa el repositorio antes de escribir nada:

SeñalStackIr a
next en package.json y un directorio app/ (o src/app/)Next.js App RouterPaso 2A
next solo con pages/Next.js Pages RouterPaso 2C (estático) o añadir /api/og con ImageResponse
astro en package.jsonAstroPaso 2B
HTML plano, Hugo, Jekyll, Vite SPA, cualquier otra cosaEstáticoPaso 2C

También encuentra: la URL base canónica del sitio (variable de entorno como NEXT_PUBLIC_SITE_URL, site en astro.config.*), los colores de la marca, el logotipo y la fuente en uso. Pregunta al usuario solo si no se encuentra nada.

Paso 2A — Next.js App Router

  1. Asegúrate de que el layout raíz exporte metadataBase (las URLs de OG deben ser absolutas):
    export const metadata = { metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000") }
    
  2. Copia assets/nextjs/opengraph-image.tsx a app/opengraph-image.tsx (imagen por defecto del sitio). Edita BRAND, colores y eslogan.
  3. Para rutas dinámicas (posts de blog, productos) cópialo en el segmento de ruta, por ejemplo: app/blog/[slug]/opengraph-image.tsx, y usa assets/nextjs/dynamic-opengraph-image.tsx, que lee params y carga el título desde tu fuente de datos. En Next.js 15+ params es una Promesa — usa await.
  4. Añade también twitter-image.tsx solo si la tarjeta de X debe ser diferente; de lo contrario Next.js reutiliza la imagen de OG cuando configuras twitter: { card: "summary_large_image" } en metadata.
  5. Texto por página: establece title y description en metadata / generateMetadata de cada página.
  6. Fuentes personalizadas: carga un archivo TTF/OTF (no WOFF2) mediante fetch(new URL("./Inter-Bold.ttf", import.meta.url)) o readFile. El texto CJK necesita un archivo de fuente CJK o se mostrará como cuadros — subconjunta la fuente para reducir el tamaño.

Límites a respetar (next/og / satori): solo flexbox (sin grid), cada div con múltiples hijos necesita display: "flex", mantén el paquete pequeño — la documentación de ImageResponse de Next.js menciona un límite de 500 KB para JSX + CSS + fuentes + imágenes. Las fuentes grandes también ralentizan el renderizado, así que subconjúntalas.

Paso 2B — Astro

Usa assets/astro/og-endpoint.ts como src/pages/og/[...slug].png.ts. Genera un PNG por página en tiempo de compilación con satori + @resvg/resvg-js (npm i satori @resvg/resvg-js), y lo referencias desde tu layout:

<meta property="og:image" content={new URL(`/og/${slug}.png`, Astro.site)} />

Astro.site debe estar configurado en astro.config.mjs. Archivo de fuente: coloca un TTF en src/assets/fonts/.

Paso 2C — Sitios estáticos / cualquier otra cosa

Genera los PNG una sola vez y haz commit:

python3 scripts/generate_og.py --pages pages.json --out public/og --brand "Acme" --bg "#0f172a" --fg "#ffffff" --accent "#38bdf8"

pages.json es una lista de {"slug": "pricing", "title": "...", "subtitle": "..."} (consulta assets/pages.example.json). Requiere Pillow (pip install pillow). Pasa --font ruta/a/fuente.ttf para fuentes de marca o texto CJK (por ejemplo, Noto Sans SC). Luego añade las etiquetas a cada página (plantilla en references/meta-tags.md).

Paso 3 — Etiquetas requeridas (cada página)

<meta property="og:title" content="Título de la página" />
<meta property="og:description" content="Una oración, ≤ ~160 caracteres" />
<meta property="og:image" content="https://ejemplo.com/og/pagina.png" />   <!-- URL absoluta -->
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://ejemplo.com/pagina" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary_large_image" />

Next.js genera estas a partir de metadata + opengraph-image.tsx; no escribas duplicados manualmente.

Paso 4 — Verificar (no lo saltes)

Ejecuta contra el sitio en funcionamiento (servidor de desarrollo, despliegue de previsualización o producción):

python3 scripts/check_og.py http://localhost:3000/ http://localhost:3000/pricing
python3 scripts/check_og.py --json https://ejemplo.com/   # legible por máquina

Obtiene cada página, verifica las etiquetas requeridas, que og:image sea absoluta, accesible, con tipo de contenido de imagen, relación ~1.91:1, al menos 600 px de ancho y menos de 5 MB. Código de salida 1 en caso de error. Corrige todo lo marcado como ERROR; los elementos WARN son recomendaciones.

Nota: las plataformas sociales almacenan en caché las vistas previas. Después de corregir, usa el depurador de cada plataforma (LinkedIn Post Inspector, Facebook Sharing Debugger) para que vuelvan a escanear. X ya no tiene un validador público; publica en un borrador/DM para verificar. Las URLs de localhost no pueden ser escaneadas por esas herramientas — despliega primero.

Reglas de diseño para la imagen

  • 1200×630, PNG, texto dentro de un margen seguro de ~60 px; título ≤ ~60 caracteres, máximo 3 líneas.
  • Alto contraste; se muestra pequeño (~500 px de ancho) en los feeds. Pruébalo con zoom al 50%.
  • Incluye nombre/logotipo de la marca; evita texto pequeño (< 28 px a 1200 de ancho).
  • Consulta references/platform-specs.md para notas específicas de cada plataforma.

Terminado cuando

  • Cada página indexable devuelve og:title, og:description, og:image (absoluta), twitter:card
  • check_og.py sale con 0 para la página de inicio y al menos una página de cada tipo de ruta
  • Las imágenes se ven bien (abre un PNG y míralo)

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

getpaidskills/agents-md-starter

Creates or upgrades a repository's AGENTS.md (read by Codex, Cursor, and other agents) and a CLAUDE.md that imports it, so Claude Code, Codex, Cursor and Gemini CLI share one set of project rules. Scans the repo to detect languages, package manager, real build/test/lint commands, framework, directory layout and existing rule files (.cursorrules, .cursor/rules, CLAUDE.md, copilot-instructions), then writes a concise, verified rules file. Use when the user asks to set up AGENTS.md or CLAUDE.md, "project rules", "make Claude Code and Codex follow the same conventions", onboard an agent to a repo, or migrate .cursorrules.

getpaidskills/directory-launch-kit

Prepares a product for submission to launch platforms and directories (Product Hunt, Show HN, BetaList, Uneed, Fazier, SaaSHub, TinyLaunch, AI tool directories, agent-skill marketplaces, Reddit, V2EX and more) without submitting anything itself. Picks only the directories the product fits, writes the copy for each form within its field limits from one product.json, resizes screenshots to each platform's sizes (Product Hunt 1270x760 gallery and 240x240 thumbnail, 1200x630 OG), builds a tracker CSV, re-checks prices and rules on the live pages, and later verifies which listings went live and whether their backlinks are follow or nofollow. Use when the user asks where to launch, how to submit to Product Hunt or AI directories, wants launch copy, a directory list, backlinks, or a launch tracker.

getpaidskills/launch-checklist

Pre-launch audit for a website or SaaS - checks SEO tags (title, description, canonical, lang, Open Graph), robots.txt, sitemap.xml, favicon and apple-touch-icon, real 404 status, HTTPS redirect, legal pages (privacy, terms, refund), image alt text, page weight and response time, plus a payment self-check (webhook signature, raw body, idempotency, refunds, secrets, success-page grants), then lists the problems and fixes them in the codebase. Ships a no-dependency crawler script (audit_site.py) that produces a pass/warn/fail report. Use when the user says they are about to launch, ship, go live, submit to Product Hunt or AI directories, or asks "is my site ready", "SEO check", "why is my site not indexed", or wants a launch checklist, or asks whether their payment or webhook setup is safe.

getpaidskills/legal-pages

Drafts a Privacy Policy, Terms of Service and Refund Policy for a SaaS, digital product or website from a short questionnaire, adapted to the payment provider (Creem, Paddle, Lemon Squeezy as Merchant of Record, or Stripe/direct) and to where users are (EU/UK GDPR, California CCPA/CPRA, China PIPL notes), then renders them as Markdown, HTML or Next.js pages and links them in the footer. Output is a starting template, NOT legal advice - the user must review it and have it checked by a qualified lawyer. Use when the user needs privacy policy, terms, refund policy, legal pages, or a payment provider (Paddle/Creem/Lemon Squeezy/Stripe) review asks for them.

Skills relacionados