Skip to content

seo: fix crawlability, restructure site, and improve internal linking#166

Merged
raymondk merged 1 commit intomainfrom
feat/seo-crawlability-and-ux
Apr 15, 2026
Merged

seo: fix crawlability, restructure site, and improve internal linking#166
raymondk merged 1 commit intomainfrom
feat/seo-crawlability-and-ux

Conversation

@marc0olo
Copy link
Copy Markdown
Member

Problem

Google only indexed the homepage despite 19 skill pages existing. Root cause: skill cards used div+onClick instead of <a href>, leaving no crawlable path to skill subpages.

Changes

Critical crawlability fix

  • BrowseTab: replaced div+onClick cards with a stretched cover-link pattern — an absolute-positioned <a href> sits beneath the card content so the entire card is crawlable without nesting anchors (which would make download/GitHub buttons invalid HTML). This supersedes feat: improve SEO by adding <a> to skills from main page #165, which used a similar CSS ::after approach on the title anchor only.

New /skills/ hub page

  • Added src/pages/skills/index.astro — gives Google a canonical entry point with all skill cards as real crawlable links; mounts BrowseTab as a Preact island

Homepage restructured as marketing page

  • src/pages/index.astro rewritten as a fully static page (no Preact island) — faster, crawlable from the start
  • Category cards grid: each category links to /skills/#<category> and shows up to 3 skill names
  • ItemList JSON-LD added (alongside existing WebSite graph) so Google sees all skill URLs from the homepage

Skill page internal linking

  • skills/[slug]/index.astro: added visible breadcrumb nav, BreadcrumbList JSON-LD, related-skills grid (up to 5 same-category skills), and prev/next skill navigation
  • BaseLayout: prevUrl/nextUrl props emit <link rel="prev/next"> in <head>

Hash-based category URL sync

  • BrowseTab reads window.location.hash on mount to pre-filter by category (so /skills/#DeFi lands directly on DeFi skills)
  • Category changes update the URL hash via history.replaceState — shareable, bookmarkable filter state

Nav simplified

  • Removed redundant "browse" tab that pointed back to / (now a marketing page)
  • 3 tabs: browse (/skills/), how it works, get started

Sitemap

  • astro.config.mjs: added lastmod: new Date() to sitemap integration so Google sees freshness signals

SEO checklist

Finding Status
Skill cards not crawlable (no <a href>) ✅ Fixed
No /skills/ hub page ✅ Fixed
No ItemList JSON-LD on homepage ✅ Fixed
No breadcrumbs / cross-links on skill pages ✅ Fixed
No <lastmod> in sitemap ✅ Fixed
SPA fallback soft-404s on asset canister ⏳ Infrastructure — tracked at dfinity/sdk#4497
Google Search Console submission ⏳ Manual step
Backlinks ⏳ Outreach

Notes

Root cause: skill cards used div+onClick instead of <a href>, leaving
Google no crawl path to any skill subpage despite 19 pages existing.

Changes:
- BrowseTab: replace div+onClick cards with stretched cover-link pattern
  (absolute <a> beneath content div) so download/GitHub buttons remain
  valid anchors without nesting; add hash-based category URL sync via
  history.replaceState so /skills/#DeFi links land pre-filtered
- Homepage (index.astro): restructure as static marketing page with
  category cards grid linking to /skills/#<category>; ItemList JSON-LD
  added via extraJsonLd so default WebSite graph is preserved
- skills/index.astro: new hub page that mounts BrowseTab island;
  gives Google a canonical /skills/ entry point with crawlable card links
- skills/[slug]/index.astro: add BreadcrumbList JSON-LD, visible
  breadcrumb nav, related-skills grid, and prev/next skill navigation;
  pass prevUrl/nextUrl for <link rel="prev/next"> in <head>
- BaseLayout: add extraJsonLd slot (second JSON-LD block), prevUrl/nextUrl
  props rendered as <link rel="prev/next">
- SiteLayout: make activeTab optional; simplify nav to 3 tabs (browse,
  how it works, get started); thread extraJsonLd/prevUrl/nextUrl through
- astro.config.mjs: add lastmod: new Date() to sitemap integration
@marc0olo marc0olo requested review from a team and JoshDFN as code owners April 15, 2026 21:10
@github-actions
Copy link
Copy Markdown

Skill Validation Report

No skill files were changed in this PR — validation skipped.

@raymondk raymondk merged commit db4edf7 into main Apr 15, 2026
6 checks passed
@raymondk raymondk deleted the feat/seo-crawlability-and-ux branch April 15, 2026 21:41
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.

2 participants