Aeo.js
Answer Engine Optimization for the modern web. Make your site discoverable by ChatGPT, Claude, Perplexity & AI search engines. Generates llms.txt, robots.txt, sitemap, JSON-LD & more.
aeo.js Answer Engine Optimization for the modern web.Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine. The project is written primarily in TypeScript, first published in 2026. Key topics include: aeo, ai-crawlers, ai-search, answer-engine-optimization, astro.
Install
bashnpm install aeo.js
Check any site in 10 seconds
See how visible a site is to ChatGPT, Claude, Perplexity & co — no install, no config:
bashnpx aeo.js check mysite.com
You get a 0–100 GEO readiness score, an access matrix for 23 AI crawlers, average content citability, and the top fixes — for any deployed site. Also available in the browser at check.aeojs.org.
Quick Start
Astro
js// astro.config.mjs import { defineConfig } from 'astro/config'; import { aeoAstroIntegration } from 'aeo.js/astro'; export default defineConfig({ site: 'https://mysite.com', integrations: [ aeoAstroIntegration({ title: 'My Site', description: 'A site optimized for AI discovery', url: 'https://mysite.com', }), ], });
Next.js
js// next.config.mjs import { withAeo } from 'aeo.js/next'; export default withAeo({ aeo: { title: 'My Site', description: 'A site optimized for AI discovery', url: 'https://mysite.com', }, });
Add the post-build step to package.json:
json{ "scripts": { "postbuild": "node -e \"import('aeo.js/next').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\"" } }
Vite
js// vite.config.ts import { defineConfig } from 'vite'; import { aeoVitePlugin } from 'aeo.js/vite'; export default defineConfig({ plugins: [ aeoVitePlugin({ title: 'My Site', description: 'A site optimized for AI discovery', url: 'https://mysite.com', }), ], });
Nuxt
ts// nuxt.config.ts export default defineNuxtConfig({ modules: ['aeo.js/nuxt'], aeo: { title: 'My Site', description: 'A site optimized for AI discovery', url: 'https://mysite.com', }, });
Remix
json{ "scripts": { "postbuild": "node -e \"import('aeo.js/remix').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\"" } }
SvelteKit
json{ "scripts": { "postbuild": "node -e \"import('aeo.js/sveltekit').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\"" } }
Angular
json{ "scripts": { "postbuild": "node -e \"import('aeo.js/angular').then(m => m.postBuild({ title: 'My App', url: 'https://myapp.com' }))\"" } }
Webpack
js// webpack.config.js const { AeoWebpackPlugin } = require('aeo.js/webpack'); module.exports = { plugins: [ new AeoWebpackPlugin({ title: 'My Site', description: 'A site optimized for AI discovery', url: 'https://mysite.com', }), ], };
CLI
No framework needed — run standalone:
bashnpx aeo.js generate --url https://mysite.com --title "My Site" npx aeo.js init npx aeo.js check
Supported Frameworks
| Framework | Import |
|---|---|
| Astro | aeo.js/astro |
| Next.js | aeo.js/next |
| Vite | aeo.js/vite |
| Nuxt | aeo.js/nuxt |
| Remix | aeo.js/remix |
| SvelteKit | aeo.js/sveltekit |
| Angular | aeo.js/angular |
| Webpack | aeo.js/webpack |
| CLI | npx aeo.js generate |
Widget
The Human/AI widget lets visitors toggle between the normal page and its AI-readable markdown version.
| Default | Small | Icon |
|---|---|---|
| <img src="widget-default.gif" alt="Default widget" width="220"> | <img src="widget-small.gif" alt="Small widget" width="220"> | <img src="widget-icon.gif" alt="Icon widget" width="220"> |
Framework plugins inject it automatically. For Next.js or manual setups:
tsx'use client'; import { useEffect } from 'react'; export function AeoWidgetLoader() { useEffect(() => { import('aeo.js/widget').then(({ AeoWidget }) => { new AeoWidget({ config: { title: 'My Site', url: 'https://mysite.com', widget: { enabled: true, position: 'bottom-right' }, }, }); }); }, []); return null; }
React and Vue wrapper components are also available:
tsximport { AeoReactWidget } from 'aeo.js/react'; <AeoReactWidget config={{ title: 'My Site', url: 'https://mysite.com' }} />
vue<script setup> import { AeoVueWidget } from 'aeo.js/vue'; </script> <template> <AeoVueWidget :config="{ title: 'My Site', url: 'https://mysite.com' }" /> </template>
Generated Files
After building, your output directory contains:
public/
├── robots.txt # AI-crawler directives
├── llms.txt # Short LLM-readable summary
├── llms-full.txt # Full content for LLMs
├── sitemap.xml # Standard sitemap
├── docs.json # Documentation manifest
├── ai-index.json # AI content index
├── index.md # Markdown for /
└── about.md # Markdown for /about
Configuration
jsimport { defineConfig } from 'aeo.js'; export default defineConfig({ title: 'My Site', url: 'https://mysite.com', description: 'A description of your site', generators: { robotsTxt: true, llmsTxt: true, llmsFullTxt: true, rawMarkdown: true, sitemap: true, aiIndex: true, schema: true, }, schema: { enabled: true, organization: { name: 'My Company', url: 'https://mysite.com' }, defaultType: 'WebPage', }, og: { enabled: true, image: 'https://mysite.com/og.png', twitterHandle: '@mycompany', }, widget: { enabled: true, position: 'bottom-right', theme: { accent: '#4ADE80', badge: '#4ADE80' }, }, });
Full configuration reference → aeojs.org/reference/configuration
Why AEO?
- 58% of searches end without a click — AI gives the answer directly
- 40% of Gen Z prefer AI assistants over traditional search engines
- 97% of sites have no
llms.txtor structured data for AI crawlers - 1 minute to set up with aeo.js
If your site isn't optimized for AI engines, you're invisible to a growing share of users who never open a search results page.
Links
License
MIT
Contributors
Showing top 7 contributors by commit count.
