Skip to content

feat(seo): Discord link previews (component embeds) - #44

Open
Zallom wants to merge 4 commits into
masterfrom
feat/discord-component-embeds
Open

Zallom wants to merge 4 commits into
masterfrom
feat/discord-component-embeds

Conversation

@Zallom

@Zallom Zallom commented Sep 18, 2026

Copy link
Copy Markdown
Member

Discord documents a way for a site to replace its Open Graph card with a layout built from Discord components: discord/discord-api-docs#8606.

The og-images plugin becomes social-preview and now handles both: the OG image and the Discord card. When a link to the site is pasted into Discord, the card carries the site's accent color, the page title and description, its image, and buttons to the documentation, the support server and the bot invite, in the language of the page.

Hub pages get their own card: the blog lists its two latest posts, the glossary three featured articles, and the documentation home points to the entry pages. 95 pages per locale, 475 cards in total. Open Graph tags stay in place and serve as the fallback.

Along the way, themeConfig.image is removed: react-helmet and the plugin were both writing og:image, so there is now a single writer per page.

Before merging

Discord's crawler must be able to get through. Tested in production: Discordbot/2.0 gets a 200 on both pages and images.

Le plugin ne se limitera plus aux images Open Graph : il va aussi porter
l'aperçu des liens dans Discord. Le nom du dossier, celui du plugin, les
logs et le dossier de cache suivent.
@Zallom Zallom changed the title feat(seo): aperçu des liens dans Discord (component embeds) feat(seo): Discord link previews (component embeds) Sep 18, 2026
Discord permet maintenant à un site de remplacer la carte Open Graph par
une mise en page construite avec ses propres composants, via un payload
`discord:component-embed` posé dans le <head> (discord/discord-api-docs#8606).

La passe tourne après la génération des images : elle relit le HTML déjà
écrit, donc elle récupère l'image OG de la page sans dupliquer la logique
de nommage. Chaque carte porte la couleur du site, le titre et la
description de la page, son image, et une rangée de boutons vers la
documentation, le support et l'invitation du bot, dans la langue de la
page.
Sur une page de hub, reprendre le gabarit générique ne dit rien de ce
qu'on y trouve. Le blog liste ses deux derniers articles et le glossaire
trois articles à la une, chacun avec sa vignette ; l'accueil de la
documentation pointe vers l'installation, les fonctionnalités, les
commandes et les dysfonctionnements.

Les titres de ces entrées sont lus dans les pages cibles, donc ils sont
déjà traduits. Les deux hubs qui listent des entrées se passent de la
grande image en tête : les vignettes suffisent, et la carte reste lisible.
Deux acteurs écrivaient la balise : react-helmet la posait depuis
`themeConfig.image`, le plugin la réécrivait ensuite dans le HTML. Le
crawler lisait la bonne valeur, le DOM affichait l'ancienne après
hydratation.

On retire donc la valeur par défaut du thème. Le plugin devient seul
responsable, sauf pour les articles de blog qui gardent l'image de leur
frontmatter. Les pages sans carte dédiée reçoivent celle de l'accueil,
ce qui supprime au passage la dernière dépendance à une image externe.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant