Full Website SEO Audit
Process
- Fetch homepage — use
scripts/fetch_page.py to retrieve HTML
- Detect business type — analyze homepage signals per seo orchestrator
- Crawl site — follow internal links up to 500 pages, respect robots.txt
- Delegate to subagents (if available, otherwise run inline sequentially):
seo-technical — robots.txt, sitemaps, canonicals, Core Web Vitals, security headers
seo-content — E-E-A-T, readability, thin content, AI citation readiness
seo-schema — detection, validation, generation recommendations
seo-sitemap — structure analysis, quality gates, missing pages
seo-performance — LCP, INP, CLS measurements
seo-visual — screenshots, mobile testing, above-fold analysis
- Score — aggregate into SEO Health Score (0-100)
- Report — generate prioritized action plan
Crawl Configuration
Max pages: 500
Respect robots.txt: Yes
Follow redirects: Yes (max 3 hops)
Timeout per page: 30 seconds
Concurrent requests: 5
Delay between requests: 1 second
Output Files
FULL-AUDIT-REPORT.md — Comprehensive findings
ACTION-PLAN.md — Prioritized recommendations (Critical → High → Medium → Low)
screenshots/ — Desktop + mobile captures (if Playwright available)
Scoring Weights
| Category |
Weight |
| Technical SEO |
25% |
| Content Quality |
25% |
| On-Page SEO |
20% |
| Schema / Structured Data |
10% |
| Performance (CWV) |
10% |
| Images |
5% |
| AI Search Readiness |
5% |
Report Structure
Executive Summary
- Overall SEO Health Score (0-100)
- Business type detected
- Top 5 critical issues
- Top 5 quick wins
Technical SEO
- Crawlability issues
- Indexability problems
- Security concerns
- Core Web Vitals status
Content Quality
- E-E-A-T assessment
- Thin content pages
- Duplicate content issues
- Readability scores
On-Page SEO
- Title tag issues
- Meta description problems
- Heading structure
- Internal linking gaps
Schema & Structured Data
- Current implementation
- Validation errors
- Missing opportunities
Performance
- LCP, INP, CLS scores
- Resource optimization needs
- Third-party script impact
Images
- Missing alt text
- Oversized images
- Format recommendations
AI Search Readiness
- Citability score
- Structural improvements
- Authority signals
Quick Audit Rules (Core Checklist)
Use these rules for rapid page-level assessment. Each rule has an ID, pass condition, and severity.
Core SEO (15 rules)
| ID |
Rule |
Pass Condition |
Severity |
| CS01 |
Title tag exists |
Present, 30-60 chars |
Critical |
| CS02 |
Title tag unique |
No duplicates across site |
High |
| CS03 |
Meta description exists |
Present, 120-160 chars |
High |
| CS04 |
H1 tag exists |
Exactly one H1 per page |
Critical |
| CS05 |
H1 contains target keyword |
Primary keyword in H1 |
High |
| CS06 |
Heading hierarchy valid |
H1→H2→H3, no skips |
Medium |
| CS07 |
Canonical tag present |
Self-referencing or correct canonical |
Critical |
| CS08 |
URL is clean |
Lowercase, hyphens, no params, ≤75 chars |
Medium |
| CS09 |
Internal links present |
≥3 internal links per page |
High |
| CS10 |
Broken internal links |
Zero 404s from internal links |
Critical |
| CS11 |
Open Graph tags |
og:title, og:description, og:image present |
Medium |
| CS12 |
Language declared |
lang attribute on <html> |
Medium |
| CS13 |
Viewport meta tag |
width=device-width present |
Critical |
| CS14 |
No duplicate content |
<15% similarity with other pages |
High |
| CS15 |
Keyword in first 100 words |
Primary keyword appears early |
Medium |
Performance (12 rules)
| ID |
Rule |
Pass Condition |
Severity |
| PF01 |
LCP ≤ 2.5s |
CrUX p75 ≤ 2500ms |
Critical |
| PF02 |
INP ≤ 200ms |
CrUX p75 ≤ 200ms |
Critical |
| PF03 |
CLS ≤ 0.1 |
CrUX p75 ≤ 0.1 |
Critical |
| PF04 |
TTFB ≤ 800ms |
Server responds in ≤800ms |
High |
| PF05 |
Total page weight ≤ 1.5MB |
Compressed transfer size |
High |
| PF06 |
JS bundle ≤ 300KB |
Compressed JS total |
High |
| PF07 |
No render-blocking resources |
Critical CSS inlined, JS deferred |
Medium |
| PF08 |
Images lazy-loaded |
Below-fold images use loading="lazy" |
Medium |
| PF09 |
HTTP/2 or HTTP/3 |
Protocol upgrade from HTTP/1.1 |
Medium |
| PF10 |
Compression enabled |
gzip or brotli on text resources |
High |
| PF11 |
Browser caching |
Cache-Control headers on static assets |
Medium |
| PF12 |
No excessive redirects |
≤1 redirect per URL |
Medium |
Links (12 rules)
| ID |
Rule |
Pass Condition |
Severity |
| LK01 |
No broken outbound links |
Zero 404/5xx from external links |
High |
| LK02 |
No orphan pages |
Every page has ≥1 internal link to it |
High |
| LK03 |
Reasonable link depth |
All pages ≤3 clicks from homepage |
Medium |
| LK04 |
No excessive outbound links |
≤100 outbound links per page |
Medium |
| LK05 |
Anchor text descriptive |
No "click here" or empty anchors |
Medium |
| LK06 |
Nofollow used correctly |
UGC/sponsored links marked |
Medium |
| LK07 |
Sitemap links match live pages |
All sitemap URLs return 200 |
Critical |
| LK08 |
Breadcrumbs present |
BreadcrumbList on subpages |
Medium |
| LK09 |
No redirect chains |
Max 1 hop per redirect |
High |
| LK10 |
Footer/nav links functional |
All nav links resolve |
Critical |
| LK11 |
Pagination correct |
rel="next"/"prev" or load-more |
Low |
| LK12 |
Hreflang reciprocal |
Return links present if hreflang used |
High |
Images (10 rules)
| ID |
Rule |
Pass Condition |
Severity |
| IM01 |
Alt text on all images |
Non-decorative images have alt |
Critical |
| IM02 |
Alt text descriptive |
10-125 chars, not "image1.jpg" |
High |
| IM03 |
Modern format used |
WebP or AVIF (not PNG/JPG for photos) |
Medium |
| IM04 |
Images properly sized |
No images wider than container |
Medium |
| IM05 |
Responsive images |
srcset/sizes attributes present |
Medium |
| IM06 |
File size reasonable |
Hero ≤200KB, content ≤100KB, thumb ≤50KB |
High |
| IM07 |
Explicit dimensions |
width/height attributes set (CLS prevention) |
High |
| IM08 |
No broken images |
All img src return 200 |
Critical |
| IM09 |
Lazy loading below fold |
loading="lazy" on non-critical images |
Medium |
| IM10 |
Image filenames descriptive |
"blue-widget.webp" not "IMG_3847.jpg" |
Low |
Security (10 rules)
| ID |
Rule |
Pass Condition |
Severity |
| SC01 |
HTTPS everywhere |
No mixed content, valid SSL cert |
Critical |
| SC02 |
HSTS header |
Strict-Transport-Security present |
High |
| SC03 |
X-Content-Type-Options |
nosniff header present |
Medium |
| SC04 |
X-Frame-Options |
DENY or SAMEORIGIN |
Medium |
| SC05 |
CSP header |
Content-Security-Policy present |
Medium |
| SC06 |
No exposed secrets |
No API keys/passwords in source |
Critical |
| SC07 |
SSL cert valid |
Not expired, correct domain |
Critical |
| SC08 |
HTTP→HTTPS redirect |
301 redirect from HTTP to HTTPS |
Critical |
| SC09 |
No open directory listing |
Directory browsing disabled |
High |
| SC10 |
Secure cookies |
HttpOnly + Secure flags on cookies |
Medium |
AI/GEO Readiness (10 rules)
| ID |
Rule |
Pass Condition |
Severity |
| AI01 |
AI crawlers allowed |
GPTBot, ClaudeBot, PerplexityBot not blocked |
High |
| AI02 |
llms.txt present |
/llms.txt exists with structured content |
Medium |
| AI03 |
Answer-first content |
Direct answer in first 200 words |
High |
| AI04 |
Self-contained answer blocks |
134-167 word blocks for key topics |
High |
| AI05 |
Question-based headings |
H2/H3 match search queries |
Medium |
| AI06 |
Statistics with sources |
Data points cited with attribution |
Medium |
| AI07 |
Author with credentials |
Person schema + bio with expertise |
High |
| AI08 |
Entity presence |
Brand on Wikipedia/Reddit/YouTube |
Medium |
| AI09 |
SSR for key content |
Content visible without JS execution |
Critical |
| AI10 |
Structured data coverage |
Schema on ≥80% of content pages |
Medium |
Content Quality (11 rules)
| ID |
Rule |
Pass Condition |
Severity |
| CQ01 |
No thin pages |
≥300 words for content pages |
High |
| CQ02 |
Readability appropriate |
Flesch Reading Ease 60-70 (general), adjust for audience |
Medium |
| CQ03 |
Publication date visible |
Date published and/or last updated shown |
Medium |
| CQ04 |
Author attribution |
Named author with bio link |
High |
| CQ05 |
External citations |
≥2 authoritative external sources cited |
Medium |
| CQ06 |
No keyword stuffing |
Primary keyword density 0.5-2.5% |
High |
| CQ07 |
Unique value proposition |
Content not duplicated from elsewhere |
Critical |
| CQ08 |
Multimedia present |
≥1 image/video per 500 words |
Medium |
| CQ09 |
Table of contents |
Present on pages ≥1500 words |
Low |
| CQ10 |
No outdated content |
Last updated within content type's refresh cycle |
Medium |
| CQ11 |
Mobile content parity |
Same content on mobile and desktop |
High |
Total: 80 core rules across 7 categories. Use these for rapid assessment; see individual sub-skills for deeper analysis.
Priority Definitions
- Critical: Blocks indexing or causes penalties (fix immediately)
- High: Significantly impacts rankings (fix within 1 week)
- Medium: Optimization opportunity (fix within 1 month)
- Low: Nice to have (backlog)
1---2name: seo-audit3description: Full website SEO audit with parallel subagent delegation. Crawls up to 500 pages, detects business type, delegates to 6 specialists, generates health score. Use when user says "audit", "full SEO check", "analyze my site", or "website health check".4---56# Full Website SEO Audit78## Process9101. **Fetch homepage** — use `scripts/fetch_page.py` to retrieve HTML112. **Detect business type** — analyze homepage signals per seo orchestrator123. **Crawl site** — follow internal links up to 500 pages, respect robots.txt134. **Delegate to subagents** (if available, otherwise run inline sequentially):14 - `seo-technical` — robots.txt, sitemaps, canonicals, Core Web Vitals, security headers15 - `seo-content` — E-E-A-T, readability, thin content, AI citation readiness16 - `seo-schema` — detection, validation, generation recommendations17 - `seo-sitemap` — structure analysis, quality gates, missing pages18 - `seo-performance` — LCP, INP, CLS measurements19 - `seo-visual` — screenshots, mobile testing, above-fold analysis205. **Score** — aggregate into SEO Health Score (0-100)216. **Report** — generate prioritized action plan2223## Crawl Configuration2425```26Max pages: 50027Respect robots.txt: Yes28Follow redirects: Yes (max 3 hops)29Timeout per page: 30 seconds30Concurrent requests: 531Delay between requests: 1 second32```3334## Output Files3536- `FULL-AUDIT-REPORT.md` — Comprehensive findings37- `ACTION-PLAN.md` — Prioritized recommendations (Critical → High → Medium → Low)38- `screenshots/` — Desktop + mobile captures (if Playwright available)3940## Scoring Weights4142| Category | Weight |43|----------|--------|44| Technical SEO | 25% |45| Content Quality | 25% |46| On-Page SEO | 20% |47| Schema / Structured Data | 10% |48| Performance (CWV) | 10% |49| Images | 5% |50| AI Search Readiness | 5% |5152## Report Structure5354### Executive Summary55- Overall SEO Health Score (0-100)56- Business type detected57- Top 5 critical issues58- Top 5 quick wins5960### Technical SEO61- Crawlability issues62- Indexability problems63- Security concerns64- Core Web Vitals status6566### Content Quality67- E-E-A-T assessment68- Thin content pages69- Duplicate content issues70- Readability scores7172### On-Page SEO73- Title tag issues74- Meta description problems75- Heading structure76- Internal linking gaps7778### Schema & Structured Data79- Current implementation80- Validation errors81- Missing opportunities8283### Performance84- LCP, INP, CLS scores85- Resource optimization needs86- Third-party script impact8788### Images89- Missing alt text90- Oversized images91- Format recommendations9293### AI Search Readiness94- Citability score95- Structural improvements96- Authority signals9798## Quick Audit Rules (Core Checklist)99100Use these rules for rapid page-level assessment. Each rule has an ID, pass condition, and severity.101102### Core SEO (15 rules)103| ID | Rule | Pass Condition | Severity |104|----|------|---------------|----------|105| CS01 | Title tag exists | Present, 30-60 chars | Critical |106| CS02 | Title tag unique | No duplicates across site | High |107| CS03 | Meta description exists | Present, 120-160 chars | High |108| CS04 | H1 tag exists | Exactly one H1 per page | Critical |109| CS05 | H1 contains target keyword | Primary keyword in H1 | High |110| CS06 | Heading hierarchy valid | H1→H2→H3, no skips | Medium |111| CS07 | Canonical tag present | Self-referencing or correct canonical | Critical |112| CS08 | URL is clean | Lowercase, hyphens, no params, ≤75 chars | Medium |113| CS09 | Internal links present | ≥3 internal links per page | High |114| CS10 | Broken internal links | Zero 404s from internal links | Critical |115| CS11 | Open Graph tags | og:title, og:description, og:image present | Medium |116| CS12 | Language declared | `lang` attribute on `<html>` | Medium |117| CS13 | Viewport meta tag | `width=device-width` present | Critical |118| CS14 | No duplicate content | <15% similarity with other pages | High |119| CS15 | Keyword in first 100 words | Primary keyword appears early | Medium |120121### Performance (12 rules)122| ID | Rule | Pass Condition | Severity |123|----|------|---------------|----------|124| PF01 | LCP ≤ 2.5s | CrUX p75 ≤ 2500ms | Critical |125| PF02 | INP ≤ 200ms | CrUX p75 ≤ 200ms | Critical |126| PF03 | CLS ≤ 0.1 | CrUX p75 ≤ 0.1 | Critical |127| PF04 | TTFB ≤ 800ms | Server responds in ≤800ms | High |128| PF05 | Total page weight ≤ 1.5MB | Compressed transfer size | High |129| PF06 | JS bundle ≤ 300KB | Compressed JS total | High |130| PF07 | No render-blocking resources | Critical CSS inlined, JS deferred | Medium |131| PF08 | Images lazy-loaded | Below-fold images use loading="lazy" | Medium |132| PF09 | HTTP/2 or HTTP/3 | Protocol upgrade from HTTP/1.1 | Medium |133| PF10 | Compression enabled | gzip or brotli on text resources | High |134| PF11 | Browser caching | Cache-Control headers on static assets | Medium |135| PF12 | No excessive redirects | ≤1 redirect per URL | Medium |136137### Links (12 rules)138| ID | Rule | Pass Condition | Severity |139|----|------|---------------|----------|140| LK01 | No broken outbound links | Zero 404/5xx from external links | High |141| LK02 | No orphan pages | Every page has ≥1 internal link to it | High |142| LK03 | Reasonable link depth | All pages ≤3 clicks from homepage | Medium |143| LK04 | No excessive outbound links | ≤100 outbound links per page | Medium |144| LK05 | Anchor text descriptive | No "click here" or empty anchors | Medium |145| LK06 | Nofollow used correctly | UGC/sponsored links marked | Medium |146| LK07 | Sitemap links match live pages | All sitemap URLs return 200 | Critical |147| LK08 | Breadcrumbs present | BreadcrumbList on subpages | Medium |148| LK09 | No redirect chains | Max 1 hop per redirect | High |149| LK10 | Footer/nav links functional | All nav links resolve | Critical |150| LK11 | Pagination correct | rel="next"/"prev" or load-more | Low |151| LK12 | Hreflang reciprocal | Return links present if hreflang used | High |152153### Images (10 rules)154| ID | Rule | Pass Condition | Severity |155|----|------|---------------|----------|156| IM01 | Alt text on all images | Non-decorative images have alt | Critical |157| IM02 | Alt text descriptive | 10-125 chars, not "image1.jpg" | High |158| IM03 | Modern format used | WebP or AVIF (not PNG/JPG for photos) | Medium |159| IM04 | Images properly sized | No images wider than container | Medium |160| IM05 | Responsive images | srcset/sizes attributes present | Medium |161| IM06 | File size reasonable | Hero ≤200KB, content ≤100KB, thumb ≤50KB | High |162| IM07 | Explicit dimensions | width/height attributes set (CLS prevention) | High |163| IM08 | No broken images | All img src return 200 | Critical |164| IM09 | Lazy loading below fold | loading="lazy" on non-critical images | Medium |165| IM10 | Image filenames descriptive | "blue-widget.webp" not "IMG_3847.jpg" | Low |166167### Security (10 rules)168| ID | Rule | Pass Condition | Severity |169|----|------|---------------|----------|170| SC01 | HTTPS everywhere | No mixed content, valid SSL cert | Critical |171| SC02 | HSTS header | Strict-Transport-Security present | High |172| SC03 | X-Content-Type-Options | nosniff header present | Medium |173| SC04 | X-Frame-Options | DENY or SAMEORIGIN | Medium |174| SC05 | CSP header | Content-Security-Policy present | Medium |175| SC06 | No exposed secrets | No API keys/passwords in source | Critical |176| SC07 | SSL cert valid | Not expired, correct domain | Critical |177| SC08 | HTTP→HTTPS redirect | 301 redirect from HTTP to HTTPS | Critical |178| SC09 | No open directory listing | Directory browsing disabled | High |179| SC10 | Secure cookies | HttpOnly + Secure flags on cookies | Medium |180181### AI/GEO Readiness (10 rules)182| ID | Rule | Pass Condition | Severity |183|----|------|---------------|----------|184| AI01 | AI crawlers allowed | GPTBot, ClaudeBot, PerplexityBot not blocked | High |185| AI02 | llms.txt present | /llms.txt exists with structured content | Medium |186| AI03 | Answer-first content | Direct answer in first 200 words | High |187| AI04 | Self-contained answer blocks | 134-167 word blocks for key topics | High |188| AI05 | Question-based headings | H2/H3 match search queries | Medium |189| AI06 | Statistics with sources | Data points cited with attribution | Medium |190| AI07 | Author with credentials | Person schema + bio with expertise | High |191| AI08 | Entity presence | Brand on Wikipedia/Reddit/YouTube | Medium |192| AI09 | SSR for key content | Content visible without JS execution | Critical |193| AI10 | Structured data coverage | Schema on ≥80% of content pages | Medium |194195### Content Quality (11 rules)196| ID | Rule | Pass Condition | Severity |197|----|------|---------------|----------|198| CQ01 | No thin pages | ≥300 words for content pages | High |199| CQ02 | Readability appropriate | Flesch Reading Ease 60-70 (general), adjust for audience | Medium |200| CQ03 | Publication date visible | Date published and/or last updated shown | Medium |201| CQ04 | Author attribution | Named author with bio link | High |202| CQ05 | External citations | ≥2 authoritative external sources cited | Medium |203| CQ06 | No keyword stuffing | Primary keyword density 0.5-2.5% | High |204| CQ07 | Unique value proposition | Content not duplicated from elsewhere | Critical |205| CQ08 | Multimedia present | ≥1 image/video per 500 words | Medium |206| CQ09 | Table of contents | Present on pages ≥1500 words | Low |207| CQ10 | No outdated content | Last updated within content type's refresh cycle | Medium |208| CQ11 | Mobile content parity | Same content on mobile and desktop | High |209210**Total: 80 core rules** across 7 categories. Use these for rapid assessment; see individual sub-skills for deeper analysis.211212## Priority Definitions213214- **Critical**: Blocks indexing or causes penalties (fix immediately)215- **High**: Significantly impacts rankings (fix within 1 week)216- **Medium**: Optimization opportunity (fix within 1 month)217- **Low**: Nice to have (backlog)