Canonry is a fully functional open-source AEO monitoring tool with the following capabilities:
canonry.yaml with canonry apply / canonry exportcitation.lost, citation.gained, run.completed, run.failed/api/v1/openapi.jsonPublished as @ainyc/canonry on npm.
Canonry competes with paid AEO monitoring tools:
| Tool | Price | Key Differentiator |
|---|---|---|
| Profound | $499+/mo | AEO Content Score, prompt volumes, enterprise SOV |
| Otterly | $29-989/mo | Daily snapshots, GEO Audit SWOT, per-prompt pricing |
| Peec | ~99-530+/mo | Looker Studio integration, per-platform add-ons |
| Scrunch | $250+/mo | Shadow sites for AI optimization, enterprise RBAC |
| HubSpot AEO Grader | Free | Brand positioning only, no deep tracking |
Canonry’s structural advantages: open-source, local-first, API-first, config-as-code, no vendor lock-in, no per-prompt pricing, full data ownership.
These build on existing infrastructure with minimal schema/architecture changes.
Gap: Canonry records binary cited/not-cited. Profound tracks “prominence” (where in the answer your brand appears). Otterly tracks citation ordering.
Implementation: When normalizing provider results, record the index of your domain in groundingSources[] and whether the domain appears in the first paragraph of answerText. Add citationPosition (int, nullable) and prominenceScore (float 0-1) to querySnapshots.
Impact: Transforms flat binary tracking into ranked visibility — “you’re cited, but dropping from position 1 to position 4.”
Gap: Every competitor (Profound, Otterly, Peec) offers SOV. Canonry doesn’t compute it.
Implementation: SOV = (runs where cited / total runs) as a percentage, computed per keyword and aggregated per project. Pure query-time computation over existing querySnapshots data — no schema changes needed. Add GET /api/v1/projects/:name/sov endpoint. Show on dashboard as a primary metric gauge.
Impact: The single most-requested AEO metric. Makes Canonry dashboards immediately comparable to paid tools.
Gap: Profound and Otterly classify mentions as positive/neutral/negative. Canonry stores answerText but doesn’t analyze tone.
Implementation: Use a cheap model (Haiku/GPT-4o-mini) to classify sentiment of how the domain is mentioned. Add sentimentTone (‘positive’|’neutral’|’negative’) and sentimentSnippet (the relevant excerpt) to querySnapshots. Run as a post-processing step after the main query.
Impact: Distinguishes “Brand X is the industry leader” from “Brand X has been criticized for…”
Gap: Canonry tracks competitorOverlap (which competitors appear) but doesn’t compute comparative SOV.
Implementation: Extend the SOV endpoint to return SOV for each competitor alongside your domain. Render as a stacked bar chart or comparison table on the dashboard.
Impact: Answers “who’s winning the AI answer war for this keyword?”
Gap: Otterly highlights CSV export. Canonry’s canonry export exports config YAML, not results data.
Implementation: Add canonry export <project> --format csv --include-results that exports snapshot data as CSV. Add corresponding GET /api/v1/projects/:name/export?format=csv&include=results endpoint.
Impact: Enables BI tool integration (Excel, Looker Studio, Tableau) without API coding.
Existing asset: @ainyc/aeo-audit (v1.2.2, published on npm, MIT) already scores websites across 13 weighted factors: structured data, content depth, AI-readable content, E-E-A-T signals, FAQ content, citations/authority, schema completeness, entity consistency, content freshness, extractability, definition blocks, named entities, AI crawler access (+ optional geo signals). Programmatic API: runAeoAudit(url, opts) -> report.
Implementation: Import @ainyc/aeo-audit as a dependency in packages/canonry. Wire into a new site-audit run kind: POST /api/v1/projects/:name/runs with kind: 'site-audit'. Store audit results in a new auditSnapshots table. Add canonry audit <project> CLI command. Show Technical Readiness score as a second gauge on the project dashboard alongside Answer Visibility.
Impact: Completes the “monitor + optimize” loop. Two score families give Canonry a unique dual-lens view.
Gap: Profound tracks 5+ engines. Perplexity is the #2 most-requested engine after ChatGPT.
Implementation: New packages/provider-perplexity/ adapter using Perplexity’s OpenAI-compatible API with web_search focus. Minimal work given existing OpenAI adapter as template.
Impact: Engine coverage from 3 to 4+ puts Canonry ahead of most mid-market tools.
Gap: No tool shows exactly how AI answers changed over time for the same query.
Implementation: Canonry already stores answerText. Build a side-by-side diff view in the UI comparing answer text across runs for the same keyword. Highlight added/removed citations and text changes.
Impact: Unique feature — even Profound doesn’t show full answer diffs.
Gap: Profound offers “prompt-level analytics” grouping queries by topic.
Implementation: Use an LLM call to cluster keywords into topic groups (e.g., “pricing”, “comparison”, “how-to”). Store topic assignments in a new keywordTopics table. Aggregate SOV and sentiment by topic on the dashboard.
Impact: Analysts think by topic, not keyword-by-keyword. This is how Profound justifies $499/mo.
Gap: Profound’s “AEO Content Score” is their most differentiated feature. No open-source tool offers this.
Implementation: For keywords where the domain is not-cited, analyze the AI answer to extract: (a) what sources were cited and why, (b) what content format the answer favors, (c) structured data the cited pages use. Generate actionable recommendations. Store in a recommendations table linked to snapshots.
Impact: Moves Canonry from “monitoring” to “optimization.”
Gap: AI agents need a way to interact with Canonry data.
Implementation: Ship a Claude Code skill (like @ainyc/aeo-audit’s /aeo skill) that wraps the Canonry CLI/API. Modes: status, run, evidence, audit. The skill calls the local CLI or API under the hood.
Impact: AI agents get natural-language access to Canonry through existing surfaces.
Gap: Profound tracks AI crawler frequency. Sites that block AI crawlers get worse citations.
Existing asset: @ainyc/aeo-audit already checks per-bot robots.txt rules for GPTBot, ClaudeBot, PerplexityBot as its “AI Crawler Access” factor.
Implementation: Run a single-factor audit (runAeoAudit(url, { factors: ['ai-crawler-access'] })) or add a dedicated GET /api/v1/projects/:name/crawl-health endpoint.
Impact: Answers “can AI engines even access my content?” Near-zero new code thanks to aeo-audit.
Gap: Profound offers “anomaly detection.” Current Canonry webhooks fire on every citation change.
Implementation: Track rolling SOV averages. Alert only when SOV drops/spikes beyond a configurable threshold. Add alert rules: citation.anomaly, sov.drop, sov.spike.
Impact: Reduces alert noise. Analysts get signal, not every fluctuation.
See ADR 0005 for full rationale.
Cloud SaaS AEO tools query from data centers, producing a single decontextualized perspective. As LLM search becomes hyper-localized and personalized, this gap becomes a structural blind spot. Canonry’s local-first architecture enables a distributed sensing network where each installation captures the real, localized, audience-specific perspective — something no cloud-only tool can replicate.
Gap: Snapshots have no origin context. When multiple Canonry instances exist, there’s no way to distinguish or aggregate their data.
Implementation: Add nodeId, nodeLocation, nodeContext columns to querySnapshots. Node identity configured via env vars or canonry.yaml. Defaults to 'local' for backward compatibility.
Impact: Foundation for all multi-node features. Zero UX change for single-node users.
Gap: Analysts capture their own personalized perspective, not their target audience’s. A 28-year-old SEO professional gets different LLM answers than a 35-year-old homeowner.
Implementation: New personas table per project. Each persona defines a systemInstruction (passed as system message to Gemini/OpenAI/Claude APIs) with query text modification as fallback. Job runner fans out across personas: keyword × provider × persona. Add personaId to snapshots. Config-as-code support in canonry.yaml. Surface parity: CLI (canonry persona add), API (POST /api/v1/projects/:name/personas), and UI (persona management + filter).
Impact: Enables audience-segmented AEO monitoring using existing API providers — no new infrastructure. “Homeowners see us cited, property managers don’t” becomes a trackable metric.
Gap: API-based queries (web_search_preview) return different results than the real ChatGPT UI. The UI reflects logged-in user context, conversation history, and real personalization.
Implementation: New packages/provider-chatgpt-browser/ adapter. Chrome MCP integration first (leverages existing MCP ecosystem), CDP (Chrome DevTools Protocol) as fallback. Implements standard ProviderAdapter interface. Navigates to ChatGPT, submits query, extracts answer text + cited sources from DOM.
Impact: Highest-signal provider. Captures what real users actually see. Combined with personas and node identity, creates a multi-dimensional observation matrix.
Gap: Multiple Canonry nodes have no way to share data or aggregate insights across locations.
Implementation: Hub mode via canonry serve --mode hub (same binary). Nodes push snapshots to hub on run completion (auto-sync) or manually (canonry sync). Hub pushes config to nodes. Append-only, cursor-based sync. Nodes are authoritative for their snapshots; hub is authoritative for config. Configurable sync scope: normalized summary by default, opt-in to full raw responses.
Impact: Enables cross-location analytics. Agency with nodes in Portland and Seattle can compare citation variance. Hub also runs API-based baseline queries as a non-personalized control group.
Gap: No tool offers geographic citation heatmaps or audience-segmented SOV. Implementation: New hub-side API endpoints: citation consistency, localization delta, geographic heatmap, audience SOV. Dashboard additions: heatmap view, consistency gauge, persona variance charts, per-node run breakdowns. Impact: Metrics that are structurally impossible for cloud SaaS tools: “Cited in 80% of local queries but 30% of generic queries” and “Strong with homeowners, invisible to property managers.”
Requires SerpAPI or similar to scrape Google search results with AI Overview snippets. “Bring your own SerpAPI key” approach.
Lightweight browser extension that real users opt into. Passively observes AI search interactions, anonymizes data, and reports citations back to the hub. The “Nielsen ratings for AI search” model — captures actual personalized results without simulation.
Multiple Chrome profiles with different ChatGPT custom instructions, browsing history, and cookies. Canonry rotates through them for deeper persona simulation beyond query framing.
Time-series analytics over SOV, sentiment, and citation position. 7/30/90-day trends. Moving averages and linear regression for SOV projections.
Postgres mode, team workspaces, API key scoping per team, Stripe billing integration. Hub mode provides the foundation.
Slack (alerts), Google Sheets (export), Looker Studio (data source), Zapier/n8n (webhook docs), Google Search Console (correlate organic vs. AI visibility).
Project grouping (“workspaces” or “organizations”), cross-project dashboards, templated configs for agency workflows. Builds on hub + multi-node architecture.
| Feature | Effort | Impact | Priority |
|---|---|---|---|
| Share of Voice metrics | Low | Very High | P0 |
| Citation position/prominence | Low | High | P0 |
| Competitor SOV comparison | Low | High | P0 |
| Sentiment classification | Low | High | P1 |
| Results CSV/JSON export | Low | Medium | P1 |
| Perplexity provider | Low | High | P1 |
| Answer diff viewer | Medium | High | P1 |
| Node identity & context metadata | Low | High | P1 |
| Persona-framed queries | Medium | Very High | P1 |
| Site audit / tech readiness | Low-Medium (uses @ainyc/aeo-audit) |
High | P2 |
| Prompt-to-topic clustering | Medium | High | P2 |
| Content optimization recs | Medium | Very High | P2 |
| Anomaly detection alerts | Medium | Medium | P2 |
| Claude Code skill | Low-Medium | High | P2 |
| Crawl health monitoring | Low (uses @ainyc/aeo-audit) |
Medium | P2 |
| Google AI Overviews provider | Medium | High | P2 |
| Browser provider (Chrome MCP/CDP) | Medium | Very High | P2 |
| Hub sync protocol | Medium | High | P2 |
| Cross-node/persona analytics | Medium | High | P2 |
| Real user panel | High | Very High | P3 |
| Synthetic browser profiles | Medium | High | P3 |
| Trend analytics & forecasting | High | Medium | P3 |
| Cloud multi-tenant mode | High | High | P3 |
| Integrations ecosystem | High | Medium | P3 |
| Agency multi-brand mgmt | Medium | Medium | P3 |