| name | canonry |
| description | Agent-first AEO monitoring and operating platform. |
| metadata | {"agent":{"emoji":"📡","requires":{"bins":["canonry"]},"install":[{"id":"npm","kind":"npm","package":"@ainyc/canonry","bins":["canonry"],"label":"Install canonry globally","command":"npm install -g @ainyc/canonry"},{"id":"npx","kind":"npx","package":"@ainyc/canonry","bins":["canonry"],"label":"Run canonry via npx","command":"npx @ainyc/canonry@latest init"}]}} |
Canonry
Open-source AEO (Answer Engine Optimization) monitoring platform. Track how AI answer engines cite your domain across Gemini, ChatGPT, Claude, and Perplexity.
Website: ainyc.ai | Docs: github.com/AINYC/canonry
When to Use
- Tracking keyphrase citations across AI providers
- Running technical SEO audits (14‑factor scoring)
- Implementing structured data (JSON‑LD)
- Diagnosing indexing gaps via Google Search Console / Bing Webmaster Tools
- Optimizing
llms.txt, sitemaps, robots.txt for AI crawlers
- Submitting URLs to Google Indexing API and Bing IndexNow
- Analyzing competitor citation patterns
Core Philosophy
- Measure outcomes — AI models are black boxes; track citations, don't assume causality
- Signal over noise — Focus on high‑intent queries; avoid granular targeting until base visibility exists
- CLI‑native — API‑driven changes over manual CMS clicks; faster, repeatable, auditable
Toolchain
canonry (AEO Monitoring)
canonry project list
canonry run <project> --wait
canonry evidence <project>
canonry status <project>
canonry keyword add <project> "polyurea roof coating"
canonry keyword remove <project> "best roof coating for a warehouse"
canonry bing request-indexing <project> <url>
canonry google request-indexing <project> <url>
aeo-audit (Technical SEO Analysis)
npx @ainyc/aeo-audit@latest "https://example.com" --format json
Google Search Console / Bing WMT
canonry google coverage <project>
canonry bing coverage <project>
canonry google refresh <project>
canonry bing refresh <project>
Workflow
1. Diagnose
canonry run <project> --wait
canonry evidence <project>
npx @ainyc/aeo-audit@latest "https://client.com" --format json > audit.json
2. Prioritize
Gaps sorted by impact:
- Missing H1 → immediate content patch
- No structured data → JSON‑LD injection
- Thin content → definition blocks ("What is…")
- County‑level targeting → refine after base visibility
- E‑E‑A‑T signals → Person schema, author tags (needs client input)
3. Execute
- Schema injection: LocalBusiness + FAQPage JSON‑LD via site‑appropriate method (Elementor Custom Code, theme hooks, etc.)
- Content patches: H1, meta title/description, image alt text via REST API or CMS
- AI‑readable files: Upload
llms.txt, llms‑full.txt to site root
- Indexing requests: Submit all URLs to Google Indexing API + Bing IndexNow
- Keyphrase strategy: Trim to 8‑12 high‑intent queries; remove noise
4. Monitor
- Weekly canonry sweeps to track citation changes
- Correlate visibility shifts with deployment dates
- Watch for competitor displacement in keyphrases
5. Report
Clear, data‑first summaries:
“Lost emergency dentist brooklyn on Gemini — two competitors moved in. Here’s what to fix.”
Common Patterns
New Site (0 citations)
- Focus on indexing first: submit sitemap to GSC/Bing, request indexing
- Implement base schema (LocalBusiness, Service)
- Create
llms.txt with service‑area details
- Trim keyphrases to 8‑12 core queries
- Expect 4‑8 weeks for first citations
Established Site (regression)
- Compare canonry runs to identify when loss occurred
- Check for recent competitor content or site changes
- Validate schema is still present and error‑free
- Re‑submit affected URLs to indexing APIs
County‑Level Targeting
Michigan:
- Oakland County (Troy, Auburn Hills, Pontiac)
- Macomb County (Sterling Heights, Shelby Township)
- Wayne County (Detroit, Dearborn)
- Lapeer County (HQ: Almont)
Florida:
- Miami‑Dade County (Miami, Coral Gables)
- Broward County (Fort Lauderdale, Hollywood)
- Palm Beach County (West Palm Beach, Boca Raton)
- Reference counties in schema
areaServed and llms.txt
- Do not create separate keyphrases per county until base visibility exists
WordPress/Elementor Specifics
- REST API user with Application Passwords (
/wp‑json/wp/v2/)
- Elementor data patched via
_elementor_data meta field
- Schema injection via Elementor Pro Custom Code (
elementor_snippet CPT)
- Yoast SEO title/description fields often NOT REST‑writable → manual WP Admin edit
wp‑login.php may be hidden (security plugin) → file uploads require manual WP File Manager
Example: Full AEO Audit + Action Plan
npx @ainyc/aeo-audit@latest "https://client.com" --format json > audit.json
cat audit.json | jq '.overallScore, .overallGrade'
canonry status client-project
canonry evidence client-project
cat audit.json | jq -r '.factors[] | select(.score < 70) | "- \(.name): \(.score)/100 (\(.grade)) - \(.recommendations[0])"'
Boundaries & Safety
- Never touch live WordPress without explicit approval
- Back up
~/.canonry/config.yaml before any config edit
- Never fabricate citation data — if a sweep hasn’t run, say so
- Client data stays private — canonry repo is public; no real domains in issues
- Respect API rate limits — batch operations, avoid tight loops
Tools: canonry v1.37+, @ainyc/aeo‑audit v1.3+
Website: ainyc.ai | Reference: AINYC AEO Methodology