Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Scan and optimize documentation files for SEO. Audits README.md files and docs/ pages for meta tags, headings, keywords, readability, duplicate content, and broken links. Applies fixes, updates sitemap.xml, and generates a report. Usage: /seo-auditor [path]
.claude/skills/alirezarezvani-seo-auditor/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 312% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 174% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 142% | 0% |
Systematically scan, audit, and optimize documentation files for SEO. Targets README.md files and docs/ pages — fixes issues in place, preserves rankings on high-performing pages, and generates a final report.
bash/seo-auditor # Audit all docs/ and root README.md /seo-auditor docs/skills/ # Audit a specific docs subdirectory /seo-auditor --report-only # Scan without making changes
Execute all 7 phases sequentially. Auto-fix non-destructive issues. Preserve existing high-ranking content. Report everything at the end.
Scan for documentation files that need SEO audit:
bash# Find all markdown files in docs/ and root README files find docs/ -name '*.md' -type f | sort find . -maxdepth 2 -name 'README.md' -not -path './.codex/*' -not -path './.gemini/*' | sort
Classify each file:
git log)index.md files (high authority, handle with care)docs/skills/**/*.md (generated by generate-docs.py)docs/index.md, docs/getting-started.md, docs/integrations.md, etc.For each target file, extract current SEO state:
title: frontmatter field → becomes <title> tagdescription: frontmatter field → becomes <meta name="description"># H1 heading## H2 and ### H3 subheadingsStore baseline in memory for the report.
For every file with YAML frontmatter, check and fix:
title:)Rules:
{Skill Name} — {Differentiator} - {site_name}mkdocs.yml is appended automatically — don't duplicate it in the titleAuto-fix: If title is generic (e.g., just the skill name), enrich it with domain context using the DOMAIN_SEO_SUFFIX pattern from scripts/generate-docs.py.
description:)Rules:
Auto-fix: If description is missing or generic, generate one from the SKILL.md frontmatter description (if available) or from the first paragraph of content. Use the extract_description_from_frontmatter() function from generate-docs.py as reference.
Run on each file that has HTML output in site/:
bashpython3 marketing-skill/skills/seo-audit/scripts/seo_checker.py --file site/{path}/index.html
Parse the score. Flag any page scoring below 60.
For each target file, analyze and improve:
Rules:
# H1 per pageAuto-fix: If heading levels skip (H1 → H3), adjust to proper hierarchy.
Run the content scorer on each file:
bashpython3 marketing-skill/skills/content-production/scripts/content_scorer.py {file_path}
Check scores for:
Run the humanizer scorer on non-generated content (README.md files, static pages):
bashpython3 marketing-skill/skills/content-humanizer/scripts/humanizer_scorer.py {file_path}
Flag pages scoring below 50 (too AI-sounding). For these pages, apply voice techniques from marketing-skill/skills/content-humanizer/references/voice-techniques.md:
Important: Only modify content that was recently created or updated. Do NOT rewrite pages that are ranking well — preserve their content.
Based on the page's purpose and domain:
| Page Type | Primary Keywords | Secondary Keywords | |-----------|-----------------|-------------------| | Homepage (docs/index.md) | "Claude Code Skills", "agent plugins" | "Codex skills", "Gemini CLI", "OpenClaw" | | Skill pages | Skill name + "Claude Code" | "agent skill", "Codex plugin", domain terms | | Agent pages | Agent name + "AI coding agent" | "Claude Code", "orchestrator" | | Command pages | Command name + "slash command" | "Claude Code", "AI coding" | | Getting started | "install Claude Code skills" | platform names | | Domain index | Domain + "skills" + "plugins" | "Claude Code", platform names |
For each page, verify the primary keyword appears in:
title:)description:)Important: Never change URLs of existing pages. URL changes break incoming links and destroy rankings. Only optimize content and meta tags.
For each target file, check all markdown links [text](url):
../, ./)#section-name) point to existing headingsAuto-fix: Use the rewrite_skill_internal_links() and rewrite_relative_links() functions from generate-docs.py as reference. Rewrite broken skill-internal links to GitHub source URLs.
Compare meta descriptions across all pages:
bashgrep -rh '^description:' docs/**/*.md | sort | uniq -d
If duplicates found, make each description unique by adding page-specific context.
Compare H1 headings across all pages — no two pages should have the same H1.
Check if every page in docs/ is referenced in mkdocs.yml nav. Pages not in nav are orphans — they won't appear in navigation and may not be indexed.
bash# Find doc pages not in mkdocs nav find docs -name '*.md' -not -name 'index.md' | while read f; do slug=$(echo "$f" | sed 's|docs/||') grep -q "$slug" mkdocs.yml || echo "ORPHAN: $f" done
Auto-fix: Add orphan pages to the correct nav section in mkdocs.yml.
bashmkdocs build
This regenerates site/sitemap.xml automatically (MkDocs Material generates it during build).
Check the generated sitemap:
bashpython3 marketing-skill/skills/site-architecture/scripts/sitemap_analyzer.py site/sitemap.xml
Verify:
mkdocs.yml nav that don't appear in sitemapGenerate a concise report for the user:
╔══════════════════════════════════════════════════════════════╗
║ SEO AUDITOR REPORT ║
╠══════════════════════════════════════════════════════════════╣
║ ║
║ Pages scanned: {n} ║
║ Issues found: {n} ║
║ Auto-fixed: {n} ║
║ Manual review needed: {n} ║
║ ║
║ META TAGS ║
║ Titles optimized: {n} ║
║ Descriptions fixed: {n} ║
║ Duplicate titles: {n} → {n} (fixed) ║
║ Duplicate descs: {n} → {n} (fixed) ║
║ ║
║ CONTENT ║
║ Readability improved: {n} pages ║
║ Heading fixes: {n} ║
║ AI score improved: {n} pages ║
║ ║
║ KEYWORDS ║
║ Pages missing primary keyword in title: {n} ║
║ Pages missing keyword in description: {n} ║
║ Pages with keyword stuffing: {n} ║
║ ║
║ LINKS ║
║ Broken links found: {n} → {n} (fixed) ║
║ Orphan pages: {n} → {n} (added to nav) ║
║ Duplicate content: {n} → {n} (deduplicated) ║
║ ║
║ SITEMAP ║
║ Total URLs: {n} ║
║ Sitemap regenerated: ✅ ║
║ ║
║ PRESERVED (no changes — ranking well) ║
║ {list of pages left untouched} ║
║ ║
╚══════════════════════════════════════════════════════════════╝These pages rank well for their target keywords. Only fix critical issues (broken links, missing meta). Do NOT rewrite content:
docs/index.md — homepage, ranks for "Claude Code Skills"docs/getting-started.md — installation guidedocs/integrations.md — multi-tool support| Tool | Path | Use | |------|------|-----| | SEO Checker | marketing-skill/skills/seo-audit/scripts/seo_checker.py | Score HTML pages 0-100 | | Content Scorer | marketing-skill/skills/content-production/scripts/content_scorer.py | Score content readability/structure/engagement | | Humanizer Scorer | marketing-skill/skills/content-humanizer/scripts/humanizer_scorer.py | Detect AI-sounding content | | Headline Scorer | marketing-skill/skills/copywriting/scripts/headline_scorer.py | Score title quality | | SEO Optimizer | marketing-skill/skills/content-production/scripts/seo_optimizer.py | Optimize content for target keyword | | Sitemap Analyzer | marketing-skill/skills/site-architecture/scripts/sitemap_analyzer.py | Analyze sitemap structure | | Schema Validator | marketing-skill/skills/schema-markup/scripts/schema_validator.py | Validate structured data | | Topic Cluster Mapper | marketing-skill/skills/content-strategy/scripts/topic_cluster_mapper.py | Group pages into content clusters |
| Reference | Path | Use | |-----------|------|-----| | SEO Audit Framework | marketing-skill/skills/seo-audit/references/seo-audit-reference.md | Priority order for SEO fixes | | AI Search Optimization | marketing-skill/skills/aeo/references/extractable_content_patterns.md | Make content citable by AI | | Content Optimization | marketing-skill/skills/content-production/references/optimization-checklist.md | Pre-publish checklist | | URL Design Guide | marketing-skill/skills/site-architecture/references/url-design-guide.md | URL structure best practices | | Internal Linking | marketing-skill/skills/site-architecture/references/internal-linking-playbook.md | Internal linking strategy | | AI Writing Detection | marketing-skill/skills/content-humanizer/references/ai-tells-checklist.md | AI cliché removal |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 3,504 | 7,396 | +111% | 1 | 1 | 0% | 545 | 3,887 | +613% | 0 | 0 | — |
case-11 | fail→pass | 15,543 | 1,704 | -89% | 1 | 1 | 0% | 858 | 3,539 | +312% | 0 | 0 | — |
case-12 | fail→pass | 22,163 | 2,357 | -89% | 1 | 1 | 0% | 1,641 | 3,640 | +122% | 0 | 0 | — |
case-02 | fail→fail | 16,241 | 5,220 | -68% | 1 | 1 | 0% | 2,964 | 3,604 | +22% | 0 | 0 | — |
case-03 | fail→fail | 3,993 | 5,138 | +29% | 1 | 1 | 0% | 254 | 3,610 | +1321% | 0 | 0 | — |
case-04 | pass→pass | 9,678 | 5,591 | -42% | 1 | 1 | 0% | 1,857 | 4,439 | +139% | 0 | 0 | — |
case-05 | pass→pass | 8,462 | 6,232 | -26% | 1 | 1 | 0% | 1,550 | 4,340 | +180% | 0 | 0 | — |
case-06 | pass→pass | 13,450 | 13,993 | +4% | 1 | 1 | 0% | 2,637 | 5,935 | +125% | 0 | 0 | — |
case-07 | pass→pass | 8,795 | 3,885 | -56% | 1 | 1 | 0% | 1,564 | 3,842 | +146% | 0 | 0 | — |
case-08 | pass→pass | 7,752 | 2,767 | -64% | 1 | 1 | 0% | 1,339 | 3,749 | +180% | 0 | 0 | — |
case-09 | pass→pass | 10,483 | 3,882 | -63% | 1 | 1 | 0% | 1,819 | 3,975 | +119% | 0 | 0 | — |
case-10 | fail→pass | 7,597 | 1,759 | -77% | 1 | 1 | 0% | 1,305 | 3,574 | +174% | 0 | 0 | — |
case-13 | pass→pass | 12,892 | 1,750 | -86% | 1 | 1 | 0% | 2,133 | 3,587 | +68% | 0 | 0 | — |
case-14 | pass→fail | 5,766 | 1,328 | -77% | 1 | 1 | 0% | 847 | 3,529 | +317% | 0 | 0 | — |
case-15 | pass→pass | 7,792 | 1,686 | -78% | 1 | 1 | 0% | 1,358 | 3,618 | +166% | 0 | 0 | — |
case-16 | fail→pass | 10,105 | 1,566 | -85% | 1 | 1 | 0% | 1,626 | 3,533 | +117% | 0 | 0 | — |
case-17 | pass→pass | 6,964 | 1,351 | -81% | 1 | 1 | 0% | 1,085 | 3,480 | +221% | 0 | 0 | — |
case-18 | fail→pass | 10,798 | 7,429 | -31% | 1 | 1 | 0% | 1,887 | 4,575 | +142% | 0 | 0 | — |
case-19 | fail→pass | 11,243 | 2,077 | -82% | 1 | 1 | 0% | 1,832 | 3,697 | +102% | 0 | 0 | — |
case-20 | pass→pass | 8,351 | 2,114 | -75% | 1 | 1 | 0% | 1,345 | 3,638 | +170% | 0 | 0 | — |
case-21 | fail→pass | 8,246 | 1,609 | -80% | 1 | 1 | 0% | 1,393 | 3,535 | +154% | 0 | 0 | — |
case-22 | fail→pass | 8,287 | 3,660 | -56% | 1 | 1 | 0% | 1,277 | 3,891 | +205% | 0 | 0 | — |
case-23 | fail→pass | 12,382 | 6,094 | -51% | 1 | 1 | 0% | 2,096 | 4,378 | +109% | 0 | 0 | — |
case-24 | pass→pass | 13,307 | 4,137 | -69% | 1 | 1 | 0% | 2,288 | 4,006 | +75% | 0 | 0 | — |
case-25 | pass→pass | 8,060 | 5,156 | -36% | 1 | 1 | 0% | 1,462 | 4,228 | +189% | 0 | 0 | — |
case-26 | pass→pass | 7,301 | 1,445 | -80% | 1 | 1 | 0% | 1,361 | 3,495 | +157% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 26 cases were attempted, and 22 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +31 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.