Skip to content

feat(seo): SEO v2 — close indexing gap with knowledge subdomain - #23

Merged
Bissbert merged 3 commits into
mainfrom
feature/seo-v2
May 11, 2026
Merged

Bissbert merged 3 commits into
mainfrom
feature/seo-v2

Conversation

@Bissbert

Copy link
Copy Markdown
Contributor

Summary

Closes the indexing gap with knowledge.gemmology.dev by fixing three structural issues identified by a six-agent SEO audit (audits/seo-2026-05/):

  1. Sitemap pollution — 442 of 910 sitemap URLs were /og/ 1200×630 image-template pages. The filter in astro.config.mjs now excludes /og/, /og-image/, /study/review, /study/settings; the built sitemap drops from 910 → 466 URLs. OG template HTML files also carry noindex,nofollow.
  2. Empty React shells on high-value surfaces — /tools/, all six tool category pages, and /quiz/ previously shipped 0–28 server-rendered body words. They now ship 429–1213 body words (server-rendered) before the React island, with structured copy on what each calculator measures, the diagnostic workflow, and named gem examples.
  3. Missing structural data — added Course + CollectionPage + BreadcrumbList to /learn/, Course + Quiz to /quiz/, SoftwareApplication to all seven tool pages, Quiz hasPart on learn articles with pretests, named Person JSON-LD on /about/ (Bissbert, with verified GitHub sameAs), and fixed the prior-audit BreadcrumbList fragment-URL bug.

AI-search readiness:

  • llms.txt restructured: added ## Tools section with per-category procedural descriptions; converted mineral bare-URL list into titled entries with crystal system / hardness / RI / SG; added Licensing (training use) section.
  • robots.txt now carries named Allow stanzas for GPTBot, OAI-SearchBot, ClaudeBot, Claude-Web, PerplexityBot, Google-Extended, CCBot, Applebot-Extended (PerplexityBot requires named-allow per their docs).

Validation

Full report in audits/seo-2026-05/v2-validation.md. Highlights:

Metric Before After
Sitemap URL count 910 466
/og/ URLs in sitemap 442 0
/tools/ body words 0 468
/tools/measurement/ body words ~22 1149
/quiz/ body words ~30 429
JSON-LD on /learn/ BreadcrumbList only Course + CollectionPage + BreadcrumbList
JSON-LD on /about/ WebPage + Breadcrumb + Person (named, no fabricated credentials)

All 31 JSON-LD blocks across 15 representative page templates parse as valid JSON and satisfy required-field heuristics (Course/provider, LearningResource/learningResourceType, SoftwareApplication/applicationCategory, etc.).

Test plan

  • npm run build succeeds locally (verified — 912 pages, 8.83s)
  • dist/sitemap-0.xml contains 466 URLs, zero under /og/, /og-image/, /study/, /admin
  • Each dist/tools/**/index.html contains ≥300 server-rendered body words and ≥1 JSON-LD block
  • dist/llms.txt contains ## Tools, titled mineral entries, and a ## Licensing (training use) section
  • dist/robots.txt contains named stanzas for GPTBot, ClaudeBot, PerplexityBot, Google-Extended
  • Manually run https://gemmology.dev/learn/, /quiz/, /tools/measurement/, /about/, /minerals/diamond/ through Google's Rich Results Test post-deploy
  • Resubmit the clean sitemap in GSC + Bing Webmaster Tools post-deploy
  • Monitor GSC Coverage delta over 14 days — expect indexed-page count up by ~50 and total submitted-pages down by ~442

Notes

This PR supersedes the closed #22; the branch was rebased onto current origin/main (which now includes the British-English language pass #20 and tools waves A/B/C #21). The three commits on this branch (8569a31, 2a13118, c764626) sit cleanly on top of 4971bd1.

Out of scope (deferred)

  • WB1 — learn-article Introduction expansion (138 YAML files in the gemmology-knowledge repo; separate cross-repo PR)
  • WB4 — robots.txt + llms.txt on knowledge.gemmology.dev (separate cross-repo PR)
  • Long-tail content cluster pages and DataForSEO-grounded keyword work (separate SEO v3 plan)

Bissbert added 3 commits May 11, 2026 14:03
Six-agent SEO audit (audits/seo-2026-05/) diagnosed why gemmology.dev is
indexed worse than knowledge.gemmology.dev despite being the better
product: 48% of sitemap URLs were /og/ image templates and high-value
surfaces (/tools, /quiz, /playground) were client:load React shells
with no server-rendered prose. This wave addresses the structural
gap; v3 will layer keyword-clustered content on top.

Sitemap & indexability (W1, W2):
- astro.config.mjs: filter excludes /og/, /og-image/, /study/review,
  /study/settings; drop priority/changefreq (Google ignores since 2023)
- /og/learn, /og/minerals, /og-image: noindex,nofollow meta added
- Result: sitemap 910 → 466 URLs (zero /og/, zero /study/)

Tool pages SSG prose + schema (W3+W4):
- 7 tool pages now have 581–1326 server-rendered body words each
  (was 0–28 words); 3 paragraphs covering definition, method, and
  diagnostic application with named gem examples
- New ToolsSchema.astro component emits SoftwareApplication JSON-LD
  on every tool page (applicationCategory EducationalApplication,
  free Offer, gemmology.dev creator)
- /tools/index gains h1, intro, static category nav before React island

Learn schema (W5, W6):
- /learn/index: Course (FGA Diploma prep, 8 categories, PT100H workload)
  + CollectionPage with ItemList of all 138 articles + BreadcrumbList
- LearnSchema.astro: BreadcrumbList fragment URL bug fixed (was
  emitting /learn#fundamentals as a crumb), datePublished now wired
  through from new publishedAt content-collection field, hasPart Quiz
  emitted when an article has curated pretest questions
- src/content/config.ts: publishedAt field added to learn collection

Quiz hub (W7):
- 250-word SSG intro with all 8 categories listed statically
- Course JSON-LD with 8 hasCourseInstance entries + Quiz JSON-LD
- /quiz/ now returns 541 body words (was 30)

About page E-E-A-T (W8):
- Visible Maintainers & Editors block with credentials list
- Person JSON-LD via extended StructuredData component
- TODO(author) markers for real name+credential before deploy

Verification:
- npm run build: 912 pages, clean
- Sitemap: 466 URLs, zero junk paths
- All key pages emit valid JSON-LD (homepage 2, /learn 3, /quiz 2,
  /tools 1, /about 3 blocks)
- 441 /og/ pages all carry noindex,nofollow

Audit corpus: workspace/gemmology.dev/audits/seo-2026-05/
Replaces author placeholders in /about with the actual maintainer.
Person JSON-LD now emits a real name and verified GitHub sameAs,
without fabricated FGA/GIA credentials.
…alidation report

- llms.txt: add ## Tools section listing the six tool categories with
  one-line procedural descriptions; convert the bare mineral URL list
  into titled entries with crystal system, hardness, RI, SG, and origin
  signal; expand intro to surface the 121/171 reference-data counts and
  FGA syllabus alignment; add a Licensing (training use) section that
  explicitly addresses AI training use under MIT + CC BY-SA 4.0.
- robots.txt: add named Allow stanzas for GPTBot, OAI-SearchBot,
  ClaudeBot, Claude-Web, PerplexityBot, Google-Extended, CCBot, and
  Applebot-Extended in addition to the wildcard rule (some AI engines,
  notably Perplexity, require an explicit per-name Allow).
- audits/seo-2026-05/v2-validation.md: record build assertions and the
  JSON-LD validation matrix across 15 representative pages (31 blocks,
  all parse cleanly and satisfy required-field heuristics).
@github-actions

Copy link
Copy Markdown

🚀 Preview deployed to: https://3e939eeb.gemmology-dev.pages.dev

@Bissbert
Bissbert merged commit e6949e6 into main May 11, 2026
3 of 4 checks passed
@Bissbert
Bissbert deleted the feature/seo-v2 branch May 11, 2026 07:54

This branch was successfully deployed

1 active deployment
gemmology-dev (Preview) — c764626a Deployed May 11, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant