# GEO/AEO Tracker > Open-source, local-first dashboard that tracks how 5 AI models (ChatGPT, Perplexity, Gemini, Copilot and Google AI Mode) mention your brand. Self-hosted, MIT licensed, bring your own API keys. GEO/AEO Tracker is a dashboard that shows whether AI models mention your brand. It sends prompts you write to 5 AI models (ChatGPT, Perplexity, Gemini, Copilot and Google AI Mode) and scores your visibility from 0 to 100 from brand mentions, position, frequency, citations and sentiment. It is for marketers, SEO leads and founders who want GEO and AEO (generative and answer engine optimization) data. You run it yourself with your own API keys and results stay in your browser by default. The software is free under the MIT license. You pay Bright Data, OpenRouter and Gemini only for the calls you make. Source: https://github.com/danishashko/geo-aeo-tracker (MIT license). Live demo: https://geo-aeo-tracker-wine.vercel.app/demo ## Why AI models are replacing traditional search for millions of queries. If your brand isn't visible in ChatGPT, Perplexity, or Gemini responses, you're invisible to a growing audience. - BYOK (Bring Your Own Keys): results are stored in your browser by default - 5 AI models tracked in parallel - Free MIT-licensed software: you pay only the API providers, per call - Local-first by default: IndexedDB + localStorage, no external database - Optional cloud sync via your own Supabase project (free tier) for multi-device access ## Features 13 feature tabs: | Tab | What it does | |---|---| | Project Settings | Brand name, aliases, website, industry, keywords, description | | Prompt Hub | Manage tracking prompts with {brand} injection. Run single or batch across models in parallel | | Persona Fan-Out | Generate persona-specific prompt variants (CMO, SEO Lead, Founder, etc.) | | Niche Explorer | AI-generated high-intent queries for your niche | | Responses | Browse AI responses with brand/competitor highlighting, filters, and search | | Visibility Analytics | Score trends over time via Recharts line charts. CSV export | | Citations | Domain-grouped citation frequency analysis | | Citation Opportunities | URLs where competitors get cited but you don't, with outreach briefs | | Competitor Battlecards | AI-generated side-by-side competitor analysis with strengths/weaknesses | | AEO Audit | Site readiness check: llms.txt, AI crawler access (robots.txt), Schema.org, BLUF density, heading structure | | SRO Analysis | Deep pipeline: Cross-Platform Citations → SERP → Page Scraping → Site Context → LLM Analysis (Gemini Grounding runs in the bulk-sro API). Produces SRO Score (0 to 100), prioritized recommendations, content gaps & competitor insights | | Automation | Cron / GitHub Actions templates for scheduled runs | | Documentation | Searchable 19-section guide covering every feature | Core capabilities: - Multi-model tracking across ChatGPT, Perplexity, Gemini, Copilot, and Google AI Mode - Geo-scoped tracking: run visibility checks by country and compare markets, with a "visibility by country" breakdown - SRO Analysis: multi-stage pipeline scoring how well your page is optimized for AI search results - Rank Signal: paired A/B tests inside the SRO tab that measure whether one text feature (a number, a named source, a freshness clause) changes which passage a model picks - Visibility scoring (0 to 100): brand mentions, position, frequency, citations, sentiment - Drift alerts: automatic notifications when your score changes significantly - Scheduled auto-runs: configurable interval-based batch scraping - Batch runs: every prompt × engine combo, 4 at a time to stay inside the rate limit - Historical comparison: delta tracking across time periods - Multi-workspace: manage multiple brands/projects independently - Dark/light/system theme with a polished sidebar UI - Mobile-responsive: collapsible sidebar with hamburger menu, adaptive KPI grid, and scrollable model toolbar ## Quick start Prerequisites: Node.js 20.9+, a Bright Data API key with AI Scraper dataset IDs, and an OpenRouter API key. Every variable is optional: the app builds, boots and deploys with an empty .env and shows the sample dataset instead of live data. ```bash git clone https://github.com/danishashko/geo-aeo-tracker.git cd geo-aeo-tracker npm install cp .env.example .env npm run dev ``` Open http://localhost:3000. Validate the setup with `npm run test:scraper`, `npm run build` and `npm run lint`. Deploy to Vercel with zero configuration. The deployment lands on a working dashboard running the sample dataset. Add keys afterwards to switch it to live data. ## Environment variables - `BRIGHT_DATA_KEY`: switches on live AI-engine tracking. With no key the dashboard loads the sample dataset and tells you so in a banner. - `OPENROUTER_KEY`: powers LLM analysis (`/api/analyze`, `/api/sro-analyze`, `/api/site-context`). Without it, scraping still works and the analysis panels report that they are not configured. Override the model with `OPENROUTER_MODEL` (default `google/gemini-3.5-flash`). - `GEMINI_API_KEY`: separate from OpenRouter. It powers only the Gemini grounding stage of the bulk-sro API, which uses Google Search grounding to see which pages Gemini actually cites in real time. A missing key skips that stage and the rest of the SRO pipeline runs. - `BRIGHT_DATA_DATASET_*`: not needed. The app ships with Bright Data's public AI-Scraper dataset ID for every engine. Set one only to point an engine at a custom or private dataset. - `BRIGHT_DATA_SERP_ZONE` and `BRIGHT_DATA_UNLOCKER_ZONE`: zone names for the SRO pipeline. They default to `serp_api1` and `web_unlocker1`. - `SUPABASE_URL` (or `NEXT_PUBLIC_SUPABASE_URL`), `SUPABASE_SERVICE_ROLE_KEY`, `NEXT_PUBLIC_CLOUD_STORAGE_ENABLED=true` and `STATE_SYNC_SECRET`: optional Supabase cloud sync. `STATE_SYNC_SECRET` is required when cloud sync is enabled, otherwise `/api/state` rejects every request. - `NEXT_PUBLIC_DEMO_ONLY=true`: deploys a read-only preview with sample data and no live API calls. - `NEXT_PUBLIC_SITE_URL`: the public origin of the deployment, used for the sitemap and metadata. ## API routes | Route | Runtime / Purpose | |---|---| | `POST /api/scrape` | Node.js. Bright Data AI Scrapers, query AI models for brand mentions | | `POST /api/analyze` | Node.js. OpenRouter LLM inference, battlecards, niche queries | | `POST /api/audit` | Node.js. AEO site audit: llms.txt, schema, BLUF, heading checks | | `POST /api/sro-analyze` | Node.js. SRO final analysis, synthesizes all data into score + recommendations | | `POST /api/serp` | Node.js. Bright Data SERP, organic search results for a keyword | | `POST /api/site-context` | Node.js. Homepage scrape + context extraction via OpenRouter | | `POST /api/unlocker` | Node.js. Bright Data Web Unlocker, single or batch URL scraping | | `POST /api/brightdata-platforms` | Node.js. 5-platform AI citation polling via Bright Data datasets | | `POST /api/bulk-sro` | Node.js. SSE streaming, bulk SRO analysis across multiple keywords | | `POST /api/rank-signal` | Node.js. SSE streaming, Rank Signal paired A/B trials for one signal (GET returns signals and allowed judge models) | | `GET/PUT/DELETE /api/state` | Node.js. Cloud KV store proxy, reads/writes to Supabase using service-role key (disabled when cloud not configured) | All routes include input validation and error handling. Most routes use in-memory caching to minimize API costs. ## Tech stack | Layer | Technology | |---|---| | Framework | Next.js 16 + Turbopack | | Language | TypeScript (strict) | | Styling | Tailwind CSS v4 with `@theme inline` | | Charts | Recharts | | Validation | Zod | | Storage | IndexedDB (idb-keyval) + localStorage, optional Supabase cloud sync | | AI Scraping | Bright Data Web Scraper API | | LLM Inference | OpenRouter (Gemini Flash) | | SRO Grounding | Google Gemini API (`@google/genai`) | | SERP Data | Bright Data SERP API | | Web Scraping | Bright Data Web Unlocker | | Deployment | Vercel | ## Links - GitHub: https://github.com/danishashko/geo-aeo-tracker - README: https://github.com/danishashko/geo-aeo-tracker/blob/main/README.md - AGENTS.md: https://github.com/danishashko/geo-aeo-tracker/blob/main/AGENTS.md - License (MIT): https://github.com/danishashko/geo-aeo-tracker/blob/main/LICENSE - Live demo: https://geo-aeo-tracker-wine.vercel.app/demo