{"id":46488167,"url":"https://github.com/madeburo/geo-ai","last_synced_at":"2026-03-11T20:00:44.117Z","repository":{"id":342519268,"uuid":"1174146375","full_name":"madeburo/GEO-AI","owner":"madeburo","description":"Generative Engine Optimization toolkit – make site visible to ChatGPT, Claude, Perplexity, Gemini, Grok \u0026 other AI search engines","archived":false,"fork":false,"pushed_at":"2026-03-06T08:03:56.000Z","size":311,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-06T12:35:07.073Z","etag":null,"topics":["ai","ai-search","chatgpt","claude","gemeni","generative-engine-optimization","geo","grok","llms-txt","nextjs","nodejs","open-source","perplexity","typescript"],"latest_commit_sha":null,"homepage":"https://www.madeburo.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/madeburo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-06T05:44:50.000Z","updated_at":"2026-03-06T08:07:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/madeburo/GEO-AI","commit_stats":null,"previous_names":["madeburo/geo-ai"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/madeburo/GEO-AI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeburo%2FGEO-AI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeburo%2FGEO-AI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeburo%2FGEO-AI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeburo%2FGEO-AI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/madeburo","download_url":"https://codeload.github.com/madeburo/GEO-AI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeburo%2FGEO-AI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30398148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T18:46:22.935Z","status":"ssl_error","status_checked_at":"2026-03-11T18:46:17.045Z","response_time":84,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-search","chatgpt","claude","gemeni","generative-engine-optimization","geo","grok","llms-txt","nextjs","nodejs","open-source","perplexity","typescript"],"created_at":"2026-03-06T10:05:57.757Z","updated_at":"2026-03-11T20:00:44.105Z","avatar_url":"https://github.com/madeburo.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GEO AI Core\n\n![GEO AI](GEO-AI.png)\n\n**GEO AI – AI Search Optimization**\n\nUniversal TypeScript engine for optimizing websites for AI search engines.\n\n[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/gpl-2.0)\n[![Node.js](https://img.shields.io/badge/Node.js-20%2B-339933.svg)](https://nodejs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.5%2B-3178C6.svg)](https://www.typescriptlang.org/)\n\nA zero-dependency TypeScript engine that optimizes websites for AI search engines like ChatGPT, Claude, Gemini, Perplexity, DeepSeek, Grok, YandexGPT, GigaChat, and more. The core works with any Node.js environment — official integrations currently include Next.js, with WordPress and Shopify available as separate ecosystem packages.\n\n- **geo-ai-core** – Universal engine (llms.txt generation, bot rules, crawl tracking, caching, encryption, SEO signals, AI descriptions)\n- **geo-ai-next** – Next.js wrapper: static file generation, middleware + route handler\n- **geo-ai-cli** – CLI tool: `geo-ai init / generate / validate / inspect` for any Node.js project\n\n\u003e **Not sure what's what?**\n\u003e - `geo-ai-core` — open-source npm library, zero dependencies, works anywhere Node.js runs\n\u003e - `geo-ai-next` — open-source npm library, Next.js integration built on top of `geo-ai-core`\n\u003e - `geo-ai-cli` — open-source npm CLI, `geo-ai init / generate / validate / inspect` for any project\n\u003e - [geoai.run](https://www.geoai.run) — the analyzer, docs, and llms.txt specification site\n\nTry the analyzer at [geoai.run/analyze](https://www.geoai.run/analyze)\n\n---\n\n## Why GEO AI?\n\nTraditional SEO tools are built for search engines like Google. But AI search engines work differently — they read structured content, not meta keywords.\n\nGEO AI provides infrastructure for **AI Search Optimization**:\n\n- ✅ `llms.txt` generation — structured content for AI crawlers\n- ✅ AI crawler management — per-bot allow/disallow rules for 16+ bots\n- ✅ AI metadata — meta tags, Link headers, JSON-LD signals\n- ✅ Structured signals — pricing, availability, variants in machine-readable format\n\n---\n\n## Architecture\n\n```\n                         GEO AI\n                           │\n            ┌──────────────┼──────────────┐\n            │              │              │\n        WordPress       Shopify        Node.js\n            │              │              │\n       GEO-AI-Woo   GEO-AI-Shopify   geo-ai-core\n            │                          │     │\n       WooCommerce               geo-ai-next  geo-ai-cli\n```\n\n### Ecosystem\n\n| Platform | Package |\n|----------|---------|\n| WordPress / WooCommerce | `geo-ai-woo` |\n| Shopify | `geo-ai-shopify` |\n| Next.js | `geo-ai-next` |\n| Any Node.js | `geo-ai-core` |\n| CLI (any project) | `geo-ai-cli` |\n\n---\n\n## Quick Start\n\n```bash\nnpm install geo-ai-core\n```\n\n```typescript\nimport { createGeoAI } from 'geo-ai-core';\n\nconst geo = createGeoAI({\n  siteName: 'My Site',\n  siteUrl: 'https://example.com',\n  provider: {\n    Pages: [{ title: 'Home', url: '/', description: 'Welcome' }],\n  },\n});\n\n// Generate llms.txt\nconst llmsTxt = await geo.generateLlms(false);\n\n// Generate llms-full.txt\nconst llmsFullTxt = await geo.generateLlms(true);\n```\n\n---\n\n## Features\n\n### llms.txt Generation\n\nGenerates `llms.txt` and `llms-full.txt` from any data source via the `ContentProvider` interface. Standard version includes resource links with descriptions; full version adds content, pricing, availability, and variants.\n\n### AI Crawler Management\n\nBuilt-in registry of 16+ AI crawlers with per-bot allow/disallow rules and robots.txt block generation.\n\n| Bot | Provider |\n|-----|----------|\n| GPTBot | OpenAI / ChatGPT |\n| OAI-SearchBot | OpenAI / Copilot Search |\n| ClaudeBot | Anthropic / Claude |\n| claude-web | Anthropic / Claude Web |\n| Google-Extended | Google / Gemini |\n| PerplexityBot | Perplexity AI |\n| DeepSeekBot | DeepSeek |\n| GrokBot | xAI / Grok |\n| meta-externalagent | Meta / LLaMA |\n| PanguBot | Alibaba / Qwen |\n| YandexBot | Yandex / YandexGPT |\n| SputnikBot | Sber / GigaChat |\n| Bytespider | ByteDance / Douyin |\n| Baiduspider | Baidu / ERNIE |\n| Amazonbot | Amazon / Alexa |\n| Applebot | Apple / Siri \u0026 Spotlight |\n\n### TTL Caching\n\nPluggable cache via `CacheAdapter` interface with built-in implementations:\n- `MemoryCacheAdapter` — In-memory with TTL and automatic expired entry eviction (configurable `maxEntries`, default 1 000)\n- `FileCacheAdapter` — File-based with JSON metadata\n\n### Crawl Tracking\n\nGDPR-compliant bot visit logging with SHA-256 IP anonymization (Web Crypto API, Edge Runtime compatible). Pluggable storage via `CrawlStore` interface with built-in `MemoryCrawlStore` (configurable `maxEntries`, default 10 000).\n\n### AI Description Generation\n\nOptional module (`geo-ai-core/ai`) for generating AI-optimized descriptions via Claude or OpenAI APIs:\n- Customizable prompt templates with `{title}`, `{content}`, `{type}`, `{price}`, `{category}` placeholders\n- Bulk generation (up to 50 items, batched by 5 concurrently) with progress callback\n- Sliding window rate limiter (default 10 req/min)\n- Typed error classification (auth, rate limit, server, network)\n\n### SEO Signals\n\n- `\u003cmeta name=\"llms\"\u003e` and `\u003cmeta name=\"llms-full\"\u003e` tags\n- HTTP `Link` header for AI content discovery\n- JSON-LD Schema.org (WebSite, Product, Article)\n\n### Encryption\n\nAES-256-GCM encryption for API keys via `node:crypto`. Format: `base64(IV[12] + authTag[16] + ciphertext)`.\n\n---\n\n### Installation\n\n```bash\nnpm install geo-ai-core\n# or for Next.js projects:\nnpm install geo-ai-next\n# or CLI (any project):\nnpm install --save-dev geo-ai-cli\n# or globally:\nnpm install -g geo-ai-cli\n```\n\n### Basic Usage\n\n```typescript\nimport { createGeoAI } from 'geo-ai-core';\n\nconst geo = createGeoAI({\n  siteName: 'My Site',\n  siteUrl: 'https://example.com',\n  provider: {\n    Products: [\n      { title: 'Widget', url: '/products/widget', description: 'A great widget' },\n    ],\n    Blog: [\n      { title: 'Hello World', url: '/blog/hello', description: 'First post' },\n    ],\n  },\n});\n\n// Generate llms.txt\nconst llmsTxt = await geo.generateLlms(false);\n\n// Generate llms-full.txt\nconst llmsFullTxt = await geo.generateLlms(true);\n\n// Generate robots.txt block\nconst robotsTxt = geo.generateRobotsTxt();\n\n// SEO signals\nconst metaTags = geo.generateMetaTags();\nconst linkHeader = geo.generateLinkHeader();\nconst jsonLd = geo.generateJsonLd();\n```\n\n### With ContentProvider\n\n```typescript\nimport { createGeoAI, type ContentProvider } from 'geo-ai-core';\n\nclass StrapiProvider implements ContentProvider {\n  async getSections(options?: { locale?: string }) {\n    const products = await fetchProducts(options?.locale);\n    return [\n      { name: 'Products', type: 'product', resources: products },\n      { name: 'Blog', type: 'page', resources: await fetchPosts() },\n    ];\n  }\n}\n\nconst geo = createGeoAI({\n  siteName: 'My Site',\n  siteUrl: 'https://example.com',\n  provider: new StrapiProvider(),\n  crawlTracking: true,\n});\n```\n\n### Next.js — Static File Generation (Recommended)\n\nGenerate `public/llms.txt` and `public/llms-full.txt` before `next build`:\n\n```typescript\n// scripts/generate-llms.ts\nimport { generateLlmsFiles } from 'geo-ai-next';\n\nawait generateLlmsFiles({\n  siteName: 'My Site',\n  siteUrl: 'https://example.com',\n  provider: new MyProvider(),\n});\n```\n\n```json\n{\n  \"scripts\": {\n    \"geo:generate\": \"geo-ai-generate\",\n    \"build\": \"npm run geo:generate \u0026\u0026 next build\"\n  }\n}\n```\n\nNext.js serves files from `public/` automatically — no middleware needed. Middleware and route handler still work for dynamic use cases.\n\n### Next.js Middleware\n\n```typescript\n// middleware.ts\nimport { geoAIMiddleware } from 'geo-ai-next';\n\nexport default geoAIMiddleware({\n  siteName: 'My Site',\n  siteUrl: 'https://example.com',\n  provider: new MyProvider(),\n  cache: '24h',\n});\n\nexport const config = {\n  matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n};\n```\n\n### Next.js Route Handler\n\n```typescript\n// app/llms/route.ts\nimport { createLlmsHandler } from 'geo-ai-next';\n\nexport const { GET } = createLlmsHandler({\n  siteName: 'My Site',\n  siteUrl: 'https://example.com',\n  provider: new MyProvider(),\n  cacheMaxAge: 3600, // seconds, default 3600\n});\n```\n\n### CLI\n\nGenerate and validate `llms.txt` without writing any code:\n\n```bash\n# Scaffold config\nnpx geo-ai init\n\n# Generate llms.txt + llms-full.txt into ./public\nnpx geo-ai generate\n\n# Validate local files\nnpx geo-ai validate\n\n# Validate remote deployment\nnpx geo-ai validate --url https://example.com\n\n# Preview config before generating\nnpx geo-ai inspect\n```\n\nSee [`geo-ai-cli`](https://npmjs.com/package/geo-ai-cli) for full documentation.\n\n### AI Description Generation\n\n```typescript\nimport { AiGenerator } from 'geo-ai-core/ai';\n\nconst ai = new AiGenerator({\n  provider: 'anthropic',\n  apiKey: 'sk-...',\n  model: 'claude-sonnet-4-20250514',\n});\n\nconst description = await ai.generate({\n  title: 'Premium Widget',\n  content: 'A high-quality widget made from...',\n  type: 'product',\n  price: '$29.99',\n});\n```\n\n---\n\n## Configuration\n\n```typescript\ninterface GeoAIConfig {\n  // Required\n  siteName: string;\n  siteUrl: string;\n  provider: ContentProvider | Record\u003cstring, Resource[]\u003e;\n\n  // Optional\n  siteDescription?: string;\n  crawlers?: Record\u003cstring, 'allow' | 'disallow'\u003e | 'all';\n  cache?: CacheAdapter | string;  // '1h', '24h', '7d' or custom adapter\n  crypto?: { encryptionKey: string };  // 64-char hex\n  crawlTracking?: { store?: CrawlStore; secret?: string } | true;\n}\n```\n\n---\n\n## Packages\n\n| Package | Description | Entry Points |\n|---------|-------------|-------------|\n| `geo-ai-core` | Universal engine | `.` (main), `./ai` (AI generator) |\n| `geo-ai-next` | Next.js: static generation, middleware, route handler | `.` |\n| `geo-ai-cli` | CLI: init, generate, validate, inspect | `geo-ai` binary |\n\n---\n\n## Requirements\n\n- Node.js 20 or higher\n- TypeScript 5.5+ (recommended, ships .d.ts)\n\n---\n\n## Development\n\n```bash\n# Clone\ngit clone https://github.com/madeburo/GEO-AI.git\ncd GEO-AI/geo-ai-core\n\n# Install\nnpm install\n\n# Build all packages\nnpm run build\n\n# Run tests\nnpx vitest run\n\n# Type check\nnpx tsc --noEmit\n```\n\n---\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n---\n\n## License\n\nGEO AI Core is open-source software licensed under the [GPL v2](LICENSE).\n\n---\n\n## Credits\n\n- **Author:** Made Büro\n- **Website:** [geoai.run](https://www.geoai.run)\n- **GitHub:** [@madeburo](https://github.com/madeburo/GEO-AI)\n- **X:** [@imadeburo](https://x.com/imadeburo)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmadeburo%2Fgeo-ai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmadeburo%2Fgeo-ai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmadeburo%2Fgeo-ai/lists"}