CommunityImagegithub.com

og-image-kit

Génère des images de partage Open Graph / Twitter (X) pour chaque page d'un site et configure les balises meta og:* et twitter:*, puis vérifie l'aperçu social. Prend en charge Next.js App Router (opengraph-image.tsx avec next/og ImageResponse), Astro (PNG au moment du build avec satori + resvg) et tout site statique (script Pillow).

Qu'est-ce que og-image-kit ?

Ce kit permet de générer automatiquement des images de partage Open Graph et Twitter pour toutes les pages d'un site web, garantissant ainsi des aperçus sociaux attrayants sur des plateformes comme X (Twitter), LinkedIn, Slack ou WeChat. Il détecte automatiquement la pile technique du projet (Next.js App Router, Astro ou site statique) et applique les configurations appropriées. Pour Next.js, il crée un fichier `opengraph-image.tsx` utilisant `next/og` et `ImageResponse` pour générer dynamiquement les images. Pour Astro, il génère des PNG au moment du build avec `satori` et `@resvg/resvg-js`. Pour les sites statiques (Hugo, Jekyll, HTML simple, SPA Vite), il utilise un script Python basé sur Pillow. Le kit inclut un script de vérification (`check_og.py`) qui valide que chaque page contient bien les balises requises (`og:title`, `og:description`, `og:image`, `twitter:card`), que l'URL de l'image est absolue et accessible, et que l'image respecte les dimensions (1200×630) et la taille. Il met également en garde contre le cache des plateformes sociales et recommande d'utiliser leurs débogueurs respectifs après le déploiement.

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

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait og-image-kit ?

Objectif : chaque page publique dispose d'une image de partage 1200×630 et des balises og:* / twitter:* correctes, et vous les avez vérifiées avec scripts/check_og.py, pas seulement écrites.

Étape 1 — Détecter la pile

Examinez le dépôt avant d'écrire quoi que ce soit :

SignalPileAller à
next dans package.json et un répertoire app/ (ou src/app/)Next.js App RouterÉtape 2A
next avec uniquement pages/Next.js Pages RouterÉtape 2C (statique) ou ajouter /api/og avec ImageResponse
astro dans package.jsonAstroÉtape 2B
HTML simple, Hugo, Jekyll, SPA Vite, autre choseStatiqueÉtape 2C

Trouvez aussi : l'URL de base canonique du site (variable d'environnement comme NEXT_PUBLIC_SITE_URL, site dans astro.config.*), les couleurs de la marque, le logo et la police utilisée. Ne demandez à l'utilisateur que si rien ne peut être trouvé.

Étape 2A — Next.js App Router

  1. Assurez-vous que la mise en page racine exporte metadataBase (les URL OG doivent être absolues) :
    export const metadata = { metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000") }
    
  2. Copiez assets/nextjs/opengraph-image.tsx vers app/opengraph-image.tsx (image par défaut du site). Modifiez BRAND, les couleurs et le slogan.
  3. Pour les routes dynamiques (articles de blog, produits), copiez-le dans le segment de route, par ex. app/blog/[slug]/opengraph-image.tsx, et utilisez assets/nextjs/dynamic-opengraph-image.tsx, qui lit params et charge le titre depuis votre source de données. Dans Next.js 15+, params est une promesse — utilisez await.
  4. Ajoutez également twitter-image.tsx uniquement si la carte X doit différer ; sinon Next.js réutilise l'image OG lorsque vous définissez twitter: { card: "summary_large_image" } dans les métadonnées.
  5. Texte par page : définissez title et description dans les metadata / generateMetadata de chaque page.
  6. Polices personnalisées : chargez un fichier TTF/OTF (pas WOFF2) via fetch(new URL("./Inter-Bold.ttf", import.meta.url)) ou readFile. Le texte CJK nécessite une police CJK, sinon il s'affiche sous forme de boîtes — réduisez-la en sous-ensemble.

Limites à respecter (next/og / satori) : flexbox uniquement (pas de grille), chaque div avec plusieurs enfants nécessite display: "flex", gardez le bundle petit — la documentation ImageResponse de Next.js liste une limite de 500 Ko pour JSX + CSS + polices + images. Les grandes polices ralentissent aussi le rendu, réduisez-les en sous-ensemble.

Étape 2B — Astro

Utilisez assets/astro/og-endpoint.ts comme src/pages/og/[...slug].png.ts. Il génère un PNG par page au moment du build avec satori + @resvg/resvg-js (npm i satori @resvg/resvg-js), et vous le référencez depuis votre mise en page :

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

Astro.site doit être défini dans astro.config.mjs. Fichier de police : placez un TTF dans src/assets/fonts/.

Étape 2C — Sites statiques / autre

Générez les PNG une fois et commitez-les :

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

pages.json est une liste de {"slug": "pricing", "title": "...", "subtitle": "..."} (voir assets/pages.example.json). Nécessite Pillow (pip install pillow). Passez --font path/to/font.ttf pour les polices de marque ou le texte CJK (ex. Noto Sans SC). Ajoutez ensuite les balises à chaque page (modèle dans references/meta-tags.md).

Étape 3 — Balises requises (chaque page)

<meta property="og:title" content="Titre de la page" />
<meta property="og:description" content="Une phrase, ≤ ~160 caractères" />
<meta property="og:image" content="https://example.com/og/page.png" />   <!-- URL absolue -->
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://example.com/page" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary_large_image" />

Next.js les génère à partir de metadata + opengraph-image.tsx ; ne les écrivez pas manuellement en double.

Étape 4 — Vérifier (ne sautez pas)

Exécutez contre le site en cours d'exécution (serveur de développement, déploiement de prévisualisation ou production) :

python3 scripts/check_og.py http://localhost:3000/ http://localhost:3000/pricing
python3 scripts/check_og.py --json https://example.com/   # lisible par machine

Il récupère chaque page, vérifie les balises requises, que og:image est absolue, accessible, un type de contenu image, ~1.91:1 et au moins 600 px de large, et moins de 5 Mo. Code de sortie 1 en cas d'erreur. Corrigez tout ce qui est marqué ERROR ; les éléments WARN sont des recommandations.

Remarque : les plateformes sociales mettent en cache les aperçus. Après correction, utilisez le débogueur de la plateforme (LinkedIn Post Inspector, Facebook Sharing Debugger) pour re-extraire. X n'a plus de validateur public ; publiez dans un brouillon/DM pour vérifier. Les URL localhost ne peuvent pas être extraites par ces outils — déployez d'abord.

Règles de conception pour l'image

  • 1200×630, PNG, texte dans une marge de sécurité d'environ 60 px ; titre ≤ ~60 caractères, max 3 lignes.
  • Contraste élevé ; elle est affichée en petit (~500 px de large) dans les flux. Testez à 50 % de zoom.
  • Incluez le nom/logo de la marque ; évitez le petit texte (< 28 px à 1200 de large).
  • Voir references/platform-specs.md pour les notes par plateforme.

Terminé quand

  • Chaque page indexable retourne og:title, og:description, og:image (absolue), twitter:card
  • check_og.py se termine avec le code 0 pour la page d'accueil et au moins une page de chaque type de route
  • Les images sont correctes (ouvrez un PNG et regardez-le)

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 associés