@canonry/canonry 4.158.0 → 4.160.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +3 -3
  2. package/THIRD_PARTY_NOTICES.md +102 -0
  3. package/assets/THIRD_PARTY_NOTICES.md +102 -0
  4. package/assets/agent-workspace/skills/aero/SKILL.md +16 -1
  5. package/assets/agent-workspace/skills/canonry/SKILL.md +17 -5
  6. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +67 -0
  7. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +231 -62
  8. package/assets/assets/{AuditHistoryPanel-McQfjoU9.js → AuditHistoryPanel-AtgoG2AH.js} +1 -1
  9. package/assets/assets/{BacklinksPage-Da8y1Wv8.js → BacklinksPage-DrOSF7Mu.js} +1 -1
  10. package/assets/assets/{HistoryPage-9MJfhRyT.js → HistoryPage-CGQXleJc.js} +1 -1
  11. package/assets/assets/{MeasurementPropertyPage-BiNAHEJW.js → MeasurementPropertyPage-C7D2OgIQ.js} +1 -1
  12. package/assets/assets/ProjectPage-Lp1VjNvL.js +12 -0
  13. package/assets/assets/{RunRow-DCG2LBlS.js → RunRow-BdzKKODo.js} +1 -1
  14. package/assets/assets/{RunsPage-ByWA_FSk.js → RunsPage-BU96L07S.js} +1 -1
  15. package/assets/assets/{SettingsPage-DdSeKAKF.js → SettingsPage-LEca0kDH.js} +1 -1
  16. package/assets/assets/SiteHealthSection-CKM4DUfE.js +4 -0
  17. package/assets/assets/{TrafficPage-5u8rPcBt.js → TrafficPage-tU9wl1F_.js} +1 -1
  18. package/assets/assets/{TrafficSourceDetailPage-Dm-fK87u.js → TrafficSourceDetailPage-DZTpnU9f.js} +1 -1
  19. package/assets/assets/extract-error-message-BAyN-ftk.js +1 -0
  20. package/assets/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  21. package/assets/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  22. package/assets/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  23. package/assets/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  24. package/assets/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  25. package/assets/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  26. package/assets/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  27. package/assets/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  28. package/assets/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  29. package/assets/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  30. package/assets/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  31. package/assets/assets/index-CACRaOmZ.css +1 -0
  32. package/assets/assets/index-Wqv7kvs-.js +83 -0
  33. package/assets/assets/{react-sigma_core.esm.min-ComIyDKi.js → react-sigma_core.esm.min-DlZOAc_w.js} +2 -2
  34. package/assets/assets/{vendor-lucide-BtYdosYk.js → vendor-lucide-nYKv-BB7.js} +1 -1
  35. package/assets/assets/{vendor-markdown-D274_wsI.js → vendor-markdown-Bn7fRwrx.js} +1 -1
  36. package/assets/assets/{vendor-radix-BxMXSwbC.js → vendor-radix-4UOaVWza.js} +1 -1
  37. package/assets/assets/{vendor-recharts-C4ktw_aE.js → vendor-recharts-D8rt5lKn.js} +1 -1
  38. package/assets/assets/{vendor-tanstack-pFxw0eGP.js → vendor-tanstack-Dock0eH1.js} +1 -1
  39. package/assets/index.html +7 -7
  40. package/dist/{chunk-DEVAEC2S.js → chunk-7M7T5QXS.js} +290 -16
  41. package/dist/{chunk-LK6YFHG4.js → chunk-HQAVEK42.js} +65 -15
  42. package/dist/{chunk-YP4K2KXH.js → chunk-X7CYY5Q7.js} +2687 -686
  43. package/dist/{chunk-4VZP64GZ.js → chunk-XGESWHFP.js} +660 -274
  44. package/dist/cli.js +333 -117
  45. package/dist/index.d.ts +37 -14
  46. package/dist/index.js +4 -4
  47. package/dist/{intelligence-service-LQ6ZRWMF.js → intelligence-service-6XQMM466.js} +2 -2
  48. package/dist/mcp.js +2 -2
  49. package/package.json +11 -9
  50. package/assets/assets/ProjectPage-mWSMjXrR.js +0 -15
  51. package/assets/assets/extract-error-message-CtxkAd6E.js +0 -1
  52. package/assets/assets/index-DUfg50Pl.js +0 -83
  53. package/assets/assets/index-cXb3mfeQ.css +0 -1
package/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/@canonry/canonry)](https://www.npmjs.com/package/@canonry/canonry) [![Node.js >= 22.14](https://img.shields.io/badge/node-%3E%3D22.14-brightgreen)](https://nodejs.org)
4
4
 
5
- Your entire AEO + web analytics stack, agent-first. **Open source. Self-hosted. Local.**
5
+ Your entire AEO/GEO/AI Visibility, technical SEO + web analytics stack. **Agent-first. Self-hosted. Local.**
6
6
 
7
7
  - **Local-only:** Canonry runs on your machine and stores its data in SQLite.
8
- - Track citations across Gemini, ChatGPT, Claude, Perplexity, and local LLMs
8
+ - Track web search citations and mentions across Gemini, ChatGPT, Claude, Perplexity, and local LLMs
9
9
  - Capture server-side traffic from Cloudflare, Cloud Run, Vercel, and WordPress — [setup guide](skills/canonry/references/server-side-traffic.md)
10
10
  - Diagnose against real traffic with built-in [GSC](docs/google-search-console-setup.md), [GA4](docs/google-analytics-setup.md), and [Bing Webmaster](docs/bing-webmaster-setup.md)
11
11
  - Track local AEO via [Google Business Profile](skills/canonry/references/google-business-profile.md) — search-term impressions, performance metrics, and hotel lodging + booking-CTA gaps
@@ -94,7 +94,7 @@ Configure during `cnry init`, in the dashboard `/settings`, or as env vars.
94
94
  | **Aero — built-in agent** | [skills/aero/SKILL.md](skills/aero/SKILL.md) |
95
95
  | **Agent Plugin — portable core + Codex / Claude adapters** | [docs/plugins.md](docs/plugins.md) |
96
96
  | **MCP — Claude Desktop / Cursor / Codex** | [docs/mcp.md](docs/mcp.md) |
97
- | **Integrations** | [GSC](docs/google-search-console-setup.md) · [GA4](docs/google-analytics-setup.md) · [Bing](docs/bing-webmaster-setup.md) · [Google Business Profile](skills/canonry/references/google-business-profile.md) · [WordPress](docs/wordpress-setup.md) · [Server-side traffic (Cloudflare direct push, Cloud Run, Vercel, WordPress)](skills/canonry/references/server-side-traffic.md) |
97
+ | **Integrations** | [GSC](docs/google-search-console-setup.md) · [GA4](docs/google-analytics-setup.md) · [Bing](docs/bing-webmaster-setup.md) · [Google Business Profile](skills/canonry/references/google-business-profile.md) · [WordPress](docs/wordpress-setup.md) · [Server-side traffic (Cloudflare direct push or Queue pull, Cloud Run, Vercel, WordPress)](skills/canonry/references/server-side-traffic.md) |
98
98
  | **Deployment** — Docker, Railway, Render, systemd, Tailscale | [docs/deployment.md](docs/deployment.md) |
99
99
  | **API** — 118+ endpoints | `GET /api/v1/openapi.json` (no auth) |
100
100
  | **Standalone skills bundle** for Claude Code / Codex | `cnry skills install` ([details](skills/canonry/SKILL.md)) |
@@ -0,0 +1,102 @@
1
+ # Third-party notices
2
+
3
+ Canonry includes the following font software in its bundled dashboard assets.
4
+
5
+ ## Geist and Geist Mono
6
+
7
+ Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
8
+
9
+ Geist-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
10
+
11
+ GeistMono-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)
12
+
13
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
14
+ This license is copied below, and is also available with a FAQ at:
15
+ http://scripts.sil.org/OFL
16
+
17
+ -----------------------------------------------------------
18
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
19
+ -----------------------------------------------------------
20
+
21
+ PREAMBLE
22
+ The goals of the Open Font License (OFL) are to stimulate worldwide
23
+ development of collaborative font projects, to support the font creation
24
+ efforts of academic and linguistic communities, and to provide a free and
25
+ open framework in which fonts may be shared and improved in partnership
26
+ with others.
27
+
28
+ The OFL allows the licensed fonts to be used, studied, modified and
29
+ redistributed freely as long as they are not sold by themselves. The
30
+ fonts, including any derivative works, can be bundled, embedded,
31
+ redistributed and/or sold with any software provided that any reserved
32
+ names are not used by derivative works. The fonts and derivatives,
33
+ however, cannot be released under any other type of license. The
34
+ requirement for fonts to remain under this license does not apply
35
+ to any document created using the fonts or their derivatives.
36
+
37
+ DEFINITIONS
38
+ "Font Software" refers to the set of files released by the Copyright
39
+ Holder(s) under this license and clearly marked as such. This may
40
+ include source files, build scripts and documentation.
41
+
42
+ "Reserved Font Name" refers to any names specified as such after the
43
+ copyright statement(s).
44
+
45
+ "Original Version" refers to the collection of Font Software components as
46
+ distributed by the Copyright Holder(s).
47
+
48
+ "Modified Version" refers to any derivative made by adding to, deleting,
49
+ or substituting -- in part or in whole -- any of the components of the
50
+ Original Version, by changing formats or by porting the Font Software to a
51
+ new environment.
52
+
53
+ "Author" refers to any designer, engineer, programmer, technical
54
+ writer or other person who contributed to the Font Software.
55
+
56
+ PERMISSION & CONDITIONS
57
+ Permission is hereby granted, free of charge, to any person obtaining
58
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
59
+ redistribute, and sell modified and unmodified copies of the Font
60
+ Software, subject to the following conditions:
61
+
62
+ 1) Neither the Font Software nor any of its individual components,
63
+ in Original or Modified Versions, may be sold by itself.
64
+
65
+ 2) Original or Modified Versions of the Font Software may be bundled,
66
+ redistributed and/or sold with any software, provided that each copy
67
+ contains the above copyright notice and this license. These can be
68
+ included either as stand-alone text files, human-readable headers or
69
+ in the appropriate machine-readable metadata fields within text or
70
+ binary files as long as those fields can be easily viewed by the user.
71
+
72
+ 3) No Modified Version of the Font Software may use the Reserved Font
73
+ Name(s) unless explicit written permission is granted by the corresponding
74
+ Copyright Holder. This restriction only applies to the primary font name as
75
+ presented to the users.
76
+
77
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
78
+ Software shall not be used to promote, endorse or advertise any
79
+ Modified Version, except to acknowledge the contribution(s) of the
80
+ Copyright Holder(s) and the Author(s) or with their explicit written
81
+ permission.
82
+
83
+ 5) The Font Software, modified or unmodified, in part or in whole,
84
+ must be distributed entirely under this license, and must not be
85
+ distributed under any other license. The requirement for fonts to
86
+ remain under this license does not apply to any document created
87
+ using the Font Software.
88
+
89
+ TERMINATION
90
+ This license becomes null and void if any of the above conditions are
91
+ not met.
92
+
93
+ DISCLAIMER
94
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
95
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
96
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
97
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
98
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
99
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
100
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
101
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
102
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,102 @@
1
+ # Third-party notices
2
+
3
+ Canonry includes the following font software in its bundled dashboard assets.
4
+
5
+ ## Geist and Geist Mono
6
+
7
+ Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
8
+
9
+ Geist-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
10
+
11
+ GeistMono-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)
12
+
13
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
14
+ This license is copied below, and is also available with a FAQ at:
15
+ http://scripts.sil.org/OFL
16
+
17
+ -----------------------------------------------------------
18
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
19
+ -----------------------------------------------------------
20
+
21
+ PREAMBLE
22
+ The goals of the Open Font License (OFL) are to stimulate worldwide
23
+ development of collaborative font projects, to support the font creation
24
+ efforts of academic and linguistic communities, and to provide a free and
25
+ open framework in which fonts may be shared and improved in partnership
26
+ with others.
27
+
28
+ The OFL allows the licensed fonts to be used, studied, modified and
29
+ redistributed freely as long as they are not sold by themselves. The
30
+ fonts, including any derivative works, can be bundled, embedded,
31
+ redistributed and/or sold with any software provided that any reserved
32
+ names are not used by derivative works. The fonts and derivatives,
33
+ however, cannot be released under any other type of license. The
34
+ requirement for fonts to remain under this license does not apply
35
+ to any document created using the fonts or their derivatives.
36
+
37
+ DEFINITIONS
38
+ "Font Software" refers to the set of files released by the Copyright
39
+ Holder(s) under this license and clearly marked as such. This may
40
+ include source files, build scripts and documentation.
41
+
42
+ "Reserved Font Name" refers to any names specified as such after the
43
+ copyright statement(s).
44
+
45
+ "Original Version" refers to the collection of Font Software components as
46
+ distributed by the Copyright Holder(s).
47
+
48
+ "Modified Version" refers to any derivative made by adding to, deleting,
49
+ or substituting -- in part or in whole -- any of the components of the
50
+ Original Version, by changing formats or by porting the Font Software to a
51
+ new environment.
52
+
53
+ "Author" refers to any designer, engineer, programmer, technical
54
+ writer or other person who contributed to the Font Software.
55
+
56
+ PERMISSION & CONDITIONS
57
+ Permission is hereby granted, free of charge, to any person obtaining
58
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
59
+ redistribute, and sell modified and unmodified copies of the Font
60
+ Software, subject to the following conditions:
61
+
62
+ 1) Neither the Font Software nor any of its individual components,
63
+ in Original or Modified Versions, may be sold by itself.
64
+
65
+ 2) Original or Modified Versions of the Font Software may be bundled,
66
+ redistributed and/or sold with any software, provided that each copy
67
+ contains the above copyright notice and this license. These can be
68
+ included either as stand-alone text files, human-readable headers or
69
+ in the appropriate machine-readable metadata fields within text or
70
+ binary files as long as those fields can be easily viewed by the user.
71
+
72
+ 3) No Modified Version of the Font Software may use the Reserved Font
73
+ Name(s) unless explicit written permission is granted by the corresponding
74
+ Copyright Holder. This restriction only applies to the primary font name as
75
+ presented to the users.
76
+
77
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
78
+ Software shall not be used to promote, endorse or advertise any
79
+ Modified Version, except to acknowledge the contribution(s) of the
80
+ Copyright Holder(s) and the Author(s) or with their explicit written
81
+ permission.
82
+
83
+ 5) The Font Software, modified or unmodified, in part or in whole,
84
+ must be distributed entirely under this license, and must not be
85
+ distributed under any other license. The requirement for fonts to
86
+ remain under this license does not apply to any document created
87
+ using the Font Software.
88
+
89
+ TERMINATION
90
+ This license becomes null and void if any of the above conditions are
91
+ not met.
92
+
93
+ DISCLAIMER
94
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
95
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
96
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
97
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
98
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
99
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
100
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
101
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
102
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -16,7 +16,22 @@ Persist only *user-scoped* context (operator preferences, communication style) i
16
16
 
17
17
  **Two signals, not one.** Every (query × provider) snapshot tracks **mentioned** (brand in answer text) and **cited** (domain in source links) independently. Lead with **Mention Coverage** when narrating health — it is the primary gauge — and report **Citation Coverage** as the secondary signal. Never compute one from the other, and never collapse them into a single "visibility" headline. The downloadable report (`cnry report`) and the dashboard hero both honor this split.
18
18
 
19
- When a project has GA4 connected, traffic is a first-class signal alongside mentions and citations. Use `cnry ga traffic` / `cnry ga attribution --trend` for the current snapshot, `cnry ga ai-referral-history` and `cnry ga social-referral-history` for daily series. Reads query a local DB synced by `cnry ga sync` — confirm `cnry ga status` shows a recent `lastSyncedAt` before quoting numbers; if stale, ask for explicit approval before re-syncing. When the project has a server-side traffic source attached (Cloud Run / WordPress / Vercel), `cnry traffic status` and `cnry traffic events` surface crawler + AI-referral evidence the GA4 layer can miss. Full command reference and return shapes live in the co-installed `canonry/references/canonry-cli.md`.
19
+ When a project has GA4 connected, traffic is a first-class signal alongside
20
+ mentions and citations. Use `cnry ga traffic` and `cnry ga attribution --trend`
21
+ for the current snapshot. Use the GA referral-history commands for daily series.
22
+ Before you quote GA4 data, make sure that `cnry ga status` has a recent
23
+ `lastSyncedAt`. If it is stale, get approval before you run `cnry ga sync`.
24
+
25
+ For Cloud Run, WordPress, Vercel, or Cloudflare, use `cnry traffic status` and
26
+ `cnry traffic events` for crawler and AI-referral evidence. Read the Cloudflare
27
+ `deliveryMode` before you recommend an action. Direct push does not use
28
+ `traffic sync`. Queue pull freshness requires an enabled `traffic-sync`
29
+ schedule. Run the `traffic.source.*` doctor checks. Inspect
30
+ `traffic.source.queue-backlog` before you quote current Queue data. If more than
31
+ 1,000 messages remain, report that one default tick cannot drain the backlog.
32
+ Get approval before you run a manual sync or change the schedule. The full
33
+ command reference is in the co-installed
34
+ `canonry/references/canonry-cli.md`.
20
35
 
21
36
  **Diagnosing a stuck Vercel/Cloud Run source:** if `cnry traffic status` shows `status=error` with a recent `lastError` of `refusing to advance` or `ExceedsBillingLimitError`, the source's `lastSyncedAt` has aged past the upstream retention boundary and every sync now throws. Recovery: `cnry traffic reset <project> --source <id> --advance-to-now`. This advances `lastSyncedAt` to NOW and resumes going-forward syncs — historical events in the gap are unrecoverable from the sync path; run `cnry traffic backfill --days N` separately if any of that history is needed (capped at retention).
22
37
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: canonry
3
- description: "Set up and operate Canonry AEO projects: inspect mention and citation coverage, diagnose regressions, run technical audits, and act through the Canonry CLI or MCP tools. Examples: inspect project acme coverage (run + report), diagnose query drift via attribution (report.html + visibility-attribution), submit GSC sitemaps (gsc-sitemap-submission batched)."
3
+ description: "Set up and operate Canonry AEO projects. Inspect mention and citation coverage, diagnose regressions, and run technical audits. Connect Cloudflare direct-push or queue-pull traffic. Act through the Canonry CLI or MCP tools. Examples: inspect project acme coverage (run + report), diagnose query drift via attribution (report.html + visibility-attribution), or submit GSC sitemaps (gsc-sitemap-submission batched)."
4
4
  compatibility: Requires Node.js 22.14+ and globally installed @canonry/canonry; canonry-mcp must be on PATH.
5
5
  metadata:
6
6
  agent: >-
@@ -131,10 +131,22 @@ GA4 is a first-class signal alongside citation tracking. Connect once with `cnry
131
131
 
132
132
  When the project ships behind a server you control, connect Cloud Run, WordPress,
133
133
  or Vercel. `cnry traffic sync` pulls and classifies their logs into hourly
134
- buckets. For a Cloudflare site, `cnry traffic connect cloudflare <project> ...`
135
- deploys a direct-push Worker from the credential-owning host. Cloudflare direct
136
- push does not use `traffic sync`. Use `cnry traffic events / sources / status`
137
- for every adapter. See `references/server-side-traffic.md` for setup.
134
+ buckets. For Cloudflare, choose `direct-push` or `queue-pull` on the local,
135
+ credential-owning host. Direct push requires a public Canonry HTTPS receiver.
136
+ It does not use `traffic sync`. Queue pull sends events to a Cloudflare Queue,
137
+ then Canonry drains it through `traffic sync` and the `traffic-sync` schedule.
138
+
139
+ If the connect response reports `activationRequired`, attach the Worker route
140
+ first. Then run `cnry traffic activate <project> --source <id>`. Activation
141
+ pauses all sibling sources. It also moves the one `traffic-sync` schedule to
142
+ Queue pull. A first source becomes active automatically.
143
+
144
+ Each default Queue tick drains at most 1,000 messages. Use `cnry traffic status`
145
+ and the `traffic.source.queue-backlog` doctor check to read the backlog. If more
146
+ than 1,000 messages remain, get approval before a manual sync or a shorter
147
+ schedule interval. Use `cnry traffic events`, `cnry traffic sources`, and
148
+ `cnry traffic status` for every adapter. See
149
+ `references/server-side-traffic.md` for setup and smoke tests.
138
150
 
139
151
  **Vercel gotcha:** a freshly connected Vercel source captures only going-forward traffic — `lastSyncedAt` is seeded to NOW to avoid the 30-day default window exceeding Vercel's ~14-day request-logs retention (which would otherwise throw on every first sync). Use `cnry traffic backfill <project> --source <id> --days N` for historical recovery. If an idle Vercel/Cloud Run source has been failing long enough that `lastSyncedAt` aged past retention, unstick it with `cnry traffic reset <project> --source <id> --advance-to-now`.
140
152
 
@@ -258,6 +258,7 @@ Site-wide technical audit (structured data, AI-readable content, AI-crawler acce
258
258
  cnry technical-aeo run <project> --wait # full crawl + audit; defaults to 1,000 pages / 100,000 edges; waits for terminal state
259
259
  cnry technical-aeo run <project> --sitemap-url <url> --max-pages 5000 --max-edges 250000 --max-depth 12 # optional crawl seeds and custom budgets; hard caps are 50,000 pages / 1,000,000 edges
260
260
  cnry technical-aeo run <project> --check-dead-links --wait # opt in to dead-link checks; they are off by default
261
+ cnry technical-aeo progress <project> --run-id <id> [--format json] # exact durable phase and pages found / checked / failed counters; never a synthesized percentage
261
262
  cnry technical-aeo crawl <project> [--run-id <id>] [--format json] # crawl metadata, budgets, completeness, and termination
262
263
  cnry site-health overview <project> [--run-id <id>] [--format json] # operator-facing alias for crawl metadata
263
264
  cnry site-health page-audit <project> (--node-key <key>|--url <url>) [--run-id <id>] [--format json] # exact audit score, factor findings, recommendations, and crawl provenance for one graph page
@@ -563,6 +564,72 @@ cnry wordpress onboard <project> --url <url> --user <user> # full onboarding wo
563
564
 
564
565
  **Onboard** runs: connect → audit → set-meta → schema deploy → Google submit → Bing submit. Use `--skip-schema` or `--skip-submit` to skip steps. `--profile <file>` provides business data and page-to-schema mapping for schema deployment.
565
566
 
567
+ ## Server-Side Traffic
568
+
569
+ Cloudflare supports direct push and Queue pull. Run Cloudflare connect only from
570
+ the local host that owns the Canonry configuration and Wrangler profile. This
571
+ operation is not available through MCP because it uses local credentials.
572
+
573
+ ```bash
574
+ # Direct push to a stable public Canonry HTTPS receiver:
575
+ cnry traffic connect cloudflare <project> \
576
+ --delivery-mode direct-push \
577
+ --zone-id <zone-id> --account-id <account-id> \
578
+ --deploy --confirm-route --confirm-fail-open
579
+
580
+ # Create the Queue and enable its HTTP pull consumer first:
581
+ wrangler queues create canonry-traffic-<project>
582
+ # Workers Paid only: use this command to change the four-day default.
583
+ wrangler queues update canonry-traffic-<project> \
584
+ --message-retention-period-secs <seconds>
585
+ wrangler queues info canonry-traffic-<project>
586
+ wrangler queues consumer http add canonry-traffic-<project>
587
+
588
+ # Queue pull keeps the API token in the local Canonry credential store:
589
+ cnry traffic connect cloudflare <project> \
590
+ --delivery-mode queue-pull \
591
+ --zone-id <zone-id> --account-id <account-id> \
592
+ --queue-id <queue-id> --queue-name canonry-traffic-<project> \
593
+ --api-token-file <mode-0600-token-file> \
594
+ --retention-seconds <actual-queue-retention-seconds> \
595
+ --deploy --confirm-route --confirm-fail-open
596
+ ```
597
+
598
+ Workers Free retention is fixed at `86400` seconds. Workers Paid defaults to
599
+ `345600` seconds. If you change paid retention with `wrangler queues update`,
600
+ pass the same value to Canonry. The Canonry flag does not change the Queue.
601
+
602
+ Both commands deploy an unattached Worker. Attach the exact site route in the
603
+ Cloudflare Dashboard. Then set its request-limit failure mode to **Fail open**.
604
+ Do not put the Queue API token on the command line or in an agent transcript.
605
+
606
+ ```bash
607
+ # If connect reports activationRequired, activate after the route is live:
608
+ cnry traffic activate <project> --source <source-id>
609
+ cnry traffic sync <project> --source <source-id> # pull adapters, including Cloudflare Queue pull
610
+ cnry traffic sources <project> --format json
611
+ cnry traffic status <project> --format json
612
+ cnry traffic events <project> --source <source-id> --format json
613
+
614
+ cnry doctor --project <project> --check 'traffic.source.*' --format json
615
+ cnry schedule show <project> --kind traffic-sync --format json
616
+ cnry schedule set <project> --kind traffic-sync \
617
+ --source <source-id> --cron "*/10 * * * *"
618
+ ```
619
+
620
+ A first source becomes active automatically. A staged source stays paused until
621
+ the explicit activation command. Activation pauses sibling sources and moves the
622
+ one `traffic-sync` schedule for the project. Direct push rejects `traffic sync` and
623
+ does not use this schedule.
624
+
625
+ Queue pull drains at most 1,000 messages in one default sync. The doctor warns
626
+ when the remaining backlog is more than 1,000 messages. If the operator approves
627
+ a manual drain, run a manual sync. If the backlog recurs, get approval to shorten
628
+ the schedule interval.
629
+
630
+ Read the [server-side traffic guide](server-side-traffic.md) for token safety,
631
+ route checks, activation order, smoke tests, rollback, and troubleshooting.
632
+
566
633
  ## Google Analytics 4
567
634
 
568
635
  GA4 integration uses service account authentication (no OAuth). The service account must have Viewer access on the GA4 property. `ga sync` writes to four DB tables (`gaTrafficSnapshots`, `gaAiReferrals`, `gaSocialReferrals`, `gaTrafficSummaries`); every subsequent read command queries the local store rather than re-fetching from GA4, so reads are fast and quotaless. AI-referral rows are tracked across 10 known providers (chatgpt, perplexity, claude, gemini, openai, anthropic, copilot, phind, you.com, meta.ai), three GA4 attribution dimensions (`session` / `first_user` / `manual_utm`), and joined to landing pages. Social referrals are split Organic vs Paid via GA4's `sessionDefaultChannelGroup`. All commands support `--format json`.