feat(#2996): add SEO metadata to docs site - #6683
Conversation
Improve search indexing and social sharing for the VitePress docs site by adding a sitemap, canonical URLs, and Open Graph / Twitter Card tags. - docs/.vitepress/seo.ts: pure helpers for canonical/OG URLs and head tags, unit-tested in seo.test.ts. Docs are served under a /docs/ base, so all absolute URLs (canonical, og:url, sitemap) include that segment. The sitemap hostname carries the base with a trailing slash because VitePress resolves base-less page paths against it. - config.ts: emit sitemap.xml, global og/twitter head tags, and per-page canonical + og tags via transformHead. The 404 page is excluded from self-canonical/og:url so crawlers do not treat it as indexable. - robots.txt: advertise the sitemap location. - Add unique description frontmatter to key landing pages (getting started, agents overview and each agent, architecture, vision); other pages fall back to the site description. Verified with a full vitepress build: 190 sitemap entries, all under https://fullsend.sh/docs/, with per-page canonical and og tags present. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Shai Revivo <srevivo@redhat.com>
E2E tests did not runE2E tests run automatically for org/repo members and collaborators on pull requests. For other contributors, a maintainer must add the See E2E testing guide for details. |
PR Summary by QodoAdd SEO metadata and sitemap generation to the docs site
AI Description
Diagram
High-Level Assessment
Files changed (14)
|
Site previewPreview: https://fa1996c4-site.fullsend-ai.workers.dev Commit: |
Code Review by Qodo
1.
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
- config.ts: exclude template placeholders (0000-*-template.md) from the build via srcExclude, mirroring isNonContent's template rule, so they no longer appear in sitemap.xml or carry canonical/OG metadata. Previously ADRs/0000-adr-template.html was advertised to search engines. - docs/agents/README.md: rewrite the description to point at runtime agent discovery (fullsend-ai/agents repo / config) instead of hardcoding the shipped agent names, per the project's discovery-over-inventory convention. - docs/guides/getting-started/README.md: reword the description in plain language, avoiding undefined jargon (inference, agent runtime, SDLC agents). Rebuilt: sitemap drops the template (190 -> 189 entries), all real pages retained, new descriptions render correctly; 13 unit tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Shai Revivo <srevivo@redhat.com>
waynesun09
left a comment
There was a problem hiding this comment.
Review sweep on the SEO metadata change: 4 findings (1 high, 3 medium) posted as inline comments. The high one is a serving-layer mismatch — the canonical/og:url/sitemap URL shape this PR emits does not resolve on the host — verified against this PR's own preview deployment at 1bd286a.
Signed-off-by: Shai Revivo <srevivo@redhat.com>
|
Addressed all four review findings in 97e65ad:
Verification: 19 focused tests pass, make lint passes, and a full docs build with the pinned experiments submodule produced 276 sitemap URLs with zero .html, redirect-root, template, or ALL-CAPS metadata entries. |
|
/fs-review |
|
🤖 Finished Review · ✅ Success · Started 5:21 PM UTC · Completed 5:37 PM UTC Commit: Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $5.27 |
|
Risk Assessment: moderate (2/5) DetailsDocs-focused SEO enhancement with 14 files (mostly 4-line frontmatter additions), no protected paths or security-sensitive files, linked to a well-scoped issue; moderate churn on some doc files but additive-only changes with comprehensive tests for the new production module. |
ReviewFindingsLow
|
- isNonContentPath: drop the trailing $ anchor so the template regex matches suffixed names, restoring the original isNonContent semantics. - Document why cleanUrls is required (matches Cloudflare's 200-serving URL shape; canonicals must not point at redirecting .html URLs). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Shai Revivo <srevivo@redhat.com>
Summary
Closes #2996. Adds SEO metadata to the VitePress docs site so pages are indexed well by search engines and render rich previews when shared on Slack / LinkedIn / X.
sitemap.xmlis now generated at build time (190 URLs). Previously/sitemap.xmlfell through to the landing-page HTML.<link rel="canonical">.og:type/og:site_name/og:image+twitter:card/twitter:image, plus per-pageog:url/og:title/og:description.descriptionfrontmatter on key landing pages (getting started, agents overview + each agent, architecture, vision); all other pages fall back to the site description.The
/docs/base gotchaThe docs are served under
base: "/docs/", so every live URL includes that segment (e.g.https://fullsend.sh/docs/agents/triage.html).The example in the issue hardcoded
https://fullsend.sh${relativePath}, which would have produced wrong URLs missing/docs/in every canonical tag, OG tag, and sitemap entry. Confirmed against the VitePress 1.6.4 source: its sitemap builder emits base-less relative paths and resolves them againstsitemap.hostnamevianew URL(path, hostname). So this PR:hostnametohttps://fullsend.sh/docs/(trailing slash required for correct resolution), andThe URL logic is isolated in a pure, unit-tested module (
docs/.vitepress/seo.ts+seo.test.ts), mirroring the existingsearchScopes.tspattern. One test is a regression guard asserting every URL includes/docs/.The 404 page is excluded from self-canonical/
og:urlso crawlers don't treat the not-found page as indexable.Testing
npx vitest run docs/.vitepress/seo.test.ts— 13 tests pass.vitepress build docs— succeeds; 190 sitemap entries, all underhttps://fullsend.sh/docs/; canonical/OG tags verified in the built HTML for a directory-index page, a content page, the root, and a page without frontmatter (falls back to the site description);404.htmlhas no self-canonical.Follow-ups (out of scope)
og:imagecurrently uses the square brand logo — functional but not ideal for large cards. A purpose-built asset is a one-line change inseo.ts.🤖 Generated with Claude Code