technical-seo
Technical SEO implementation: crawlability, metadata, sitemaps, structured data, SSR/SSG/ISR, status codes, Core Web Vitals. Use for making pages discoverable and indexable. Content/marketing SEO is o
SKILL.mdskills/frontend/technical-seo/SKILL.md
GitHubtechnical-seo
If a crawler cannot fetch it, render it, or understand it, content quality is irrelevant.
Activate when
- Building or auditing pages for search visibility: metadata, sitemaps, structured data, crawl/index behavior, JS-rendered content, migrations with URL changes.
Do NOT activate for
- Content strategy, keyword writing, link building (marketing SEO — out of scope).
- General performance work without crawl impact (see frontend/performance).
Procedure
- Inspect the existing setup first: framework + version, rendering mode per route (SSR/SSG/ISR/CSR), existing sitemap/robots/manifest. Never prescribe Next.js metadata APIs without confirming the installed Next.js major in package.json.
- Metadata per URL: unique
<title>(50–60 chars), meta description (150–160), canonical URL (self-referencing by default), Open Graph + Twitter cards,robotsmeta only where exclusion is intended. - Crawl plumbing:
robots.txt(allow + sitemap pointer, no security-by-obscurity), XML sitemap(s) with lastmod, internal linking so every indexable URL is within a few clicks, clean URL structure (lowercase, words not IDs, trailing-slash consistent). - Structured data: JSON-LD per page type against https://schema.org/ (Article, Product, FAQ, BreadcrumbList…); validate with Google's Rich Results Test before shipping.
- Status codes: 200 for indexable, 301 for moved (with redirect chains collapsed to one hop), 404 for truly gone, 410 for deliberately removed; soft-404s (200 with error content) are a defect.
- Pagination/canonicalization: paginated series canonicalize per-page (no canonical-to-page-1 unless content truly duplicates); faceted/filtered URLs canonical or noindexed deliberately.
- Duplicates: one URL per content (trailing slash, www, http/https, case variants all resolve to canonical); hreflang only for genuine locale alternates, with return links.
- JavaScript content: verify what the crawler sees — SSR/SSG for index-critical content; if CSR, prove renderability (fetch-and-render test, dynamic rendering only as last resort). Dynamic metadata must be in the initial HTML, not injected post-hydration.
- Next.js specifics: research the metadata API for the installed major in https://nextjs.org/docs (App Router
metadata/generateMetadatavs Pages<Head>— never mix generations); sitemap/robots via route handlers ornext-sitemapper version docs; ISR revalidation for freshness-sensitive pages. - Images: descriptive filenames/alt, responsive sources, sitemap entries for image-search-critical pages (details:
../media-assets/). - Vitals/mobile: Core Web Vitals (LCP/INP/CLS) as ranking inputs — measure with field + lab data; mobile-first indexing means the mobile render is the canonical one (see
../performance/,../responsive-design/). - Verify with tooling: IF available use Search Console URL inspection, Rich Results Test, and a crawler (Screaming Frog or equivalent); ELSE verify manually — view-source checks for metadata/canonical/JSON-LD, status-code sweep with curl, robots/sitemap fetch. Record tool used and residual gaps.
Failure modes
- CSR-only pages with empty initial HTML; canonical pointing at wrong URL; noindex left from staging; redirect chains; duplicate content across locale variants; metadata from the wrong Next.js generation.
References
- Registry:
../../research/documentation-search/references/framework-registry.yaml(nextjs, vercel). - Runtime research:
../../research/documentation-search/(detect Next.js version first). - Related:
../performance/,../accessibility/(semantic HTML),../media-assets/.