Deep SEO audit for web projects. Analyzes codebase for crawlability, indexability, on-page SEO, structured data, social previews, and technical foundations. Optionally runs Lighthouse and PageSpeed against a live URL. Reports findings with severity, offers direct fixes or /arc:detail plans. Use when asked to "audit SEO", "check SEO", "review SEO", or "is my site SEO-ready".
Performs comprehensive SEO audits by analyzing codebases and optionally running Lighthouse against live URLs.
/plugin marketplace add howells/arc/plugin install arc@howellsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
<tasklist_context> Use TaskList tool to check for existing tasks related to this work.
If a related task exists, note its ID and mark it in_progress with TaskUpdate when starting.
</tasklist_context>
<rules_context> Read SEO rules NOW:
Use Read tool: ${CLAUDE_PLUGIN_ROOT}/rules/seo.md
This defines page classification (marketing vs app), all required vitals, and configuration requirements. The skill goes deeper than these rules, but they are the shared baseline. </rules_context>
<progress_context>
Use Read tool: docs/progress.md (first 50 lines)
Check for recent changes that might affect SEO (new pages, redesigns, migrations). </progress_context>
Deep SEO audit for web projects. Analyzes codebase for technical SEO compliance, content optimization, and social sharing readiness. Optionally validates against a live site.
Use Glob + Grep to detect project type:
| Check | Tool | Pattern |
|---|---|---|
| Next.js | Grep | "next" in package.json |
| Remix | Grep | "@remix-run" in package.json |
| Astro | Grep | "astro" in package.json |
| SvelteKit | Grep | "@sveltejs/kit" in package.json |
| Nuxt | Grep | "nuxt" in package.json |
| Static HTML | Glob | *.html in root or public/ |
Record framework — this determines where to look for routes, meta tags, and config.
Framework-specific route discovery:
| Framework | Glob Pattern | Route Pattern |
|---|---|---|
| Next.js (App Router) | app/**/page.{tsx,jsx,ts,js} | Directory = route |
| Next.js (Pages Router) | pages/**/*.{tsx,jsx,ts,js} | File = route |
| Remix | app/routes/**/*.{tsx,jsx,ts,js} | File = route |
| Astro | src/pages/**/*.{astro,md,mdx} | File = route |
| SvelteKit | src/routes/**/+page.svelte | Directory = route |
| Static HTML | **/*.html | File = route |
Present discovered routes to user.
Ask the user to classify pages:
Present the route list and ask which are app-only (authenticated/gated). Use AskUserQuestion with multiSelect.
Default: treat all as marketing unless user marks as app-only.
Example:
"I found these routes. Which are app pages (authenticated/gated)?
Marketing pages get full SEO audit. App pages get basics only (title, noindex)."
Routes:
- / (homepage)
- /about
- /pricing
- /blog
- /blog/[slug]
- /dashboard
- /settings
- /api/*
API routes are automatically excluded from SEO checks.
Scan for what's already in place:
| Check | Where to Look |
|---|---|
| robots.txt | public/robots.txt, app/robots.ts (Next.js) |
| sitemap | public/sitemap.xml, app/sitemap.ts (Next.js) |
| Meta setup | Root layout, page-level metadata exports |
| Structured data | JSON-LD in layouts or pages |
| OG images | app/opengraph-image.*, static OG images in public/ |
| Favicons | app/icon.*, app/favicon.ico, public/favicon.ico |
| Google Search Console | <meta name="google-site-verification"> in root layout, public/google*.html verification file |
Report what exists:
## Existing SEO Config
- ✓ robots.txt present
- ✓ Meta titles in root layout
- ✗ sitemap.xml missing
- ✗ No structured data found
- ✗ OG images not configured
- ✗ Google Search Console not verified
"Do you have a live URL (dev or production) for this site? If so, I can run Lighthouse and PageSpeed for additional analysis. This is optional."
If provided, store for Phase 2.
Run checks against the codebase, organized by category. Marketing pages get full treatment. App pages get basics only.
noindex? Common pitfall: Vercel preview noindex leaking to production.google-site-verification or public/google*.html file). If not verified, flag as High — without Search Console, Google won't notify you of indexing issues, manual actions, or crawl errors.<html lang="..."> set to correct language code?<meta name="viewport" content="width=device-width, initial-scale=1"> present?<meta charset="utf-8"> or equivalent declared?If user provided a live URL and wants live checks:
"Running Lighthouse and PageSpeed on [URL]. This may take a moment."
Run programmatic tools (blocking — results go into the report):
# Lighthouse SEO audit
npx lighthouse [URL] --output=json --only-categories=seo --chrome-flags="--headless=new" 2>/dev/null
# Lighthouse Performance (Core Web Vitals)
npx lighthouse [URL] --output=json --only-categories=performance --chrome-flags="--headless=new" 2>/dev/null
PageSpeed Insights API (no key needed for light usage):
GET https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=[URL]&category=seo&strategy=mobile
GET https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=[URL]&category=seo&strategy=desktop
If user wants full-site crawl:
npx unlighthouse --site [URL] --reporter jsonExpanded
Failure handling: If any check fails (timeout, auth wall, network error), note in the report: "Could not access [URL] — [reason]. Skipping live check." Continue with codebase-only findings.
Extract from Lighthouse JSON:
Extract from PageSpeed API:
Create: docs/audits/YYYY-MM-DD-seo-audit.md
# SEO Audit Report
**Date:** YYYY-MM-DD
**Framework:** [detected framework]
**Marketing pages:** [count]
**App pages:** [count] (basics only)
**Live URL:** [URL or "not provided"]
**Live checks:** [run / not run]
## Summary
[1-2 paragraph overview of findings]
- **Critical:** X issues
- **High:** X issues
- **Medium:** X issues
## Critical Issues
> Indexing is broken or severely impaired
### [Issue Title]
**File:** `path/to/file.ts:123`
**Category:** [Crawlability / Indexability / On-page / etc.]
**Issue:** [What's wrong]
**Impact:** [How this affects SEO]
**Fix:** [Specific change needed]
## High Priority
> Core SEO elements missing
[Same format per finding]
## Medium Priority
> Suboptimal but not broken
[Same format per finding]
## Live Site Results
> From Lighthouse and PageSpeed (if run)
**Lighthouse SEO Score:** [X/100]
**Core Web Vitals:**
- LCP: [value] — [good/needs improvement/poor]
- CLS: [value] — [good/needs improvement/poor]
- INP: [value] — [good/needs improvement/poor]
**PageSpeed:**
- Mobile SEO: [X/100]
- Desktop SEO: [X/100]
[Specific audit failures from Lighthouse]
## Google Search Console
**Status:** [Verified / Not verified]
If not verified, submit your site now:
→ **Add your site:** [https://search.google.com/search-console/welcome](https://search.google.com/search-console/welcome)
After verification, submit your sitemap:
→ **Submit sitemap:** `https://search.google.com/search-console/sitemaps?resource_id=https://[DOMAIN]/`
Without Search Console, Google won't alert you to indexing problems, crawl errors, or manual actions. This is not optional for any site that needs organic traffic.
## Manual Validation Tools
Check these tools for additional validation:
- [Google Rich Results Test](https://search.google.com/test/rich-results?url=[URL])
- [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/?q=[URL])
- [Twitter Card Validator](https://cards-dev.twitter.com/validator)
- [LinkedIn Post Inspector](https://www.linkedin.com/post-inspector/)
## Framework-Specific Recommendations
[Tailored to detected framework — Next.js Metadata API, Astro SEO patterns, etc.]
Count the number of files affected by findings.
Fix heuristic:
/arc:detail?"/arc:detail?"Use AskUserQuestion to present the appropriate options based on file count.
Tailor recommendations to the detected framework:
Next.js (App Router):
export const metadata or generateMetadata)opengraph-image.tsx for dynamic OG imagesrobots.ts for programmatic robots.txtsitemap.ts for dynamic sitemap generationicon.tsx for dynamic faviconsNext.js (Pages Router):
next/head for meta tagsnext-seo package or custom SEO componentnext-sitemapRemix:
meta function exports per routeAstro:
<head> in layout components@astrojs/sitemap)Other:
mkdir -p docs/audits
git add docs/audits/YYYY-MM-DD-seo-audit.md
git commit -m "docs: add SEO audit report"
## SEO Audit Complete
**Scope:** [N] marketing pages, [N] app pages
**Live checks:** [Yes — score X/100 / No]
**Report:** docs/audits/YYYY-MM-DD-seo-audit.md
### Findings
- Critical: X | High: X | Medium: X
- Files affected: X
### [Fix option based on heuristic]
<success_criteria> SEO audit is complete when:
/arc:audit<arc_log>
After completing this skill, append to the activity log.
See: ${CLAUDE_PLUGIN_ROOT}/references/arc-log.md
Entry: /arc:seo — [scope] audit ([N] issues)
</arc_log>
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.