Audit any website (any framework) for SEO and AEO (Answer-Engine Optimization) quality, producing a prioritized improvement report with framework-specific code fixes. Holistic whole-site audit, not just blog posts. Use when the user says "audit X.com", "SEO audit on...", "AEO audit", "check SEO/AEO gaps on...", or asks for an improvement/architectural report on a live website. Works on Next.js, Astro, Nuxt, SvelteKit, Gatsby, Remix, WordPress, Shopify, or generic HTML.
Resources
10Install
npx skillscat add openairlabs/seo-aeo-audit Install via the SkillsCat registry.
SEO + AEO Audit Skill
You are running a holistic SEO & AEO audit of a live website. This skill combines a deterministic Python analyzer with your own judgment to produce a prioritized, strategic improvement report with framework-specific code fixes.
When to invoke
Trigger when the user asks to:
- "audit [domain]" / "run an SEO audit" / "AEO audit" / "check SEO gaps"
- "analyze [URL] for search optimization"
- "generate an improvement report for [site]"
- produce "architectural improvements" or "gaps" for search/AI visibility
Process (follow in order)
Step 1 — Verify environment
CRITICAL: This skill installs its Python deps into a venv at ~/.claude/skills/seo-aeo-audit/venv/. Always use the venv's Python — NEVER plain python3 or python. Plain python3 is the system Python and won't have the skill's deps, so it will always report missing modules and send you down a false install path.
The single Python binary to use everywhere in this skill is:
~/.claude/skills/seo-aeo-audit/venv/bin/pythonFirst, check if the venv is installed:
ls ~/.claude/skills/seo-aeo-audit/venv/bin/python 2>/dev/null && echo "venv present" || echo "venv missing"If the venv is present, verify deps (using the venv's Python):
~/.claude/skills/seo-aeo-audit/venv/bin/python -c "import playwright, httpx, bs4, tldextract, click, docx" 2>&1(extruct is optional. docx means python-docx — required for the .docx output step.)
Only if the venv is missing or the import check fails, run the install ladder:
# 1. If pip is missing (Ubuntu/WSL often lacks it):
sudo apt-get install -y python3-pip python3-venv
# 2. Create the skill's venv:
python3 -m venv ~/.claude/skills/seo-aeo-audit/venv
# 3. Install Python deps (use the venv's pip, NOT system pip):
~/.claude/skills/seo-aeo-audit/venv/bin/pip install -r ~/.claude/skills/seo-aeo-audit/requirements.txt
# 4. Install at least one Playwright browser (uses the venv's python):
~/.claude/skills/seo-aeo-audit/venv/bin/python -m playwright install chromium
# or firefox: ~/.claude/skills/seo-aeo-audit/venv/bin/python -m playwright install firefox
# or webkit: ~/.claude/skills/seo-aeo-audit/venv/bin/python -m playwright install webkitOffer to run the install for the user if needed. Do not proceed with the analyzer until the venv's Python can import the modules.
Step 2 — Run the analyzer
Always invoke via the venv's Python:
~/.claude/skills/seo-aeo-audit/venv/bin/python ~/.claude/skills/seo-aeo-audit/audit.py <URL> --out ./audits/Common flags:
--max-pages N— cap sampled templates (default 15)--no-render— skip Playwright fallback (faster, misses SPAs)--focus {seo,aeo,strategic,all}— narrow the analyzer output--browser {auto,chromium,firefox,webkit}— Playwright browser.autoprobes in order chromium → firefox → webkit and uses the first available. Default:auto.--compare URL— produce a delta vs. reference site (use with caution, doubles runtime)
Expect 30-90 seconds. The analyzer writes to ./audits/<domain>/<YYYY-MM-DD>/:
findings.json— structured findings (this is your source of truth)screenshots/— desktop + mobile PNGs per sampled URLpages.json— raw parsed data per page (useful for citations)
Step 3 — Read findings.json and screenshots
# Structure:
# findings.json
# - run: { url, date, pages_sampled, framework_detected, scores }
# - findings: [ { id, severity, category, template, affected_urls, evidence, why, recommendation, framework_fix, impact_score } ]
# - templates: { template_name: [sample_urls] }
# - schema_matrix: { template: { BlogPosting: bool, FAQPage: bool, ... } }Then look at 3-5 key screenshots (home, primary product/pricing, blog post, key conversion page). The strategic/design 20% layer of the report comes from YOUR read of these screenshots — the analyzer cannot judge visual hierarchy or positioning.
Step 4 — Synthesize the technical report
Write the report to ./audits/<domain>/<YYYY-MM-DD>/report.md using templates/report-template.md as scaffold. The report MUST contain these sections in this order:
- Executive Summary — scores (SEO, AEO, Strategic 0-100), 3 biggest wins, 3 biggest gaps, recommended focus
- Critical Issues — blockers that lose traffic/ranking today. Filter
severity: criticalfrom findings. - High-Impact Improvements — 30-day list, ordered by
impact_score - Per-Template Findings — one section per sampled template
- Schema Coverage Matrix — render the matrix as a markdown table (✓/✗)
- AEO Readiness — answer-engine posture: schema depth, AI crawler access, entity linking (Wikidata etc.), direct-answer structure, Speakable schema
- Strategic & Design Layer (the 20%) — YOUR judgment from screenshots. Cover: above-the-fold 3-second test, positioning sharpness, primary CTA visibility, social proof, IA clarity, conversion path, visual hierarchy, brand voice distinctiveness, topical authority gaps, mobile impression
- 30/60/90 Roadmap — prioritized action plan
- Framework-Specific Code — for each critical/high finding, show the fix in the detected framework. Load
frameworks/<detected>.mdfor patterns. - Methodology — one paragraph + link to raw findings.json
Step 5 — Apply framework-specific fixes
The analyzer populates run.framework_detected (one of: astro, nextjs, nuxt, sveltekit, gatsby, remix, wordpress, shopify, unknown).
For the Framework-Specific Code section:
- Read
frameworks/<detected>.md— contains canonical code snippets per issue class - For each critical + high finding, cross-reference its
idagainst the framework file - If the framework is
astro, referencereferences/astro-gold-standard-patterns.mdfor the full-depth pattern library (Organization schema depth, Speakable schema, combined@graphutility, AI bot detection, etc.) - Fall back to
frameworks/generic-html.mdwhen framework is unknown
Step 6 — Write the technical report
Keep the report actionable. For every finding, include:
- What — one-line statement of the issue
- Why it matters — SEO/AEO impact in plain language
- Fix — HTML-level description
- Code — framework-specific snippet
- Evidence — sampled URL(s) + what was observed
Step 7 — Write the layman summary (for non-technical stakeholders)
Every audit also produces a plain-English summary aimed at founders, marketing leads, and non-technical stakeholders who don't read code. Write to ./audits/<domain>/<YYYY-MM-DD>/summary.md using templates/summary-template.md as scaffold.
Rules for the summary:
- No jargon without definition. Any technical term gets expanded in the glossary.
- Business impact, not technical detail. Frame every gap as lost traffic, fewer AI citations, lower conversion, worse first impression.
- Traffic-light health section. Green (what's working), yellow (could be better), red (broken / costing visibility).
- Top 5 things to do first — each with title, what, why, effort (day/week/month), who to assign.
- Ideas & guidance section — this is the "so what" for a strategic reader. Go beyond just fixing what's broken:
- Content areas/topical authority the site should own
- Positioning / hero-headline tightening (suggest actual rewrites when you can)
- Trust signals to add (logos, case studies, counts, testimonials)
- Pages to create (comparisons, tools/calculators, guides) that capture commercial-intent traffic
- Distribution plays (llms.txt, newsletter, Wikipedia/Wikidata presence, community, podcast outreach)
- Glossary — define every acronym and technical term used.
- Tone: confident, specific, kind. Not condescending. Assume the reader is smart but not a web developer.
Keep summary.md to roughly 800-1500 words.
Step 8 — Render .docx versions of both
Run the bundled converter to produce Word-compatible docx files (again, always via the venv's Python):
~/.claude/skills/seo-aeo-audit/venv/bin/python \
~/.claude/skills/seo-aeo-audit/render_docx.py \
./audits/<domain>/<date>/report.md \
./audits/<domain>/<date>/report.docx
~/.claude/skills/seo-aeo-audit/venv/bin/python \
~/.claude/skills/seo-aeo-audit/render_docx.py \
./audits/<domain>/<date>/summary.md \
./audits/<domain>/<date>/summary.docxThis gives stakeholders shareable .docx files alongside the markdown source.
Step 9 — Final message to the user
End with two lines to the user:
Report: ./audits/<domain>/<date>/report.md (+ .docx)— for the web/content teamSummary: ./audits/<domain>/<date>/summary.md (+ .docx)— for stakeholders
Plus scores and the single top gap:Scores: SEO X/100, AEO Y/100, Strategic Z/100. Top gap: <gap>.
The Strategic 20% — how to read screenshots
Don't just list what you see. For each screenshot, answer:
- Above the fold: In 3 seconds, what does this site do? Who's it for?
- Hero: Is the headline sharp and specific, or template SaaS? ("The ad spend OS for scaling lead gen" is sharp; "The best platform for your business" is not)
- Visual hierarchy: Does the design lead the eye to the primary CTA? Is there ONE primary CTA or competing ones?
- Social proof: Are trust signals (logos, counts, testimonials) visible in the first viewport?
- IA signals: Nav clarity — jobs-to-be-done or internal org chart? How many top-level items?
- Copy voice: Does it sound distinctive (brand-owned) or generic (AI-written template)?
- Mobile: How does the mobile screenshot change the experience? Is content re-ordered well?
AEO is the differentiator — don't skimp on it
Most audits are SEO-only. AEO (how AI answer engines like ChatGPT, Perplexity, Google AI Overview, Claude represent the site) is where sites win or lose in 2026. Heavily emphasize:
- Schema depth — Organization schema with
sameAsincluding Wikidata URL is a 10x entity-recognition signal - FAQPage + HowTo + Speakable schemas — direct AEO surfaces
- AI crawler policy — robots.txt must allow GPTBot, ClaudeBot, PerplexityBot, CCBot, Google-Extended, Applebot-Extended (flag any disallows as gaps unless the user has a reason)
- llms.txt — emerging standard, flag if missing
- Direct-answer structure — first ≤50 words of each page should answer the implied question
- Entity density — how many Wikipedia/Wikidata-linkable entities appear as
sameAs?
Reference: references/playbook-distilled.md for the full set of AEO principles applied during synthesis.
Tone & calibration
- Be direct. This is a technical audit, not marketing copy.
- Quantify findings when possible ("73% of sampled blog posts missing canonical").
- Never say "comprehensive", "holistic", "leverage", "world-class" in the report — they're hollow filler.
- Lead with the biggest gap. If the home page has no Organization schema, that's worth more than 50 meta description tweaks.
- Be specific about framework-specific fixes — vague "add schema markup" is a failure mode.
Output
Final deliverable the user sees:
./audits/<domain>/<YYYY-MM-DD>/
├── report.md ← Technical audit (for web/content team)
├── report.docx ← Same, as Word doc
├── summary.md ← Layman summary (for stakeholders)
├── summary.docx ← Same, as Word doc
├── findings.json ← Raw analyzer output (structured, for tooling)
├── pages.json ← Raw per-page parsed data
└── screenshots/
├── home-desktop.png
├── home-mobile.png
├── blog-desktop.png
└── ...