$npx -y skills add onvoyage-ai/gtm-engineer-skills --skill improve-aeo-geoAudits a website codebase and makes code changes so AI engines (ChatGPT, Claude, Perplexity, Google AI Overviews) can better discover, parse, quote, and cite the site. Covers structured data, content structure, technical signals, and freshness.
| 1 | # Improve Website AEO/GEO Skill |
| 2 | |
| 3 | You are an expert at AI Engine Optimization (AEO) and Generative Engine Optimization (GEO). When invoked, you analyze the user's website codebase and make concrete, actionable code changes so AI agents — ChatGPT, Claude, Perplexity, Google AI Overviews, and others — can better discover, parse, quote, and cite the site. |
| 4 | |
| 5 | The web is shifting from human-first to AI-first discovery. AI agents don't browse like humans. They extract structured data, scan for direct answers, and decide in milliseconds whether content is worth citing. This skill makes websites visible to that new audience. |
| 6 | |
| 7 | ## Workflow |
| 8 | |
| 9 | When invoked on a codebase, follow this exact sequence: |
| 10 | |
| 11 | ### Step 1: Baseline |
| 12 | - If the user has a live URL, get a baseline score first. Run the **`audit-website-aeo`** skill for a local crawl + scored report, or use the hosted [aeo-audit.sh](https://aeo-audit.sh). If an `aeo_audit_report.md` already exists, read it — its prioritized fixes and weakest pages tell you exactly what to fix. |
| 13 | - If no URL is available, proceed with a code-level audit. |
| 14 | |
| 15 | ### Step 2: Discover the stack |
| 16 | - Identify the framework (Next.js, Nuxt, Astro, SvelteKit, Remix, WordPress, Hugo, Jekyll, 11ty, plain HTML) |
| 17 | - Find where `<head>` is managed (layout files, document components, plugins, theme files) |
| 18 | - Find where content lives (pages, MDX/MD files, CMS templates, components, PHP templates) |
| 19 | - Check for existing SEO plugins/packages (next-seo, @astrojs/sitemap, Yoast, etc.) |
| 20 | - Check if the site uses SSR, SSG, or client-side rendering |
| 21 | |
| 22 | ### Step 3: Audit existing state |
| 23 | Run through all checks below. For each failing check, note the file(s) to modify and the specific fix. |
| 24 | |
| 25 | ### Step 4: Fix in priority order |
| 26 | Apply changes starting with Priority 1 (blockers), then work down. Make the smallest, most targeted changes needed. |
| 27 | |
| 28 | ### Step 5: Verify |
| 29 | - Re-run the audit (`audit-website-aeo` skill, or [aeo-audit.sh](https://aeo-audit.sh)) and compare against the Step 1 baseline to confirm the score improved |
| 30 | - Target: 80+ overall score (B+ grade or higher) |
| 31 | |
| 32 | --- |
| 33 | |
| 34 | ## Scoring Model |
| 35 | |
| 36 | The AEO audit score combines two halves: |
| 37 | |
| 38 | - **Foundational Score (50%)** — 16 deterministic checks, pass/fail per page, aggregated site-wide (80%+ pages must pass) |
| 39 | - **Intelligence Score (50%)** — 6 LLM-evaluated content quality dimensions (0-5 scale) |
| 40 | |
| 41 | **Final Score** = 50% Foundational + 50% Intelligence → letter grade (A+ = 95-100, A = 90-94, B+ = 80-84, ..., F = below 40). |
| 42 | |
| 43 | --- |
| 44 | |
| 45 | ## Priority 1: Blockers (fix these first) |
| 46 | |
| 47 | ### AI Bot Access (12 pts) |
| 48 | |
| 49 | robots.txt must NOT block these 9 AI crawlers: `GPTBot`, `ClaudeBot`, `PerplexityBot`, `Google-Extended`, `OAI-SearchBot`, `anthropic-ai`, `ChatGPT-User`, `Bytespider`, `CCBot`. |
| 50 | |
| 51 | **Fix**: Open `robots.txt` (project root, `public/robots.txt`, or framework equivalent). Remove any `Disallow` rules for these bots. If no robots.txt exists, create one: |
| 52 | |
| 53 | ```txt |
| 54 | User-agent: * |
| 55 | Allow: / |
| 56 | |
| 57 | User-agent: GPTBot |
| 58 | Allow: / |
| 59 | |
| 60 | User-agent: ClaudeBot |
| 61 | Allow: / |
| 62 | |
| 63 | User-agent: PerplexityBot |
| 64 | Allow: / |
| 65 | |
| 66 | User-agent: Google-Extended |
| 67 | Allow: / |
| 68 | |
| 69 | User-agent: OAI-SearchBot |
| 70 | Allow: / |
| 71 | |
| 72 | User-agent: anthropic-ai |
| 73 | Allow: / |
| 74 | |
| 75 | User-agent: ChatGPT-User |
| 76 | Allow: / |
| 77 | |
| 78 | User-agent: Bytespider |
| 79 | Allow: / |
| 80 | |
| 81 | User-agent: CCBot |
| 82 | Allow: / |
| 83 | |
| 84 | Sitemap: https://YOURDOMAIN.com/sitemap.xml |
| 85 | ``` |
| 86 | |
| 87 | If AI bots are blocked, nothing else matters. This is the #1 prerequisite. |
| 88 | |
| 89 | ### AI-Accessible Meta Tags (6 pts) |
| 90 | |
| 91 | Pages must NOT have `nosnippet`, `noai`, or `noimageai` in robots meta tags or `X-Robots-Tag` headers. Search for these and remove from public content pages. |
| 92 | |
| 93 | ### Indexability (10 pts) |
| 94 | |
| 95 | Pages must NOT have `<meta name="robots" content="noindex">` on public-facing pages. Search codebase for `noindex` and remove where inappropriate. |
| 96 | |
| 97 | --- |
| 98 | |
| 99 | ## Priority 2: High-Impact Structure |
| 100 | |
| 101 | ### Structured Data / JSON-LD (8 pts) |
| 102 | |
| 103 | Every page needs at least 1 `<script type="application/ld+json">` block. Recognized `@type` values (8 additional pts): `Organization`, `WebSite`, `WebPage`, `Article`, `Product`, `FAQPage`, `BreadcrumbList`, `LocalBusiness`, `Person`, `Event`, `HowTo`, `Recipe`, `VideoObject`, `SoftwareApplication`. |
| 104 | |
| 105 | Minimum setup: |
| 106 | - **Site-wide**: Organization schema in the root layout |
| 107 | - **Homepage**: WebSite schema with SearchAction |
| 108 | - **Blog posts**: Article schema with author, datePublished, dateModified |
| 109 | - **Product pages**: Product schema |
| 110 | - **FAQ sections**: FAQPage schema |
| 111 | |
| 112 | ### Page Titles (10 pts) |
| 113 | |
| 114 | Every `<title>` must be 10+ characters. Each page needs a unique, descriptive title. Format: `[Page Topic] | [Brand]`. Aim for 50-60 characters. |
| 115 | |
| 116 | ### Meta Descriptions (10 pts) |
| 117 | |
| 118 | Every page needs `<meta name="description">` with 50+ characters. Write unique descriptions (120-160 chars ideal). Lead with the ans |