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 β
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
| 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 |
- π€ 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
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, soservice_rolestays server-side and RLS isn't a concern - Auto-opt-in cloud: when
NEXT_PUBLIC_CLOUD_STORAGE_ENABLED=truethe 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
- Node.js 18+
- Bright Data API key + AI Scraper dataset IDs
- OpenRouter API key
git clone https://github.com/danishashko/geo-aeo-tracker.git
cd geo-aeo-tracker
npm installCreate .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-flashnpm run devOpen http://localhost:3000.
npm run test:scraper # Test Bright Data API connection
npm run build # Full production build check
npm run lint # ESLintβ The deploy button launches a fully functional production instance. You'll be prompted for your API keys during setup. No demo mode, no restrictions.
- Click the button above (or run
vercel --prodfrom your clone) - Enter your Bright Data and OpenRouter API keys when prompted
- Done! Your tracker deploys automatically with full production capabilities
Want to deploy a read-only preview with sample data and no API keys?
- Add env var
NEXT_PUBLIC_DEMO_ONLY=truein Vercel β Project Settings β Environment Variables - Redeploy. The dashboard will load with pre-generated demo data instead of making live API calls
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)
-
Create a free project at supabase.com.
-
In the Supabase SQL editor, paste and run
supabase/migrations/001_kv_store.sqlfrom this repo. This creates a singlekv_storetable with RLS enabled. -
In Supabase β Project Settings β API, grab:
Project URLβSUPABASE_URL(orNEXT_PUBLIC_SUPABASE_URLβ either is accepted)service_rolesecret key βSUPABASE_SERVICE_ROLE_KEY
-
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
-
Redeploy. Open Project Settings β Cloud Sync, enable it, and paste the same
STATE_SYNC_SECRETvalue 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_rolekey 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.
| 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.
| 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 |
MIT β use it, fork it, ship it.
Built by Daniel Shashko
Powered by Bright Data