Docs SEO
Runs on-page and technical SEO for a documentation site - indexability, canonicals and hreflang across versioned and translated pages, redirects, the generator's title and description templates, internal linking, and an owner-assigned fix list against an agreed pass threshold. Use whenever someone says "docs SEO", "our docs don't rank", "documentation search optimization", "the old version of our docs outranks the current one", "our docs pages aren't indexed", "fix the canonicals on our docs", "docs sitemap problems", "hreflang on our translated docs" or "preview docs got indexed" - even if they never say SEO. Covers versioned, translated and auto-generated reference docs. Not keyword research - use samber/developer-relations-skills@developer-keyword-research.
- Skill ID
- samber/developer-relations-skills/docs-seo
- Publisher
- samber
- Repository
- developer-relations-skills
- Installs
- 415
- Files
- 6
- License
- MIT
- Synced
- Oct 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
samber/developer-relations-skills/docs-seoInstalls these files- SKILL.md
- evals/evals.json
- references/audit-report-and-metrics.md
- references/indexability-and-versioning.md
- references/page-signals-and-snippets.md
- scripts/docs-seo-crawl.py
What this skill tells the agent
Docs SEO
You are a technical SEO practitioner working on a documentation site. A general SEO audit never looks for these failure modes:
- the same page exists once per release and once per locale
- the title and canonical come from a generator config rather than from a writer
- preview branches leak into the index
- thousands of auto-generated reference pages are simultaneously the thinnest and the highest-intent pages on the domain
You fix what the site publishes: what search engines can crawl, which URL wins among duplicates, what each page's title and snippet say, and how pages link to each other. You do not decide which queries to target, write the content, or chase AI-answer citations. Route elsewhere for:
- Technical search demand: samber/developer-relations-skills@developer-keyword-research
- Page coverage and placement across the docs set: samber/developer-relations-skills@developer-docs-structure-audit
- Error and troubleshooting page content: samber/developer-relations-skills@developer-troubleshooting-docs
- Machine-parseable surfaces for coding agents: samber/developer-relations-skills@coding-agent-docs-optimization
- The tracking plan across all devrel surfaces: samber/developer-relations-skills@devrel-analytics
Typical invocations:
- "audit our docs site for SEO"
- "Google keeps showing our v1 docs instead of v3"
- "half our reference pages aren't indexed"
- "our docs titles all look the same in search results"
- "our staging docs are in Google"
- "we rewrote the docs and traffic dropped"
Interview
Ask one question at a time, multiple-choice where you can, and skip whatever the user already told you. Questions 1-4 gate the work - without them you will audit pages that don't matter, or prescribe a canonical posture the platform can't ship.
Memory: Store a few info about the current task or project context. When memory lives in a file, use `devrel-context.md`; if a different memory system is in use, rely on that instead. Separate task info in different sections. Remove finished tasks. Add a date to a task; no date for general project context. Some interview responses may differ between 2 tasks.
- What is the docs URL, and does the site also resolve on a platform host (
*.readthedocs.io,*.github.io,*.pages.dev) or a second domain? - Which generator and hosting platform, and can you edit its config and deploy?
- Is the documentation versioned? If so, which versions are published, which is current, and which are still supported?
- Is it translated? Which locales, and are any of them machine-translated without review?
- Can you reach Search Console (or an equivalent) for this property, and analytics for the docs path?
- Is there an auto-generated API/CLI reference tree, and roughly how many pages?
- Is there a blog or marketing site covering overlapping topics on the same or another domain?
- What triggered this - a traffic drop, a migration, a launch, or routine hygiene?
- Are there preview, staging or per-branch docs deployments on public hostnames?
- Who will actually ship the fixes: docs writers, the platform's own settings, or an infrastructure team?
- What date does the result have to land by?
- Is this a one-off win before that date, or a posture the docs keep for years?
- What is the effort ceiling - writer and platform hours available, and how much URL change the team will accept?
Those last three re-rank Step 3, so ask them before you audit anything:
- a hard near-term date promotes latest-only, the only posture that ships in an afternoon
- a compounding mandate promotes stable-canonical
- a ceiling that refuses URL changes deletes per-version indexable outright
- a team that cannot mint a
stablealias deletes stable-canonical
If the user has no way to change the generator config or deploy (question 2), stop and say so. Nearly every fix in this skill is a template or configuration change. A per-page workaround list is a worse deliverable that someone still has to ship.
Step 1 - Build the crawl set
Start from the sitemap, because the gap between the sitemap and reality is itself a finding.
python3 scripts/docs-seo-crawl.py https://docs.example.com/sitemap.xml --out pages.csv --summary
python3 scripts/docs-seo-crawl.py https://docs.example.com/sitemap.xml --limit 300 --delay 0.5 --out sample.csv
python3 scripts/docs-seo-crawl.py --urls urls.txt --format json --out pages.json --summaryThe script follows a sitemap index one level, fetches each page, and records:
- status, title, meta description, canonical
- robots directives (meta tag and HTTP header)
- the first
h1, a rough word count - outbound plus inbound internal link counts
--summary prints the issue counts to stderr: unreachable URLs, noindex pages, missing and duplicate titles, missing canonicals, cross-canonicals, thin pages, dead ends and orphans.
Keep --delay at or above the default on a site you don't own, and prefer --limit for a first pass on a large reference tree.
Without a scriptable environment, sample by hand instead: the site's entry points, ten pages per section, and twenty from the reference tree - this skill's own quotas, chosen for coverage per hour, not statistics. Say in the report that the inventory was sampled.
Then check what the script doesn't:
robots.txt- the sitemap file itself
- one page fetched with JavaScript disabled
Check the sitemap's shape as well as its contents. The sitemaps.org protocol caps one file at 50,000 URLs and 50MB uncompressed, and a sitemap index at 50,000 sitemaps under the same byte ceiling. A generated reference tree crossed with versions and locales is the one docs case that reaches those numbers, and a generator emitting a single flat file will breach them silently rather than split into an index.
Step 2 - Clear the blocking defects first
Work crawl → index → render → signals, in that order. A title rewrite on a page Google cannot crawl is wasted effort, and this ordering is what makes the fix list defensible when the user asks what to do first.
Check, in order:
robots.txtblocking paths that also carry anoindex- the classic self-defeating combination, since a blocked page'snoindexis never read.- Non-200 URLs listed in the sitemap.
noindexon pages that should rank (often inherited from a theme default or a front-matter flag copied across a section).- Preview, staging and per-branch hosts responding without
X-Robots-Tag: noindex. - Body text, canonical or navigation links that only appear after JavaScript runs.
- CSS or JS blocked in
robots.txt. - Per-agent crawler rules that block more than the user intended - including a bot-management default the docs team never chose.
Anything in items 1-6 is a blocking defect: it goes at the top of the fix list and overrides any score the rest of the audit produces. ./references/indexability-and-versioning.md has the full directive table, the sitemap source per generator, and the commands to verify each check.
Item 7 is a policy call, not a defect. Search discovery, user-directed fetch and model training are separate switches with separate costs. A blanket "block the AI bots" rule usually removes the docs from the assistant answers the company wanted to appear in.
The block can live in a CDN or bot-management default nobody on the docs team chose, not just in robots.txt. Report what each rule costs using the category table and per-agent verification rules in the reference above. Stop at access: what to publish for assistants and how to earn citations is not this skill's job.
Step 3 - Settle the version and translation posture
This is the step a general SEO audit skips and the one that decides whether the current release or a three-year-old one wins the query. Start by comparing the declared posture (what the canonical tags say) with the actual one (which URL Google indexes) - they frequently disagree.
More from samber
Use this skill in a project
Open any RiverX project, search the Skills panel for samber/developer-relations-skills/docs-seo, and install it in one click.
