{
  "version": "1.0",
  "generated": "2026-03-17T21:54:49.121Z",
  "site": {
    "title": "aeo.js — Answer Engine Optimization for the Modern Web",
    "description": "Make your website discoverable by ChatGPT, Claude, Perplexity & AI search engines. Auto-generates llms.txt, robots.txt, sitemap, JSON-LD structured data & more.",
    "url": "https://aeojs.org"
  },
  "entries": [
    {
      "id": "0816ca1a8e7bd810",
      "url": "https://aeojs.org/getting-started/installation",
      "title": "Installation",
      "content": "## Installation\n\n## Install the package\n\n[Section titled “Install the package”](#install-the-package)\n\n- [npm](#tab-panel-0)\n- [pnpm](#tab-panel-1)\n- [yarn](#tab-panel-2)\n\n-\n\nTerminal window\n\nnpm install aeo.js\n\n**\n\nTerminal window\n\npnpm add aeo.js\n\nTerminal window\n\nyarn add aeo.js\n\n## Or use the CLI directly\n\n[Section titled “Or use the CLI directly”](#or-use-the-cli-directly)\n\nNo installation needed — run it with npx:\n\nTerminal window\n\nnpx aeo.js generate\n\n## Requirements\n\n[Section titled “Requirements”](#requirements)\n\nNode.js** 18 or later\n\n- A framework with a build step that outputs HTML (or use the CLI for any static site)\n\n## Next steps\n\n[Section titled “Next steps”](#next-steps)\n\nHead to [Quick Start](/getting-started/quick-start/) to add aeo.js to your project, or jump to your framework’s guide:\n\n- [Astro](/frameworks/astro/)\n\n- [Next.js](/frameworks/nextjs/)\n\n- [Vite](/frameworks/vite/)\n\n- [Nuxt](/frameworks/nuxt/)\n\n- [Angular](/frameworks/angular/)\n\n- [Webpack](/frameworks/webpack/)\n\n[Previous\nIntroduction](/getting-started/introduction/) [Next\nQuick Start](/getting-started/quick-start/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Install aeo.js in your project.",
      "keywords": [
        "frameworks",
        "next",
        "install",
        "section",
        "titled",
        "terminal",
        "window",
        "quick",
        "start",
        "package"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/getting-started/installation"
      }
    },
    {
      "id": "08b80cf6344e0500",
      "url": "https://aeojs.org/docs/index",
      "title": "aeo.js (Part 1)",
      "content": "import { Tabs, TabItem } from '@astrojs/starlight/components';\nimport StickyNav from '../../components/StickyNav.astro';\n\n<StickyNav />\n\n## Quick Start\n\n```bash\nnpm install aeo.js\n```\n\n<Tabs>\n  <TabItem label=\"Astro\">\n    ```js\n    // astro.config.mjs\n    import { defineConfig } from 'astro/config';\n    import { aeoAstroIntegration } from 'aeo.js/astro';\n\n    export default defineConfig({\n      site: 'https://mysite.com',\n      integrations: [\n        aeoAstroIntegration({\n          title: 'My Site',\n          description: 'A site optimized for AI discovery',\n          url: 'https://mysite.com',\n        }),\n      ],\n    });\n    ```\n  </TabItem>\n  <TabItem label=\"Next.js\">\n    ```js\n    // next.config.mjs\n    import { withAeo } from 'aeo.js/next';\n\n    export default withAeo({\n      aeo: {\n        title: 'My Site',\n        description: 'A site optimized for AI discovery',\n        url: 'https://mysite.com',\n      },\n    });\n    ```\n\n    Add the post-build step to `package.json`:\n\n    ```json\n    {\n      \"scripts\": {\n        \"postbuild\": \"node -e \\\"import('aeo.js/next').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\\\"\"\n      }\n    }\n    ```\n  </TabItem>\n  <TabItem label=\"Vite\">\n    ```js\n    // vite.config.ts\n    import { defineConfig } from 'vite';\n    import { aeoVitePlugin } from 'aeo.js/vite';\n\n    export default defineConfig({\n      plugins: [\n        aeoVitePlugin({\n          title: 'My Site',\n          description: 'A site optimized for AI discovery',\n          url: 'https://mysite.com',\n        }),\n      ],\n    });\n    ```\n  </TabItem>\n  <TabItem label=\"Nuxt\">\n    ```ts\n    // nuxt.config.ts\n    export default defineNuxtConfig({\n      modules: ['aeo.js/nuxt'],\n      aeo: {\n        title: 'My Site',\n        description: 'A site optimized for AI discovery',\n        url: 'https://mysite.com',\n      },\n    });\n    ```\n  </TabItem>\n  <TabItem label=\"Angular\">\n    Add a post-build step to `package.json`:",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "class",
        "site",
        "tabitem",
        "https",
        "import",
        "mysite",
        "label",
        "title",
        "from",
        "config"
      ],
      "metadata": {
        "title": "aeo.js",
        "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
        "template": "splash",
        "head": "",
        "- tag": "title",
        "content": "aeo.js — Answer Engine Optimization for the Modern Web",
        "hero": "",
        "tagline": "Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine, automatically.",
        "actions": "",
        "- text": "Get Started",
        "link": "/getting-started/introduction/",
        "icon": "right-arrow",
        "variant": "primary",
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "docs/index.mdx"
      }
    },
    {
      "id": "0afad6fbf6fcf829",
      "url": "https://aeojs.org",
      "title": "aeo.js — Answer Engine Optimization for the Modern Web (Part 1)",
      "content": "## aeo.js\n\n[Get Started](/getting-started/introduction/)\n\n**Install Audit Generate Config\n\n$ ▌\n\nadded 1 package in 2s\n\nReady — run npx aeo.js init to get started\n\n$ ▌\n\nGEO Readiness Score: 92/100 (Excellent)\n\n══════════════════════════════════════\n\nAI Access: 20/20\n\nContent Structure: 20/20\n\nSchema Presence: 20/20\n\nMeta Quality: 16/20\n\nCitability: 16/20\n\n$ ▌\n\n[aeo.js] Generating AEO files...\n\nrobots.txt — AI crawler directives\n\nllms.txt — LLM summary\n\nllms-full.txt — full content for LLMs\n\nsitemap.xml — sitemap\n\nschema.json — JSON-LD structured data\n\nai-index.json — AI content index\n\nGenerated 6 files in 42ms\n\n// aeo.config.ts\n\nimport { defineConfig } from 'aeo.js'\n\nexport default defineConfig({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\nschema: { organization: { name: 'My Co' } },\n\nwidget: { size: 'small' },\n\n});\n\n- [Quick Start](#quick-start)\n- [What is AEO?](#what-is-aeo)\n- [Why AEO](#why-aeo-matters)\n- [Widget](#widget)\n- [Configuration](#configuration)\n- [Generated Files](#generated-files)\n- [Checker](#checker)\n\n## Quick Start\n\n[Section titled “Quick Start”](#quick-start)\n\n-\n\nTerminal window\n\nnpm install aeo.js\n\n[Astro](#tab-panel-3)\n- [Next.js](#tab-panel-4)\n- [Vite](#tab-panel-5)\n- [Nuxt](#tab-panel-6)\n- [Angular](#tab-panel-7)\n- [Webpack](#tab-panel-8)\n- [CLI](#tab-panel-9)\n\nastro.config.mjs\n\nimport { defineConfig } from 'astro/config';\n\nimport { aeoAstroIntegration } from 'aeo.js/astro';\n\nexport default defineConfig({\n\nsite: 'https://mysite.com',\n\nintegrations: [aeoAstroIntegration({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n});\n\nnext.config.mjs\n\nimport { withAeo } from 'aeo.js/next';\n\nexport default withAeo({\n\naeo: {\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n},\n\n});\n\nAdd the post-build step to package.json:\n\n{\n\n\"scripts\": {",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "site",
        "https",
        "title",
        "mysite",
        "import",
        "config",
        "widget",
        "true",
        "from",
        "files"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/"
      }
    },
    {
      "id": "161a43e79cc6ec42",
      "url": "https://aeojs.org/docs/reference/configuration",
      "title": "Configuration (Part 3)",
      "content": "| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | `boolean` | `false` | Enable OG tag generation |\n| `image` | `string` | `''` | Default OG image URL |\n| `twitterHandle` | `string` | `''` | Twitter handle (e.g. `@company`) |\n| `type` | `'website' \\| 'article'` | `'website'` | Default OG type |\n\n### `widget`\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | `boolean` | `true` | Enable the widget |\n| `position` | `string` | `'bottom-right'` | Widget position |\n| `humanLabel` | `string` | `'Human'` | Label for human view |\n| `aiLabel` | `string` | `'AI'` | Label for AI view |\n| `showBadge` | `boolean` | `true` | Show the AEO badge |\n| `theme.background` | `string` | `'rgba(18, 18, 24, 0.9)'` | Widget background |\n| `theme.text` | `string` | `'#C0C0C5'` | Text color |\n| `theme.accent` | `string` | `'#E8E8EA'` | Accent color |\n| `theme.badge` | `string` | `'#4ADE80'` | Badge color |",
      "description": "Full configuration reference for aeo.js.",
      "keywords": [
        "true",
        "string",
        "boolean",
        "default",
        "description",
        "type",
        "organization",
        "generate",
        "sitemap",
        "https"
      ],
      "metadata": {
        "title": "Configuration",
        "description": "Full configuration reference for aeo.js.",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "docs/reference/configuration.mdx"
      }
    },
    {
      "id": "1723a3fa6d3c26d2",
      "url": "https://aeojs.org/getting-started/quick-start",
      "title": "Quick Start (Part 1)",
      "content": "## Quick Start\n\nThe fastest way to add AEO to your site depends on your framework.\n\n## Astro\n\n[Section titled “Astro”](#astro)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nAdd the integration to your Astro config:\n\nastro.config.mjs\n\nimport { defineConfig } from 'astro/config';\n\nimport { aeoAstroIntegration } from 'aeo.js/astro';\n\nexport default defineConfig({\n\nsite: 'https://mysite.com',\n\nintegrations: [aeoAstroIntegration({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n});\n\n-\nBuild your site — all AEO files are generated automatically.\n\n## Next.js\n\n[Section titled “Next.js”](#nextjs)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nWrap your Next.js config:\n\nnext.config.mjs\n\nimport { withAeo } from 'aeo.js/next';\n\nexport default withAeo({\n\naeo: {\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n},\n\n});\n\n-\nAdd the post-build step to package.json:\n\n{\n\n\"scripts\": {\n\n\"postbuild\": \"node -e \\\"import('aeo.js/next').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\\\"\"\n\n}\n\n}\n\nm.postBuild({ title: &#x27;My Site&#x27;, url: &#x27;https://mysite.com&#x27; }))\\&#x22;&#x22; }}\">\n\n## Vite\n\n[Section titled “Vite”](#vite)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nAdd the plugin to your Vite config:\n\nvite.config.ts\n\nimport { defineConfig } from 'vite';\n\nimport { aeoVitePlugin } from 'aeo.js/vite';\n\nexport default defineConfig({\n\nplugins: [aeoVitePlugin({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n});\n\n## CLI (any site)\n\n[Section titled “CLI (any site)”](#cli-any-site)\n\nNo framework integration needed:\n\nTerminal window\n\nnpx aeo.js generate --url https://mysite.com --title \"My Site\"\n\nSee [CLI docs](/features/cli/) for all commands and options.",
      "description": "Get aeo.js running in under 2 minutes.",
      "keywords": [
        "site",
        "astro",
        "https",
        "config",
        "mysite",
        "next",
        "vite",
        "your",
        "install",
        "import"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/getting-started/quick-start"
      }
    },
    {
      "id": "17dc64cc0a6f3b8e",
      "url": "https://aeojs.org/docs/frameworks/astro",
      "title": "Astro",
      "content": "import { Steps } from '@astrojs/starlight/components';\n\n## Setup\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Add the integration to your Astro config:\n   ```js\n   // astro.config.mjs\n   import { defineConfig } from 'astro/config';\n   import { aeoAstroIntegration } from 'aeo.js/astro';\n\n   export default defineConfig({\n     site: 'https://mysite.com',\n     integrations: [\n       aeoAstroIntegration({\n         title: 'My Site',\n         description: 'A site optimized for AI discovery',\n         url: 'https://mysite.com',\n       }),\n     ],\n   });\n   ```\n\n3. Build your site:\n   ```bash\n   npm run build\n   ```\n</Steps>\n\n## How it works\n\nThe Astro integration:\n\n- Hooks into the Astro build pipeline via `astro:build:done`\n- Scans all rendered HTML pages for content extraction\n- Generates all AEO files in your output directory\n- Automatically injects the Human/AI widget\n- Persists the widget across View Transitions\n\n## Configuration\n\nPass any [AeoConfig](/reference/configuration/) options to the integration:\n\n```js\naeoAstroIntegration({\n  title: 'My Site',\n  url: 'https://mysite.com',\n  generators: {\n    robotsTxt: true,\n    llmsTxt: true,\n    sitemap: false, // Astro has its own sitemap\n  },\n  widget: {\n    position: 'bottom-left',\n    theme: {\n      accent: '#6366f1',\n    },\n  },\n});\n```",
      "description": "Use aeo.js with Astro.",
      "keywords": [
        "astro",
        "site",
        "build",
        "import",
        "steps",
        "from",
        "integration",
        "your",
        "config",
        "aeoastrointegration"
      ],
      "metadata": {
        "title": "Astro",
        "description": "Use aeo.js with Astro.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/frameworks/astro.mdx"
      }
    },
    {
      "id": "1a327206d18bdd23",
      "url": "https://aeojs.org/frameworks/nextjs",
      "title": "Next.js (Part 1)",
      "content": "## Next.js\n\n## Setup\n\n[Section titled “Setup”](#setup)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nWrap your Next.js config with withAeo:\n\nnext.config.mjs\n\nimport { withAeo } from 'aeo.js/next';\n\nexport default withAeo({\n\naeo: {\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n},\n\n});\n\n-\nAdd the post-build step to your package.json:\n\n{\n\n\"scripts\": {\n\n\"postbuild\": \"node -e \\\"import('aeo.js/next').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\\\"\"\n\n}\n\n}\n\nm.postBuild({ title: &#x27;My Site&#x27;, url: &#x27;https://mysite.com&#x27; }))\\&#x22;&#x22; }}\">\n\nTip\n\nThe postbuild step is needed because Next.js pre-renders pages during build. The post-build step scans the rendered HTML to extract full page content.\n\n## Widget\n\n[Section titled “Widget”](#widget)\n\nFor Next.js, add the widget manually as a client component:\n\n// app/layout.tsx (or any client component)\n\n'use client';\n\nimport { useEffect } from 'react';\n\nexport function AeoWidgetLoader() {\n\nuseEffect(() => {\n\nimport('aeo.js/widget').then(({ AeoWidget }) => {\n\nnew AeoWidget({\n\nconfig: {\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\nwidget: { enabled: true, position: 'bottom-right' },\n\n},\n\n});\n\n});\n\n}, []);\n\nreturn null;\n\n}\n\n{ import(&#x27;aeo.js/widget&#x27;).then(({ AeoWidget }) => { new AeoWidget({ config: { title: &#x27;My Site&#x27;, url: &#x27;https://mysite.com&#x27;, widget: { enabled: true, position: &#x27;bottom-right&#x27; }, }, }); }); }, []); return null;}\">\n\n## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nPass any [AeoConfig](/reference/configuration/) options in the aeo key:\n\nexport default withAeo({\n\naeo: {\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\ngenerators: {\n\nrobotsTxt: true,\n\nllmsTxt: true,\n\nschema: true,\n\n},\n\nwidget: {\n\nenabled: true,\n\nposition: 'bottom-right',\n\n},\n\n},\n\n});",
      "description": "Use aeo.js with Next.js.",
      "keywords": [
        "widget",
        "next",
        "https",
        "site",
        "title",
        "mysite",
        "true",
        "import",
        "config",
        "withaeo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/frameworks/nextjs"
      }
    },
    {
      "id": "217405d59066b758",
      "url": "https://aeojs.org/features/cli",
      "title": "CLI",
      "content": "## CLI\n\n## Usage\n\n[Section titled “Usage”](#usage)\n\nTerminal window\n\nnpx aeo.js &#x3C;command> [options]\n\n[options]\">\n\n## Commands\n\n[Section titled “Commands”](#commands)\n\n### generate\n\n[Section titled “generate”](#generate)\n\nGenerate all AEO files (robots.txt, llms.txt, sitemap.xml, etc.):\n\nTerminal window\n\nnpx aeo.js generate\n\nnpx aeo.js generate --url https://mysite.com --title \"My Site\" --out public\n\n### init\n\n[Section titled “init”](#init)\n\nCreate an aeo.config.ts configuration file in your project:\n\nTerminal window\n\nnpx aeo.js init\n\nThis generates a starter config with all options documented.\n\n### check\n\n[Section titled “check”](#check)\n\nValidate your AEO setup and show what would be generated:\n\nTerminal window\n\nnpx aeo.js check\n\n## Options\n\n[Section titled “Options”](#options)\n\nFlag\n\nDescription\n\n--out &#x3C;dir>\n\nOutput directory (default: auto-detected)\n\n--url &#x3C;url>\n\nSite URL\n\n--title &#x3C;title>\n\nSite title\n\n--no-widget\n\nDisable widget generation\n\n--help, -h\n\nShow help\n\n--version, -v\n\nShow version\n\n## Configuration file\n\n[Section titled “Configuration file”](#configuration-file)\n\nThe CLI looks for aeo.config.ts (or aeo.config.js) in your project root. Create one with npx aeo.js init:\n\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\ndescription: 'A site optimized for AI discovery',\n\noutDir: 'public',\n\n});\n\nSee the full [Configuration reference](/reference/configuration/) for all options.\n\n[Previous\nWidget](/features/widget/) [Next\nSchema & Open Graph](/features/schema-og/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Run aeo.js from the command line without any framework integration.",
      "keywords": [
        "section",
        "titled",
        "options",
        "generate",
        "configuration",
        "title",
        "site",
        "init",
        "terminal",
        "window"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/features/cli"
      }
    },
    {
      "id": "25a0f604f5876b44",
      "url": "https://aeojs.org/docs/reference/configuration",
      "title": "Configuration (Part 2)",
      "content": "| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `title` | `string` | `''` | Site title |\n| `description` | `string` | `''` | Site description |\n| `url` | `string` | `''` | Site URL (used for absolute URLs in generated files) |\n| `contentDir` | `string` | `'docs'` | Directory with handwritten markdown files |\n| `outDir` | `string` | auto-detected | Output directory for generated files |\n| `pages` | `PageEntry[]` | `[]` | Manually specify pages to include |\n\n### `generators`\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `robotsTxt` | `boolean` | `true` | Generate `robots.txt` |\n| `llmsTxt` | `boolean` | `true` | Generate `llms.txt` |\n| `llmsFullTxt` | `boolean` | `true` | Generate `llms-full.txt` |\n| `rawMarkdown` | `boolean` | `true` | Generate per-page `.md` files |\n| `manifest` | `boolean` | `true` | Generate `docs.json` |\n| `sitemap` | `boolean` | `true` | Generate `sitemap.xml` |\n| `aiIndex` | `boolean` | `true` | Generate `ai-index.json` |\n| `schema` | `boolean` | `false` | Generate JSON-LD structured data |\n\n### `robots`\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `allow` | `string[]` | `['/']` | Allowed paths |\n| `disallow` | `string[]` | `[]` | Disallowed paths |\n| `crawlDelay` | `number` | `0` | Crawl delay in seconds |\n| `sitemap` | `string` | auto | Sitemap URL |\n\n### `schema`\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | `boolean` | `false` | Enable schema generation |\n| `organization.name` | `string` | `''` | Organization name |\n| `organization.url` | `string` | `''` | Organization URL |\n| `organization.logo` | `string` | `''` | Organization logo URL |\n| `organization.sameAs` | `string[]` | `[]` | Social profile URLs |\n| `defaultType` | `'Article' \\| 'WebPage'` | `'WebPage'` | Default schema type for pages |\n\n### `og`",
      "description": "Full configuration reference for aeo.js.",
      "keywords": [
        "true",
        "string",
        "boolean",
        "default",
        "description",
        "type",
        "organization",
        "generate",
        "sitemap",
        "https"
      ],
      "metadata": {
        "title": "Configuration",
        "description": "Full configuration reference for aeo.js.",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "docs/reference/configuration.mdx"
      }
    },
    {
      "id": "26e49de01bc2590b",
      "url": "https://aeojs.org/docs/frameworks/webpack",
      "title": "Webpack",
      "content": "import { Steps } from '@astrojs/starlight/components';\n\n## Setup\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Add the plugin to your Webpack config:\n   ```js\n   // webpack.config.js\n   const { AeoWebpackPlugin } = require('aeo.js/webpack');\n\n   module.exports = {\n     plugins: [\n       new AeoWebpackPlugin({\n         title: 'My Site',\n         description: 'A site optimized for AI discovery',\n         url: 'https://mysite.com',\n       }),\n     ],\n   };\n   ```\n</Steps>\n\n## How it works\n\nThe Webpack plugin:\n\n- Runs during the `emit` phase of the Webpack compilation\n- Generates all AEO files in your output directory\n- Injects the widget into your HTML entry point\n\n## Configuration\n\nPass any [AeoConfig](/reference/configuration/) options to the plugin:\n\n```js\nnew AeoWebpackPlugin({\n  title: 'My Site',\n  url: 'https://mysite.com',\n  widget: {\n    enabled: true,\n    position: 'bottom-right',\n  },\n});\n```",
      "description": "Use aeo.js with Webpack.",
      "keywords": [
        "webpack",
        "steps",
        "plugin",
        "your",
        "aeowebpackplugin",
        "site",
        "install",
        "config",
        "title",
        "https"
      ],
      "metadata": {
        "title": "Webpack",
        "description": "Use aeo.js with Webpack.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/frameworks/webpack.mdx"
      }
    },
    {
      "id": "2708b2aec0639c0f",
      "url": "https://aeojs.org/docs/index",
      "title": "aeo.js (Part 2)",
      "content": "```json\n    {\n      \"scripts\": {\n        \"postbuild\": \"node -e \\\"import('aeo.js/angular').then(m => m.postBuild({ title: 'My App', url: 'https://myapp.com' }))\\\"\"\n      }\n    }\n    ```\n\n    Or generate programmatically:\n\n    ```ts\n    import { generate } from 'aeo.js/angular';\n    await generate({ title: 'My App', url: 'https://myapp.com' });\n    ```\n  </TabItem>\n  <TabItem label=\"Webpack\">\n    ```js\n    // webpack.config.js\n    const { AeoWebpackPlugin } = require('aeo.js/webpack');\n\n    module.exports = {\n      plugins: [\n        new AeoWebpackPlugin({\n          title: 'My Site',\n          description: 'A site optimized for AI discovery',\n          url: 'https://mysite.com',\n        }),\n      ],\n    };\n    ```\n  </TabItem>\n  <TabItem label=\"CLI\">\n    No framework needed — run standalone:\n\n    ```bash\n    # Generate all AEO files\n    npx aeo.js generate --url https://mysite.com --title \"My Site\"\n\n    # Scaffold a config file\n    npx aeo.js init\n\n    # Check your setup\n    npx aeo.js check\n    ```\n  </TabItem>\n</Tabs>\n\n## What is AEO?\n\nAnswer Engine Optimization (AEO) is the practice of making your website discoverable and citable by AI-powered answer engines like ChatGPT, Claude, Perplexity, and SearchGPT.\n\n**aeo.js** auto-generates the files these engines look for and provides a drop-in widget that shows visitors how your site appears to AI. First-class support for Astro, Next.js, Vite, Nuxt, Angular, and Webpack — or run standalone via CLI.\n\n## Why AEO matters",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "class",
        "site",
        "tabitem",
        "https",
        "import",
        "mysite",
        "label",
        "title",
        "from",
        "config"
      ],
      "metadata": {
        "title": "aeo.js",
        "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
        "template": "splash",
        "head": "",
        "- tag": "title",
        "content": "aeo.js — Answer Engine Optimization for the Modern Web",
        "hero": "",
        "tagline": "Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine, automatically.",
        "actions": "",
        "- text": "Get Started",
        "link": "/getting-started/introduction/",
        "icon": "right-arrow",
        "variant": "primary",
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "docs/index.mdx"
      }
    },
    {
      "id": "28510963a60458b8",
      "url": "https://aeojs.org/docs/features/schema-og",
      "title": "Schema & Open Graph",
      "content": "import { Aside } from '@astrojs/starlight/components';\n\naeo.js can generate JSON-LD structured data and Open Graph meta tags for your pages.\n\n## JSON-LD Schema\n\nEnable schema generation in your config:\n\n```js\n{\n  schema: {\n    enabled: true,\n    organization: {\n      name: 'My Company',\n      url: 'https://mysite.com',\n      logo: 'https://mysite.com/logo.png',\n      sameAs: [\n        'https://twitter.com/mycompany',\n        'https://github.com/mycompany',\n      ],\n    },\n    defaultType: 'WebPage', // or 'Article'\n  },\n}\n```\n\nThis generates `<script type=\"application/ld+json\">` blocks with:\n\n- **Organization** schema for your site\n- **WebPage** or **Article** schema for each page\n- Proper `@context`, `@type`, `name`, `description`, and `url` fields\n\n## Open Graph tags\n\nEnable OG tag generation:\n\n```js\n{\n  og: {\n    enabled: true,\n    image: 'https://mysite.com/og.png',\n    twitterHandle: '@mycompany',\n    type: 'website', // or 'article'\n  },\n}\n```\n\nThis generates meta tags like:\n\n```html\n<meta property=\"og:title\" content=\"Page Title\" />\n<meta property=\"og:description\" content=\"Page description\" />\n<meta property=\"og:image\" content=\"https://mysite.com/og.png\" />\n<meta property=\"og:url\" content=\"https://mysite.com/page\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:site\" content=\"@mycompany\" />\n```\n\n## Programmatic API\n\n```ts\nimport { generateSchema, generateSchemaObjects, generateJsonLdScript } from 'aeo.js';\nimport { generateOGTags, generateOGTagsHtml } from 'aeo.js';\n\n// Get schema objects\nconst schemas = generateSchemaObjects(config);\n\n// Get a <script> tag string\nconst script = generateJsonLdScript(config);\n\n// Get OG meta tag objects\nconst tags = generateOGTags(config, page);\n\n// Get OG meta tags as HTML string\nconst html = generateOGTagsHtml(config, page);\n```\n\n<Aside type=\"tip\">\nSchema and OG generators work independently — you can enable one without the other.\n</Aside>",
      "description": "Auto-generated JSON-LD structured data and Open Graph meta tags.",
      "keywords": [
        "meta",
        "schema",
        "https",
        "page",
        "content",
        "tags",
        "config",
        "mysite",
        "name",
        "mycompany"
      ],
      "metadata": {
        "title": "Schema & Open Graph",
        "description": "Auto-generated JSON-LD structured data and Open Graph meta tags.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/features/schema-og.mdx"
      }
    },
    {
      "id": "29049040c18c4049",
      "url": "https://aeojs.org/docs/index",
      "title": "aeo.js (Part 4)",
      "content": "<template>\n      <AeoVueWidget :config=\"{ title: 'My Site', url: 'https://mysite.com' }\" />\n    </template>\n    ```\n  </TabItem>\n</Tabs>\n\n## Configuration\n\nAll frameworks use the same config shape — [see full reference](/reference/configuration/):\n\n```ts\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n  title: 'My Site',\n  url: 'https://mysite.com',\n  description: 'A site optimized for AI discovery',\n\n  generators: {\n    robotsTxt: true,\n    llmsTxt: true,\n    llmsFullTxt: true,\n    rawMarkdown: true,\n    sitemap: true,\n    aiIndex: true,\n    schema: true,\n  },\n\n  schema: {\n    enabled: true,\n    organization: { name: 'My Company', url: 'https://mysite.com' },\n    defaultType: 'WebPage',\n  },\n\n  og: {\n    enabled: true,\n    image: 'https://mysite.com/og.png',\n    twitterHandle: '@mycompany',\n  },\n\n  widget: {\n    enabled: true,\n    position: 'bottom-right',\n    theme: { accent: '#4ADE80', badge: '#4ADE80' },\n  },\n});\n```\n\n## Generated Files\n\nAfter building, your output directory contains:\n\n```\npublic/\n├── robots.txt          # AI-crawler directives\n├── llms.txt            # Short LLM-readable summary\n├── llms-full.txt       # Full content for LLMs\n├── sitemap.xml         # Standard sitemap\n├── docs.json           # Documentation manifest\n├── ai-index.json       # AI content index\n├── index.md            # Markdown for /\n└── about.md            # Markdown for /about\n```\n\n## Checker",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "class",
        "site",
        "tabitem",
        "https",
        "import",
        "mysite",
        "label",
        "title",
        "from",
        "config"
      ],
      "metadata": {
        "title": "aeo.js",
        "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
        "template": "splash",
        "head": "",
        "- tag": "title",
        "content": "aeo.js — Answer Engine Optimization for the Modern Web",
        "hero": "",
        "tagline": "Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine, automatically.",
        "actions": "",
        "- text": "Get Started",
        "link": "/getting-started/introduction/",
        "icon": "right-arrow",
        "variant": "primary",
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "docs/index.mdx"
      }
    },
    {
      "id": "2f144d7a2b0631dd",
      "url": "https://aeojs.org/docs/features/widget",
      "title": "Human/AI Widget (Part 2)",
      "content": "| Default | Small | Icon |\n|---------|-------|------|\n| ![Default widget](/widget-default.gif) | ![Small widget](/widget-small.gif) | ![Icon widget](/widget-icon.gif) |\n| `size: 'default'` | `size: 'small'` | `size: 'icon-only'` |\n| Full labels with icons | Compact — ~30% smaller | Just icons, no labels |\n\n<Aside type=\"tip\">\nSet `widget.enabled: false` to disable the widget entirely while still generating AEO files.\n</Aside>",
      "description": "The drop-in toggle that shows how AI sees your pages.",
      "keywords": [
        "widget",
        "import",
        "from",
        "react",
        "size",
        "default",
        "small",
        "icon",
        "aside",
        "components"
      ],
      "metadata": {
        "title": "Human/AI Widget",
        "description": "The drop-in toggle that shows how AI sees your pages.",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "docs/features/widget.mdx"
      }
    },
    {
      "id": "3b0d3d9d2ab30f9a",
      "url": "https://aeojs.org/reference/configuration",
      "title": "Configuration (Part 3)",
      "content": "[Previous\nAudit & Citability](/features/audit/) [Next\nAPI](/reference/api/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Full configuration reference for aeo.js.",
      "keywords": [
        "true",
        "string",
        "boolean",
        "default",
        "description",
        "type",
        "section",
        "titled",
        "https",
        "schema"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/reference/configuration"
      }
    },
    {
      "id": "3c248c59d0c54216",
      "url": "https://aeojs.org/docs/reference/api",
      "title": "API Reference (Part 1)",
      "content": "## Core\n\n### `defineConfig(config)`\n\nType-safe configuration helper:\n\n```ts\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n  title: 'My Site',\n  url: 'https://mysite.com',\n});\n```\n\n### `generateAll(config)`\n\nGenerate all AEO files programmatically:\n\n```ts\nimport { generateAll } from 'aeo.js';\n\nawait generateAll({\n  title: 'My Site',\n  url: 'https://mysite.com',\n  outDir: 'dist',\n});\n```\n\n### `resolveConfig(config)`\n\nResolve a partial config into a fully resolved config with defaults:\n\n```ts\nimport { resolveConfig } from 'aeo.js';\n\nconst resolved = resolveConfig({ title: 'My Site' });\n// All fields now have defaults\n```\n\n### `validateConfig(config)`\n\nValidate a config object and return any errors:\n\n```ts\nimport { validateConfig } from 'aeo.js';\n\nconst errors = validateConfig(config);\n```\n\n### `detectFramework()`\n\nAuto-detect the framework used in the current project:\n\n```ts\nimport { detectFramework } from 'aeo.js';\n\nconst info = detectFramework();\n// { framework: 'next', contentDir: 'pages', outDir: '.next' }\n```\n\n## HTML Extraction\n\n### `htmlToMarkdown(html)`\n\nConvert HTML to clean markdown:\n\n```ts\nimport { htmlToMarkdown } from 'aeo.js';\n\nconst md = htmlToMarkdown('<h1>Hello</h1><p>World</p>');\n// '# Hello\\n\\nWorld'\n```\n\n### `extractTextFromHtml(html)`\n\nExtract plain text from HTML:\n\n```ts\nimport { extractTextFromHtml } from 'aeo.js';\n\nconst text = extractTextFromHtml('<p>Hello <strong>world</strong></p>');\n```\n\n### `extractTitle(html)` / `extractDescription(html)`\n\nExtract the title or meta description from an HTML document.\n\n### `extractJsonLd(html)`\n\nExtract JSON-LD structured data from an HTML document.\n\n## Schema\n\n### `generateSchemaObjects(config)`\n\nGenerate JSON-LD schema objects:\n\n```ts\nimport { generateSchemaObjects } from 'aeo.js';\n\nconst schemas = generateSchemaObjects(resolvedConfig);\n```\n\n### `generateJsonLdScript(config)`\n\nGenerate a `<script type=\"application/ld+json\">` tag:\n\n```ts\nimport { generateJsonLdScript } from 'aeo.js';",
      "description": "Programmatic API for aeo.js.",
      "keywords": [
        "from",
        "config",
        "import",
        "html",
        "const",
        "title",
        "site",
        "generate",
        "await",
        "page"
      ],
      "metadata": {
        "title": "API Reference",
        "description": "Programmatic API for aeo.js.",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "docs/reference/api.mdx"
      }
    },
    {
      "id": "40769a7ef81185c5",
      "url": "https://aeojs.org",
      "title": "aeo.js — Answer Engine Optimization for the Modern Web (Part 3)",
      "content": "aeo.js** auto-generates the files these engines look for and provides a drop-in widget that shows visitors how your site appears to AI. First-class support for Astro, Next.js, Vite, Nuxt, Angular, and Webpack — or run standalone via CLI.\n\n## Why AEO matters\n\n[Section titled “Why AEO matters”](#why-aeo-matters)\n\n58%\n\nof searches\n\nend without a click — AI gives the answer directly\n\n40%\n\nof Gen Z\n\nprefer AI assistants over traditional search engines\n\n97%\n\nof sites\n\nhave no llms.txt or structured data for AI crawlers\n\n1 min\n\nto set up\n\naeo.js generates robots.txt, llms.txt, schema &#x26; more\n\nIf your site isn’t optimized for AI engines, you’re invisible to a growing share of users who never open a search results page. AEO is the new SEO.\n\n## Widget\n\n[Section titled “Widget”](#widget)\n\nThe Human/AI widget lets visitors toggle between the normal page and its AI-readable markdown version. Framework plugins inject it automatically — for Next.js or manual setups:\n\n'use client';\n\nimport { useEffect } from 'react';\n\nexport function AeoWidgetLoader() {\n\nuseEffect(() => {\n\nimport('aeo.js/widget').then(({ AeoWidget }) => {\n\nnew AeoWidget({\n\nconfig: {\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\nwidget: { enabled: true, position: 'bottom-right' },\n\n},\n\n});\n\n});\n\n}, []);\n\nreturn null;\n\n}\n\n{ import(&#x27;aeo.js/widget&#x27;).then(({ AeoWidget }) => { new AeoWidget({ config: { title: &#x27;My Site&#x27;, url: &#x27;https://mysite.com&#x27;, widget: { enabled: true, position: &#x27;bottom-right&#x27; }, }, }); }); }, []); return null;}\">\n\nReact and Vue wrapper components are also available:\n\n- [React](#tab-panel-10)\n- [Vue](#tab-panel-11)\n\nimport { AeoReactWidget } from 'aeo.js/react';\n\n&#x3C;AeoReactWidget config={{ title: 'My Site', url: 'https://mysite.com' }} />\n\n\">\n\n&#x3C;script setup>\n\nimport { AeoVueWidget } from 'aeo.js/vue';\n\n&#x3C;/script>\n\n&#x3C;template>\n\n&#x3C;AeoVueWidget :config=\"{ title: 'My Site', url: 'https://mysite.com' }\" />\n\n&#x3C;/template>",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "site",
        "https",
        "title",
        "mysite",
        "import",
        "config",
        "widget",
        "true",
        "from",
        "files"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/"
      }
    },
    {
      "id": "40a75a682470edae",
      "url": "https://aeojs.org/docs/index",
      "title": "aeo.js (Part 3)",
      "content": "<div class=\"why-aeo-grid\">\n  <div class=\"why-card\">\n    <div class=\"why-stat\">58%</div>\n    <div class=\"why-label\">of searches</div>\n    <div class=\"why-desc\">end without a click — AI gives the answer directly</div>\n  </div>\n  <div class=\"why-card\">\n    <div class=\"why-stat\">40%</div>\n    <div class=\"why-label\">of Gen Z</div>\n    <div class=\"why-desc\">prefer AI assistants over traditional search engines</div>\n  </div>\n  <div class=\"why-card\">\n    <div class=\"why-stat\">97%</div>\n    <div class=\"why-label\">of sites</div>\n    <div class=\"why-desc\">have no llms.txt or structured data for AI crawlers</div>\n  </div>\n  <div class=\"why-card\">\n    <div class=\"why-stat\">1 min</div>\n    <div class=\"why-label\">to set up</div>\n    <div class=\"why-desc\">aeo.js generates robots.txt, llms.txt, schema &amp; more</div>\n  </div>\n</div>\n\nIf your site isn't optimized for AI engines, you're invisible to a growing share of users who never open a search results page. AEO is the new SEO.\n\n## Widget\n\nThe Human/AI widget lets visitors toggle between the normal page and its AI-readable markdown version. Framework plugins inject it automatically — for Next.js or manual setups:\n\n```tsx\n'use client';\nimport { useEffect } from 'react';\n\nexport function AeoWidgetLoader() {\n  useEffect(() => {\n    import('aeo.js/widget').then(({ AeoWidget }) => {\n      new AeoWidget({\n        config: {\n          title: 'My Site',\n          url: 'https://mysite.com',\n          widget: { enabled: true, position: 'bottom-right' },\n        },\n      });\n    });\n  }, []);\n  return null;\n}\n```\n\nReact and Vue wrapper components are also available:\n\n<Tabs>\n  <TabItem label=\"React\">\n    ```tsx\n    import { AeoReactWidget } from 'aeo.js/react';\n\n    <AeoReactWidget config={{ title: 'My Site', url: 'https://mysite.com' }} />\n    ```\n  </TabItem>\n  <TabItem label=\"Vue\">\n    ```vue\n    <script setup>\n    import { AeoVueWidget } from 'aeo.js/vue';\n    </script>",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "class",
        "site",
        "tabitem",
        "https",
        "import",
        "mysite",
        "label",
        "title",
        "from",
        "config"
      ],
      "metadata": {
        "title": "aeo.js",
        "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
        "template": "splash",
        "head": "",
        "- tag": "title",
        "content": "aeo.js — Answer Engine Optimization for the Modern Web",
        "hero": "",
        "tagline": "Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine, automatically.",
        "actions": "",
        "- text": "Get Started",
        "link": "/getting-started/introduction/",
        "icon": "right-arrow",
        "variant": "primary",
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "docs/index.mdx"
      }
    },
    {
      "id": "45512fbdccb834f2",
      "url": "https://aeojs.org/reference/configuration",
      "title": "Configuration (Part 1)",
      "content": "## Configuration\n\nAll framework plugins and the CLI accept the same AeoConfig object.\n\n## Full example\n\n[Section titled “Full example”](#full-example)\n\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n\n// Required\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\n// Optional\n\ndescription: 'A description of your site',\n\ncontentDir: 'docs', // Directory with handwritten .md files\n\noutDir: 'public', // Output directory for generated files\n\n// Toggle individual generators\n\ngenerators: {\n\nrobotsTxt: true,\n\nllmsTxt: true,\n\nllmsFullTxt: true,\n\nrawMarkdown: true,\n\nmanifest: true,\n\nsitemap: true,\n\naiIndex: true,\n\nschema: true,\n\n},\n\n// Customize robots.txt\n\nrobots: {\n\nallow: ['/'],\n\ndisallow: ['/admin'],\n\ncrawlDelay: 0,\n\nsitemap: 'https://mysite.com/sitemap.xml',\n\n},\n\n// JSON-LD structured data\n\nschema: {\n\nenabled: true,\n\norganization: {\n\nname: 'My Company',\n\nurl: 'https://mysite.com',\n\nlogo: 'https://mysite.com/logo.png',\n\nsameAs: ['https://twitter.com/mycompany'],\n\n},\n\ndefaultType: 'WebPage',\n\n},\n\n// Open Graph meta tags\n\nog: {\n\nenabled: true,\n\nimage: 'https://mysite.com/og.png',\n\ntwitterHandle: '@mycompany',\n\ntype: 'website',\n\n},\n\n// Widget configuration\n\nwidget: {\n\nenabled: true,\n\nposition: 'bottom-right',\n\nhumanLabel: 'Human',\n\naiLabel: 'AI',\n\nshowBadge: true,\n\ntheme: {\n\nbackground: 'rgba(18, 18, 24, 0.9)',\n\ntext: '#C0C0C5',\n\naccent: '#E8E8EA',\n\nbadge: '#4ADE80',\n\n},\n\n},\n\n});\n\n## Options reference\n\n[Section titled “Options reference”](#options-reference)\n\n### Top-level\n\n[Section titled “Top-level”](#top-level)\n\nOption\n\nType\n\nDefault\n\nDescription\n\ntitle\n\nstring\n\n''\n\nSite title\n\ndescription\n\nstring\n\n''\n\nSite description\n\nurl\n\nstring\n\n''\n\nSite URL (used for absolute URLs in generated files)\n\ncontentDir\n\nstring\n\n'docs'\n\nDirectory with handwritten markdown files\n\noutDir\n\nstring\n\nauto-detected\n\nOutput directory for generated files\n\npages\n\nPageEntry[]\n\n[]\n\nManually specify pages to include\n\n### generators\n\n[Section titled “generators”](#generators)\n\nOption",
      "description": "Full configuration reference for aeo.js.",
      "keywords": [
        "true",
        "string",
        "boolean",
        "default",
        "description",
        "type",
        "section",
        "titled",
        "https",
        "schema"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/reference/configuration"
      }
    },
    {
      "id": "4a78d04133eb79e3",
      "url": "https://aeojs.org/docs/frameworks/nuxt",
      "title": "Nuxt",
      "content": "import { Steps } from '@astrojs/starlight/components';\n\n## Setup\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Add the module to your Nuxt config:\n   ```ts\n   // nuxt.config.ts\n   export default defineNuxtConfig({\n     modules: ['aeo.js/nuxt'],\n     aeo: {\n       title: 'My Site',\n       description: 'A site optimized for AI discovery',\n       url: 'https://mysite.com',\n     },\n   });\n   ```\n</Steps>\n\n## How it works\n\nThe Nuxt module:\n\n- Scans your `pages/` directory for routes\n- Generates AEO files during dev and production builds\n- Scans pre-rendered HTML from `.output/public/` for full page content\n- Injects the widget as a client-side Nuxt plugin\n- Adds `<link>` and `<meta>` tags for AEO discoverability\n\n## Configuration\n\nPass any [AeoConfig](/reference/configuration/) options in the `aeo` key:\n\n```ts\nexport default defineNuxtConfig({\n  modules: ['aeo.js/nuxt'],\n  aeo: {\n    title: 'My Site',\n    url: 'https://mysite.com',\n    generators: {\n      robotsTxt: true,\n      llmsTxt: true,\n      rawMarkdown: true,\n    },\n    widget: {\n      enabled: true,\n      position: 'bottom-left',\n    },\n  },\n});\n```",
      "description": "Use aeo.js with Nuxt 3.",
      "keywords": [
        "nuxt",
        "true",
        "steps",
        "site",
        "from",
        "install",
        "module",
        "your",
        "config",
        "export"
      ],
      "metadata": {
        "title": "Nuxt",
        "description": "Use aeo.js with Nuxt 3.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/frameworks/nuxt.mdx"
      }
    },
    {
      "id": "4af97965a7c3b340",
      "url": "https://aeojs.org/features/schema-og",
      "title": "Schema & Open Graph (Part 2)",
      "content": "tag stringconst script = generateJsonLdScript(config);// Get OG meta tag objectsconst tags = generateOGTags(config, page);// Get OG meta tags as HTML stringconst html = generateOGTagsHtml(config, page);\">\n\nTip\n\nSchema and OG generators work independently — you can enable one without the other.\n\n[Previous\nCLI](/features/cli/) [Next\nAudit & Citability](/features/audit/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Auto-generated JSON-LD structured data and Open Graph meta tags.",
      "keywords": [
        "meta",
        "schema",
        "tags",
        "https",
        "config",
        "page",
        "const",
        "content",
        "open",
        "graph"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/features/schema-og"
      }
    },
    {
      "id": "4bf4782ca6c223ef",
      "url": "https://aeojs.org/docs/index",
      "title": "aeo.js (Part 5)",
      "content": "<div class=\"aeo-checker-widget\" style={{marginTop: '1rem', marginBottom: '0.5rem'}}>\n  <form id=\"aeo-check-form\" class=\"aeo-checker-input-wrap\" action=\"https://check.aeojs.org\" method=\"GET\">\n    <input\n      type=\"text\"\n      name=\"q\"\n      class=\"aeo-checker-input\"\n      placeholder=\"Enter your website URL…\"\n      required\n    />\n    <button type=\"submit\" class=\"aeo-checker-btn\">\n      Scan\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/></svg>\n    </button>\n  </form>\n  <p style={{textAlign: 'center', fontSize: '0.8rem', color: 'rgba(255,255,255,0.3)', marginTop: '0.75rem'}}>Free — no signup required. Powered by <a href=\"https://check.aeojs.org\" style={{color: 'rgba(255,255,255,0.5)', textDecoration: 'underline', textUnderlineOffset: '2px'}}>AEO Checker</a></p>\n</div>",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "class",
        "site",
        "tabitem",
        "https",
        "import",
        "mysite",
        "label",
        "title",
        "from",
        "config"
      ],
      "metadata": {
        "title": "aeo.js",
        "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
        "template": "splash",
        "head": "",
        "- tag": "title",
        "content": "aeo.js — Answer Engine Optimization for the Modern Web",
        "hero": "",
        "tagline": "Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine, automatically.",
        "actions": "",
        "- text": "Get Started",
        "link": "/getting-started/introduction/",
        "icon": "right-arrow",
        "variant": "primary",
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "docs/index.mdx"
      }
    },
    {
      "id": "509dc5a4543fe75d",
      "url": "https://aeojs.org/docs/getting-started/quick-start",
      "title": "Quick Start (Part 2)",
      "content": "See [CLI docs](/features/cli/) for all commands and options.",
      "description": "Get aeo.js running in under 2 minutes.",
      "keywords": [
        "site",
        "import",
        "steps",
        "config",
        "from",
        "your",
        "install",
        "https",
        "mysite",
        "astro"
      ],
      "metadata": {
        "title": "Quick Start",
        "description": "Get aeo.js running in under 2 minutes.",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "docs/getting-started/quick-start.mdx"
      }
    },
    {
      "id": "56458f0da655812f",
      "url": "https://aeojs.org/docs/frameworks/vite",
      "title": "Vite",
      "content": "import { Steps } from '@astrojs/starlight/components';\n\n## Setup\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Add the plugin to your Vite config:\n   ```js\n   // vite.config.ts\n   import { defineConfig } from 'vite';\n   import { aeoVitePlugin } from 'aeo.js/vite';\n\n   export default defineConfig({\n     plugins: [\n       aeoVitePlugin({\n         title: 'My Site',\n         description: 'A site optimized for AI discovery',\n         url: 'https://mysite.com',\n       }),\n     ],\n   });\n   ```\n</Steps>\n\n## How it works\n\nThe Vite plugin:\n\n- Generates AEO files on both `vite dev` and `vite build`\n- Injects the Human/AI widget automatically via HTML transform\n- Serves dynamic `.md` files during development (extracts content from your running app)\n- Detects SPA shells and falls back to client-side DOM extraction\n- Works with React, Vue, Svelte, or any Vite-based framework\n\n## Configuration\n\nPass any [AeoConfig](/reference/configuration/) options to the plugin:\n\n```js\naeoVitePlugin({\n  title: 'My Site',\n  url: 'https://mysite.com',\n  widget: {\n    position: 'top-right',\n    theme: {\n      background: 'rgba(0, 0, 0, 0.85)',\n      accent: '#f59e0b',\n    },\n  },\n});\n```",
      "description": "Use aeo.js with Vite (React, Vue, Svelte, etc.).",
      "keywords": [
        "vite",
        "from",
        "import",
        "steps",
        "plugin",
        "aeoviteplugin",
        "site",
        "install",
        "your",
        "config"
      ],
      "metadata": {
        "title": "Vite",
        "description": "Use aeo.js with Vite (React, Vue, Svelte, etc.).",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/frameworks/vite.mdx"
      }
    },
    {
      "id": "5ed515c47e46d362",
      "url": "https://aeojs.org/features/audit",
      "title": "Audit & Citability (Part 2)",
      "content": "[Previous\nSchema & Open Graph](/features/schema-og/) [Next\nConfiguration](/reference/configuration/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Audit your AEO setup and measure your site",
      "keywords": [
        "score",
        "audit",
        "citability",
        "site",
        "report",
        "from",
        "const",
        "console",
        "hints",
        "section"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/features/audit"
      }
    },
    {
      "id": "60fd04c439d85529",
      "url": "https://aeojs.org/frameworks/vite",
      "title": "Vite",
      "content": "## Vite\n\n## Setup\n\n[Section titled “Setup”](#setup)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nAdd the plugin to your Vite config:\n\nvite.config.ts\n\nimport { defineConfig } from 'vite';\n\nimport { aeoVitePlugin } from 'aeo.js/vite';\n\nexport default defineConfig({\n\nplugins: [aeoVitePlugin({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n});\n\n## How it works\n\n[Section titled “How it works”](#how-it-works)\n\nThe Vite plugin:\n\n- Generates AEO files on both vite dev and vite build\n\n- Injects the Human/AI widget automatically via HTML transform\n\n- Serves dynamic .md files during development (extracts content from your running app)\n\n- Detects SPA shells and falls back to client-side DOM extraction\n\n- Works with React, Vue, Svelte, or any Vite-based framework\n\n## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nPass any [AeoConfig](/reference/configuration/) options to the plugin:\n\naeoVitePlugin({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\nwidget: {\n\nposition: 'top-right',\n\ntheme: {\n\nbackground: 'rgba(0, 0, 0, 0.85)',\n\naccent: '#f59e0b',\n\n},\n\n},\n\n});\n\n[Previous\nNext.js](/frameworks/nextjs/) [Next\nNuxt](/frameworks/nuxt/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Use aeo.js with Vite (React, Vue, Svelte, etc.).",
      "keywords": [
        "vite",
        "https",
        "works",
        "configuration",
        "setup",
        "section",
        "titled",
        "plugin",
        "from",
        "aeoviteplugin"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/frameworks/vite"
      }
    },
    {
      "id": "6216767cbf68c5a7",
      "url": "https://aeojs.org/docs/features/cli",
      "title": "CLI",
      "content": "## Usage\n\n```bash\nnpx aeo.js <command> [options]\n```\n\n## Commands\n\n### `generate`\n\nGenerate all AEO files (robots.txt, llms.txt, sitemap.xml, etc.):\n\n```bash\nnpx aeo.js generate\nnpx aeo.js generate --url https://mysite.com --title \"My Site\" --out public\n```\n\n### `init`\n\nCreate an `aeo.config.ts` configuration file in your project:\n\n```bash\nnpx aeo.js init\n```\n\nThis generates a starter config with all options documented.\n\n### `check`\n\nValidate your AEO setup and show what would be generated:\n\n```bash\nnpx aeo.js check\n```\n\n## Options\n\n| Flag | Description |\n|------|-------------|\n| `--out <dir>` | Output directory (default: auto-detected) |\n| `--url <url>` | Site URL |\n| `--title <title>` | Site title |\n| `--no-widget` | Disable widget generation |\n| `--help`, `-h` | Show help |\n| `--version`, `-v` | Show version |\n\n## Configuration file\n\nThe CLI looks for `aeo.config.ts` (or `aeo.config.js`) in your project root. Create one with `npx aeo.js init`:\n\n```ts\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n  title: 'My Site',\n  url: 'https://mysite.com',\n  description: 'A site optimized for AI discovery',\n  outDir: 'public',\n});\n```\n\nSee the full [Configuration reference](/reference/configuration/) for all options.",
      "description": "Run aeo.js from the command line without any framework integration.",
      "keywords": [
        "title",
        "site",
        "bash",
        "options",
        "generate",
        "config",
        "configuration",
        "init",
        "your",
        "show"
      ],
      "metadata": {
        "title": "CLI",
        "description": "Run aeo.js from the command line without any framework integration.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/features/cli.mdx"
      }
    },
    {
      "id": "6748cb72ec53a1ed",
      "url": "https://aeojs.org/features/audit",
      "title": "Audit & Citability (Part 1)",
      "content": "## Audit & Citability\n\n## Site Audit\n\n[Section titled “Site Audit”](#site-audit)\n\nThe auditSite function checks your site for AEO best practices and returns a detailed report:\n\n-\n\nimport { auditSite, formatAuditReport, getGrade } from 'aeo.js';\n\nconst result = await auditSite('https://mysite.com');\n\nconsole.log(formatAuditReport(result));\n\nconsole.log('Grade:', getGrade(result));\n\nThe audit checks for:\n\nPresence of robots.txt, llms.txt, llms-full.txt\n\n- Sitemap accessibility\n\n- Structured data (JSON-LD)\n\n- Open Graph meta tags\n\n- AI crawler accessibility\n\nYou can also run it from the CLI:\n\nTerminal window\n\nnpx aeo.js check\n\n## Citability Score\n\n[Section titled “Citability Score”](#citability-score)\n\nMeasure how likely AI engines are to cite your content:\n\nimport { scorePageCitability, scoreSiteCitability, formatPageCitability } from 'aeo.js';\n\n// Score a single page\n\nconst pageScore = await scorePageCitability(url, html);\n\nconsole.log(formatPageCitability(pageScore));\n\n// Score the whole site\n\nconst siteScore = await scoreSiteCitability('https://mysite.com', pages);\n\nThe citability score evaluates:\n\n- Content structure and headings\n\n- Factual density and specificity\n\n- Source attribution\n\n- Unique data and statistics\n\n- Clear definitions and explanations\n\n## Reports\n\n[Section titled “Reports”](#reports)\n\nGenerate a comprehensive AEO report:\n\nimport { generateReport, formatReportMarkdown, formatReportJson } from 'aeo.js';\n\nconst report = await generateReport(config);\n\n// Get as markdown\n\nconsole.log(formatReportMarkdown(report));\n\n// Get as JSON\n\nconsole.log(formatReportJson(report));\n\n## Platform Hints\n\n[Section titled “Platform Hints”](#platform-hints)\n\nGet platform-specific optimization suggestions:\n\nimport { generatePlatformHints } from 'aeo.js';\n\nconst hints = generatePlatformHints('next');\n\n// Returns hints specific to Next.js optimization",
      "description": "Audit your AEO setup and measure your site",
      "keywords": [
        "score",
        "audit",
        "citability",
        "site",
        "report",
        "from",
        "const",
        "console",
        "hints",
        "section"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/features/audit"
      }
    },
    {
      "id": "67f7ab9c9a5c4a50",
      "url": "https://aeojs.org/frameworks/nextjs",
      "title": "Next.js (Part 2)",
      "content": "[Previous\nAstro](/frameworks/astro/) [Next\nVite](/frameworks/vite/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Use aeo.js with Next.js.",
      "keywords": [
        "widget",
        "next",
        "https",
        "site",
        "title",
        "mysite",
        "true",
        "import",
        "config",
        "withaeo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/frameworks/nextjs"
      }
    },
    {
      "id": "6a8fb9e052251f1c",
      "url": "https://aeojs.org/frameworks/astro",
      "title": "Astro",
      "content": "## Astro\n\n## Setup\n\n[Section titled “Setup”](#setup)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nAdd the integration to your Astro config:\n\nastro.config.mjs\n\nimport { defineConfig } from 'astro/config';\n\nimport { aeoAstroIntegration } from 'aeo.js/astro';\n\nexport default defineConfig({\n\nsite: 'https://mysite.com',\n\nintegrations: [aeoAstroIntegration({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n});\n\n-\nBuild your site:\n\nTerminal window\n\nnpm run build\n\n## How it works\n\n[Section titled “How it works”](#how-it-works)\n\nThe Astro integration:\n\n- Hooks into the Astro build pipeline via astro:build:done\n\n- Scans all rendered HTML pages for content extraction\n\n- Generates all AEO files in your output directory\n\n- Automatically injects the Human/AI widget\n\n- Persists the widget across View Transitions\n\n## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nPass any [AeoConfig](/reference/configuration/) options to the integration:\n\naeoAstroIntegration({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\ngenerators: {\n\nrobotsTxt: true,\n\nllmsTxt: true,\n\nsitemap: false, // Astro has its own sitemap\n\n},\n\nwidget: {\n\nposition: 'bottom-left',\n\ntheme: {\n\naccent: '#6366f1',\n\n},\n\n},\n\n});\n\n[Previous\nQuick Start](/getting-started/quick-start/) [Next\nNext.js](/frameworks/nextjs/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Use aeo.js with Astro.",
      "keywords": [
        "astro",
        "site",
        "https",
        "build",
        "configuration",
        "setup",
        "section",
        "titled",
        "integration",
        "your"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/frameworks/astro"
      }
    },
    {
      "id": "72a970dfbf3ce6c2",
      "url": "https://aeojs.org/reference/api",
      "title": "API Reference (Part 3)",
      "content": "const result = await auditSite('https://mysite.com');\n\nconsole.log(formatAuditReport(result));\n\nconsole.log(getGrade(result)); // 'A', 'B', 'C', etc.\n\n## Citability\n\n[Section titled “Citability”](#citability)\n\n### scorePageCitability(url, html)\n\n[Section titled “scorePageCitability(url, html)”](#scorepagecitabilityurl-html)\n\nScore how likely a page is to be cited by AI:\n\nimport { scorePageCitability, formatPageCitability } from 'aeo.js';\n\nconst score = await scorePageCitability(url, html);\n\nconsole.log(formatPageCitability(score));\n\n### scoreSiteCitability(url, pages)\n\n[Section titled “scoreSiteCitability(url, pages)”](#scoresitecitabilityurl-pages)\n\nScore citability across your entire site.\n\n## Reports\n\n[Section titled “Reports”](#reports)\n\n### generateReport(config)\n\n[Section titled “generateReport(config)”](#generatereportconfig)\n\nGenerate a comprehensive AEO report:\n\nimport { generateReport, formatReportMarkdown } from 'aeo.js';\n\nconst report = await generateReport(config);\n\nconsole.log(formatReportMarkdown(report));\n\n## Types\n\n[Section titled “Types”](#types)\n\nAll types are exported from the main entry:\n\nimport type {\n\nAeoConfig,\n\nResolvedAeoConfig,\n\nPageEntry,\n\nDocEntry,\n\nAeoManifest,\n\nMarkdownFile,\n\nManifestEntry,\n\nAIIndexEntry,\n\nFrameworkType,\n\nFrameworkInfo,\n\nAuditResult,\n\nAuditCategory,\n\nAuditIssue,\n\nMetaTag,\n\nPageCitabilityResult,\n\nSiteCitabilityResult,\n\nCitabilityDimension,\n\nContentHint,\n\nAeoReport,\n\nPlatformHint,\n\n} from 'aeo.js';\n\n[Previous\nConfiguration](/reference/configuration/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Programmatic API for aeo.js.",
      "keywords": [
        "config",
        "section",
        "titled",
        "html",
        "from",
        "import",
        "const",
        "page",
        "title",
        "site"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/reference/api"
      }
    },
    {
      "id": "7301dda1a39fd93b",
      "url": "https://aeojs.org/docs/frameworks/nextjs",
      "title": "Next.js",
      "content": "import { Steps, Aside } from '@astrojs/starlight/components';\n\n## Setup\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Wrap your Next.js config with `withAeo`:\n   ```js\n   // next.config.mjs\n   import { withAeo } from 'aeo.js/next';\n\n   export default withAeo({\n     aeo: {\n       title: 'My Site',\n       description: 'A site optimized for AI discovery',\n       url: 'https://mysite.com',\n     },\n   });\n   ```\n\n3. Add the post-build step to your `package.json`:\n   ```json\n   {\n     \"scripts\": {\n       \"postbuild\": \"node -e \\\"import('aeo.js/next').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\\\"\"\n     }\n   }\n   ```\n</Steps>\n\n<Aside type=\"tip\">\nThe `postbuild` step is needed because Next.js pre-renders pages during build. The post-build step scans the rendered HTML to extract full page content.\n</Aside>\n\n## Widget\n\nFor Next.js, add the widget manually as a client component:\n\n```tsx\n// app/layout.tsx (or any client component)\n'use client';\nimport { useEffect } from 'react';\n\nexport function AeoWidgetLoader() {\n  useEffect(() => {\n    import('aeo.js/widget').then(({ AeoWidget }) => {\n      new AeoWidget({\n        config: {\n          title: 'My Site',\n          url: 'https://mysite.com',\n          widget: { enabled: true, position: 'bottom-right' },\n        },\n      });\n    });\n  }, []);\n  return null;\n}\n```\n\n## Configuration\n\nPass any [AeoConfig](/reference/configuration/) options in the `aeo` key:\n\n```js\nexport default withAeo({\n  aeo: {\n    title: 'My Site',\n    url: 'https://mysite.com',\n    generators: {\n      robotsTxt: true,\n      llmsTxt: true,\n      schema: true,\n    },\n    widget: {\n      enabled: true,\n      position: 'bottom-right',\n    },\n  },\n});\n```",
      "description": "Use aeo.js with Next.js.",
      "keywords": [
        "next",
        "import",
        "site",
        "widget",
        "true",
        "withaeo",
        "title",
        "https",
        "mysite",
        "steps"
      ],
      "metadata": {
        "title": "Next.js",
        "description": "Use aeo.js with Next.js.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/frameworks/nextjs.mdx"
      }
    },
    {
      "id": "77c89f00c11e6580",
      "url": "https://aeojs.org",
      "title": "aeo.js — Answer Engine Optimization for the Modern Web (Part 4)",
      "content": " \">\n\n## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nAll frameworks use the same config shape — [see full reference](/reference/configuration/):\n\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\ndescription: 'A site optimized for AI discovery',\n\ngenerators: {\n\nrobotsTxt: true,\n\nllmsTxt: true,\n\nllmsFullTxt: true,\n\nrawMarkdown: true,\n\nsitemap: true,\n\naiIndex: true,\n\nschema: true,\n\n},\n\nschema: {\n\nenabled: true,\n\norganization: { name: 'My Company', url: 'https://mysite.com' },\n\ndefaultType: 'WebPage',\n\n},\n\nog: {\n\nenabled: true,\n\nimage: 'https://mysite.com/og.png',\n\ntwitterHandle: '@mycompany',\n\n},\n\nwidget: {\n\nenabled: true,\n\nposition: 'bottom-right',\n\ntheme: { accent: '#4ADE80', badge: '#4ADE80' },\n\n},\n\n});\n\n## Generated Files\n\n[Section titled “Generated Files”](#generated-files)\n\nAfter building, your output directory contains:\n\npublic/\n\n├── robots.txt # AI-crawler directives\n\n├── llms.txt # Short LLM-readable summary\n\n├── llms-full.txt # Full content for LLMs\n\n├── sitemap.xml # Standard sitemap\n\n├── docs.json # Documentation manifest\n\n├── ai-index.json # AI content index\n\n├── index.md # Markdown for /\n\n└── about.md # Markdown for /about\n\n## Checker\n\n[Section titled “Checker”](#checker)\n\nScan\n\nFree — no signup required. Powered by [AEO Checker](https://check.aeojs.org)\n\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "site",
        "https",
        "title",
        "mysite",
        "import",
        "config",
        "widget",
        "true",
        "from",
        "files"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/"
      }
    },
    {
      "id": "7d6be39e623d2df8",
      "url": "https://aeojs.org/features/generated-files",
      "title": "Generated Files (Part 2)",
      "content": "blog.md # Markdown for /blog\n\n## Toggling generators\n\n[Section titled “Toggling generators”](#toggling-generators)\n\nYou can enable or disable individual generators:\n\n{\n\ngenerators: {\n\nrobotsTxt: true,\n\nllmsTxt: true,\n\nllmsFullTxt: true,\n\nrawMarkdown: true,\n\nmanifest: true,\n\nsitemap: true,\n\naiIndex: true,\n\nschema: true,\n\n}\n\n}\n\n[Previous\nWebpack](/frameworks/webpack/) [Next\nWidget](/features/widget/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "All the files aeo.js generates and what they",
      "keywords": [
        "https",
        "section",
        "titled",
        "true",
        "site",
        "mysite",
        "markdown",
        "llms",
        "content",
        "index"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/features/generated-files"
      }
    },
    {
      "id": "897334fff5d461e1",
      "url": "https://aeojs.org/docs/getting-started/installation",
      "title": "Installation",
      "content": "import { Tabs, TabItem } from '@astrojs/starlight/components';\n\n## Install the package\n\n<Tabs>\n  <TabItem label=\"npm\">\n    ```bash\n    npm install aeo.js\n    ```\n  </TabItem>\n  <TabItem label=\"pnpm\">\n    ```bash\n    pnpm add aeo.js\n    ```\n  </TabItem>\n  <TabItem label=\"yarn\">\n    ```bash\n    yarn add aeo.js\n    ```\n  </TabItem>\n</Tabs>\n\n## Or use the CLI directly\n\nNo installation needed — run it with `npx`:\n\n```bash\nnpx aeo.js generate\n```\n\n## Requirements\n\n- **Node.js** 18 or later\n- A framework with a build step that outputs HTML (or use the CLI for any static site)\n\n## Next steps\n\nHead to [Quick Start](/getting-started/quick-start/) to add aeo.js to your project, or jump to your framework's guide:\n\n- [Astro](/frameworks/astro/)\n- [Next.js](/frameworks/nextjs/)\n- [Vite](/frameworks/vite/)\n- [Nuxt](/frameworks/nuxt/)\n- [Angular](/frameworks/angular/)\n- [Webpack](/frameworks/webpack/)",
      "description": "Install aeo.js in your project.",
      "keywords": [
        "tabitem",
        "frameworks",
        "bash",
        "tabs",
        "label",
        "install",
        "pnpm",
        "yarn",
        "with",
        "framework"
      ],
      "metadata": {
        "title": "Installation",
        "description": "Install aeo.js in your project.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/getting-started/installation.mdx"
      }
    },
    {
      "id": "8e7a1608a84d0dc1",
      "url": "https://aeojs.org/reference/configuration",
      "title": "Configuration (Part 2)",
      "content": "Type\n\nDefault\n\nDescription\n\nrobotsTxt\n\nboolean\n\ntrue\n\nGenerate robots.txt\n\nllmsTxt\n\nboolean\n\ntrue\n\nGenerate llms.txt\n\nllmsFullTxt\n\nboolean\n\ntrue\n\nGenerate llms-full.txt\n\nrawMarkdown\n\nboolean\n\ntrue\n\nGenerate per-page .md files\n\nmanifest\n\nboolean\n\ntrue\n\nGenerate docs.json\n\nsitemap\n\nboolean\n\ntrue\n\nGenerate sitemap.xml\n\naiIndex\n\nboolean\n\ntrue\n\nGenerate ai-index.json\n\nschema\n\nboolean\n\nfalse\n\nGenerate JSON-LD structured data\n\n### robots\n\n[Section titled “robots”](#robots)\n\nOption\n\nType\n\nDefault\n\nDescription\n\nallow\n\nstring[]\n\n['/']\n\nAllowed paths\n\ndisallow\n\nstring[]\n\n[]\n\nDisallowed paths\n\ncrawlDelay\n\nnumber\n\n0\n\nCrawl delay in seconds\n\nsitemap\n\nstring\n\nauto\n\nSitemap URL\n\n### schema\n\n[Section titled “schema”](#schema)\n\nOption\n\nType\n\nDefault\n\nDescription\n\nenabled\n\nboolean\n\nfalse\n\nEnable schema generation\n\norganization.name\n\nstring\n\n''\n\nOrganization name\n\norganization.url\n\nstring\n\n''\n\nOrganization URL\n\norganization.logo\n\nstring\n\n''\n\nOrganization logo URL\n\norganization.sameAs\n\nstring[]\n\n[]\n\nSocial profile URLs\n\ndefaultType\n\n'Article' | 'WebPage'\n\n'WebPage'\n\nDefault schema type for pages\n\n### og\n\n[Section titled “og”](#og)\n\nOption\n\nType\n\nDefault\n\nDescription\n\nenabled\n\nboolean\n\nfalse\n\nEnable OG tag generation\n\nimage\n\nstring\n\n''\n\nDefault OG image URL\n\ntwitterHandle\n\nstring\n\n''\n\nTwitter handle (e.g. @company)\n\ntype\n\n'website' | 'article'\n\n'website'\n\nDefault OG type\n\n### widget\n\n[Section titled “widget”](#widget)\n\nOption\n\nType\n\nDefault\n\nDescription\n\nenabled\n\nboolean\n\ntrue\n\nEnable the widget\n\nposition\n\nstring\n\n'bottom-right'\n\nWidget position\n\nhumanLabel\n\nstring\n\n'Human'\n\nLabel for human view\n\naiLabel\n\nstring\n\n'AI'\n\nLabel for AI view\n\nshowBadge\n\nboolean\n\ntrue\n\nShow the AEO badge\n\ntheme.background\n\nstring\n\n'rgba(18, 18, 24, 0.9)'\n\nWidget background\n\ntheme.text\n\nstring\n\n'#C0C0C5'\n\nText color\n\ntheme.accent\n\nstring\n\n'#E8E8EA'\n\nAccent color\n\ntheme.badge\n\nstring\n\n'#4ADE80'\n\nBadge color",
      "description": "Full configuration reference for aeo.js.",
      "keywords": [
        "true",
        "string",
        "boolean",
        "default",
        "description",
        "type",
        "section",
        "titled",
        "https",
        "schema"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/reference/configuration"
      }
    },
    {
      "id": "988c293450866ae4",
      "url": "https://aeojs.org/docs/reference/configuration",
      "title": "Configuration (Part 1)",
      "content": "All framework plugins and the CLI accept the same `AeoConfig` object.\n\n## Full example\n\n```ts\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n  // Required\n  title: 'My Site',\n  url: 'https://mysite.com',\n\n  // Optional\n  description: 'A description of your site',\n  contentDir: 'docs',        // Directory with handwritten .md files\n  outDir: 'public',          // Output directory for generated files\n\n  // Toggle individual generators\n  generators: {\n    robotsTxt: true,\n    llmsTxt: true,\n    llmsFullTxt: true,\n    rawMarkdown: true,\n    manifest: true,\n    sitemap: true,\n    aiIndex: true,\n    schema: true,\n  },\n\n  // Customize robots.txt\n  robots: {\n    allow: ['/'],\n    disallow: ['/admin'],\n    crawlDelay: 0,\n    sitemap: 'https://mysite.com/sitemap.xml',\n  },\n\n  // JSON-LD structured data\n  schema: {\n    enabled: true,\n    organization: {\n      name: 'My Company',\n      url: 'https://mysite.com',\n      logo: 'https://mysite.com/logo.png',\n      sameAs: ['https://twitter.com/mycompany'],\n    },\n    defaultType: 'WebPage',\n  },\n\n  // Open Graph meta tags\n  og: {\n    enabled: true,\n    image: 'https://mysite.com/og.png',\n    twitterHandle: '@mycompany',\n    type: 'website',\n  },\n\n  // Widget configuration\n  widget: {\n    enabled: true,\n    position: 'bottom-right',\n    humanLabel: 'Human',\n    aiLabel: 'AI',\n    showBadge: true,\n    theme: {\n      background: 'rgba(18, 18, 24, 0.9)',\n      text: '#C0C0C5',\n      accent: '#E8E8EA',\n      badge: '#4ADE80',\n    },\n  },\n});\n```\n\n## Options reference\n\n### Top-level",
      "description": "Full configuration reference for aeo.js.",
      "keywords": [
        "true",
        "string",
        "boolean",
        "default",
        "description",
        "type",
        "organization",
        "generate",
        "sitemap",
        "https"
      ],
      "metadata": {
        "title": "Configuration",
        "description": "Full configuration reference for aeo.js.",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "docs/reference/configuration.mdx"
      }
    },
    {
      "id": "a1781ad16a6c6389",
      "url": "https://aeojs.org/docs/features/widget",
      "title": "Human/AI Widget (Part 1)",
      "content": "import { Aside } from '@astrojs/starlight/components';\n\nThe Human/AI widget is a floating toggle that lets visitors switch between the normal page and its AI-readable markdown version.\n\n## How it works\n\nWhen a visitor clicks **AI**, the widget:\n\n1. Fetches the `.md` file for the current page\n2. Falls back to extracting markdown from the live DOM if no `.md` exists\n3. Displays the markdown in a slide-out panel\n4. Offers copy-to-clipboard and download actions\n\n## Automatic injection\n\nFramework plugins (Astro, Vite, Nuxt, Angular) inject the widget automatically. No extra code needed.\n\n## Manual setup (Next.js / React)\n\nFor Next.js or other manual setups, create a client component:\n\n```tsx\n'use client';\nimport { useEffect } from 'react';\n\nexport function AeoWidgetLoader() {\n  useEffect(() => {\n    import('aeo.js/widget').then(({ AeoWidget }) => {\n      new AeoWidget({\n        config: {\n          title: 'My Site',\n          url: 'https://mysite.com',\n          widget: { enabled: true, position: 'bottom-right' },\n        },\n      });\n    });\n  }, []);\n  return null;\n}\n```\n\n## Framework components\n\naeo.js ships React, Vue, and Svelte wrapper components:\n\n### React\n\n```tsx\nimport { AeoReactWidget } from 'aeo.js/react';\n\n<AeoReactWidget config={{ title: 'My Site', url: 'https://mysite.com' }} />\n```\n\n### Vue\n\n```vue\n<script setup>\nimport { AeoVueWidget } from 'aeo.js/vue';\n</script>\n\n<template>\n  <AeoVueWidget :config=\"{ title: 'My Site', url: 'https://mysite.com' }\" />\n</template>\n```\n\n## Configuration\n\n```js\nwidget: {\n  enabled: true,\n  position: 'bottom-right', // 'bottom-left' | 'top-right' | 'top-left'\n  size: 'default',          // 'small' | 'icon-only'\n  humanLabel: 'Human',\n  aiLabel: 'AI',\n  showBadge: true,\n  theme: {\n    background: 'rgba(18, 18, 24, 0.9)',\n    text: '#C0C0C5',\n    accent: '#E8E8EA',\n    badge: '#4ADE80',\n  },\n}\n```\n\n## Size variants",
      "description": "The drop-in toggle that shows how AI sees your pages.",
      "keywords": [
        "widget",
        "import",
        "from",
        "react",
        "size",
        "default",
        "small",
        "icon",
        "aside",
        "components"
      ],
      "metadata": {
        "title": "Human/AI Widget",
        "description": "The drop-in toggle that shows how AI sees your pages.",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "docs/features/widget.mdx"
      }
    },
    {
      "id": "abc0afec27074cbc",
      "url": "https://aeojs.org/getting-started/quick-start",
      "title": "Quick Start (Part 2)",
      "content": "[Previous\nInstallation](/getting-started/installation/) [Next\nAstro](/frameworks/astro/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Get aeo.js running in under 2 minutes.",
      "keywords": [
        "site",
        "astro",
        "https",
        "config",
        "mysite",
        "next",
        "vite",
        "your",
        "install",
        "import"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/getting-started/quick-start"
      }
    },
    {
      "id": "ae189ca9b89835a2",
      "url": "https://aeojs.org/docs/frameworks/angular",
      "title": "Angular",
      "content": "import { Steps, Aside } from '@astrojs/starlight/components';\n\n## Setup\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Add a post-build step to your `package.json`:\n   ```json\n   {\n     \"scripts\": {\n       \"postbuild\": \"node -e \\\"import('aeo.js/angular').then(m => m.postBuild({ title: 'My App', url: 'https://myapp.com' }))\\\"\"\n     }\n   }\n   ```\n\n3. Build your app:\n   ```bash\n   npm run build\n   ```\n</Steps>\n\n## How it works\n\nThe Angular plugin:\n\n- Reads `angular.json` to auto-detect the output directory (`dist/<project>/browser/`)\n- Scans route config files (`*.routes.ts`) and component directories for routes\n- Scans pre-rendered HTML from the build output for full page content\n- Injects the widget into `index.html` automatically\n\n## Programmatic usage\n\nYou can also generate AEO files from source routes without building:\n\n```ts\nimport { generate } from 'aeo.js/angular';\n\nawait generate({ title: 'My App', url: 'https://myapp.com' });\n```\n\n<Aside type=\"note\">\nAngular SSR (with `@angular/ssr`) is supported. The plugin will scan pre-rendered HTML for content extraction.\n</Aside>\n\n## Configuration\n\nPass any [AeoConfig](/reference/configuration/) options to `postBuild` or `generate`:\n\n```ts\nimport { postBuild } from 'aeo.js/angular';\n\nawait postBuild({\n  title: 'My App',\n  url: 'https://myapp.com',\n  generators: {\n    robotsTxt: true,\n    llmsTxt: true,\n    schema: true,\n  },\n});\n```",
      "description": "Use aeo.js with Angular.",
      "keywords": [
        "angular",
        "from",
        "postbuild",
        "import",
        "build",
        "generate",
        "steps",
        "aside",
        "json",
        "title"
      ],
      "metadata": {
        "title": "Angular",
        "description": "Use aeo.js with Angular.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/frameworks/angular.mdx"
      }
    },
    {
      "id": "bc43df2fd0afba97",
      "url": "https://aeojs.org/features/widget",
      "title": "Human/AI Widget (Part 2)",
      "content": "## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nwidget: {\n\nenabled: true,\n\nposition: 'bottom-right', // 'bottom-left' | 'top-right' | 'top-left'\n\nsize: 'default', // 'small' | 'icon-only'\n\nhumanLabel: 'Human',\n\naiLabel: 'AI',\n\nshowBadge: true,\n\ntheme: {\n\nbackground: 'rgba(18, 18, 24, 0.9)',\n\ntext: '#C0C0C5',\n\naccent: '#E8E8EA',\n\nbadge: '#4ADE80',\n\n},\n\n}\n\n## Size variants\n\n[Section titled “Size variants”](#size-variants)\n\nDefault\n\nSmall\n\nIcon\n\nsize: 'default'\n\nsize: 'small'\n\nsize: 'icon-only'\n\nFull labels with icons\n\nCompact — ~30% smaller\n\nJust icons, no labels\n\nTip\n\nSet widget.enabled: false to disable the widget entirely while still generating AEO files.\n\n[Previous\nGenerated Files](/features/generated-files/) [Next\nCLI](/features/cli/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "The drop-in toggle that shows how AI sees your pages.",
      "keywords": [
        "widget",
        "react",
        "section",
        "titled",
        "size",
        "https",
        "import",
        "from",
        "framework",
        "manual"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/features/widget"
      }
    },
    {
      "id": "bd4f27007c409577",
      "url": "https://aeojs.org/reference/api",
      "title": "API Reference (Part 1)",
      "content": "## API Reference\n\n## Core\n\n[Section titled “Core”](#core)\n\n### defineConfig(config)\n\n[Section titled “defineConfig(config)”](#defineconfigconfig)\n\nType-safe configuration helper:\n\nimport { defineConfig } from 'aeo.js';\n\nexport default defineConfig({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\n});\n\n**\n\n### generateAll(config)\n\n[Section titled “generateAll(config)”](#generateallconfig)\n\nGenerate all AEO files programmatically:\n\nimport { generateAll } from 'aeo.js';\n\nawait generateAll({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\noutDir: 'dist',\n\n});\n\n### resolveConfig(config)\n\n[Section titled “resolveConfig(config)”](#resolveconfigconfig)\n\nResolve a partial config into a fully resolved config with defaults:\n\nimport { resolveConfig } from 'aeo.js';\n\nconst resolved = resolveConfig({ title: 'My Site' });\n\n// All fields now have defaults\n\n### validateConfig(config)\n\n[Section titled “validateConfig(config)”](#validateconfigconfig)\n\nValidate a config object and return any errors:\n\nimport { validateConfig } from 'aeo.js';\n\nconst errors = validateConfig(config);\n\n### detectFramework()\n\n[Section titled “detectFramework()”](#detectframework)\n\nAuto-detect the framework used in the current project:\n\nimport { detectFramework } from 'aeo.js';\n\nconst info = detectFramework();\n\n// { framework: 'next', contentDir: 'pages', outDir: '.next' }\n\n## HTML Extraction\n\n[Section titled “HTML Extraction”](#html-extraction)\n\n### htmlToMarkdown(html)\n\n[Section titled “htmlToMarkdown(html)”](#htmltomarkdownhtml)\n\nConvert HTML to clean markdown:\n\nimport { htmlToMarkdown } from 'aeo.js';\n\nconst md = htmlToMarkdown('&#x3C;h1>Hello&#x3C;/h1>&#x3C;p>World&#x3C;/p>');\n\n// '# Hello\\n\\nWorld'\n\n### extractTextFromHtml(html)\n\n[Section titled “extractTextFromHtml(html)”](#extracttextfromhtmlhtml)\n\nExtract plain text from HTML:\n\nimport { extractTextFromHtml } from 'aeo.js';\n\nconst text = extractTextFromHtml('&#x3C;p>Hello &#x3C;strong>world&#x3C;/strong>&#x3C;/p>');\n\nworld**\n\n&#x27;);\">",
      "description": "Programmatic API for aeo.js.",
      "keywords": [
        "config",
        "section",
        "titled",
        "html",
        "from",
        "import",
        "const",
        "page",
        "title",
        "site"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/reference/api"
      }
    },
    {
      "id": "be1c966e1e727e67",
      "url": "https://aeojs.org/getting-started/introduction",
      "title": "Introduction",
      "content": "## Introduction\n\n## What is Answer Engine Optimization?\n\n[Section titled “What is Answer Engine Optimization?”](#what-is-answer-engine-optimization)\n\nAnswer Engine Optimization (AEO) is the practice of making your website discoverable and citable by AI-powered answer engines like **ChatGPT**, **Claude**, **Perplexity**, and **SearchGPT**.\n\nUnlike traditional SEO which focuses on search engine result pages (SERPs), AEO ensures your content is understood and referenced by Large Language Models (LLMs) when they generate answers.\n\n## Why aeo.js?\n\n[Section titled “Why aeo.js?”](#why-aeojs)\n\nAI crawlers and LLMs look for specific files and formats that most websites don’t provide:\n\n- **llms.txt** — A concise summary of your site written for LLMs\n\n- **llms-full.txt** — Full content concatenated for deep ingestion\n\n- **ai-index.json** — Structured content optimized for RAG pipelines\n\n- **docs.json** — Documentation manifest for content discovery\n\n- **Raw Markdown** — Per-page .md files for clean content extraction\n\n**aeo.js** generates all of these automatically from your existing pages — no manual work required.\n\n## How it works\n\n[Section titled “How it works”](#how-it-works)\n\n- **Install** the package and add the plugin for your framework\n\n- **Build** your site as usual\n\n- **aeo.js** scans your output, extracts content, and generates all AEO files\n\n- The optional **widget** lets visitors toggle between human and AI views of your pages\n\n## Supported Frameworks\n\n[Section titled “Supported Frameworks”](#supported-frameworks)\n\nFramework\n\nImport\n\nAstro\n\naeo.js/astro\n\nNext.js\n\naeo.js/next\n\nVite (React, Vue, Svelte)\n\naeo.js/vite\n\nNuxt\n\naeo.js/nuxt\n\nAngular\n\naeo.js/angular\n\nWebpack\n\naeo.js/webpack\n\nAny (CLI)\n\nnpx aeo.js generate\n\n[Next\nInstallation](/getting-started/installation/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "What is aeo.js and why you need Answer Engine Optimization.",
      "keywords": [
        "your",
        "content",
        "answer",
        "engine",
        "llms",
        "optimization",
        "section",
        "titled",
        "what",
        "pages"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/getting-started/introduction"
      }
    },
    {
      "id": "c508db81362df17c",
      "url": "https://aeojs.org/features/widget",
      "title": "Human/AI Widget (Part 1)",
      "content": "## Human/AI Widget\n\nThe Human/AI widget is a floating toggle that lets visitors switch between the normal page and its AI-readable markdown version.\n\n## How it works\n\n[Section titled “How it works”](#how-it-works)\n\nWhen a visitor clicks **AI**, the widget:\n\n- Fetches the .md file for the current page\n\n- Falls back to extracting markdown from the live DOM if no .md exists\n\n- Displays the markdown in a slide-out panel\n\n- Offers copy-to-clipboard and download actions\n\n## Automatic injection\n\n[Section titled “Automatic injection”](#automatic-injection)\n\nFramework plugins (Astro, Vite, Nuxt, Angular) inject the widget automatically. No extra code needed.\n\n## Manual setup (Next.js / React)\n\n[Section titled “Manual setup (Next.js / React)”](#manual-setup-nextjs--react)\n\nFor Next.js or other manual setups, create a client component:\n\n'use client';\n\nimport { useEffect } from 'react';\n\nexport function AeoWidgetLoader() {\n\nuseEffect(() => {\n\nimport('aeo.js/widget').then(({ AeoWidget }) => {\n\nnew AeoWidget({\n\nconfig: {\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\nwidget: { enabled: true, position: 'bottom-right' },\n\n},\n\n});\n\n});\n\n}, []);\n\nreturn null;\n\n}\n\n{ import(&#x27;aeo.js/widget&#x27;).then(({ AeoWidget }) => { new AeoWidget({ config: { title: &#x27;My Site&#x27;, url: &#x27;https://mysite.com&#x27;, widget: { enabled: true, position: &#x27;bottom-right&#x27; }, }, }); }); }, []); return null;}\">\n\n## Framework components\n\n[Section titled “Framework components”](#framework-components)\n\naeo.js ships React, Vue, and Svelte wrapper components:\n\n### React\n\n[Section titled “React”](#react)\n\nimport { AeoReactWidget } from 'aeo.js/react';\n\n&#x3C;AeoReactWidget config={{ title: 'My Site', url: 'https://mysite.com' }} />\n\n\">\n\n### Vue\n\n[Section titled “Vue”](#vue)\n\n&#x3C;script setup>\n\nimport { AeoVueWidget } from 'aeo.js/vue';\n\n&#x3C;/script>\n\n&#x3C;template>\n\n&#x3C;AeoVueWidget :config=\"{ title: 'My Site', url: 'https://mysite.com' }\" />\n\n&#x3C;/template>\n\n \">",
      "description": "The drop-in toggle that shows how AI sees your pages.",
      "keywords": [
        "widget",
        "react",
        "section",
        "titled",
        "size",
        "https",
        "import",
        "from",
        "framework",
        "manual"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/features/widget"
      }
    },
    {
      "id": "c524d046ae5f4534",
      "url": "https://aeojs.org/docs/features/generated-files",
      "title": "Generated Files (Part 2)",
      "content": "```js\n{\n  generators: {\n    robotsTxt: true,\n    llmsTxt: true,\n    llmsFullTxt: true,\n    rawMarkdown: true,\n    manifest: true,\n    sitemap: true,\n    aiIndex: true,\n    schema: true,\n  }\n}\n```",
      "description": "All the files aeo.js generates and what they're for.",
      "keywords": [
        "true",
        "site",
        "https",
        "mysite",
        "content",
        "your",
        "about",
        "index",
        "markdown",
        "blog"
      ],
      "metadata": {
        "title": "Generated Files",
        "description": "All the files aeo.js generates and what they're for.",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "docs/features/generated-files.mdx"
      }
    },
    {
      "id": "c9965c40e44472a1",
      "url": "https://aeojs.org/docs/features/audit",
      "title": "Audit & Citability",
      "content": "## Site Audit\n\nThe `auditSite` function checks your site for AEO best practices and returns a detailed report:\n\n```ts\nimport { auditSite, formatAuditReport, getGrade } from 'aeo.js';\n\nconst result = await auditSite('https://mysite.com');\n\nconsole.log(formatAuditReport(result));\nconsole.log('Grade:', getGrade(result));\n```\n\nThe audit checks for:\n\n- Presence of `robots.txt`, `llms.txt`, `llms-full.txt`\n- Sitemap accessibility\n- Structured data (JSON-LD)\n- Open Graph meta tags\n- AI crawler accessibility\n\nYou can also run it from the CLI:\n\n```bash\nnpx aeo.js check\n```\n\n## Citability Score\n\nMeasure how likely AI engines are to cite your content:\n\n```ts\nimport { scorePageCitability, scoreSiteCitability, formatPageCitability } from 'aeo.js';\n\n// Score a single page\nconst pageScore = await scorePageCitability(url, html);\nconsole.log(formatPageCitability(pageScore));\n\n// Score the whole site\nconst siteScore = await scoreSiteCitability('https://mysite.com', pages);\n```\n\nThe citability score evaluates:\n\n- Content structure and headings\n- Factual density and specificity\n- Source attribution\n- Unique data and statistics\n- Clear definitions and explanations\n\n## Reports\n\nGenerate a comprehensive AEO report:\n\n```ts\nimport { generateReport, formatReportMarkdown, formatReportJson } from 'aeo.js';\n\nconst report = await generateReport(config);\n\n// Get as markdown\nconsole.log(formatReportMarkdown(report));\n\n// Get as JSON\nconsole.log(formatReportJson(report));\n```\n\n## Platform Hints\n\nGet platform-specific optimization suggestions:\n\n```ts\nimport { generatePlatformHints } from 'aeo.js';\n\nconst hints = generatePlatformHints('next');\n// Returns hints specific to Next.js optimization\n```",
      "description": "Audit your AEO setup and measure your site's citability score.",
      "keywords": [
        "report",
        "from",
        "const",
        "console",
        "import",
        "await",
        "score",
        "site",
        "auditsite",
        "result"
      ],
      "metadata": {
        "title": "Audit & Citability",
        "description": "Audit your AEO setup and measure your site's citability score.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/features/audit.mdx"
      }
    },
    {
      "id": "ceb04bed927b6b30",
      "url": "https://aeojs.org/frameworks/nuxt",
      "title": "Nuxt",
      "content": "## Nuxt\n\n## Setup\n\n[Section titled “Setup”](#setup)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nAdd the module to your Nuxt config:\n\nnuxt.config.ts\n\nexport default defineNuxtConfig({\n\nmodules: ['aeo.js/nuxt'],\n\naeo: {\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n},\n\n});\n\n## How it works\n\n[Section titled “How it works”](#how-it-works)\n\nThe Nuxt module:\n\n- Scans your pages/ directory for routes\n\n- Generates AEO files during dev and production builds\n\n- Scans pre-rendered HTML from .output/public/ for full page content\n\n- Injects the widget as a client-side Nuxt plugin\n\n- Adds &#x3C;link> and &#x3C;meta> tags for AEO discoverability\n\n## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nPass any [AeoConfig](/reference/configuration/) options in the aeo key:\n\nexport default defineNuxtConfig({\n\nmodules: ['aeo.js/nuxt'],\n\naeo: {\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\ngenerators: {\n\nrobotsTxt: true,\n\nllmsTxt: true,\n\nrawMarkdown: true,\n\n},\n\nwidget: {\n\nenabled: true,\n\nposition: 'bottom-left',\n\n},\n\n},\n\n});\n\n[Previous\nVite](/frameworks/vite/) [Next\nAngular](/frameworks/angular/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Use aeo.js with Nuxt 3.",
      "keywords": [
        "nuxt",
        "https",
        "configuration",
        "true",
        "setup",
        "section",
        "titled",
        "site",
        "works",
        "install"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/frameworks/nuxt"
      }
    },
    {
      "id": "d22f5b66eddeeca5",
      "url": "https://aeojs.org",
      "title": "aeo.js — Answer Engine Optimization for the Modern Web (Part 2)",
      "content": "\"postbuild\": \"node -e \\\"import('aeo.js/next').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\\\"\"\n\n}\n\n}\n\nm.postBuild({ title: &#x27;My Site&#x27;, url: &#x27;https://mysite.com&#x27; }))\\&#x22;&#x22; }}\">\n\nvite.config.ts\n\nimport { defineConfig } from 'vite';\n\nimport { aeoVitePlugin } from 'aeo.js/vite';\n\nexport default defineConfig({\n\nplugins: [aeoVitePlugin({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n});\n\nnuxt.config.ts\n\nexport default defineNuxtConfig({\n\nmodules: ['aeo.js/nuxt'],\n\naeo: {\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n},\n\n});\n\nAdd a post-build step to package.json:\n\n{\n\n\"scripts\": {\n\n\"postbuild\": \"node -e \\\"import('aeo.js/angular').then(m => m.postBuild({ title: 'My App', url: 'https://myapp.com' }))\\\"\"\n\n}\n\n}\n\nm.postBuild({ title: &#x27;My App&#x27;, url: &#x27;https://myapp.com&#x27; }))\\&#x22;&#x22; }}\">\n\nOr generate programmatically:\n\nimport { generate } from 'aeo.js/angular';\n\nawait generate({ title: 'My App', url: 'https://myapp.com' });\n\nwebpack.config.js\n\nconst { AeoWebpackPlugin } = require('aeo.js/webpack');\n\nmodule.exports = {\n\nplugins: [new AeoWebpackPlugin({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n};\n\nNo framework needed — run standalone:\n\nTerminal window\n\n# Generate all AEO files\n\nnpx aeo.js generate --url https://mysite.com --title \"My Site\"\n\n# Scaffold a config file\n\nnpx aeo.js init\n\n# Check your setup\n\nnpx aeo.js check\n\n## What is AEO?\n\n[Section titled “What is AEO?”](#what-is-aeo)\n\nAnswer Engine Optimization (AEO) is the practice of making your website discoverable and citable by AI-powered answer engines like ChatGPT, Claude, Perplexity, and SearchGPT.",
      "description": "Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.",
      "keywords": [
        "site",
        "https",
        "title",
        "mysite",
        "import",
        "config",
        "widget",
        "true",
        "from",
        "files"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/"
      }
    },
    {
      "id": "d586bea441969721",
      "url": "https://aeojs.org/docs/getting-started/quick-start",
      "title": "Quick Start (Part 1)",
      "content": "import { Tabs, TabItem, Steps } from '@astrojs/starlight/components';\n\nThe fastest way to add AEO to your site depends on your framework.\n\n## Astro\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Add the integration to your Astro config:\n   ```js\n   // astro.config.mjs\n   import { defineConfig } from 'astro/config';\n   import { aeoAstroIntegration } from 'aeo.js/astro';\n\n   export default defineConfig({\n     site: 'https://mysite.com',\n     integrations: [\n       aeoAstroIntegration({\n         title: 'My Site',\n         description: 'A site optimized for AI discovery',\n         url: 'https://mysite.com',\n       }),\n     ],\n   });\n   ```\n\n3. Build your site — all AEO files are generated automatically.\n</Steps>\n\n## Next.js\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Wrap your Next.js config:\n   ```js\n   // next.config.mjs\n   import { withAeo } from 'aeo.js/next';\n\n   export default withAeo({\n     aeo: {\n       title: 'My Site',\n       description: 'A site optimized for AI discovery',\n       url: 'https://mysite.com',\n     },\n   });\n   ```\n\n3. Add the post-build step to `package.json`:\n   ```json\n   {\n     \"scripts\": {\n       \"postbuild\": \"node -e \\\"import('aeo.js/next').then(m => m.postBuild({ title: 'My Site', url: 'https://mysite.com' }))\\\"\"\n     }\n   }\n   ```\n</Steps>\n\n## Vite\n\n<Steps>\n1. Install the package:\n   ```bash\n   npm install aeo.js\n   ```\n\n2. Add the plugin to your Vite config:\n   ```js\n   // vite.config.ts\n   import { defineConfig } from 'vite';\n   import { aeoVitePlugin } from 'aeo.js/vite';\n\n   export default defineConfig({\n     plugins: [\n       aeoVitePlugin({\n         title: 'My Site',\n         description: 'A site optimized for AI discovery',\n         url: 'https://mysite.com',\n       }),\n     ],\n   });\n   ```\n</Steps>\n\n## CLI (any site)\n\nNo framework integration needed:\n\n```bash\nnpx aeo.js generate --url https://mysite.com --title \"My Site\"\n```",
      "description": "Get aeo.js running in under 2 minutes.",
      "keywords": [
        "site",
        "import",
        "steps",
        "config",
        "from",
        "your",
        "install",
        "https",
        "mysite",
        "astro"
      ],
      "metadata": {
        "title": "Quick Start",
        "description": "Get aeo.js running in under 2 minutes.",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "docs/getting-started/quick-start.mdx"
      }
    },
    {
      "id": "d95f8907004121f9",
      "url": "https://aeojs.org/frameworks/webpack",
      "title": "Webpack",
      "content": "## Webpack\n\n## Setup\n\n[Section titled “Setup”](#setup)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nAdd the plugin to your Webpack config:\n\nwebpack.config.js\n\nconst { AeoWebpackPlugin } = require('aeo.js/webpack');\n\nmodule.exports = {\n\nplugins: [new AeoWebpackPlugin({\n\ntitle: 'My Site',\n\ndescription: 'A site optimized for AI discovery',\n\nurl: 'https://mysite.com',\n\n}),],\n\n};\n\n## How it works\n\n[Section titled “How it works”](#how-it-works)\n\nThe Webpack plugin:\n\n- Runs during the emit phase of the Webpack compilation\n\n- Generates all AEO files in your output directory\n\n- Injects the widget into your HTML entry point\n\n## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nPass any [AeoConfig](/reference/configuration/) options to the plugin:\n\nnew AeoWebpackPlugin({\n\ntitle: 'My Site',\n\nurl: 'https://mysite.com',\n\nwidget: {\n\nenabled: true,\n\nposition: 'bottom-right',\n\n},\n\n});\n\n[Previous\nAngular](/frameworks/angular/) [Next\nGenerated Files](/features/generated-files/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Use aeo.js with Webpack.",
      "keywords": [
        "webpack",
        "https",
        "configuration",
        "setup",
        "section",
        "titled",
        "plugin",
        "your",
        "aeowebpackplugin",
        "site"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/frameworks/webpack"
      }
    },
    {
      "id": "dfd49959f70f08f2",
      "url": "https://aeojs.org/features/schema-og",
      "title": "Schema & Open Graph (Part 1)",
      "content": "## Schema & Open Graph\n\naeo.js can generate JSON-LD structured data and Open Graph meta tags for your pages.\n\n## JSON-LD Schema\n\n[Section titled “JSON-LD Schema”](#json-ld-schema)\n\nEnable schema generation in your config:\n\n-\n\n{\n\nschema: {\n\nenabled: true,\n\norganization: {\n\nname: 'My Company',\n\nurl: 'https://mysite.com',\n\nlogo: 'https://mysite.com/logo.png',\n\nsameAs: ['https://twitter.com/mycompany',\n\n'https://github.com/mycompany',],\n\n},\n\ndefaultType: 'WebPage', // or 'Article'\n\n},\n\n}\n\n**\n\nThis generates &#x3C;script type=\"application/ld+json\"> blocks with:\n\nOrganization** schema for your site\n\n- **WebPage** or **Article** schema for each page\n\n- Proper @context, @type, name, description, and url fields\n\n## Open Graph tags\n\n[Section titled “Open Graph tags”](#open-graph-tags)\n\nEnable OG tag generation:\n\n{\n\nog: {\n\nenabled: true,\n\nimage: 'https://mysite.com/og.png',\n\ntwitterHandle: '@mycompany',\n\ntype: 'website', // or 'article'\n\n},\n\n}\n\nThis generates meta tags like:\n\n&#x3C;meta property=\"og:title\" content=\"Page Title\" />\n\n&#x3C;meta property=\"og:description\" content=\"Page description\" />\n\n&#x3C;meta property=\"og:image\" content=\"https://mysite.com/og.png\" />\n\n&#x3C;meta property=\"og:url\" content=\"https://mysite.com/page\" />\n\n&#x3C;meta name=\"twitter:card\" content=\"summary_large_image\" />\n\n&#x3C;meta name=\"twitter:site\" content=\"@mycompany\" />\n\n\">\n\n## Programmatic API\n\n[Section titled “Programmatic API”](#programmatic-api)\n\nimport { generateSchema, generateSchemaObjects, generateJsonLdScript } from 'aeo.js';\n\nimport { generateOGTags, generateOGTagsHtml } from 'aeo.js';\n\n// Get schema objects\n\nconst schemas = generateSchemaObjects(config);\n\n// Get a &#x3C;script> tag string\n\nconst script = generateJsonLdScript(config);\n\n// Get OG meta tag objects\n\nconst tags = generateOGTags(config, page);\n\n// Get OG meta tags as HTML string\n\nconst html = generateOGTagsHtml(config, page);",
      "description": "Auto-generated JSON-LD structured data and Open Graph meta tags.",
      "keywords": [
        "meta",
        "schema",
        "tags",
        "https",
        "config",
        "page",
        "const",
        "content",
        "open",
        "graph"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/features/schema-og"
      }
    },
    {
      "id": "e3559a15f546c191",
      "url": "https://aeojs.org/reference/api",
      "title": "API Reference (Part 2)",
      "content": "### extractTitle(html) / extractDescription(html)\n\n[Section titled “extractTitle(html) / extractDescription(html)”](#extracttitlehtml--extractdescriptionhtml)\n\nExtract the title or meta description from an HTML document.\n\n### extractJsonLd(html)\n\n[Section titled “extractJsonLd(html)”](#extractjsonldhtml)\n\nExtract JSON-LD structured data from an HTML document.\n\n## Schema\n\n[Section titled “Schema”](#schema)\n\n### generateSchemaObjects(config)\n\n[Section titled “generateSchemaObjects(config)”](#generateschemaobjectsconfig)\n\nGenerate JSON-LD schema objects:\n\nimport { generateSchemaObjects } from 'aeo.js';\n\nconst schemas = generateSchemaObjects(resolvedConfig);\n\n### generateJsonLdScript(config)\n\n[Section titled “generateJsonLdScript(config)”](#generatejsonldscriptconfig)\n\nGenerate a &#x3C;script type=\"application/ld+json\"> tag:\n\nimport { generateJsonLdScript } from 'aeo.js';\n\nconst script = generateJsonLdScript(resolvedConfig);\n\n### generateSiteSchemas(config) / generatePageSchemas(config, page)\n\n[Section titled “generateSiteSchemas(config) / generatePageSchemas(config, page)”](#generatesiteschemasconfig--generatepageschemasconfig-page)\n\nGenerate schemas for the site or individual pages.\n\n## Open Graph\n\n[Section titled “Open Graph”](#open-graph)\n\n### generateOGTags(config, page)\n\n[Section titled “generateOGTags(config, page)”](#generateogtagsconfig-page)\n\nReturns an array of MetaTag objects:\n\nimport { generateOGTags } from 'aeo.js';\n\nconst tags = generateOGTags(config, { pathname: '/', title: 'Home' });\n\n// [{ property: 'og:title', content: 'Home' }, ...]\n\n### generateOGTagsHtml(config, page)\n\n[Section titled “generateOGTagsHtml(config, page)”](#generateogtagshtmlconfig-page)\n\nReturns OG tags as an HTML string.\n\n## Audit\n\n[Section titled “Audit”](#audit)\n\n### auditSite(url)\n\n[Section titled “auditSite(url)”](#auditsiteurl)\n\nAudit a site for AEO best practices:\n\nimport { auditSite, formatAuditReport, getGrade } from 'aeo.js';",
      "description": "Programmatic API for aeo.js.",
      "keywords": [
        "config",
        "section",
        "titled",
        "html",
        "from",
        "import",
        "const",
        "page",
        "title",
        "site"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/reference/api"
      }
    },
    {
      "id": "e461e98ff44ddf2a",
      "url": "https://aeojs.org/docs/features/generated-files",
      "title": "Generated Files (Part 1)",
      "content": "After building, aeo.js generates these files in your output directory:\n\n## robots.txt\n\nAI-crawler-aware robots directives. Includes rules for all known AI crawlers (GPTBot, ClaudeBot, PerplexityBot, etc.) with sensible defaults.\n\n```txt\nUser-agent: *\nAllow: /\n\nUser-agent: GPTBot\nAllow: /\n\nUser-agent: ClaudeBot\nAllow: /\n```\n\n## llms.txt\n\nA concise, LLM-readable summary of your site. This is the first file AI crawlers look for — it tells them what your site is about and where to find content.\n\n```txt\n# My Site\n\nA site optimized for AI discovery\n\n## Pages\n\n- [Home](https://mysite.com/)\n- [About](https://mysite.com/about)\n- [Blog](https://mysite.com/blog)\n```\n\n## llms-full.txt\n\nFull concatenated content of all pages in a single file. Useful for LLMs that want to ingest your entire site at once.\n\n## sitemap.xml\n\nStandard XML sitemap for search engines and AI crawlers.\n\n## docs.json\n\nA structured documentation manifest:\n\n```json\n{\n  \"name\": \"My Site\",\n  \"description\": \"A site optimized for AI discovery\",\n  \"baseUrl\": \"https://mysite.com\",\n  \"totalDocs\": 5,\n  \"docs\": [\n    {\n      \"title\": \"Home\",\n      \"path\": \"/\",\n      \"markdownUrl\": \"https://mysite.com/index.md\",\n      \"htmlUrl\": \"https://mysite.com/\",\n      \"content\": \"...\"\n    }\n  ]\n}\n```\n\n## ai-index.json\n\nAn AI-optimized content index designed for RAG (Retrieval-Augmented Generation) pipelines:\n\n```json\n[\n  {\n    \"id\": \"index\",\n    \"url\": \"https://mysite.com/\",\n    \"title\": \"Home\",\n    \"content\": \"Full page content in markdown...\",\n    \"description\": \"Page description\",\n    \"keywords\": [\"keyword1\", \"keyword2\"]\n  }\n]\n```\n\n## Raw Markdown\n\nOne `.md` file per page, extracted from your rendered HTML:\n\n```\npublic/\n  index.md     # Markdown for /\n  about.md     # Markdown for /about\n  blog.md      # Markdown for /blog\n```\n\n## Toggling generators\n\nYou can enable or disable individual generators:",
      "description": "All the files aeo.js generates and what they're for.",
      "keywords": [
        "true",
        "site",
        "https",
        "mysite",
        "content",
        "your",
        "about",
        "index",
        "markdown",
        "blog"
      ],
      "metadata": {
        "title": "Generated Files",
        "description": "All the files aeo.js generates and what they're for.",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "docs/features/generated-files.mdx"
      }
    },
    {
      "id": "e8b58693e44424e2",
      "url": "https://aeojs.org/docs/reference/api",
      "title": "API Reference (Part 2)",
      "content": "const script = generateJsonLdScript(resolvedConfig);\n```\n\n### `generateSiteSchemas(config)` / `generatePageSchemas(config, page)`\n\nGenerate schemas for the site or individual pages.\n\n## Open Graph\n\n### `generateOGTags(config, page)`\n\nReturns an array of `MetaTag` objects:\n\n```ts\nimport { generateOGTags } from 'aeo.js';\n\nconst tags = generateOGTags(config, { pathname: '/', title: 'Home' });\n// [{ property: 'og:title', content: 'Home' }, ...]\n```\n\n### `generateOGTagsHtml(config, page)`\n\nReturns OG tags as an HTML string.\n\n## Audit\n\n### `auditSite(url)`\n\nAudit a site for AEO best practices:\n\n```ts\nimport { auditSite, formatAuditReport, getGrade } from 'aeo.js';\n\nconst result = await auditSite('https://mysite.com');\nconsole.log(formatAuditReport(result));\nconsole.log(getGrade(result)); // 'A', 'B', 'C', etc.\n```\n\n## Citability\n\n### `scorePageCitability(url, html)`\n\nScore how likely a page is to be cited by AI:\n\n```ts\nimport { scorePageCitability, formatPageCitability } from 'aeo.js';\n\nconst score = await scorePageCitability(url, html);\nconsole.log(formatPageCitability(score));\n```\n\n### `scoreSiteCitability(url, pages)`\n\nScore citability across your entire site.\n\n## Reports\n\n### `generateReport(config)`\n\nGenerate a comprehensive AEO report:\n\n```ts\nimport { generateReport, formatReportMarkdown } from 'aeo.js';\n\nconst report = await generateReport(config);\nconsole.log(formatReportMarkdown(report));\n```\n\n## Types\n\nAll types are exported from the main entry:\n\n```ts\nimport type {\n  AeoConfig,\n  ResolvedAeoConfig,\n  PageEntry,\n  DocEntry,\n  AeoManifest,\n  MarkdownFile,\n  ManifestEntry,\n  AIIndexEntry,\n  FrameworkType,\n  FrameworkInfo,\n  AuditResult,\n  AuditCategory,\n  AuditIssue,\n  MetaTag,\n  PageCitabilityResult,\n  SiteCitabilityResult,\n  CitabilityDimension,\n  ContentHint,\n  AeoReport,\n  PlatformHint,\n} from 'aeo.js';\n```",
      "description": "Programmatic API for aeo.js.",
      "keywords": [
        "from",
        "config",
        "import",
        "html",
        "const",
        "title",
        "site",
        "generate",
        "await",
        "page"
      ],
      "metadata": {
        "title": "API Reference",
        "description": "Programmatic API for aeo.js.",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "docs/reference/api.mdx"
      }
    },
    {
      "id": "f3b133f8dfb06d7b",
      "url": "https://aeojs.org/features/generated-files",
      "title": "Generated Files (Part 1)",
      "content": "## Generated Files\n\nAfter building, aeo.js generates these files in your output directory:\n\n## robots.txt\n\n[Section titled “robots.txt”](#robotstxt)\n\nAI-crawler-aware robots directives. Includes rules for all known AI crawlers (GPTBot, ClaudeBot, PerplexityBot, etc.) with sensible defaults.\n\nUser-agent: *\n\nAllow: /\n\nUser-agent: GPTBot\n\nAllow: /\n\nUser-agent: ClaudeBot\n\nAllow: /\n\n## llms.txt\n\n[Section titled “llms.txt”](#llmstxt)\n\nA concise, LLM-readable summary of your site. This is the first file AI crawlers look for — it tells them what your site is about and where to find content.\n\n# My Site\n\nA site optimized for AI discovery\n\n## Pages\n\n- [Home](https://mysite.com/)\n\n- [About](https://mysite.com/about)\n\n- [Blog](https://mysite.com/blog)\n\n## llms-full.txt\n\n[Section titled “llms-full.txt”](#llms-fulltxt)\n\nFull concatenated content of all pages in a single file. Useful for LLMs that want to ingest your entire site at once.\n\n## sitemap.xml\n\n[Section titled “sitemap.xml”](#sitemapxml)\n\nStandard XML sitemap for search engines and AI crawlers.\n\n## docs.json\n\n[Section titled “docs.json”](#docsjson)\n\nA structured documentation manifest:\n\n{\n\n\"name\": \"My Site\",\n\n\"description\": \"A site optimized for AI discovery\",\n\n\"baseUrl\": \"https://mysite.com\",\n\n\"totalDocs\": 5,\n\n\"docs\": [{\n\n\"title\": \"Home\",\n\n\"path\": \"/\",\n\n\"markdownUrl\": \"https://mysite.com/index.md\",\n\n\"htmlUrl\": \"https://mysite.com/\",\n\n\"content\": \"...\"\n\n}]\n\n}\n\n## ai-index.json\n\n[Section titled “ai-index.json”](#ai-indexjson)\n\nAn AI-optimized content index designed for RAG (Retrieval-Augmented Generation) pipelines:\n\n[{\n\n\"id\": \"index\",\n\n\"url\": \"https://mysite.com/\",\n\n\"title\": \"Home\",\n\n\"content\": \"Full page content in markdown...\",\n\n\"description\": \"Page description\",\n\n\"keywords\": [\"keyword1\", \"keyword2\"]\n\n}]\n\n## Raw Markdown\n\n[Section titled “Raw Markdown”](#raw-markdown)\n\nOne .md file per page, extracted from your rendered HTML:\n\npublic/\n\nindex.md # Markdown for /\n\nabout.md # Markdown for /about",
      "description": "All the files aeo.js generates and what they",
      "keywords": [
        "https",
        "section",
        "titled",
        "true",
        "site",
        "mysite",
        "markdown",
        "llms",
        "content",
        "index"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/features/generated-files"
      }
    },
    {
      "id": "f452caba69101fb6",
      "url": "https://aeojs.org/docs/getting-started/introduction",
      "title": "Introduction",
      "content": "![aeo.js in action](/example.gif)\n\n## What is Answer Engine Optimization?\n\nAnswer Engine Optimization (AEO) is the practice of making your website discoverable and citable by AI-powered answer engines like **ChatGPT**, **Claude**, **Perplexity**, and **SearchGPT**.\n\nUnlike traditional SEO which focuses on search engine result pages (SERPs), AEO ensures your content is understood and referenced by Large Language Models (LLMs) when they generate answers.\n\n## Why aeo.js?\n\nAI crawlers and LLMs look for specific files and formats that most websites don't provide:\n\n- **`llms.txt`** — A concise summary of your site written for LLMs\n- **`llms-full.txt`** — Full content concatenated for deep ingestion\n- **`ai-index.json`** — Structured content optimized for RAG pipelines\n- **`docs.json`** — Documentation manifest for content discovery\n- **Raw Markdown** — Per-page `.md` files for clean content extraction\n\n**aeo.js** generates all of these automatically from your existing pages — no manual work required.\n\n## How it works\n\n1. **Install** the package and add the plugin for your framework\n2. **Build** your site as usual\n3. **aeo.js** scans your output, extracts content, and generates all AEO files\n4. The optional **widget** lets visitors toggle between human and AI views of your pages\n\n## Supported Frameworks\n\n| Framework | Import |\n|-----------|--------|\n| Astro | `aeo.js/astro` |\n| Next.js | `aeo.js/next` |\n| Vite (React, Vue, Svelte) | `aeo.js/vite` |\n| Nuxt | `aeo.js/nuxt` |\n| Angular | `aeo.js/angular` |\n| Webpack | `aeo.js/webpack` |\n| Any (CLI) | `npx aeo.js generate` |",
      "description": "What is aeo.js and why you need Answer Engine Optimization.",
      "keywords": [
        "your",
        "content",
        "llms",
        "answer",
        "engine",
        "pages",
        "files",
        "optimization",
        "generate",
        "site"
      ],
      "metadata": {
        "title": "Introduction",
        "description": "What is aeo.js and why you need Answer Engine Optimization.",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "docs/getting-started/introduction.mdx"
      }
    },
    {
      "id": "fe3e73e267325986",
      "url": "https://aeojs.org/frameworks/angular",
      "title": "Angular",
      "content": "## Angular\n\n## Setup\n\n[Section titled “Setup”](#setup)\n\n-\nInstall the package:\n\nTerminal window\n\nnpm install aeo.js\n\n-\nAdd a post-build step to your package.json:\n\n{\n\n\"scripts\": {\n\n\"postbuild\": \"node -e \\\"import('aeo.js/angular').then(m => m.postBuild({ title: 'My App', url: 'https://myapp.com' }))\\\"\"\n\n}\n\n}\n\nm.postBuild({ title: &#x27;My App&#x27;, url: &#x27;https://myapp.com&#x27; }))\\&#x22;&#x22; }}\">\n\n-\nBuild your app:\n\nTerminal window\n\nnpm run build\n\n## How it works\n\n[Section titled “How it works”](#how-it-works)\n\nThe Angular plugin:\n\n- Reads angular.json to auto-detect the output directory (dist/&#x3C;project>/browser/)\n\n- Scans route config files (*.routes.ts) and component directories for routes\n\n- Scans pre-rendered HTML from the build output for full page content\n\n- Injects the widget into index.html automatically\n\n## Programmatic usage\n\n[Section titled “Programmatic usage”](#programmatic-usage)\n\nYou can also generate AEO files from source routes without building:\n\nimport { generate } from 'aeo.js/angular';\n\nawait generate({ title: 'My App', url: 'https://myapp.com' });\n\nNote\n\nAngular SSR (with @angular/ssr) is supported. The plugin will scan pre-rendered HTML for content extraction.\n\n## Configuration\n\n[Section titled “Configuration”](#configuration)\n\nPass any [AeoConfig](/reference/configuration/) options to postBuild or generate:\n\nimport { postBuild } from 'aeo.js/angular';\n\nawait postBuild({\n\ntitle: 'My App',\n\nurl: 'https://myapp.com',\n\ngenerators: {\n\nrobotsTxt: true,\n\nllmsTxt: true,\n\nschema: true,\n\n},\n\n});\n\n[Previous\nNuxt](/frameworks/nuxt/) [Next\nWebpack](/frameworks/webpack/)\nBuilt by [rubenmarcus](https://github.com/rubenmarcus) & [multivmlabs](https://github.com/multivmlabs)",
      "description": "Use aeo.js with Angular.",
      "keywords": [
        "angular",
        "postbuild",
        "https",
        "section",
        "titled",
        "build",
        "title",
        "myapp",
        "from",
        "generate"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/frameworks/angular"
      }
    }
  ],
  "metadata": {
    "totalEntries": 57,
    "generator": "aeo.js",
    "generatorUrl": "https://aeojs.org",
    "embedding": {
      "recommended": "text-embedding-ada-002",
      "dimensions": 1536
    }
  }
}