Skip to content

Commit bee2a13

Browse files
btraversclaude
andcommitted
docs(website): add JSON-LD structured data + complete OG/Twitter tags
The landing page had good basic meta but no structured data. Add: - JSON-LD: Organization (btravstack, with sameAs GitHub + npm and logo), WebSite, and an ItemList of the three packages (each a SoftwareApplication) — helps Google build the entity, show the site name/logo, and understand the hub → packages relationship. - Round out Open Graph (site_name, locale, image type/width/height/alt) and Twitter (explicit title/description, image alt), plus author/robots/keywords. Verified: build renders all three JSON-LD blocks and the full tag set. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 47af849 commit bee2a13

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

apps/website/.vitepress/config.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,121 @@ export default defineConfig({
2020
["meta", { name: "google-site-verification", content: "u6ZPW5bWbP9G1yF5Sv7B4fSOJm5rLbZWeH858tmisTc" }],
2121
["link", { rel: "icon", type: "image/svg+xml", href: "/favicon.svg" }],
2222
["link", { rel: "apple-touch-icon", sizes: "180x180", href: "/apple-touch-icon.png" }],
23+
["meta", { name: "author", content: "Benoit Travers" }],
24+
["meta", { name: "robots", content: "index, follow" }],
25+
[
26+
"meta",
27+
{
28+
name: "keywords",
29+
content:
30+
"TypeScript, backend, Node.js, type-safe, contracts, AMQP, RabbitMQ, Temporal, workflows, errors as values, Result, schema validation, amqp-contract, temporal-contract, unthrown",
31+
},
32+
],
33+
34+
// Open Graph
2335
["meta", { property: "og:type", content: "website" }],
36+
["meta", { property: "og:site_name", content: SITE_TITLE }],
37+
["meta", { property: "og:locale", content: "en_US" }],
2438
["meta", { property: "og:title", content: `${SITE_TITLE} — an expressive, robust TypeScript backend` }],
2539
["meta", { property: "og:description", content: SITE_DESCRIPTION }],
2640
["meta", { property: "og:url", content: `${SITE_URL}/` }],
2741
["meta", { property: "og:image", content: `${SITE_URL}/og-btravstack.png` }],
42+
["meta", { property: "og:image:type", content: "image/png" }],
43+
["meta", { property: "og:image:width", content: "1280" }],
44+
["meta", { property: "og:image:height", content: "640" }],
45+
[
46+
"meta",
47+
{
48+
property: "og:image:alt",
49+
content: "btravstack — type-safe building blocks for the TypeScript backend",
50+
},
51+
],
52+
53+
// Twitter Card
2854
["meta", { name: "twitter:card", content: "summary_large_image" }],
55+
["meta", { name: "twitter:title", content: `${SITE_TITLE} — an expressive, robust TypeScript backend` }],
56+
["meta", { name: "twitter:description", content: SITE_DESCRIPTION }],
2957
["meta", { name: "twitter:image", content: `${SITE_URL}/og-btravstack.png` }],
58+
[
59+
"meta",
60+
{
61+
name: "twitter:image:alt",
62+
content: "btravstack — type-safe building blocks for the TypeScript backend",
63+
},
64+
],
65+
66+
// JSON-LD: the org, the site, and the three packages it publishes
67+
[
68+
"script",
69+
{ type: "application/ld+json" },
70+
JSON.stringify({
71+
"@context": "https://schema.org",
72+
"@type": "Organization",
73+
name: SITE_TITLE,
74+
url: `${SITE_URL}/`,
75+
logo: { "@type": "ImageObject", url: `${SITE_URL}/logos/btravstack-dark.svg` },
76+
description: SITE_DESCRIPTION,
77+
sameAs: ["https://github.com/btravstack", "https://www.npmjs.com/~btravers"],
78+
}),
79+
],
80+
[
81+
"script",
82+
{ type: "application/ld+json" },
83+
JSON.stringify({
84+
"@context": "https://schema.org",
85+
"@type": "WebSite",
86+
name: SITE_TITLE,
87+
url: `${SITE_URL}/`,
88+
description: SITE_DESCRIPTION,
89+
}),
90+
],
91+
[
92+
"script",
93+
{ type: "application/ld+json" },
94+
JSON.stringify({
95+
"@context": "https://schema.org",
96+
"@type": "ItemList",
97+
name: "btravstack packages",
98+
itemListElement: [
99+
{
100+
"@type": "ListItem",
101+
position: 1,
102+
item: {
103+
"@type": "SoftwareApplication",
104+
name: "amqp-contract",
105+
applicationCategory: "DeveloperApplication",
106+
operatingSystem: "Cross-platform",
107+
url: "https://btravstack.github.io/amqp-contract/",
108+
description: "Type-safe contracts for AMQP & RabbitMQ.",
109+
},
110+
},
111+
{
112+
"@type": "ListItem",
113+
position: 2,
114+
item: {
115+
"@type": "SoftwareApplication",
116+
name: "temporal-contract",
117+
applicationCategory: "DeveloperApplication",
118+
operatingSystem: "Cross-platform",
119+
url: "https://btravstack.github.io/temporal-contract/",
120+
description: "Type-safe contracts for Temporal.io.",
121+
},
122+
},
123+
{
124+
"@type": "ListItem",
125+
position: 3,
126+
item: {
127+
"@type": "SoftwareApplication",
128+
name: "unthrown",
129+
applicationCategory: "DeveloperApplication",
130+
operatingSystem: "Cross-platform",
131+
url: "https://btravstack.github.io/unthrown/",
132+
description: "Explicit errors as values, for TypeScript.",
133+
},
134+
},
135+
],
136+
}),
137+
],
30138
],
31139

32140
themeConfig: {

0 commit comments

Comments
 (0)