From 17b69234497d582371c8bb5902f9bf7321d7764e Mon Sep 17 00:00:00 2001 From: RockChinQ Date: Mon, 21 Sep 2026 10:52:23 +0000 Subject: [PATCH] design: use clean branded documentation social preview --- docs.json | 8 +++++++- images/social/docs-v2.png | Bin 0 -> 34716 bytes package.json | 2 +- press.config.tsx | 3 +++ tests/social-preview.test.mjs | 20 ++++++++++++++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 images/social/docs-v2.png create mode 100644 tests/social-preview.test.mjs diff --git a/docs.json b/docs.json index 92dd1f2a9..6a19e6760 100644 --- a/docs.json +++ b/docs.json @@ -20,7 +20,13 @@ "metatags": { "og:site_name": "LangBot Docs", "twitter:card": "summary_large_image", - "og:image": "https://langbot.app/og-image.png" + "og:image": "https://langbot.app/docs/images/social/docs-v2.png", + "og:image:width": "1200", + "og:image:height": "630", + "og:image:type": "image/png", + "og:image:alt": "LangBot Docs — Build. Connect. Extend.", + "twitter:image": "https://langbot.app/docs/images/social/docs-v2.png", + "twitter:image:alt": "LangBot Docs — Build. Connect. Extend." } }, "navbar": { diff --git a/images/social/docs-v2.png b/images/social/docs-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..acbe3d670bade82b7b50b6e65cb9ae3a329d6d20 GIT binary patch literal 34716 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index cc8c06860..5c9c24b81 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "generate:sitemap-alternates": "node scripts/generate-alternate-sitemap.mjs", "sync:articles": "node scripts/sync-blog-articles.mjs", "check:articles": "node scripts/sync-blog-articles.mjs --check", - "test": "node --test tests/locale-preference.test.mjs tests/agent-docs.test.mjs tests/blog-articles.test.mjs tests/fumapress-migration.test.mjs tests/seo.test.mjs && python3 -m unittest discover -s tests -p 'test_*.py'", + "test": "node --test tests/social-preview.test.mjs tests/locale-preference.test.mjs tests/agent-docs.test.mjs tests/blog-articles.test.mjs tests/fumapress-migration.test.mjs tests/seo.test.mjs && python3 -m unittest discover -s tests -p 'test_*.py'", "finalize:base-path": "node scripts/finalize-base-path.mjs" }, "dependencies": { diff --git a/press.config.tsx b/press.config.tsx index a68713a02..54ede693a 100644 --- a/press.config.tsx +++ b/press.config.tsx @@ -404,6 +404,9 @@ export default defineConfig({ // One registration is intentional: its adapter and loader plugin handle all // OpenAPI virtual pages, regardless of which content source generated them. .plugins( + // Replace the recommended generic Takumi artwork with our shared static + // brand card. Keeping its plugin name suppresses duplicate og:image tags. + { name: "core:takumi" }, { name: "langbot:locale-preference", init() { diff --git a/tests/social-preview.test.mjs b/tests/social-preview.test.mjs new file mode 100644 index 000000000..b9b41a5b7 --- /dev/null +++ b/tests/social-preview.test.mjs @@ -0,0 +1,20 @@ +import assert from "node:assert/strict"; +import { readFileSync, existsSync } from "node:fs"; +import test from "node:test"; +import { fileURLToPath } from "node:url"; +import path from "node:path"; +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +test("share metadata references the branded versioned preview", () => { + for (const file of ['docs.json']) { + assert.ok(readFileSync(path.join(root, file), "utf8").includes('/images/social/docs-v2.png'), file); + } +}); +test("sharing PNG is a small 1200 by 630 image", () => { + const file = path.join(root, 'images/social/docs-v2.png'); + assert.ok(existsSync(file), "branded image is present"); + const png = readFileSync(file); + assert.equal(png.subarray(1, 4).toString(), "PNG"); + assert.equal(png.readUInt32BE(16), 1200); + assert.equal(png.readUInt32BE(20), 630); + assert.ok(png.length < 200_000); +});