Social cards & OG images

Satori

La bibliothèque open source de Vercel qui transforme JSX et CSS en SVG — le moteur derrière les images Open Graph dynamiques

vercel/satoriTypeScript13,746 as of 2026-08-07
By Jake Luo · Published 7 août 2026

Satori est une bibliothèque open source de Vercel qui rend du JSX et un sous-ensemble de CSS sous forme de SVG, que l'on convertit ensuite en PNG. C'est le moteur qui se cache sous la génération d'images Open Graph de Vercel et sous l'ImageResponse de Next.js : la plupart des gens qui produisent des cartes sociales l'utilisent donc sans le nommer. Pour une fondatrice ou un fondateur, il règle proprement un problème de distribution bien précis : chaque lien que vous partagez, et chaque lien que quelqu'un d'autre partage, embarque une image d'aperçu — et Satori permet de la générer à partir de vos données au lieu de la dessiner à la main, page après page.

Ce qu'est Satori

Satori (github.com/vercel/satori) prend un élément JSX et renvoie une chaîne SVG. Il est écrit en TypeScript et publié sous licence MPL-2.0. Vous lui passez un arbre d'éléments simples et une police sous forme de buffer, il calcule la mise en page avec Yoga — le moteur flexbox qu'utilise React Native — et vous rend une sortie vectorielle que vous convertissez en PNG. Il fonctionne dans le navigateur, dans Node 16 ou plus et dans les Web Workers, ses dépendances WebAssembly étant embarquées.

Ce n'est délibérément pas un navigateur, et ce sont les contraintes qui font l'intérêt. Le JSX doit être pur et sans état : pas de hooks React, pas de dangerouslySetInnerHTML. Il n'y a ni balise style, ni feuille de style externe, ni script ; tous les styles sont en ligne. La prise en charge de CSS est un sous-ensemble documenté, `display` vaut `flex` par défaut et n'accepte que `flex`, `contents` ou `none`, et le projet indique explicitement que la sortie ne promet pas de correspondre au pixel près à un navigateur. La plupart des gens ne touchent jamais la bibliothèque directement : ils la rencontrent via `next/og` ou la génération d'images OG de Vercel, qui l'enveloppent d'un rastériseur et d'une réponse HTTP. Il existe aussi un bac à sable en direct sur og-playground.vercel.app, le moyen le plus rapide de savoir si une mise en page est exprimable.

Là où une image d'aperçu gagne sa place

Une carte sociale est le seul élément créatif qui voyage automatiquement avec un lien. Vous ne choisissez pas où elle apparaît, et les surfaces où elle compte le plus sont précisément celles que vous voyez le moins :

  • Partages privés Un lien collé dans Slack, WhatsApp ou un message direct se déplie en carte, et cette carte constitue tout l'argumentaire pour quelqu'un qui n'a jamais entendu parler de vous. Ce trafic arrive sans référent et atterrit en Direct — l'angle mort du dark social. Autrement dit, la carte accomplit un travail que vous ne verrez jamais attribué.
  • Par page, pas par site Une seule carte faite à la main pour tout le domaine, et chacune de vos pages se ressemble dans un fil d'actualité. Des cartes générées permettent à une page de comparaison, à une note de version et à une page de documentation d'afficher chacune son propre titre : la différence entre un lien qui dit "un site web" et un lien qui dit "la réponse que vous cherchiez".
  • Pages programmatiques Si vous publiez des pages sur gabarit à la moindre échelle — SEO programmatique, fiches d'annuaire, pages d'atterrissage par intégration —, dessiner les cartes à la main devient impraticable vers la trentième page. La génération est la seule version qui survit au contact d'un grand ensemble de pages.

Soyons honnêtes sur le plafond : `og:image` n'est pas un signal de classement, et aucune carte ne sauve une page que personne n'a envie de partager. Elle modifie le taux de clic des partages qui allaient de toute façon avoir lieu — un effet réel mais borné, plus proche en ampleur d'une bonne balise title que d'un nouveau canal.

Ce que nous a appris notre propre carte

Nous générons la carte sociale d'AgentCeres — le Directeur de la croissance par l'IA, sur agentceres.com — avec `next/og`, donc avec Satori en dessous, et deux choses nous ont coûté plus cher que la carte elle-même. La première fut une erreur de routage sans le moindre message : le fichier de convention se trouvait un segment au-dessus de la mise en page dont dépendent réellement toutes les pages, si bien qu'aucune image n'était produite et que la route renvoyait un 404, en silence, en production, jusqu'à ce que nous le découvrions le 14 juillet 2026. Rien ne vous alerte : une image d'aperçu absente ressemble exactement à une image d'aperçu que vous n'avez pas regardée, et vous ne le remarquez qu'en collant votre propre lien quelque part et en le voyant revenir nu. Si vous générez des cartes, ajoutez une vérification qui appelle la route de l'image et exige un code 200.

La seconde a coûté moins cher, mais elle est universelle : les règles de mise en page de Satori ne sont pas celles du navigateur. Chaque conteneur de notre carte porte un `display: flex` explicite, la marque est intégrée en URI de données base64 plutôt que récupérée, et la carte est prérendue par langue afin d'être un fichier statique plutôt qu'un rendu à la volée à chaque passage de robot. Rien d'exotique là-dedans : c'est la forme vers laquelle converge un gabarit Satori dès qu'on cesse d'écrire le CSS qu'on écrirait pour une page. L'outil, c'est un quart d'heure de travail ; décider ce qu'un inconnu doit voir quand votre lien apparaît dans la fenêtre de conversation de quelqu'un d'autre, voilà la partie qui mérite réflexion.

FAQ

Satori et @vercel/og, est-ce la même chose ?
Non. Satori est la bibliothèque de mise en page et de rendu qui transforme du JSX en SVG. @vercel/og — et l'ImageResponse de Next.js, exporté depuis next/og — l'enveloppe d'un rastériseur qui convertit le SVG en PNG et d'une réponse HTTP adaptée au cache. La plupart des applications veulent l'enveloppe. On passe directement par Satori lorsqu'on veut une sortie SVG ou qu'on travaille hors de Next.js.
Les images Open Graph dynamiques aident-elles le SEO ?
Pas directement : og:image n'est pas un signal de classement, et Google ne remonte pas une page parce que son aperçu est plus joli. L'effet est sur la distribution : la carte détermine si un lien partagé est cliqué dans un fil ou dans une conversation. Jugez-la au taux de clic sur les partages, pas à la performance en recherche.
Quelles sont les principales limites ?
La prise en charge de CSS est un sous-ensemble documenté, résolu par le moteur flexbox de Yoga : les mises en page en bloc ou en grille ne se comportent donc pas comme dans un navigateur. Les balises style et les feuilles de style externes ne sont pas gérées, les polices doivent être fournies sous forme de buffers, le JSX doit être pur et sans état, et le projet indique clairement que la sortie ne promet pas de correspondre exactement au rendu d'un navigateur. Le rendu ralentit aussi à mesure que vous chargez davantage de polices et d'émojis par image.
Faut-il générer les cartes à la requête ?
Non, et souvent il vaut mieux éviter. Si vos pages sont connues au moment de la compilation, prérendez les images pour que chacune soit un fichier statique servi depuis le cache plutôt qu'un appel de fonction à chaque visite de robot. Nous prérendons les nôtres par langue exactement pour cette raison. La génération à la requête s'impose quand la carte reflète des données qui changent : un chiffre en direct, le nom d'un utilisateur, un rapport daté.
Related projects
Next SEOComposants React sous licence MIT pour les données structurées dans les projets Next.jsDubOpen-source link management and attribution for modern marketing teamsWebstudioConstructeur de sites visuel open source — une alternative à Webflow que vous hébergez vous-même

You built it. Now grow it.

AgentCeres is a managed AI marketing team — specialists draft the SEO, social, and outreach that fill your links, you approve what ships. 14-day free trial, from $39/month.

Start free trialMore projects