seo/SKILL.md
Full-stack SEO: technical audit (crawlability, indexability, CWV, security), on-page analysis (meta, headings, content, images), structured data (JSON-LD), sitemaps, hreflang, internal linking, and actionable fixes. Use when user says "SEO audit", "check SEO", "why isn't my page ranking", "structured data", "sitemap", "Core Web Vitals", "meta tags", "hreflang", or "image optimization".
npx skillsauth add snqb/my-skills seoInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
One skill, eight domains. Audit what exists, fix what's broken, generate what's missing.
"Audit SEO for this site" → Full audit (all 8 domains)
"Check this page's SEO" → Single-page deep analysis
"Generate schema for this page" → JSON-LD structured data
"Fix my sitemap" → Sitemap validation + generation
"Why isn't this page ranking?" → On-page + technical diagnosis
Score each category, flag issues by severity (Critical / High / Medium / Low).
AI Crawler Management (2025–2026):
| Crawler | Company | Token | Purpose |
|---------|---------|-------|---------|
| GPTBot | OpenAI | GPTBot | Training |
| ChatGPT-User | OpenAI | ChatGPT-User | Browsing |
| ClaudeBot | Anthropic | ClaudeBot | Training |
| Google-Extended | Google | Google-Extended | Gemini training (NOT search) |
| PerplexityBot | Perplexity | PerplexityBot | Search + training |
| Bytespider | ByteDance | Bytespider | Training |
Blocking Google-Extended does NOT affect Google Search or AI Overviews — those use Googlebot.
JS SEO (Dec 2025 Google update):
noindex in raw HTML may be honored even if JS removes itEvaluation uses 75th percentile of real user data.
| Metric | Good | Needs Work | Poor | |--------|------|------------|------| | LCP (Largest Contentful Paint) | <2.5s | 2.5–4s | >4s | | INP (Interaction to Next Paint) | <200ms | 200–500ms | >500ms | | CLS (Cumulative Layout Shift) | <0.1 | 0.1–0.25 | >0.25 |
INP replaced FID on March 12, 2024. Never reference FID.
Use PageSpeed Insights API if available:
https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=URL&strategy=mobile
includeSubDomainsMobile-first indexing is 100% complete (July 2024). Google crawls ALL sites with mobile Googlebot.
| separator (e.g., Primary Keyword | Brand)<h1> per page, matches page intent<meta property="og:type" content="website" />
<meta property="og:title" content="Title (70 chars max)" />
<meta property="og:description" content="Description (200 chars max)" />
<meta property="og:image" content="https://example.com/image.jpg" /> <!-- 1200×630px -->
<meta property="og:url" content="https://example.com/page" />
<meta property="og:locale" content="ru_RU" />
<meta name="twitter:card" content="summary_large_image" />
<img> (except decorative: role="presentation")| Category | Target | Warning | Critical | |----------|--------|---------|----------| | Thumbnails | <50KB | >100KB | >200KB | | Content | <100KB | >200KB | >500KB | | Hero/banner | <200KB | >300KB | >700KB |
<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="Description" width="800" height="600" loading="lazy" decoding="async">
</picture>
fetchpriority="high", NO loading="lazy"loading="lazy" + decoding="async"width + height (prevents CLS)blue-running-shoes.webp not IMG_1234.jpgJSON-LD is Google's preferred format. Serve in initial HTML, not injected via JS.
Organization, LocalBusiness, Product, ProductGroup, Offer, Service, Article, BlogPosting, NewsArticle, Review, AggregateRating, BreadcrumbList, WebSite, WebPage, Person, ProfilePage, VideoObject, ImageObject, Event, JobPosting, Course, SoftwareApplication, TravelGuide
@context: https://schema.org@type: valid, active typeOrganization:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "",
"url": "",
"logo": "",
"contactPoint": { "@type": "ContactPoint", "telephone": "", "contactType": "customer service" },
"sameAs": ["", ""]
}
LocalBusiness:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "", "url": "", "telephone": "",
"address": { "@type": "PostalAddress", "streetAddress": "", "addressLocality": "", "addressCountry": "" },
"geo": { "@type": "GeoCoordinates", "latitude": "", "longitude": "" },
"openingHoursSpecification": [{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Mo","Tu","We","Th","Fr"], "opens": "09:00", "closes": "18:00" }]
}
BreadcrumbList:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com" },
{ "@type": "ListItem", "position": 2, "name": "Category", "item": "https://example.com/cat" },
{ "@type": "ListItem", "position": 3, "name": "Page" }
]
}
Article:
{
"@context": "https://schema.org", "@type": "Article",
"headline": "", "author": { "@type": "Person", "name": "" },
"datePublished": "", "dateModified": "",
"image": "", "publisher": { "@type": "Organization", "name": "", "logo": { "@type": "ImageObject", "url": "" } }
}
Product + Offer:
{
"@context": "https://schema.org", "@type": "Product",
"name": "", "image": "", "description": "",
"brand": { "@type": "Brand", "name": "" },
"offers": { "@type": "Offer", "url": "", "priceCurrency": "USD", "price": "", "availability": "https://schema.org/InStock" }
}
<lastmod> dates are real (not all identical/current timestamp)<priority> and <changefreq> are ignored by Google — can omit<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/page</loc>
<lastmod>2026-03-11</lastmod>
</url>
</urlset>
For >50K URLs, use sitemap index:
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://example.com/sitemap-pages.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemap-posts.xml</loc></sitemap>
</sitemapindex>
<link> tags — simple, <50 language versionsen, ru, ja — NOT eng, jp)en-US, en-GB, pt-BR — NOT en-uk)| Issue | Severity |
|-------|----------|
| Missing self-referencing tag | Critical |
| Missing return tags (A→B but no B→A) | Critical |
| Missing x-default | High |
| Invalid language code (eng instead of en) | High |
| Invalid region code (en-uk instead of en-GB) | High |
| Hreflang on non-canonical URL | High |
| zh without region qualifier | Medium |
| Hreflang route doesn't exist (404) | Critical |
Overall: XX/100
Technical: XX/100 ████████░░
On-Page: XX/100 ██████████
Images: XX/100 ███████░░░
Structured Data: XX/100 █████░░░░░
Sitemap: XX/100 ████████░░
Hreflang: XX/100 ██████░░░░
Internal Links: XX/100 ████████░░
| # | Fix | Effort | Impact | Domain | |---|-----|--------|--------|--------| | 1 | ... | Low/Med/High | 🔴🔴🔴 | Technical | | 2 | ... | Low | 🟠🟠 | On-Page |
curl -s "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=URL&strategy=mobile" | jq '.lighthouseResult.categories'
curl -s https://example.com/robots.txt
curl -s https://example.com/sitemap.xml | head -50
# Extract JSON-LD from page
curl -s URL | grep -oP '<script type="application/ld\+json">\K[^<]+'
curl -sI https://example.com/ | grep -iE "x-frame|x-content|strict-transport|referrer-policy|content-security|cache-control"
curl -s URL | grep -i hreflang
curl -s URL | grep -oE 'href="https?://example\.com[^"]*"' | sort -u | wc -l
Fused from: aaron-he-zhu/seo-geo-claude-skills (20 skills, 807+ installs), agricidaniel/claude-seo (14 skills, 111+ installs), seo-skills/seo-audit-skill (257 installs). Distilled to actionable checklists; removed filler, duplicate cross-references, and tool-specific integrations.
documentation
Enrich Markdown articles with inline Wikipedia links. First mention of each notable entity gets a hyperlink. Use when asked to add wiki links, enrich, or add references to .md files.
development
Structured visual QA: screenshot → batch issues → fix all → verify. Replaces the 300-cycle screenshot→edit death spiral. Optional bishkek review as exit gate. Use when building/polishing UI with browser testing, or when user asks for N iterations/reviews.
development
Find complex code, analyze intent, recommend battle-tested library replacements. Uses radon/eslint for detection, GitHub quality search for alternatives.
research
Research real-world UI patterns from curated galleries (Collect UI, Component Gallery, Mobbin). Use when exploring what exists: dropdowns, accordions, inputs, navigation, cards, modals, etc.