From specialist-agent
Audits web app source code for technical SEO issues including meta tags, structured data, content structure, Core Web Vitals, and crawlability. Detects rendering strategies and frameworks like Next.js, Nuxt.
npx claudepluginhub herbertjulio/specialist-agent --plugin specialist-agentThis skill is limited to using the following tools:
Audit web application source code for SEO issues - meta tags, structured data, content structure, Core Web Vitals indicators, and crawlability - producing a scored report with actionable fixes.
Audits websites for SEO issues including meta tags, heading hierarchy, broken links, image optimization, Core Web Vitals, robots/sitemap, performance, and structured data. Produces prioritized fix list.
Runs Maestro-style SEO audits assessing meta tags, structured data, crawlability, and Core Web Vitals in web-facing HTML, templates, and routes. Provides severity-rated findings and remediation guidance.
Share bugs, ideas, or general feedback.
Audit web application source code for SEO issues - meta tags, structured data, content structure, Core Web Vitals indicators, and crawlability - producing a scored report with actionable fixes.
Target: $ARGUMENTS
@marketing SEO mode)/design-review)@perf)# Find page/route files
find $TARGET -path "*/pages/*" -o -path "*/app/*" -o -path "*/routes/*" | grep -E "\.(tsx?|vue|svelte|astro)$" | grep -v "_\|layout\|error\|loading" | head -30
# Check for SSR/SSG configuration
grep -rn "getStaticProps\|getServerSideProps\|generateStaticParams\|getStaticPaths" $TARGET --include="*.ts" --include="*.tsx" 2>/dev/null | head -10
grep -rn "defineNuxtConfig\|ssr:\|prerender" $TARGET --include="*.ts" --include="*.config.*" 2>/dev/null | head -5
grep -rn "export const prerender\|export const ssr" $TARGET --include="*.ts" --include="*.svelte" 2>/dev/null | head -5
Output:
## Scope
- Pages: [N] routes detected
- Framework: [Next.js/Nuxt/SvelteKit/Astro/other]
- Rendering: [SSR/SSG/CSR/ISR/Hybrid]
- i18n: [detected/not detected]
Check meta tags and structured data for each page:
| Check | What to Look For | Impact |
|---|---|---|
| Title tag | Unique, 50-60 chars, keyword-rich | HIGH |
| Meta description | Unique, 150-160 chars, compelling | HIGH |
| Open Graph tags | og:title, og:description, og:image, og:url | MEDIUM |
| Twitter cards | twitter:card, twitter:title, twitter:image | MEDIUM |
| Canonical URL | Self-referencing canonical on every page | HIGH |
| Robots meta | Proper noindex/nofollow where needed | HIGH |
| Structured data | JSON-LD for relevant schema types | MEDIUM |
| Hreflang | Present if multi-language | HIGH (if i18n) |
| Favicon | Present and proper size | LOW |
# Check for meta tag implementation
grep -rn "title\|meta.*description\|og:title\|twitter:card" $TARGET --include="*.tsx" --include="*.vue" --include="*.svelte" --include="*.astro" 2>/dev/null | head -20
# Check for Head/Meta components (framework-specific)
grep -rn "Head>\|useHead\|useSeoMeta\|<svelte:head\|Astro.props" $TARGET --include="*.tsx" --include="*.vue" --include="*.svelte" --include="*.astro" 2>/dev/null | head -15
# Check for JSON-LD structured data
grep -rn "application/ld+json\|structuredData\|jsonLd" $TARGET --include="*.tsx" --include="*.vue" --include="*.svelte" 2>/dev/null | head -10
| Check | Criteria | Severity |
|---|---|---|
| H1 tag | Exactly one H1 per page | HIGH |
| Heading hierarchy | Logical H1 → H2 → H3, no skipped levels | MEDIUM |
| Alt text | All images have descriptive alt text | HIGH |
| Internal links | Meaningful anchor text, no "click here" | MEDIUM |
| Content length | Adequate content for the page type | LOW |
| Semantic HTML | Proper use of <article>, <nav>, <main>, <section> | MEDIUM |
# Check heading usage
grep -rn "<h1\|<h2\|<h3\|<H1\|<H2\|<H3" $TARGET --include="*.tsx" --include="*.vue" --include="*.svelte" 2>/dev/null | head -20
# Check for missing alt text
grep -rn "<img\|<Image" $TARGET --include="*.tsx" --include="*.vue" --include="*.svelte" 2>/dev/null | grep -v "alt=" | head -10
# Check semantic HTML usage
grep -rn "<article\|<section\|<nav\|<main\|<aside\|<header\|<footer" $TARGET --include="*.tsx" --include="*.vue" --include="*.svelte" 2>/dev/null | wc -l
Check code-level indicators that affect CWV:
| Check | CWV Metric | What to Look For |
|---|---|---|
| Image optimization | LCP | next/image, lazy loading, srcset, WebP/AVIF |
| Font loading | CLS | display:swap, font preloading, system font fallback |
| JS bundle size | FID/INP | Dynamic imports, code splitting, tree shaking |
| CSS loading | CLS | Critical CSS inline, non-blocking stylesheet loading |
| Layout shifts | CLS | Explicit width/height on images, skeleton screens |
| Third-party scripts | FID/INP | Deferred/async loading, script placement |
# Image optimization
grep -rn "<img\|<Image" $TARGET --include="*.tsx" --include="*.vue" 2>/dev/null | grep -v "loading=\|lazy\|next/image\|nuxt-img" | head -10
# Font loading strategy
grep -rn "font-display\|@font-face\|display.*swap" $TARGET --include="*.css" --include="*.tsx" 2>/dev/null | head -5
# Dynamic imports (code splitting)
grep -rn "dynamic(\|lazy(\|import(" $TARGET --include="*.tsx" --include="*.vue" --include="*.ts" 2>/dev/null | grep -v "node_modules" | head -10
# Third-party scripts
grep -rn "<script.*src=\|<Script" $TARGET --include="*.tsx" --include="*.vue" --include="*.html" 2>/dev/null | head -10
| Check | What to Look For |
|---|---|
| robots.txt | Exists, allows critical paths, blocks /api and admin |
| Sitemap | sitemap.xml exists and includes all public routes |
| 404 page | Custom 404 with navigation, proper status code |
| Redirects | No redirect chains (>2 hops), 301 for permanent |
| URL structure | Clean, descriptive slugs, no query params for content |
| SPA concerns | Prerendering for CSR apps, proper hydration |
| Dynamic routes | Meta tags set per-route, not hardcoded |
# Check for robots.txt
find . -name "robots.txt" -not -path "*/node_modules/*" 2>/dev/null
# Check for sitemap
find . -name "sitemap*" -not -path "*/node_modules/*" 2>/dev/null
grep -rn "sitemap" $TARGET --include="*.ts" --include="*.config.*" 2>/dev/null | head -5
# Check for 404 page
find $TARGET -name "404*" -o -name "not-found*" -o -name "\[...slug\]*" 2>/dev/null | head -5
# Check for redirect configuration
grep -rn "redirect\|rewrite" $TARGET --include="*.config.*" --include="*.ts" 2>/dev/null | head -10
Score each category 0-100:
| Score Range | Rating |
|---|---|
| 90-100 | Excellent |
| 70-89 | Good |
| 50-69 | Needs Work |
| 0-49 | Critical |
Scoring formula per category:
Before claiming the audit is complete:
| Excuse | Reality |
|---|---|
| "SEO doesn't matter for our app" | Even SaaS apps need landing pages that rank. SEO drives organic acquisition at zero marginal cost. |
| "We'll add meta tags later" | Missing meta tags from day 1 means lost indexing time. Search engines need weeks to crawl and rank. |
| "It's a SPA, SEO doesn't apply" | SPAs need SSR/SSG for SEO. If Google can't render it, it doesn't exist in search results. |
| "Our content is good enough" | Good content with bad technical SEO is invisible. Fix the plumbing so the content can flow. |
| "The framework handles SEO" | Frameworks provide tools, not configuration. You still need proper meta, structured data, and sitemap. |
| "We don't need structured data" | Rich snippets increase CTR by 20-40%. Structured data is free visibility in search results. |
| "We'll do SEO after launch" | Retrofitting SEO is 3-5x more expensive than building it in. Especially for routing and rendering changes. |
──── /seo-audit ────
Target: $ARGUMENTS
Framework: [detected]
Rendering: [SSR/SSG/CSR/Hybrid]
Pages scanned: [N]
Technical SEO: [score]/100 - [N findings]
Content: [score]/100 - [N findings]
Performance: [score]/100 - [N findings]
Crawlability: [score]/100 - [N findings]
Severity:
CRITICAL: N
HIGH: N
MEDIUM: N
LOW: N
Top Findings:
1. [CRITICAL] [description] - [file:line]
2. [HIGH] [description] - [file:line]
3. [HIGH] [description] - [file:line]
Overall SEO Score: [N]/100
Rating: [Excellent | Good | Needs Work | Critical]