seo-a11y-audit
Composite skill — full SEO + Accessibility audit of a website or webapp in one workflow. Chains audit-website (squirrelscan SEO + tech + perf scan) + seo-audit (SEO framing) + playwright-best-practice
SKILL.mdpackages/catalog/catalog/skills/adt-seo-a11y-audit/SKILL.md
GitHubSEO + Accessibility Audit
Pairs SEO and accessibility in one composite because they share root causes: both fail when content isn't discoverable, semantic, or properly structured. A site that fails for screen readers usually also fails for search bots, and vice versa.
Auto-invocation triggers
- User says "audit my site", "check SEO", "accessibility audit", "is this site good"
- Pre-launch / pre-redesign reviews
- Quarterly site health check
- After a search rankings drop or accessibility complaint
- Before submitting a site to government/enterprise procurement (a11y compliance often required)
Workflow
Phase 1 — Broad scan (always, in parallel)
Dispatch in parallel:
audit-website (squirrelscan, 230+ rules across 15 categories)
- SEO: meta tags, Open Graph, schema markup, sitemap, robots, canonical, internal links
- Accessibility: alt text, ARIA, color contrast, focus order, semantic HTML
- Technical: HTTPS, performance, broken links, redirects
- Returns: structured findings with severity + URL
seo-audit (focused SEO framing on top of audit-website)
- Indexability: robots.txt, sitemap.xml, noindex tags
- On-page: title/meta uniqueness, heading hierarchy, keyword targeting
- Content: thin content, duplicate content, content-to-code ratio
- Returns: SEO backlog with remediation order
Phase 2 — Deep accessibility (always, requires running site)
playwright-best-practices axe-core scan:
- Run axe-core against each top-level route
- WCAG 2.1 AA + AAA flags
- Returns: per-route a11y violations with element selectors
If the site isn't accessible from the dev machine: skip Phase 2, mark as PARTIAL, recommend running locally with the site up.
Phase 3 — Design-system pattern review (always)
ui-audit accessibility-focused mode:
- Color palette: contrast ratios across actual UI states
- Typography: font sizes, line heights, readability scores
- Layout patterns: focus order, keyboard navigation, skip links
- Component patterns: form labels, error messaging, ARIA usage
- Returns: pattern-level recommendations distinct from per-page violations
Phase 4 — Reconcile findings
Combine all four sources into one severity-ranked list, organized into 3 buckets:
Bucket A — SEO only (search-discoverability issues)
- Missing meta descriptions
- No canonical tags
- Missing schema markup
- Slow page load (Core Web Vitals)
Bucket B — Accessibility only (assistive-tech issues)
- Color contrast failures
- Missing alt text on decorative images
- Keyboard traps
- ARIA misuse
Bucket C — Both (highest priority — impacts both audiences)
- Missing/empty
<title>tags (SEO + screen readers) - No heading hierarchy (SEO + navigation)
- Images without alt text (SEO + screen readers)
- No semantic HTML (
<main>,<nav>,<article>) (SEO + screen readers) - Inaccessible forms (SEO can't index, users can't submit)
- JS-only content (search bots and screen readers both miss it)
Bucket C findings are always CRITICAL — they fail for both audiences with one root cause. Fix these first; ROI is doubled.
Phase 5 — Severity ranking + remediation plan
For each finding:
- Severity: CRITICAL (blocks audience) / HIGH (degrades experience) / MEDIUM (best practice) / LOW (polish)
- Effort: 5min / 30min / 2h / day+
- Affected scope: single page / template / sitewide
Sort by (impact × audiences) ÷ effort for the action plan.
Phase 6 — Capture
Write report to ~/.claude/projects/<slug>/memory/seo_a11y_audit_<domain>_<date>.md.
Trend visible across periodic runs.
If pre-launch and any CRITICAL/HIGH found: surface as a launch blocker.
Reconciliation
SEO + ACCESSIBILITY AUDIT — <domain> — <date>
Tools run: audit-website ✓, seo-audit ✓, axe-core ✓ (N routes), ui-audit ✓
Pages scanned: N
CRITICAL — Bucket C (both audiences):
✗ <finding> (5min, sitewide) Fix: <action>
✗ <finding> (30min, single page) Fix: <action>
CRITICAL — Bucket A (SEO):
✗ <finding>
CRITICAL — Bucket B (A11y):
✗ <finding>
HIGH (X), MEDIUM (Y), LOW (Z): see report.
Top 5 actions (impact × audiences ÷ effort):
1. <action> (fixes 1 CRITICAL Bucket C, 5min)
2. <action> (fixes 3 HIGH Bucket B, 30min)
3. ...
Memory: <report path>
Launch blocker: YES / NO
Outputs / Evidence
- Reconciled severity-ranked report split by bucket
- Effort-sorted remediation plan
- Memory file for trend tracking
- Launch-blocker verdict if pre-launch context
Failure / Stop Conditions
- Site not reachable → audit-website + seo-audit fail; partial report from ui-audit only with note
- Playwright cannot run (CI/headless env without browser): skip Phase 2, mark as PARTIAL, recommend manual axe DevTools scan
- audit-website CLI not installed: stop with install instruction; this skill needs squirrelscan to function
Memory Hooks
- Read prior reports for trend (e.g., "color contrast HIGH flagged 4 quarters running — push design system fix")
- Read documented false-positive list (e.g., "decorative SVG with empty alt is intentional, suppress")
- Write report as primary output