seo-ready
Full SEO and AEO audit that reads the codebase, scores every signal, and applies the fixes. Not just a report — it changes the files.
Phase 1: Detect the Stack
Identify the framework and routing pattern before doing anything else.
Check for these in order:
next.config.*→ Next.js (check version in package.json — v13+ uses App Router withgenerateMetadata, older uses_documentandnext/head)astro.config.*→ Astro (uses frontmatter +<head>in layouts)nuxt.config.*→ Nuxt (usesuseHeadoruseSeoMeta)svelte.config.*→ SvelteKit (uses<svelte:head>)index.htmlat root → Static HTML / Vite SPAgatsby-config.*→ Gatsby (usesgatsby-plugin-react-helmet)
Find all pages/routes:
- Next.js App Router:
app/**/page.tsxorpage.jsx - Next.js Pages Router:
pages/**/*.tsx - Astro:
src/pages/**/*.astro - Static: all
.htmlfiles
Tell the user: "Found [framework] project with [N] pages. Running full SEO/AEO audit."
Phase 2: Audit Every Signal
Check each of these across all pages. Score each as PASS / WARN / FAIL.
2.1 Title Tags
- Every page must have a unique
<title>or equivalent metadata - Length: 30-60 characters (PASS), 20-70 (WARN), outside range (FAIL)
- Must include the primary keyword/topic for that page
- In Next.js: check
metadata.titleorgenerateMetadata()return value - Check for title template (e.g.,
%s | Brand Name) in root layout
2.2 Meta Descriptions
- Every page must have a meta description
- Length: 70-160 characters (PASS), 50-180 (WARN), outside or missing (FAIL)
- Should contain the direct answer or core promise of the page
- In Next.js: check
metadata.description
2.3 Heading Hierarchy
- Exactly one
<h1>per page (PASS), zero or multiple (FAIL) - H2s should be used for major sections
- Check for skipped levels (h1 → h3 with no h2)
- For AEO: check if any H2s are phrased as questions (how/what/why/when/who/which/can/does/should)
- 2+ question headings = PASS, 1 = WARN, 0 = FAIL
- Question headings match voice/LLM prompts directly
2.4 Open Graph Tags
og:title,og:description,og:type,og:url,og:image— all must be presentog:imageis critical — without it, social shares show a blank card- In Next.js: check
metadata.openGraphobject - Check Twitter card tags too:
twitter:card,twitter:title,twitter:description twitter:cardshould besummary_large_imagefor best visibility
2.5 Canonical URLs
- Every page should have a canonical URL
- In Next.js: check
metadata.alternates.canonical - In HTML: check
<link rel="canonical"> - Must be absolute URLs, not relative
2.6 Structured Data (JSON-LD)
- Check for
<script type="application/ld+json">blocks - Check for these high-value schema types:
FAQPage— captures long-tail questions in AI answers (HIGH IMPACT)HowTo— wins "how to" featured snippetsArticle/BlogPosting— for content pagesWebApplication— for SaaS productsProduct+Review— for e-commerceOrganization— for brand identityBreadcrumbList— for navigation context
- In Next.js: schema may be in page components as
<script>tags or in metadata - PASS if relevant schema types present, FAIL if none
2.7 Sitemap
- Check for
sitemap.xmlorsitemap.ts(Next.js) orsitemap-index.xml - Must include all public pages with proper
lastmod,changefreq,priority - Dynamic pages must be included (e.g., all
/blog/[slug]pages) - PASS if exists and covers all pages, WARN if exists but incomplete, FAIL if missing
2.8 Robots.txt
- Check for
robots.txtorrobots.ts(Next.js) - Must allow crawling of public pages
- Must block private routes (
/api/,/admin/,/auth/,/dashboard/) - Must reference sitemap URL
- FAIL if missing entirely
2.9 AI Crawler Rules (AEO-specific)
- In
robots.txt, check for explicit rules for AI crawlers:GPTBot(OpenAI / ChatGPT)ChatGPT-User(ChatGPT browsing)Claude-Web(Anthropic)PerplexityBot(Perplexity)Applebot-Extended(Apple Intelligence)Google-Extended(Gemini)
- These should be explicitly ALLOWED for public content pages
- WARN if not mentioned (defaults vary), FAIL if explicitly blocked
2.10 llms.txt
- Check for
llms.txtin the public directory - This file helps AI tools understand your product/site structure
- Should contain: product name, description, key features, pricing, important URLs
- PASS if exists and has content, FAIL if missing
2.11 Opening Summary / Answer Block (AEO-specific)
- For content pages, check if the first paragraph is a concise summary (35-90 words)
- This is what answer engines pull into answer boxes
- Check for "answer-first" writing pattern — the key information should be near the top, not buried
- PASS if found, WARN if too long/short, FAIL if no clear summary
2.12 Internal Linking
- Count internal links per page
- 6+ internal links = PASS, 2-5 = WARN, 0-1 = FAIL
- Internal links help search engines and LLM retrievers map topic depth
2.13 FAQ Sections
- Check for FAQ headings or FAQ-like Q&A content
- These capture long-tail prompts in AI search
- Should have structured data (FAQPage schema) if FAQ content exists
- PASS if FAQ section + schema, WARN if FAQ but no schema, FAIL if neither
2.14 Image Alt Text
- Check all
<img>tags and Next.js<Image>components for alt text - Every image should have descriptive alt text
- PASS if all have alt text, WARN if some missing, FAIL if most missing
2.15 Performance Signals
- Check for
next/imageusage (not raw<img>) in Next.js projects - Check for font optimization (next/font, font-display: swap)
- Check for excessive client-side JavaScript (
"use client"on pages that could be server-rendered)
Phase 3: Score and Report
Calculate the overall score:
- Each check has equal weight
- PASS = 1 point, WARN = 0.5 points, FAIL = 0 points
- Score = (total points / total checks) * 100
Display the report:
SEO/AEO Readiness: [SCORE]/100 ([VERDICT])
Framework: [detected framework]
Pages scanned: [N]
On-site checks:
[PASS] Title tags All pages have titles (30-60 chars)
[WARN] Meta descriptions 2/5 pages missing descriptions
[FAIL] Structured data No JSON-LD schema detected
[PASS] Sitemap sitemap.ts found, covers all pages
...
AEO checks:
[FAIL] AI crawler rules No AI bot rules in robots.txt
[FAIL] llms.txt Not found
[WARN] Question headings 1 question heading found (need 2+)
[FAIL] FAQ schema No FAQPage schema
...
Top issues to fix (by impact):
1. (HIGH) Add FAQPage JSON-LD schema — captures AI answer citations
2. (HIGH) Create llms.txt — makes your site readable by AI tools
3. (HIGH) Add AI crawler allow rules — GPTBot, Claude-Web, PerplexityBot
4. (MEDIUM) Add meta descriptions to 2 pages
5. (LOW) Add alt text to 3 images
Then ask: "Want me to fix all [N] issues, or pick specific ones?"
Phase 4: Fix Everything
Apply fixes based on the detected framework. Ask before making changes.
Fix: Missing/Bad Meta Tags
Next.js App Router:
- Add or update
metadataexport in page files orgenerateMetadata()for dynamic pages - Set up title template in root
layout.tsx:title: { template: '%s | Brand', default: 'Brand — tagline' } - Add description, keywords, authors, creator
Static HTML:
- Add
<meta>tags in<head>section
Fix: Missing Open Graph / Twitter Cards
Next.js:
openGraph: {
title: 'Page Title',
description: 'Page description',
type: 'website', // or 'article' for content pages
url: 'https://yoursite.com/page',
siteName: 'Brand Name',
locale: 'en_US',
},
twitter: {
card: 'summary_large_image',
title: 'Page Title',
description: 'Page description',
}
Fix: Missing OG Image
Next.js App Router:
Create opengraph-image.tsx (or .jsx) in the app directory for auto-generated OG images:
import { ImageResponse } from 'next/og'
export const runtime = 'edge'
export const alt = 'Page Title'
export const size = { width: 1200, height: 630 }
export const contentType = 'image/png'
export default async function Image() {
return new ImageResponse(
(
<div style={{
fontSize: 64,
background: '#000',
color: '#fff',
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}>
Page Title
</div>
),
{ ...size }
)
}
For static sites, remind the user to create a 1200x630 image and reference it.
Fix: Missing Sitemap
Next.js App Router — create app/sitemap.ts:
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = 'https://yoursite.com'
return [
{ url: baseUrl, lastModified: new Date(), changeFrequency: 'daily', priority: 1 },
// Add all public pages here
]
}
Read the project's pages/routes and auto-generate all entries with appropriate priorities:
- Homepage: priority 1, daily
- Core feature pages: priority 0.8, weekly
- Content/blog pages: priority 0.7, weekly
- Legal/about pages: priority 0.3, monthly
For dynamic routes, use generateStaticParams data if available to include all slugs.
Fix: Missing/Incomplete Robots.txt
Next.js App Router — create app/robots.ts:
import type { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
const baseUrl = 'https://yoursite.com'
return {
rules: [
{
userAgent: '*',
allow: '/',
disallow: ['/api/', '/admin/', '/auth/', '/dashboard/'],
},
{
userAgent: 'GPTBot',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'ChatGPT-User',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'Claude-Web',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'PerplexityBot',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'Applebot-Extended',
allow: ['/', '/docs/', '/blog/'],
},
],
sitemap: `${baseUrl}/sitemap.xml`,
}
}
Adjust the allow paths based on the project's actual public routes.
Fix: Missing llms.txt
Create public/llms.txt with:
# [Product Name]
## What is [Product Name]?
[One paragraph description — what it does, who it's for]
## Key Features
- [Feature 1]
- [Feature 2]
- [Feature 3]
## Pricing
[Pricing model — free, freemium, paid, per-credit, etc.]
## Links
- Website: [URL]
- Documentation: [URL]
- GitHub: [URL if open source]
Read the project's README, landing page copy, and package.json to auto-fill this.
Fix: Missing Structured Data
Add FAQPage schema where FAQ content exists:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Question text here?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Answer text here."
}
}
]
}
</script>
Add WebApplication schema for SaaS products:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "Product Name",
"description": "Description",
"url": "https://yoursite.com",
"applicationCategory": "Category",
"operatingSystem": "Web",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
</script>
Add Article schema for content/blog pages:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Article Title",
"description": "Description",
"author": { "@type": "Organization", "name": "Brand" },
"publisher": { "@type": "Organization", "name": "Brand" },
"mainEntityOfPage": { "@type": "WebPage", "@id": "https://yoursite.com/page" }
}
</script>
Fix: Missing Canonical URLs
Next.js:
alternates: {
canonical: 'https://yoursite.com/this-page',
}
Fix: Heading Hierarchy Issues
- If multiple H1s: keep the most relevant one, demote others to H2
- If no H1: promote the most prominent heading
- Suggest rephrasing H2s as questions where appropriate for AEO
Fix: Missing Alt Text
- Find all images without alt text
- Generate descriptive alt text based on the image file name and surrounding context
- In Next.js, ensure all
<Image>components have thealtprop
Phase 5: Verify
After applying fixes, re-run the audit on the modified files only. Show the before/after score:
SEO/AEO Readiness: 34/100 -> 89/100
Fixed:
+ Added meta descriptions to 3 pages
+ Created sitemap.ts with 8 pages
+ Created robots.ts with AI crawler rules
+ Created llms.txt
+ Added FAQPage schema to /guides page
+ Added OG image generator
+ Fixed heading hierarchy on 2 pages
Remaining (manual):
- Add real OG image assets (currently using generated fallback)
- Write FAQ content for /pricing page
- Add alt text to 2 product screenshots (need human description)
Mode Modifiers
The user can specify a mode to add domain-specific checks:
/seo-ready --mode b2b — adds checks for:
- Documentation/help center in subdirectory (not subdomain)
- Technical content depth (code examples, API references)
- Comparison/alternatives pages
- Integration pages
/seo-ready --mode commerce — adds checks for:
- Product schema with price, availability, reviews
- Review/rating structured data
- Category page optimization
- Image optimization for product photos
/seo-ready --mode local — adds checks for:
- LocalBusiness schema
- NAP (Name, Address, Phone) consistency
- Google Business Profile link
- Location-specific content
/seo-ready --mode saas — adds checks for:
- WebApplication schema
- Pricing page structured data
- Feature comparison tables
- Changelog/updates page for freshness signals
More from tushaarmehtaa/tushar-skills
ship-credits
Scaffold a complete credits/token metering system for any app — database schema, backend middleware, payment webhooks, frontend state, and UI components. Goes from zero to "users can buy and spend credits" in one session.
17deploy-check
Pre-flight check before pushing to production. Catches TypeScript errors, accidentally staged secrets, pending migrations, and hygiene gaps before they hit live users.
6ship-email
Scaffold transactional and campaign email infrastructure end-to-end — provider setup, templates, user segmentation, and admin send UI. Use when the user wants to add email to their app — welcome emails, notifications, re-engagement, or bulk campaigns. Triggers on requests like "add email", "set up Resend", "email campaigns", "transactional email", "send emails to users", "welcome email", "notification emails", or any mention of email sending in an app context.
6make-skill
Turn any workflow into a properly structured Claude Code skill — YAML frontmatter, phase-based instructions, real code blocks, and a verify checklist. Use when the user wants to package a repeated workflow, create a new skill, turn a process into a slash command, or publish to the skills directory. Triggers on requests like "make a skill", "create a skill", "turn this into a skill", "new skill for...", "package this as a skill", "build a skill", "I want to publish a skill", "help me write a skill", or any request to create a reusable Claude Code skill.
6mvp-spec
Turn a rough product idea into a structured MVP spec — problem statement, personas, core loop, feature split, data model, API routes, page list, and tech stack recommendation. Write this before touching any code. Triggers on requests like "spec this out", "MVP spec", "plan this product", "what should I build first", "scope this idea", "PRD", "product spec", "write a spec for...", "help me plan this", "what do I build in v1", "product requirements", or any request to structure a product idea before writing code.
6og-image
Set up dynamic Open Graph image generation and all required meta tags so links look professional when shared on Twitter/X, LinkedIn, Slack, or anywhere that renders link previews. Triggers on requests like "OG image", "open graph", "social preview", "link preview", "Twitter card", "meta tags for sharing", "my links look broken when I share them", or any mention of how links appear when shared on social media.
6