docs: add canonical links and Organization JSON-LD to both sites - #509
Conversation
docs.plane.so had no <link rel="canonical"> and neither site published structured data, which the is-agentic scan flagged (metadata completeness, JSON-LD, Organization schema). Add `packages/theme/src/seo.ts`, exported as `@plane/docs-theme/seo`, with: - `siteJsonLd(site)` — one `application/ld+json` head entry carrying a shared Plane Organization (logo, GitHub/X profiles, support and sales contact points) plus a WebSite node for the site, so both sites publish the same identity - `canonicalLink(origin, pageData)` — per-page canonical mirroring cleanUrls, skipped when frontmatter already sets one Wire both into `apps/docs` (new `transformPageData`) and `apps/developer-docs` (replacing its inline canonical logic). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CsPSwTnpsEb5c5Ud2CLrL8
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reached
Next review available in: 49 minutes Limit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?Wait for the limit to reset, then comment An organization admin can change what happens after included review limits in Billing. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
With #509 merged, not-found.md picked up a canonical pointing at /not-found, a URL that only exists to become 404.html. Add a `canonical: false` frontmatter opt-out to canonicalLink() and use it there. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CsPSwTnpsEb5c5Ud2CLrL8
* docs: server-render a useful 404 page on both sites Unknown paths on docs.plane.so and developers.plane.so returned a 404 whose body was an empty app shell (VitePress deliberately leaves #app empty in the 404.html it writes), so agents and no-JS clients got nothing to recover from. - packages/theme: new NotFound.vue with the "page not found" content — home, search, sitemap.xml, llms.txt, llms-full.txt, the sibling Plane docs site, a help link, and a hint for agents (append .md / Accept: text/markdown). Registered as <PlaneNotFound> and used as the Layout's default `not-found` slot so client-side navigation to a missing page shows the same content. Site-specific wording comes from a new `notFound` option on createPlaneTheme. - apps/*: docs/not-found.md renders the component; buildEnd moves the server-rendered not-found.html over 404.html and drops the stray copies. The page is noindex, excluded from search, llms.txt and the sitemap. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CsPSwTnpsEb5c5Ud2CLrL8 * docs: no canonical on the 404 page With #509 merged, not-found.md picked up a canonical pointing at /not-found, a URL that only exists to become 404.html. Add a `canonical: false` frontmatter opt-out to canonicalLink() and use it there. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CsPSwTnpsEb5c5Ud2CLrL8 --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
Item 2 from the
is-agenticscan of docs.plane.so (follow-up to #508, independent of it).docs.plane.so had no
<link rel="canonical">(developers.plane.so already injected one per page), and neither site published structured data. The scan flagged three findings for this: Metadata completeness (partial), JSON-LD structured data (fail), Organization schema completeness (fail).Change. New
packages/theme/src/seo.ts, exported as@plane/docs-theme/seo(build-time only — nothing ships to the browser):siteJsonLd(site)→ one<script type="application/ld+json">head entry with a shared Organization for Plane (name, url, logo,sameAsGitHub + X,contactPointfor support@ and sales@) plus a WebSite node for the specific site. Keeping the Organization in the theme means both sites publish the same identity and it can't drift.canonicalLink(origin, pageData)→ per-page canonical mirroringcleanUrls(dir/page.md→/dir/page,index.md→/), skipped when frontmatter already sets one.apps/docsgains atransformPageDatafor the canonical;apps/developer-docsswaps its inline canonical logic for the helper. Both addsiteJsonLd(...)tohead.No postal address is included — say if one should be published.
Verification
pnpm check:types/check:formatpass; both apps build.dist/s: exactly one canonical and one JSON-LD per page; root canonical ishttps://docs.plane.so/, nested pages have no trailing slash, and/self-hosting/manage/upgrade-from-0.13.2-0.14.0is correct. The JSON-LD parses (Organization Plane+WebSite …, 2 contact points).Checklist
/llms.txtand/sitemap.xmlopenapi.jsonon developers.plane.so and link it fromllms.txtnpx is-agenticon both hosts🤖 Generated with Claude Code
https://claude.ai/code/session_01CsPSwTnpsEb5c5Ud2CLrL8