seo 0.13.3 → 0.15.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 (89) hide show
  1. package/PRIVACY.md +244 -510
  2. package/TERMS.md +57 -72
  3. package/dist/cli.js +88 -84
  4. package/dist/cli.js.map +1 -1
  5. package/dist/{dist-BbTqJIE_.js → dist-Dik5MNDk.js} +1 -1
  6. package/dist/dist-pwGymked.js +449 -0
  7. package/dist/dist-pwGymked.js.map +1 -0
  8. package/dist/{esm-hHlvm1W0.js → esm-DieyhVZ-.js} +95 -188
  9. package/dist/{esm-hHlvm1W0.js.map → esm-DieyhVZ-.js.map} +1 -1
  10. package/dist/index.d.ts +274 -425
  11. package/dist/index.js +5295 -1345
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp.d.ts +0 -14
  14. package/dist/mcp.js +5048 -1769
  15. package/dist/mcp.js.map +1 -1
  16. package/dist/provider-sdk.d.ts +0 -2
  17. package/dist/provider-sdk.js +1 -2
  18. package/package.json +6 -5
  19. package/site-kit/README.md +13 -0
  20. package/site-kit/guide/build.md +70 -0
  21. package/site-kit/guide/data.md +49 -0
  22. package/site-kit/guide/golden-page.md +50 -0
  23. package/site-kit/guide/grow.md +58 -0
  24. package/site-kit/guide/launch.md +55 -0
  25. package/site-kit/guide/market.md +57 -0
  26. package/site-kit/guide/plan.md +49 -0
  27. package/site-kit/guide/scale.md +41 -0
  28. package/site-kit/guide/setup.md +59 -0
  29. package/site-kit/guide/writing.md +55 -0
  30. package/site-kit/starter/.github/workflows/refresh-data.yml +88 -0
  31. package/site-kit/starter/.node-version +1 -0
  32. package/site-kit/starter/AGENTS.md +65 -0
  33. package/site-kit/starter/README.md +11 -0
  34. package/site-kit/starter/astro.config.mjs +31 -0
  35. package/site-kit/starter/gitignore +7 -0
  36. package/site-kit/starter/llms.config.mjs +38 -0
  37. package/site-kit/starter/package.json +31 -0
  38. package/site-kit/starter/pnpm-workspace.yaml +5 -0
  39. package/site-kit/starter/public/_headers +5 -0
  40. package/site-kit/starter/public/favicon.svg +1 -0
  41. package/site-kit/starter/public/fonts/InterLatinVF.woff2 +0 -0
  42. package/site-kit/starter/public/fonts/JetBrainsMonoLatinVF.woff2 +0 -0
  43. package/site-kit/starter/public/fonts/LICENSE-inter.txt +93 -0
  44. package/site-kit/starter/public/fonts/LICENSE-jetbrains-mono.txt +93 -0
  45. package/site-kit/starter/scripts/deploy.mjs +60 -0
  46. package/site-kit/starter/scripts/markdown-rewrites.mjs +33 -0
  47. package/site-kit/starter/scripts/refresh-data.mjs +60 -0
  48. package/site-kit/starter/scripts/validate-data.mjs +47 -0
  49. package/site-kit/starter/site.config.json +9 -0
  50. package/site-kit/starter/src/components/Breadcrumbs.astro +27 -0
  51. package/site-kit/starter/src/components/Button.astro +46 -0
  52. package/site-kit/starter/src/components/Card.astro +54 -0
  53. package/site-kit/starter/src/components/CodeBlock.astro +62 -0
  54. package/site-kit/starter/src/components/FactTable.astro +45 -0
  55. package/site-kit/starter/src/components/FaqAccordion.astro +143 -0
  56. package/site-kit/starter/src/components/Footer.astro +34 -0
  57. package/site-kit/starter/src/components/FormInput.astro +18 -0
  58. package/site-kit/starter/src/components/FormSelect.astro +34 -0
  59. package/site-kit/starter/src/components/Header.astro +17 -0
  60. package/site-kit/starter/src/components/HugeIcon.astro +36 -0
  61. package/site-kit/starter/src/components/Logo.astro +21 -0
  62. package/site-kit/starter/src/components/PageHeader.astro +33 -0
  63. package/site-kit/starter/src/components/SectionHeading.astro +18 -0
  64. package/site-kit/starter/src/components/ui/button.ts +51 -0
  65. package/site-kit/starter/src/data/parks.json +106 -0
  66. package/site-kit/starter/src/data/sources.json +11 -0
  67. package/site-kit/starter/src/integrations/og-images.ts +49 -0
  68. package/site-kit/starter/src/integrations/sitemaps.ts +104 -0
  69. package/site-kit/starter/src/layouts/Base.astro +69 -0
  70. package/site-kit/starter/src/lib/cn.ts +5 -0
  71. package/site-kit/starter/src/lib/narrative.ts +115 -0
  72. package/site-kit/starter/src/lib/og/card.ts +85 -0
  73. package/site-kit/starter/src/lib/og/path.ts +14 -0
  74. package/site-kit/starter/src/lib/og/render.ts +30 -0
  75. package/site-kit/starter/src/lib/parks.ts +84 -0
  76. package/site-kit/starter/src/lib/seo.ts +97 -0
  77. package/site-kit/starter/src/pages/404.astro +30 -0
  78. package/site-kit/starter/src/pages/about.astro +39 -0
  79. package/site-kit/starter/src/pages/index.astro +52 -0
  80. package/site-kit/starter/src/pages/parks/[slug].astro +95 -0
  81. package/site-kit/starter/src/pages/regions/[region].astro +58 -0
  82. package/site-kit/starter/src/pages/robots.txt.ts +16 -0
  83. package/site-kit/starter/src/site.ts +29 -0
  84. package/site-kit/starter/src/styles/globals.css +561 -0
  85. package/site-kit/starter/tsconfig.json +5 -0
  86. package/site-kit/starter/wrangler.jsonc +16 -0
  87. package/skills/seo/SKILL.md +20 -1
  88. package/dist/dist-DBI-BioS.js +0 -420
  89. package/dist/dist-DBI-BioS.js.map +0 -1
package/PRIVACY.md CHANGED
@@ -1,519 +1,253 @@
1
1
  # Privacy policy
2
2
 
3
- Last updated: 22 October 2026
4
-
5
- This policy covers the official `seo` command-line tool, library, MCP server,
6
- the hosted MCP server at seoskill.dev/mcp with its account page, and the
7
- seoskill.dev website.
8
-
9
- In short: the hosted MCP keeps only your linked Google and Bing accounts, any
10
- API keys and Clicky sites you save and the machines you link, encrypted, so it can fetch your
11
- own data when you ask. It never
12
- keeps your Search Console or analytics data, your reports or a log of your
13
- requests. When you first sign up it also notes how you found it: the
14
- sign-in path, the agent or app, and the site that sent you there. The only
15
- thing kept about your use is an anonymous usage count (the event, report,
16
- agent, version and week). Accounts with the weekly site audit also have
17
- their audited sites' crawl results kept, as described below.
18
-
19
- The command-line tool runs on your machine. It does not create an SEO
20
- account, upload reports to a hosted SEO service, or send reports or connected
21
- account data to the project maintainer.
22
-
23
- Local first describes where the software runs and stores its data. It does not
24
- mean every command works offline. A command can make a direct request from your
25
- machine to Google, a research provider, a site, or another service needed for
26
- the work you requested. The sections below explain what each request can send.
27
-
28
- ## The hosted MCP server
29
-
30
- The hosted MCP server at `https://seoskill.dev/mcp` runs the same reports
31
- for an MCP client you connect to it. To do that it keeps a small store in
32
- Cloudflare D1 with only these things:
33
-
34
- - **A person id.** A random id created the first time you sign in with
35
- Google. That first Google account is your account. There is no password.
36
- - **Your linked Google accounts.** The email address of each Google account
37
- you link, and its refresh and access tokens. You grant read-only access to
38
- Search Console and Google Analytics.
39
- - **Your linked Bing account, if you link one.** Its refresh and access
40
- tokens, with read-only access to Bing Webmaster Tools, and a name made
41
- from its sites.
42
- - **Search Console folders you add from the Sites tab.** "Create these in
43
- Search Console" asks Google, at that moment, for permission to add and
44
- manage your Search Console properties. The server uses it once, to add
45
- the folders listed on the page, and does not keep that permission or its
46
- token. It keeps which folders it added and whether Google verified them.
47
- - **Alerts, for accounts in the weekly-audit beta.** Which alerts you want
48
- by email and by webhook, your webhook URL and its signing secret, and
49
- each alert sent in the last 30 days: the site, the pages that changed
50
- and whether it was delivered. Alert email goes to your first linked
51
- Google account's address through PostShiba, our email provider, which
52
- receives that address and the alert's text to send it. A webhook gets
53
- the same alert at the URL you save.
54
- - **Your API keys, if you save them.** A DataForSEO login and password, an
55
- Ahrefs key and a TypeSafe key.
56
- - **Your Clicky sites, if you save them.** Each site's numeric site ID,
57
- sitekey and domain. The domain comes from Clicky when you save the site,
58
- so agents can name the site.
59
- - **Your Clicky account login, if you save it.** Your Clicky username or
60
- email and your Clicky password. Clicky has no other way to list an
61
- account's sites, so the server keeps the password, encrypted, and uses it
62
- only to read your Clicky site list: when you save it, and again when an
63
- agent asks for a Clicky site that is not saved yet. The password is never
64
- sent to a linked machine. Remove it on the account page, and change your
65
- password at Clicky if you want to be sure it no longer works.
66
- - **Machines you link with `seo login`.** A name such as "seo on
67
- my-laptop", made from the machine's host name, and the date it was last
68
- used. A linked machine asks for short-lived Google and Bing tokens and your
69
- keys, and makes the Google and Bing requests itself. Nothing it fetches is
70
- sent back.
71
- - **How much metered work the server did for you.** One number a day per
72
- kind of work: the browser time and pages the weekly audit rendered with
73
- JavaScript, the Google URL Inspection checks made for you, and how many
74
- research calls you made with each provider. It holds no URLs, page
75
- content or research results. It is kept to
76
- see what the hosted features cost to run.
77
- - **Beta features turned on for you.** The name of each beta feature the
78
- maintainer turned on for your account, and when. Only the maintainer sets
79
- these; most accounts have none.
80
- - **How you signed up.** Written once, when your person id is created, and
81
- never changed:
82
- - the way you signed up: an MCP client, the account page, or `seo login`;
83
- - the MCP client's name and its user agent, such as "Claude Code", or for
84
- `seo login` the agent running the CLI (when the CLI can tell and usage
85
- counts are on) and the CLI's user agent; for the account page, your
86
- browser's user agent;
87
- - if you visited the seoskill.dev website first in the same browser: the
88
- host name of the site that sent you (such as a search engine, never the
89
- full address), the first page you opened on seoskill.dev without its
90
- query string, and any `utm_source`, `utm_medium` and `utm_campaign` tags
91
- in that link.
92
-
93
- It holds no IP address, country or email address. It shows which paths
94
- bring people to SEO Skill, and it is counted only in totals. Once a week
95
- the server sends the maintainer those totals for the last seven days, such
96
- as sign-ups per path, agent, referring site and `utm_*` tag, through a
97
- Telegram message. The message never holds a row for one person.
98
-
99
- Every token and key is encrypted with a server key before it is written. The
100
- tokens are used only to fetch your own data when you or your agent ask for
101
- it. The token your MCP client keeps carries only your person id.
102
-
103
- The server keeps nothing else. It does not keep reports, Search Console
104
- or Google Analytics rows, lists of your sites, or the pages it checked.
105
- Request logs are turned off. The one exception is the weekly site audit,
106
- below, and only for the sites you add to it.
107
-
108
- ### Weekly site audit
109
-
110
- The weekly site audit is a paid plan, and the maintainer also turns it on
111
- for some beta accounts. If you pay for it, Stripe takes the payment and
112
- keeps your card details; the server keeps only your Stripe customer,
113
- subscription and open checkout ids, the subscription's status and how many sites you pay
114
- for. Deleting your account cancels the subscription.
115
- For each Search Console property you add on the account page, the server
116
- crawls the site once a week, up to 5,000 pages, as `SEOSkillBot`, and
117
- follows the site's `robots.txt`. It keeps, per site:
118
-
119
- - the property name, when you added it and when the next crawl is due;
120
- - the latest crawl and the one before it: each page's URL, status,
121
- redirect target, title, description, first heading, canonical, robots
122
- settings, word count and the internal links on it with their link text,
123
- and for pages rendered with JavaScript (below) the raw HTML's values where
124
- rendering changed them;
125
- - the findings worked out from them (such as broken links or missing
126
- titles), with when each was first seen and resolved; resolved findings
127
- are removed after 90 days;
128
- - a one-line summary of each of the last 52 crawls (counts only);
129
- - Google's URL Inspection result for each known URL of the site (the
130
- sitemap's, the crawl's and the Search Console pages with clicks or
131
- impressions, up to 50,000 from the sitemap and crawl): its indexing
132
- reason and Google's details, when it was checked and is due again, the
133
- reason before it last changed, and when it last dropped out of or came
134
- back to Google's index. The server checks these in the background each day, within
135
- Google's 2,000 checks a day per property, and `seo_page` and `seo_index`
136
- read and add to the same results;
137
- - for each of those Search Console pages, its clicks and impressions in the
138
- last 28 days and its clicks in the 28 days before, replaced each day;
139
- - how many URL Inspection checks each property used today;
140
- - how many pages a day Google can check for the site, and the folders worth
141
- adding as their own Search Console properties, with which of them you
142
- added from the account page.
143
-
144
- Some sites build their titles, canonicals and links with JavaScript. To
145
- read those, the crawl loads a few pages of each part of the site in
146
- Cloudflare Browser Run, a browser Cloudflare runs for the server, and if
147
- JavaScript changes what they show, it loads every HTML page of that part
148
- there too. It also loads pages whose HTML looks built by JavaScript. The
149
- server keeps which parts of the site need this for 28 days.
150
- Browser Run fetches the page from the site as `SEOSkillBot` and returns
151
- the page after its scripts run. The server asks it not to cache pages.
152
-
153
- If you click Create these in Search Console, Google asks you for
154
- permission to manage Search Console for that Google account. The server
155
- uses that permission once, to add the listed folders as properties and
156
- read back whether each is verified. It asks for no refresh token and
157
- keeps no token afterwards.
158
-
159
- Remove a site on the account page and all of this is deleted at once.
160
- Delete everything deletes it for every site.
161
-
162
- - **Your data.** Search Console, Google Analytics, Clicky and provider responses are
163
- fetched for each request, returned to your MCP client and not kept. Pages checked live are fetched for the request and not kept.
164
- - **API key headers.** You can send `X-DataForSEO-Login`,
165
- `X-DataForSEO-Password` and `X-Ahrefs-Key` headers instead of saving keys.
166
- A header wins over a saved key and is used for that request only.
167
- - **The account page.** At [seoskill.dev/account](https://seoskill.dev/account)
168
- you sign in with Google to see your linked accounts, keys and machines,
169
- add or remove them, approve a `seo login`, and make a token for a cloud
170
- agent. It sets one essential cookie that holds your
171
- encrypted person id for up to 30 days. The `seo_first` website cookie
172
- described below is read once, when you first sign up.
173
- - **Outside services.** Google answers its own requests. The provider you
174
- choose receives your research request under its own policy. Clicky
175
- receives the site ID, sitekey, report types and dates for a Clicky request,
176
- and your Clicky username and password when the server reads your Clicky
177
- site list.
178
- Ahrefs receives the domains in research rows for the free Domain Rating
179
- column. Cloudflare runs the server, stores the encrypted data and handles
180
- the network requests.
181
- - **Usage counts.** Each run sends one anonymous event to the same telemetry
182
- endpoint the CLI uses, with the event, report, agent, version and week. It
183
- never contains a site, URL, query, key, account or report data.
184
-
185
- ### Delete your hosted data
186
-
187
- Sign in at [seoskill.dev/account](https://seoskill.dev/account) and choose
188
- **Delete everything**. It deletes your person id, linked accounts, keys,
189
- Clicky sites, linked machines, beta features, audited sites with their
190
- crawl data, your plan's Stripe ids (after cancelling it) and how you signed up,
191
- and revokes the Google sign-ins. Your agents will ask you to sign in again if
192
- you use the hosted server later. You can also revoke SEO Skill in your
193
- [Google Account connections](https://myaccount.google.com/connections), which
194
- stops the stored Google tokens working.
195
-
196
- Your MCP client and its model provider receive the results under their own
197
- terms.
198
-
199
- ## Google data the software can access
200
-
201
- Google access is optional. If you connect an account, the software asks for
202
- read-only access to:
203
-
204
- - your Google account email address, so the local app can identify the account
205
- you connected;
206
- - Search Console properties, performance data, and URL Inspection data you can
207
- already access; and
208
- - Google Analytics accounts, properties, and report data you can already
209
- access.
210
-
211
- The software uses this data to list properties, run the report you requested,
212
- and join search or analytics evidence to crawl findings. It does not save
213
- report history. It does not use Google data for advertising or to train
214
- general-purpose AI models.
215
-
216
- The shared desktop OAuth client identifies the `seo` app to Google. OAuth
217
- tokens and API responses are returned to your machine, not to the project
218
- maintainer.
219
-
220
- The use of information received from Google APIs follows the [Google API
221
- Services User Data Policy](https://developers.google.com/terms/api-services-user-data-policy),
3
+ Last updated: 3 November 2026
4
+
5
+ This policy covers SEO Skill: the `seo` command-line tool and library, the
6
+ local and hosted MCP servers, your account at seoskill.dev, the paid weekly
7
+ site audit, and the seoskill.dev website and its free tools.
8
+
9
+ ## In short
10
+
11
+ - The command-line tool runs on your machine. Your tokens, settings and
12
+ cache stay there. We only receive anonymous usage counts.
13
+ - The hosted server keeps your sign-ins and keys, encrypted, so it can fetch
14
+ your own data when you ask. It does not keep your Search Console or
15
+ analytics data, your reports or a log of your requests.
16
+ - The paid weekly site audit is the exception. For the sites you add, it
17
+ keeps what the audit needs, listed below, until you remove the site.
18
+ - We do not sell data or use it for advertising.
19
+ - **Delete everything** on the [account page](https://seoskill.dev/account)
20
+ removes everything the hosted server keeps about you.
21
+
22
+ ## What the hosted server keeps
23
+
24
+ Everything is stored in Cloudflare D1. Tokens, keys and passwords are
25
+ encrypted before they are written.
26
+
27
+ - **Your account.** A random id, made when you first sign in with Google.
28
+ There is no password.
29
+ - **Google accounts you link.** Each one's email address and tokens, with
30
+ read-only access to Search Console and Google Analytics.
31
+ - **Bing, if you link it.** Its tokens, with read-only access to Bing
32
+ Webmaster Tools, and a name made from its sites.
33
+ - **Keys you save.** DataForSEO, Ahrefs and TypeSafe keys.
34
+ - **Clicky, if you save it.** Each site's ID, sitekey and domain. If you save
35
+ your Clicky login, we keep your username and password, encrypted, and use
36
+ them only to read your list of Clicky sites. The password never leaves
37
+ the server.
38
+ - **Machines you link with `seo login`.** A name made from the machine's
39
+ host name, and when it was last used.
40
+ - **How you signed up.** Written once: whether you came from an AI agent,
41
+ the account page or `seo login`, the agent or browser name, and, if you
42
+ visited the website first, the site that sent you, your first page and any
43
+ `utm_` tags. No IP address or email. We look at it only as totals, in a
44
+ weekly message to the maintainer and on the public
45
+ [stats page](https://seoskill.dev/stats), where any value shared by fewer
46
+ than three sign-ups shows as Other.
47
+ - **Usage totals.** One number a day for each kind of paid-for work we do
48
+ for you, such as browser time, Google index checks and research calls. No
49
+ URLs or results.
50
+ - **Beta features** the maintainer turned on for your account.
51
+
52
+ We keep nothing else. Your Search Console, Google Analytics, Clicky and
53
+ provider data is fetched for each request, returned to your agent and not
54
+ kept. Request logs are turned off.
55
+
56
+ Keys sent as request headers instead of saved are used for that request
57
+ only.
58
+
59
+ The account page sets one essential cookie, `seo_session`, which holds your
60
+ encrypted account id for up to 30 days.
61
+
62
+ ## The weekly site audit
63
+
64
+ If you pay, Stripe takes the payment and keeps your card. We keep only your
65
+ Stripe ids, your plan's status and how many sites you pay for.
66
+
67
+ For each site you add, we crawl it once a week as `SEOSkillBot`, up to 5,000
68
+ pages, following its `robots.txt`. Some pages are loaded in Cloudflare's
69
+ browser so we can read what JavaScript builds. For each site we keep:
70
+
71
+ - the last two crawls: each page's URL, status, title, description, first
72
+ heading, canonical, robots settings, word count and internal links;
73
+ - the problems found in them, with when each was found and fixed (fixed
74
+ ones are removed after 90 days), and a one-line count for each of the last
75
+ 52 crawls;
76
+ - Google's index status for each known page, checked in the background
77
+ each day, with when it dropped out of or came back to the index;
78
+ - each page's Search Console clicks and impressions for the last 28 days,
79
+ replaced daily;
80
+ - the issues list, if you ask for it, with what you marked each issue;
81
+ - which parts of the site need a browser to read, for 28 days.
82
+
83
+ **Alerts.** Your alert settings, webhook address and signing secret, and the
84
+ alerts sent in the last 30 days. Alert and weekly emails go to your first
85
+ Google account's address through our email provider, PostShiba.
86
+
87
+ **Competitor check.** Each paid site gets a weekly check for keywords its
88
+ competitors rank for and it does not. It runs on our own provider accounts,
89
+ not your keys. We keep the site's competitors, up to 500 of each
90
+ competitor's keywords (removed 90 days after they were last fetched), the
91
+ keywords ruled out in the last 28 days, and the keywords we suggested. To
92
+ run it we send:
93
+
94
+ - DataForSEO: the site's and its competitors' domains, its main country and
95
+ the candidate keywords;
96
+ - TypeSafe: the site's domain, its top 25 Search Console queries and the
97
+ candidate keywords with the competitor pages that rank for them, so its
98
+ Jev model can judge whether each keyword fits the site;
99
+ - Ahrefs: the domains in the top 10 results, for their Domain Rating.
100
+
101
+ **Search Console folders.** If you click Create these in Search Console,
102
+ Google asks for permission to add properties. We use it once, to add the
103
+ listed folders, and do not keep it.
104
+
105
+ Remove a site and all of its data is deleted at once.
106
+
107
+ ## The free tools on the website
108
+
109
+ Most tools run in your browser and send nothing to us: the log file
110
+ analyzer, word combiner, pasted or uploaded validators, and the tools that
111
+ read a Search Console export.
112
+
113
+ - **Signed-in tools.** The Google algorithm update checker can read your
114
+ daily clicks through your SEO Skill account. The clicks are fetched for
115
+ that request and not kept. Remove the Google account on the account page
116
+ to stop it.
117
+ - **Internal linking tool.** When you sign in and run it, `SEOSkillBot`
118
+ crawls a site from your Search Console (up to 100 pages, or 5,000 for a
119
+ site in the weekly audit), following its `robots.txt`. Each page's URL,
120
+ title, description, headings, opening text and the sentences that could
121
+ hold a link go to TypeSafe on our key, so Jev can judge the links. Your
122
+ Search Console queries are read to count shared searches and not kept.
123
+ The crawl is deleted when the run ends. The result is kept for 24 hours,
124
+ then deleted. We keep a daily count of runs and pages for the limits.
125
+ - **Tools that fetch a page.** Checks of a live page, sitemap, robots.txt,
126
+ llms.txt, favicon, Open Graph or search preview send the URL to our
127
+ Cloudflare Worker, which fetches it. The domain age checker asks the
128
+ domain's registry.
129
+ - **Tools that use a provider.** Spam Score, website traffic, backlinks,
130
+ competitor keywords and the SERP checker send your input to DataForSEO.
131
+ Domain Rating and the Domain Rating column send domains to Ahrefs. We do
132
+ not keep your input or the results.
133
+ - **Limits.** These forms use Cloudflare Turnstile to stop bots. To apply
134
+ daily limits we keep a code made from your IP address that changes each
135
+ day, with a count, and delete it after 48 hours. We never store the IP
136
+ address itself.
137
+ - The update checker loads Google's public Search Status feed straight
138
+ from your browser.
139
+
140
+ ## The website
141
+
142
+ - **Analytics.** We use [Clicky](https://clicky.com/terms/privacy) to count
143
+ visits, with its cookies turned off. Clicky receives normal request data
144
+ such as the page, referrer, device and IP address. Visit totals are on the
145
+ [stats page](https://seoskill.dev/stats).
146
+ - **First-visit cookie.** On your first visit we set one cookie,
147
+ `seo_first`, for 30 days. It holds the site that sent you (the host name
148
+ only), your first page and any `utm_` tags. It is never changed, never
149
+ sent to anyone else, read only if you sign up, and not set if your browser
150
+ sends Global Privacy Control.
151
+ - **Hosting.** Cloudflare hosts the website and the hosted server and sees
152
+ normal request data.
153
+ - **Payments.** Stripe Checkout and the billing portal are on Stripe's own
154
+ site, under Stripe's policies.
155
+
156
+ ## The command-line tool
157
+
158
+ The `seo` command and the local MCP server run on your machine and do not
159
+ send your reports or data to us.
160
+
161
+ - **Stored on your machine.** Settings, Google tokens, provider keys, logs
162
+ and a cache, in your user folders with private file permissions. Tokens
163
+ and keys use your system keychain when it is available. Reports and crawls
164
+ are not saved, except the issues list you ask for.
165
+ - **Cache.** Google and Clicky answers are reused for up to 24 hours, and
166
+ Google index checks for up to 7 days. Old cache rows are removed after 30
167
+ days.
168
+ - **Direct requests.** Commands talk straight to Google, Bing, Clicky, the
169
+ research providers and the sites you crawl. Each receives only what that
170
+ command needs, plus normal network data.
171
+ - **`seo login`.** A linked machine gets short-lived Google and Bing tokens
172
+ and your saved keys from your account, and makes the requests itself.
173
+ Nothing it fetches is sent back.
174
+ - **TypeSafe.** With a TypeSafe key, `seo internal-links` sends page titles,
175
+ descriptions, headings, opening sentences and candidate sentences to
176
+ TypeSafe so its Jev model can judge links.
177
+ - **Updates.** Once a day the tool asks npm for the latest version number.
178
+ Set `NO_UPDATE_NOTIFIER=1` to stop it.
179
+
180
+ To remove things:
181
+
182
+ - `seo auth logout` removes your Google tokens.
183
+ - `seo providers <provider> disconnect` removes a saved key.
184
+ - `seo cache clear --provider <provider>` clears a provider's cache.
185
+ - `seo reset --yes` removes every token, key, setting, cache and log.
186
+ - `seo privacy` shows where everything is stored.
187
+
188
+ ## Google data
189
+
190
+ Connecting Google is optional. We ask for read-only access to your email
191
+ address, Search Console and Google Analytics. We use that data only to run
192
+ the reports and checks you ask for. We do not use it for advertising or to
193
+ train general AI models, and we do not sell it.
194
+
195
+ Our use of data from Google APIs follows the [Google API Services User Data
196
+ Policy](https://developers.google.com/terms/api-services-user-data-policy),
222
197
  including its Limited Use requirements.
223
198
 
224
- ## Clicky data the software can access
225
-
226
- Clicky access is optional. The hosted server and a CLI linked with
227
- `seo login` use the Clicky sites saved on your account, as described above.
228
- If you connect a site on your machine, the software sends its numeric
229
- site ID, sitekey, requested report type, date range, and row limit directly to
230
- Clicky over HTTPS. It can read the traffic data that sitekey permits. The
231
- project maintainer does not receive the request or response.
232
-
233
- The site ID is saved in the local configuration. The sitekey uses the operating
234
- system keychain when available, with a private local file fallback. Agents and
235
- CI can use `SEO_CLICKY_SITEKEY` without saving it. Clicky responses are cached
236
- locally for up to 24 hours, and cache keys and cached responses do not contain
237
- the sitekey.
238
-
239
- ## Bing data the software can access
240
-
241
- Bing access is optional. In the command-line tool and local MCP server, you
242
- save a Bing Webmaster API key with `seo providers bing connect`, or set
243
- `SEO_BING_API_KEY`. The key is saved in the system keychain when available,
244
- with a private local file fallback. Requests go directly from your machine to
245
- Bing over HTTPS and can read the sites that key can read. Run
246
- `seo providers bing disconnect` to remove the saved key. A machine linked
247
- with `seo login` can instead use the Bing account linked on seoskill.dev:
248
- the server hands it a short-lived token and the machine calls Bing directly.
249
- The hosted MCP server itself does not read Bing data.
250
-
251
- ## How Google data is protected
252
-
253
- The software stores settings, OAuth tokens, cached API responses, and logs in
254
- local user directories. It does not save reports or crawls. It does not
255
- upload Google API responses to a hosted SEO account or project database.
256
- Google API requests go directly from your machine to Google over HTTPS. The
257
- software does not send Search Console data to a research provider. `seo
258
- research` sends only the keywords or target you give it.
259
-
260
- OAuth tokens use the operating system keychain when that option is enabled.
261
- The fallback token file and any bring-your-own OAuth client file are written
262
- with user-only file permissions. Config, cache, and log directories are also
263
- created with user-only permissions on supported systems. `seo privacy` prints
264
- the relevant local paths and file permissions so you can inspect them.
265
-
266
- The local cache is not a substitute for device security or disk encryption. A
267
- person or process with access to your operating system account may be able to
268
- read local reports and caches. You are responsible for the security of your
269
- device, backups, shell history, exported reports, and any environment variables
270
- you create.
271
-
272
- ## How long Google data is kept
273
-
274
- OAuth tokens remain on your machine until you run `seo auth logout` or
275
- `seo reset --yes`. Revoking SEO Skill from your Google Account invalidates the
276
- grant. You should still run `seo auth logout` if you also want to remove the
277
- local token record.
278
-
279
- Google Analytics and Search Console API responses are cached locally so repeat
280
- commands do not make the same request unnecessarily. A cached response is
281
- eligible for reuse for up to 24 hours. URL Inspection results (Google's index
282
- status for each URL, keyed by property and URL) are kept so `seo index` can
283
- page through or repeat a result without asking Google again; each is reused
284
- for up to 7 days. Expired cache rows are removed during
285
- automatic cache maintenance, which also removes cache rows older than 30 days
286
- and enforces local size limits. On a machine where the command is no longer
287
- run, expired rows may remain in the local cache file until you delete them.
288
-
289
- Run `seo cache clear --provider google-analytics` to remove cached Google
290
- Analytics responses immediately. Run `seo cache clear --provider gsc` to do
291
- the same for Search Console, including saved URL Inspection results. Run `seo cache clear --provider clicky` to remove
292
- cached Clicky responses. Settings and saved provider credentials remain until
293
- you delete them with the relevant command or run `seo reset --yes`. The reset
294
- command removes Google tokens, local configuration, caches, logs, any
295
- histories or reports saved by earlier versions, and saved provider
296
- credentials. It removes active keychain credentials before deleting local
297
- files. If the keychain refuses a deletion, reset stops and tells you to unlock
298
- it before trying again.
299
-
300
- ## Optional research provider requests
301
-
302
- Research-provider requests send only the inputs needed for the selected
303
- operation. Depending on the provider and report, these can include:
304
-
305
- - keywords, domains, URLs, result limits, country, and language.
306
-
307
- DataForSEO requests use your login and API password. Ahrefs requests use your API v3 bearer key and can include the
308
- target mode and country filter. Each provider also receives ordinary network
309
- metadata.
310
-
311
- `seo internal-links` sends page text to TypeSafe when a TypeSafe key is set
312
- (`TYPESAFE_API_KEY` on your machine, or saved on your seoskill.dev account
313
- and delivered by `seo login`). For each crawled page it sends the URL,
314
- title, description, headings and opening sentences, and for each link it
315
- judges, the source sentences that could hold the link and the target's
316
- title, description and opening. The requests go from your machine with your
317
- key, and TypeSafe processes them under the
318
- [TypeSafe privacy policy](https://typesafe.ai/legal/privacy-policy). Without a key, nothing
319
- is sent to TypeSafe.
320
-
321
- The project maintainer does not receive these credentials, inputs, or
322
- responses. DataForSEO processes them under its
323
- [privacy policy](https://dataforseo.com/privacy-policy). As of the date of this
324
- policy, DataForSEO says it stores API task data for 365 days. Its policy and
325
- retention can change independently of this project. Ahrefs processes requests
326
- under the [Ahrefs privacy policy](https://ahrefs.com/legal/privacy-policy).
327
-
328
- Importing a local DataForSEO or Ahrefs file does not upload it to the
329
- provider or the project maintainer.
330
-
331
- ## Other network requests
332
-
333
- Other commands can make these direct requests:
334
-
335
- - Crawls request the public pages, sitemaps, robots files, and agent files you
336
- select. External-link checks can request linked third-party pages. Browser
337
- rendering can also load scripts, images, fonts, and other resources embedded
338
- by a page.
339
- - Chrome UX Report requests send the requested URL or origin, form factor,
340
- metrics, and your API key to Google.
341
- - Search status checks request Google's public incident feed without sending a
342
- site or property.
343
- - Package update checks can request current package information from the npm
344
- registry.
345
- - Anonymous usage events can be sent to seoskill.dev as described in the next
346
- section.
347
-
348
- The remote service receives ordinary network metadata in addition to the
349
- listed inputs and handles it under its own terms and privacy policy.
350
-
351
- When an agent or MCP client runs the software, that client may send tool
352
- inputs, report output, or conversation context to its chosen model provider.
353
- That transfer is controlled by the client and model service, not by the local
354
- `seo` process. Check the privacy settings and policy of the agent you use.
355
-
356
- ## How long research data is kept locally
357
-
358
- `seo research` does not cache DataForSEO or Ahrefs responses. Older versions
359
- did, and cache maintenance removes those entries once they are 30 days old.
360
- On a machine where the command is no longer run, they can remain until you
361
- clear the cache or reset the software. Older versions also kept a local
362
- provider spend ledger. The software deletes it the next time it opens its
363
- cache.
364
-
365
- Run `seo cache clear --provider dataforseo` or
366
- `seo cache clear --provider ahrefs` to remove one provider's cached responses.
367
- Run the matching `seo providers <provider> disconnect` command to remove its
368
- saved credential. These commands do not delete data already processed by an
369
- external provider. Run `seo reset --yes` to remove every saved provider
370
- credential along with local configuration, caches, histories, logs, and saved
371
- reports.
372
-
373
- ## Anonymous tool usage
374
-
375
- Anonymous usage telemetry is enabled by default with a one-time first-run
376
- notice. It describes use of the tool, not the site or Google data being
377
- analysed. Events can contain only a fixed event name, public report identifier
378
- or top-level command name, package version, detected agent category, operating
379
- system, architecture, Node major version, first-run ISO week, wire schema
380
- version, and fixed failure classification for failed runs. The classification
381
- can include a category, reason, and one allowlisted code context. It never
382
- contains the underlying error text or a user-supplied value.
383
-
384
- Telemetry never contains a user ID, machine ID, UUID, fingerprint, audited
385
- domain, URL, hostname, page content, report content, Search Console or Google
386
- Analytics response, Google property ID, token, secret, file path, username,
387
- local hostname, raw error message, command argument, IP address, or location.
388
- The complete event and field catalogue is published at
389
- [seoskill.dev/telemetry](https://seoskill.dev/telemetry).
390
-
391
- Once-only event state stays in a private local file in the existing SEO config
392
- directory. The telemetry endpoint accepts only the published fixed schema and
393
- writes those fields to a dedicated Cloudflare D1 table. The server adds only
394
- the UTC receipt month, such as `2026-07`, so it can publish monthly totals
395
- without storing an exact request time. The table has no account or identity
396
- column. It does not use KV, R2, or Analytics Engine. Worker request logging is
397
- disabled. The ingest code does not read request IP or Cloudflare location
398
- fields, and neither is written to D1. Cloudflare still handles the ordinary
399
- network request at its edge.
400
-
401
- Disable all telemetry network calls with `seo telemetry disable`,
402
- `DO_NOT_TRACK=1`, `SEOSKILL_TELEMETRY_DISABLED=1`, or
403
- `SEO_TELEMETRY_DISABLED=1`. It is automatically disabled in common CI
404
- environments. Use `seo telemetry status` to inspect the effective setting and
405
- `seo telemetry enable` to turn the local setting back on. Environment and CI
406
- overrides always win.
407
-
408
- An unexpected CLI error can print a prefilled GitHub issue link. The link
409
- contains only the package version, Node major, operating system, architecture,
410
- fixed report or command name, and fixed failure classification. It does not
411
- contain the raw error or command arguments. Nothing is sent to GitHub unless
412
- you open the link, and you can review the form before submitting it.
413
-
414
- Aggregate event counts are public at
415
- [seoskill.dev/stats](https://seoskill.dev/stats). Failure counts, setup
416
- completions and retention are not shown there; the maintainer reads them
417
- privately to find and fix problems, including a weekly Telegram message with
418
- failure totals, first audit rates and retention by version. The
419
- public counts are described as installs, active machines, and audits, never
420
- users. One person can have several installs, and clearing local state creates
421
- a new install.
422
-
423
- Once a day the CLI and local MCP server ask the npm registry for the latest
424
- version number of `seo`, so they can say when an update is out. The request
425
- sends nothing about you or your sites. Set `NO_UPDATE_NOTIFIER=1` to turn it
426
- off.
427
-
428
- Installing the package through npm or using GitHub is covered by the policies
429
- of those services.
430
-
431
- The seoskill.dev website uses [Clicky](https://clicky.com/terms/privacy) to
432
- count visits and see which pages people use. Tracking cookies are disabled in
433
- the website code. Clicky receives normal browser and request information such
434
- as the page, referrer, device, and IP address.
435
-
436
- On your first visit, the website sets one first-party cookie, `seo_first`,
437
- for 30 days. It holds the host name of the site that sent you (never the full
438
- address), the first page you opened without its query string, and any
439
- `utm_source`, `utm_medium` and `utm_campaign` tags in that link. Later visits
440
- never change it, and it is not set when your browser sends Global Privacy
441
- Control. It is not sent to anyone else. The hosted MCP server reads it only
442
- when you first sign up, as described above.
443
-
444
- The website host and security provider may also process normal web request
445
- data such as an IP address, user agent, requested path, and timestamp. Website
446
- analytics and logs do not include the reports, tokens, or Google API responses
447
- stored by the local software.
448
-
449
- ## Website tool requests
450
-
451
- Most browser tool input stays in the browser. The log file analyzer, word
452
- combiner, and pasted or uploaded validator modes do not upload their input to
453
- seoskill.dev. A tool that fetches a public URL must send that URL to the
454
- seoskill.dev Cloudflare Worker because normal browser cross-origin rules often
455
- prevent a direct request. This includes live llms.txt, sitemap, robots.txt, and
456
- favicon checks. The target server receives an ordinary request from
457
- Cloudflare and can record it in its own logs.
458
-
459
- Three provider-backed website tools send a target and the inputs needed for
460
- the selected check from the Worker to an outside provider:
461
-
462
- - Spam Score sends the domain or page to DataForSEO.
463
- - Website traffic estimates send the domain, country, and language to
464
- DataForSEO.
465
- - Domain Rating sends the domain to Ahrefs.
466
-
467
- The provider credentials remain in encrypted Cloudflare Worker secrets. The
468
- Worker returns a small normalized result and does not save submitted targets
469
- or provider responses in a product database or public recent-search list.
470
- DataForSEO and Ahrefs process these requests under the provider privacy
471
- policies linked in the research-provider section above.
472
-
473
- Provider-backed forms use Cloudflare Turnstile to limit automated use. The
474
- browser sends challenge information to Cloudflare and the Worker validates the
475
- single-use token before calling a provider. Every tool that reaches the Worker
476
- also creates a daily HMAC from the Cloudflare-provided connecting IP address.
477
- Only the HMAC, tool, date, and counters are stored in a Durable Object. The raw
478
- IP is not stored in the counter, the HMAC changes each UTC day, and the object
479
- deletes its stored data after 48 hours. People on one shared network can share
480
- the same daily allowance.
481
-
482
- ## Sharing and sale
483
-
484
- The project maintainer does not receive or sell the reports, connected account
485
- data, or provider request data processed by the local software. A service you
486
- choose receives only the request inputs needed for the operation you start, as
487
- described above.
488
-
489
- No local report is shared with another person or service unless you export,
490
- copy, publish, transmit, or pass it to an agent or application yourself.
491
-
492
- ## Removing access and local data
493
-
494
- Use `seo auth logout` to remove local Google tokens. Use
495
- `seo providers dataforseo disconnect`, `seo providers ahrefs disconnect` or
496
- `seo providers bing disconnect` to remove the corresponding saved credential.
497
- To remove what the hosted MCP keeps, use **Delete everything** on the
498
- [account page](https://seoskill.dev/account). Environment variables are
499
- controlled by your shell or runtime and are not changed by these commands. Use `seo privacy` to
500
- inspect local paths and `seo reset --yes` to remove every saved credential and
501
- local file managed by the software.
502
-
503
- You can also revoke the app from your
199
+ You can remove our access at any time in your
504
200
  [Google Account connections](https://myaccount.google.com/connections).
505
- Deleting local files does not delete data already held by Google, a research
506
- provider, npm, GitHub, a site you crawled, an agent or model
507
- provider, or your operating system backups.
508
201
 
509
- ## Changes to this policy
202
+ ## Other services
510
203
 
511
- This policy will change when a collection, storage, retention, network, or
512
- hosted-service boundary changes materially. The date at the top will be updated
513
- when that happens. Earlier versions remain available in the public Git history.
204
+ When you use a provider, it handles your request under its own policy:
205
+ [DataForSEO](https://dataforseo.com/privacy-policy) (which says it keeps
206
+ API task data for 365 days), [Ahrefs](https://ahrefs.com/legal/privacy-policy),
207
+ [TypeSafe](https://typesafe.ai/legal/privacy-policy), Clicky, Bing and
208
+ Google.
514
209
 
515
- ## Privacy questions
210
+ Your AI agent sends tool results to its model provider. That is up to your
211
+ agent and its settings, not us.
516
212
 
517
- Open an issue in the [public GitHub repository](https://github.com/iannuttall/seo/issues).
518
- Do not include OAuth tokens, private reports, personal data, or other secrets in
519
- a public issue.
213
+ ## Anonymous usage counts
214
+
215
+ The tool and the hosted server send anonymous events, such as "a report
216
+ ran", so we can see what is used and fix what breaks. An event can hold
217
+ only:
218
+
219
+ - the event, report or command name;
220
+ - the version, agent type, operating system, chip type and Node version;
221
+ - the week the tool was first run;
222
+ - for a failure, a fixed reason code, never the error text.
223
+
224
+ It never holds a site, URL, query, key, account, file path, IP address or
225
+ any report data. We store only the month it arrived. Every field is listed
226
+ on the [telemetry page](https://seoskill.dev/telemetry), and totals are on
227
+ the [stats page](https://seoskill.dev/stats). Failure and retention counts
228
+ stay private and reach the maintainer in a weekly message.
229
+
230
+ Turn it off with `seo telemetry disable`, `DO_NOT_TRACK=1` or
231
+ `SEO_TELEMETRY_DISABLED=1`. It is off in CI.
232
+
233
+ ## Delete your data
234
+
235
+ - **Hosted account.** **Delete everything** on the
236
+ [account page](https://seoskill.dev/account) deletes your account, linked
237
+ accounts, keys, Clicky sites, machines, audited sites and their data, alert
238
+ history and how you signed up. It cancels a paid plan and revokes the
239
+ Google sign-ins.
240
+ - **Your machine.** Run `seo reset --yes`.
241
+
242
+ Deleting with us does not delete data already held by Google, a provider,
243
+ your AI agent or your own backups.
244
+
245
+ ## Changes
246
+
247
+ When this policy changes, the date at the top changes. Earlier versions are
248
+ in the public Git history.
249
+
250
+ ## Questions
251
+
252
+ Open an issue on [GitHub](https://github.com/iannuttall/seo/issues). Do not
253
+ put tokens, keys or private data in a public issue.