Skip to content

danishashko/geo-aeo-tracker

Repository files navigation

GEO/AEO Tracker – Open-source AI visibility dashboard

Powered by Bright Data Live Demo Deploy to Vercel

GEO/AEO Tracker

Open-source, local-first AI visibility intelligence dashboard.
Track your brand across 6 AI models with zero vendor lock-in.
Now with SRO Analysis β€” deep cross-platform search result optimization.
Mobile-responsive β€” works seamlessly on desktop, tablet, and phone.

Features Β· Quick Start Β· Deploy Β· Cloud Sync Β· API


🌐 Built with Bright Data β€” the world's leading web data platform. GEO/AEO Tracker uses Bright Data's AI Scraper API to reliably collect structured responses from 6 AI models. Get your API key β†’


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.

Existing tools charge $200–$500+/month, lock you into closed ecosystems, and store your data on their servers.

GEO/AEO Tracker is the alternative:

  • πŸ”‘ BYOK (Bring Your Own Keys): your data never leaves your machine
  • πŸ€– 6 AI models simultaneously: more coverage than paid tools
  • πŸ’Έ $0/month: self-hosted, open-source, forever free
  • πŸ›‘οΈ 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, Schema.org, BLUF density, heading structure
πŸ“‘ SRO Analysis 6-stage deep pipeline: Gemini Grounding β†’ Cross-Platform Citations β†’ SERP β†’ Page Scraping β†’ Site Context β†’ LLM Analysis. Produces SRO Score (0–100), prioritized recommendations, content gaps & competitor insights
⏱️ Automation Cron / GitHub Actions templates for scheduled runs
πŸ“– Documentation Searchable 18-section guide covering every feature

πŸš€ Core Capabilities

  • πŸ€– Multi-model tracking across ChatGPT, Perplexity, Gemini, Copilot, Google AI Overview, Grok
  • οΏ½ SRO Analysis: 6-stage pipeline scoring how well your page is optimized for AI search results
  • πŸ“ˆ Visibility scoring (0–100): brand mentions, position, frequency, citations, sentiment
  • πŸ”” Drift alerts: automatic notifications when your score changes significantly
  • ⏰ Scheduled auto-runs: configurable interval-based batch scraping
  • πŸš€ Fully parallel batch runs: all prompt Γ— provider combos execute simultaneously
  • πŸ“… 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 β€” works on any screen size

Architecture

Next.js 16.1 + Turbopack
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ page.tsx                    # Main dashboard (or demo via env var)
β”‚   β”œβ”€β”€ demo/page.tsx               # Standalone demo route
β”‚   └── api/
β”‚       β”œβ”€β”€ scrape/route.ts         # Bright Data AI Scrapers (Node runtime)
β”‚       β”œβ”€β”€ analyze/route.ts        # OpenRouter LLM analysis (Edge runtime)
β”‚       β”œβ”€β”€ audit/route.ts          # AEO site audit crawler
β”‚       β”œβ”€β”€ sro-analyze/route.ts    # SRO final LLM analysis
β”‚       β”œβ”€β”€ serp/route.ts           # Bright Data SERP results
β”‚       β”œβ”€β”€ site-context/route.ts   # Homepage context extraction
β”‚       β”œβ”€β”€ unlocker/route.ts       # Bright Data Web Unlocker (single/batch)
β”‚       β”œβ”€β”€ brightdata-platforms/   # 6-platform AI citation polling
β”‚       β”œβ”€β”€ bulk-sro/route.ts       # SSE bulk SRO analysis
β”‚       └── state/route.ts          # Cloud KV store (GET/PUT/DELETE β€” Node runtime)
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ sovereign-dashboard.tsx     # Main shell β€” state, tabs, KPIs
β”‚   └── dashboard/
β”‚       β”œβ”€β”€ types.ts                # AppState, ScrapeRun, Provider, etc.
β”‚       └── tabs/                   # 13 tab components
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ client/
β”‚   β”‚   β”œβ”€β”€ sovereign-store.ts      # Storage API β€” IDB default, cloud when configured
β”‚   β”‚   └── cloud-mode.ts           # isCloudActive / isCloudAvailable helpers
β”‚   β”œβ”€β”€ server/
β”‚   β”‚   β”œβ”€β”€ supabase.ts             # Server-side Supabase singleton (service_role)
β”‚   β”‚   β”œβ”€β”€ kv-store.ts             # kvGet / kvSet / kvDelete helpers
β”‚   β”‚   β”œβ”€β”€ brightdata-scraper.ts   # Bright Data AI Scraper integration
β”‚   β”‚   β”œβ”€β”€ brightdata-platforms.ts # 6-platform citation scraper
β”‚   β”‚   β”œβ”€β”€ gemini-grounding.ts     # Gemini Grounding via Google Search
β”‚   β”‚   β”œβ”€β”€ openrouter-sro.ts       # SRO analysis via OpenRouter
β”‚   β”‚   β”œβ”€β”€ serp.ts                 # SERP data via Bright Data
β”‚   β”‚   β”œβ”€β”€ sro-types.ts            # SRO type definitions
β”‚   β”‚   └── unlocker.ts             # Web Unlocker scraping
β”‚   └── demo-data.ts                # Deterministic seed data for demo mode
β”œβ”€β”€ supabase/
β”‚   └── migrations/
β”‚       └── 001_kv_store.sql        # kv_store table + updated_at trigger
└── scripts/
    β”œβ”€β”€ test-scraper.js             # API validation script
    └── test-pillar.js              # Feature pillar tests

Key decisions:

  • IndexedDB primary store (no size limit) with localStorage as best-effort cache; same public API whether cloud is active or not
  • Cloud storage routes through /api/state β€” the client never calls Supabase directly, so service_role stays server-side and RLS isn't a concern
  • Auto-opt-in cloud: when NEXT_PUBLIC_CLOUD_STORAGE_ENABLED=true the IDB write path becomes a cache; IDB is the authoritative fallback if the cloud route fails
  • Edge runtime for /api/analyze (Gemini Flash via OpenRouter) β€” fast global inference
  • Bright Data Web Scraper API for AI model scraping β€” reliable, structured data
  • Bright Data SERP + Web Unlocker for SRO pipeline data gathering
  • Google Gemini API for grounding analysis in SRO pipeline
  • Zod schema validation on all API routes
  • Recharts for analytics visualizations
  • Tailwind CSS v4 with CSS custom properties for theming

Quick Start

Prerequisites

Install & Run

git clone https://github.com/danishashko/geo-aeo-tracker.git
cd geo-aeo-tracker
npm install

Create .env in the project root:

BRIGHT_DATA_KEY=your_bright_data_api_key

# AI Scraper dataset IDs (from Bright Data Scrapers Library)
BRIGHT_DATA_DATASET_CHATGPT=gd_xxx
BRIGHT_DATA_DATASET_PERPLEXITY=gd_xxx
BRIGHT_DATA_DATASET_COPILOT=gd_xxx
BRIGHT_DATA_DATASET_GEMINI=gd_xxx
BRIGHT_DATA_DATASET_GOOGLE_AI=gd_xxx
BRIGHT_DATA_DATASET_GROK=gd_xxx

# OpenRouter (powers /api/analyze, /api/sro-analyze, /api/site-context)
OPENROUTER_KEY=your_openrouter_api_key

# Gemini API (powers Gemini Grounding in SRO Analysis)
GEMINI_API_KEY=your_gemini_api_key

# Bright Data zones for the SRO pipeline (SERP + Web Unlocker).
# Use your own zone names from the Bright Data dashboard.
BRIGHT_DATA_SERP_ZONE=your_serp_zone
BRIGHT_DATA_UNLOCKER_ZONE=your_web_unlocker_zone

# Optional: override the OpenRouter model used by /api/analyze,
# /api/sro-analyze, and /api/site-context (default: google/gemini-3.5-flash).
# OPENROUTER_MODEL=google/gemini-3.5-flash
npm run dev

Open http://localhost:3000.

Validate Setup

npm run test:scraper    # Test Bright Data API connection
npm run build           # Full production build check
npm run lint            # ESLint

Deploy to Vercel

βœ… The deploy button launches a fully functional production instance. You'll be prompted for your API keys during setup. No demo mode, no restrictions.

Deploy with Vercel

  1. Click the button above (or run vercel --prod from your clone)
  2. Enter your Bright Data and OpenRouter API keys when prompted
  3. Done! Your tracker deploys automatically with full production capabilities

πŸ§ͺ Demo-Only Mode (optional)

Want to deploy a read-only preview with sample data and no API keys?

  1. Add env var NEXT_PUBLIC_DEMO_ONLY = true in Vercel β†’ Project Settings β†’ Environment Variables
  2. Redeploy. The dashboard will load with pre-generated demo data instead of making live API calls

☁️ Optional: Cloud persistence with Supabase

By default, all your data stays in your browser (IndexedDB). That's great for a single device, but if you want your runs, prompts, and settings to persist across devices β€” or survive clearing browser data β€” you can plug in a free Supabase project.

Why it's optional

  • Local-first still works 100% without Supabase.
  • When enabled, the client never talks to Supabase directly. Every read/write goes through a server-side Next.js route using your service-role key, so your key stays private and RLS is a non-issue.
  • You can toggle cloud sync on/off per-browser from Project Settings β†’ Cloud Sync.

Setup (5 minutes)

  1. Create a free project at supabase.com.

  2. In the Supabase SQL editor, paste and run supabase/migrations/001_kv_store.sql from this repo. This creates a single kv_store table with RLS enabled.

  3. In Supabase β†’ Project Settings β†’ API, grab:

    • Project URL β†’ SUPABASE_URL (or NEXT_PUBLIC_SUPABASE_URL β€” either is accepted)
    • service_role secret key β†’ SUPABASE_SERVICE_ROLE_KEY
  4. In Vercel β†’ Project Settings β†’ Environment Variables, add:

    SUPABASE_URL=https://your-project.supabase.co
    SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
    NEXT_PUBLIC_CLOUD_STORAGE_ENABLED=true
    
    # Shared secret that authenticates the cloud sync API. Generate a long
    # random string (e.g. `openssl rand -hex 24`). REQUIRED when cloud sync is
    # enabled β€” without it the /api/state route rejects every request.
    STATE_SYNC_SECRET=your_long_random_secret
  5. Redeploy. Open Project Settings β†’ Cloud Sync, enable it, and paste the same STATE_SYNC_SECRET value into the Sync passphrase field. This is what keeps your KV store private: the API denies any request without it, so the secret never ships in the client bundle.

Free tier caveats (always check supabase.com/pricing for current limits)

  • Free tier includes a generous Postgres database, but projects pause after a week of inactivity on the free plan β€” first request after a pause may be slow.
  • The service_role key has full DB access β€” keep it server-side only (Vercel env vars are fine; never commit it).
  • Single-tenant by design: one deployment = one Supabase project = your data. If you want multi-user auth, you'll need to extend the schema with a user_id column + RLS policies.

What gets synced

  • All app state keyed by workspace (sovereign-aeo-tracker-*) β€” runs, prompts, settings, SRO results.
  • NOT synced (kept local on purpose): theme preference, workspace list, active workspace β€” these are per-device UI choices.

API Routes

Route Runtime Purpose
POST /api/scrape Node.js Bright Data AI Scrapers β€” query AI models for brand mentions
POST /api/analyze Edge 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 6-platform AI citation polling via Bright Data datasets
POST /api/bulk-sro Node.js SSE streaming β€” bulk SRO analysis across multiple keywords
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.1 + 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

License

MIT β€” use it, fork it, ship it.


Built by Daniel Shashko
Powered by Bright Data

About

Open-source, local-first AI visibility intelligence dashboard. Track your brand across 6 AI models.

Topics

Resources

Stars

187 stars

Watchers

7 watching

Forks

Contributors

Languages