From d795cb49049b19853e54511dc699f131b3ad7ad0 Mon Sep 17 00:00:00 2001 From: GigaHierz Date: Tue, 25 Aug 2026 12:50:17 +0100 Subject: [PATCH 1/3] feat(seo): inject brand-level Organization JSON-LD with sameAs linking docs to the Celo entity Closes #2283 Co-Authored-By: Claude Fable 5 --- seo-schema.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 seo-schema.js diff --git a/seo-schema.js b/seo-schema.js new file mode 100644 index 000000000..c2edd47ff --- /dev/null +++ b/seo-schema.js @@ -0,0 +1,46 @@ +// Injects brand-level Organization JSON-LD linking docs.celo.org to the Celo +// entity (celo.org) and its public profiles. Mintlify's auto-generated schema +// names the Organization "Celo Docs" with no sameAs, which leaves the docs +// disconnected from the brand entity that search and AI engines resolve (#2283). +// +// Mintlify loads every .js file in the content directory on each page, after +// the page becomes interactive. Limitation: because this runs client-side, +// Google and other DOM-rendering crawlers see the block, but plain-fetch +// crawlers do not. Static head injection is not available on the current plan. +(function () { + var data = { + "@context": "https://schema.org", + "@graph": [ + { + "@type": "Organization", + "@id": "https://celo.org/#organization", + name: "Celo", + url: "https://celo.org", + logo: "https://docs.celo.org/images/CeloDocs_LogoLight.svg", + description: + "Celo is an Ethereum Layer 2 built for real-world use: fast, low-cost payments in stablecoins, mobile-first apps, and infrastructure for AI agents.", + sameAs: [ + "https://github.com/celo-org", + "https://x.com/Celo", + "https://www.youtube.com/@CeloOrg", + "https://discord.com/invite/celo", + "https://forum.celo.org", + "https://www.coingecko.com/en/coins/celo", + "https://defillama.com/chain/celo", + "https://l2beat.com/scaling/projects/celo" + ] + }, + { + "@type": "WebSite", + "@id": "https://docs.celo.org/#celo-docs", + name: "Celo Documentation", + url: "https://docs.celo.org", + publisher: { "@id": "https://celo.org/#organization" } + } + ] + }; + var s = document.createElement("script"); + s.type = "application/ld+json"; + s.text = JSON.stringify(data); + document.head.appendChild(s); +})(); From ae8f918092eac4d7dedaa1afbdb06740672e9200 Mon Sep 17 00:00:00 2001 From: GigaHierz Date: Thu, 27 Aug 2026 20:13:13 +0100 Subject: [PATCH 2/3] feat(seo): use a raster (PNG) Organization logo for Google rich results Google's structured-data logo guideline requires a raster format; SVG is ignored for the logo feature. Point at the Celo brand PNG. Co-Authored-By: Claude Opus 4.8 --- seo-schema.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seo-schema.js b/seo-schema.js index c2edd47ff..569221530 100644 --- a/seo-schema.js +++ b/seo-schema.js @@ -16,7 +16,7 @@ "@id": "https://celo.org/#organization", name: "Celo", url: "https://celo.org", - logo: "https://docs.celo.org/images/CeloDocs_LogoLight.svg", + logo: "https://docs.celo.org/logo/celo_light.png", description: "Celo is an Ethereum Layer 2 built for real-world use: fast, low-cost payments in stablecoins, mobile-first apps, and infrastructure for AI agents.", sameAs: [ From 75e7699cd0bd97cd08d4504f85472f414ed39f1c Mon Sep 17 00:00:00 2001 From: GigaHierz Date: Fri, 28 Aug 2026 13:58:58 +0100 Subject: [PATCH 3/3] feat(seo): use Mintlify's native seo.organization instead of injected JSON-LD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces seo-schema.js with the `seo.organization` block in docs.json. The injected script added a second Organization node at a different `@id` (`https://celo.org/#organization`) than the one Mintlify already emits and references from every page's `publisher` (`https://docs.celo.org/#organization`). Google merges by `@id`, so the injected node sat beside the real graph instead of joining it. The native block edits the existing node in place, is rendered server-side, and so also reaches crawlers that do not execute JavaScript — the limitation the deleted file documented in its own header comment. Verified against https://mintlify.com/docs.json, which docs.json already declares as its `$schema`: `seo.organization` accepts `id`, `name`, `legalName`, `url`, `logo` and `sameAs`. Other changes this forces or fixes: - The `WebSite` node is gone. Mintlify already emits one named "Celo Docs" for this URL; a second named "Celo Documentation" gave Google two competing site names. - `logo` now points at logo/celo_light.png (4034x913) rather than the docs logo CeloDocs_LogoLight.svg (343x50), which is below Google's 112x112 floor. - The duplicated description is dropped; the schema has no description field, and the claim already appears in docs.json and home/celo.mdx frontmatter. - `forum.celo.org/` now matches the trailing slash used in footer.links. - `sameAs` is limited to official Celo profiles that were verified to return 200. The CoinGecko and DefiLlama listings are dropped: both are third-party listings rather than official profiles, and both return 403 to any non-browser client, so the links cannot be checked. - `id` is left at its default so it keeps matching the id the rest of the graph already points at. celo.org emits no JSON-LD at all today, so pointing it at `https://celo.org/#organization` would not merge with anything. Co-Authored-By: Claude Opus 5 (1M context) --- docs.json | 15 +++++++++++++++ seo-schema.js | 46 ---------------------------------------------- 2 files changed, 15 insertions(+), 46 deletions(-) delete mode 100644 seo-schema.js diff --git a/docs.json b/docs.json index 24d514e2c..dfa49cc2c 100644 --- a/docs.json +++ b/docs.json @@ -10,6 +10,21 @@ "contextual": { "options": ["copy", "view", "mcp", "chatgpt", "claude", "cursor", "vscode"] }, + "seo": { + "organization": { + "name": "Celo", + "url": "https://celo.org", + "logo": "https://docs.celo.org/logo/celo_light.png", + "sameAs": [ + "https://github.com/celo-org", + "https://x.com/Celo", + "https://www.youtube.com/@CeloOrg", + "https://discord.com/invite/celo", + "https://forum.celo.org/", + "https://l2beat.com/scaling/projects/celo" + ] + } + }, "integrations": { "ga4": { "measurementId": "G-0CXEKQ81V2" diff --git a/seo-schema.js b/seo-schema.js deleted file mode 100644 index 569221530..000000000 --- a/seo-schema.js +++ /dev/null @@ -1,46 +0,0 @@ -// Injects brand-level Organization JSON-LD linking docs.celo.org to the Celo -// entity (celo.org) and its public profiles. Mintlify's auto-generated schema -// names the Organization "Celo Docs" with no sameAs, which leaves the docs -// disconnected from the brand entity that search and AI engines resolve (#2283). -// -// Mintlify loads every .js file in the content directory on each page, after -// the page becomes interactive. Limitation: because this runs client-side, -// Google and other DOM-rendering crawlers see the block, but plain-fetch -// crawlers do not. Static head injection is not available on the current plan. -(function () { - var data = { - "@context": "https://schema.org", - "@graph": [ - { - "@type": "Organization", - "@id": "https://celo.org/#organization", - name: "Celo", - url: "https://celo.org", - logo: "https://docs.celo.org/logo/celo_light.png", - description: - "Celo is an Ethereum Layer 2 built for real-world use: fast, low-cost payments in stablecoins, mobile-first apps, and infrastructure for AI agents.", - sameAs: [ - "https://github.com/celo-org", - "https://x.com/Celo", - "https://www.youtube.com/@CeloOrg", - "https://discord.com/invite/celo", - "https://forum.celo.org", - "https://www.coingecko.com/en/coins/celo", - "https://defillama.com/chain/celo", - "https://l2beat.com/scaling/projects/celo" - ] - }, - { - "@type": "WebSite", - "@id": "https://docs.celo.org/#celo-docs", - name: "Celo Documentation", - url: "https://docs.celo.org", - publisher: { "@id": "https://celo.org/#organization" } - } - ] - }; - var s = document.createElement("script"); - s.type = "application/ld+json"; - s.text = JSON.stringify(data); - document.head.appendChild(s); -})();