seo 0.14.0 → 0.15.1
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.
- package/PRIVACY.md +244 -518
- package/TERMS.md +57 -72
- package/dist/cli.js +85 -85
- package/dist/cli.js.map +1 -1
- package/dist/{dist-4Yam8ps7.js → dist-BnpsvtXl.js} +1 -1
- package/dist/{dist-B_2zww72.js → dist-DoPZlCJq.js} +148 -126
- package/dist/dist-DoPZlCJq.js.map +1 -0
- package/dist/{esm-BmuxgZyN.js → esm-D12ZCG_1.js} +2 -2
- package/dist/{esm-BmuxgZyN.js.map → esm-D12ZCG_1.js.map} +1 -1
- package/dist/index.d.ts +263 -81
- package/dist/index.js +3982 -908
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +4075 -1001
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
- package/skills/seo/SKILL.md +1 -0
- package/dist/dist-B_2zww72.js.map +0 -1
package/PRIVACY.md
CHANGED
|
@@ -1,527 +1,253 @@
|
|
|
1
1
|
# Privacy policy
|
|
2
2
|
|
|
3
|
-
Last updated:
|
|
4
|
-
|
|
5
|
-
This policy covers the
|
|
6
|
-
|
|
7
|
-
seoskill.dev website.
|
|
8
|
-
|
|
9
|
-
In short
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
- **
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
- **
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
the
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
- **
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
and revokes the Google sign-ins. Your agents will ask you to sign in again if
|
|
198
|
-
you use the hosted server later. You can also revoke SEO Skill in your
|
|
199
|
-
[Google Account connections](https://myaccount.google.com/connections), which
|
|
200
|
-
stops the stored Google tokens working.
|
|
201
|
-
|
|
202
|
-
Your MCP client and its model provider receive the results under their own
|
|
203
|
-
terms.
|
|
204
|
-
|
|
205
|
-
## Google data the software can access
|
|
206
|
-
|
|
207
|
-
Google access is optional. If you connect an account, the software asks for
|
|
208
|
-
read-only access to:
|
|
209
|
-
|
|
210
|
-
- your Google account email address, so the local app can identify the account
|
|
211
|
-
you connected;
|
|
212
|
-
- Search Console properties, performance data, and URL Inspection data you can
|
|
213
|
-
already access; and
|
|
214
|
-
- Google Analytics accounts, properties, and report data you can already
|
|
215
|
-
access.
|
|
216
|
-
|
|
217
|
-
The software uses this data to list properties, run the report you requested,
|
|
218
|
-
and join search or analytics evidence to crawl findings. It does not save
|
|
219
|
-
report history. It does not use Google data for advertising or to train
|
|
220
|
-
general-purpose AI models.
|
|
221
|
-
|
|
222
|
-
The shared desktop OAuth client identifies the `seo` app to Google. OAuth
|
|
223
|
-
tokens and API responses are returned to your machine, not to the project
|
|
224
|
-
maintainer.
|
|
225
|
-
|
|
226
|
-
The use of information received from Google APIs follows the [Google API
|
|
227
|
-
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),
|
|
228
197
|
including its Limited Use requirements.
|
|
229
198
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
Clicky access is optional. The hosted server and a CLI linked with
|
|
233
|
-
`seo login` use the Clicky sites saved on your account, as described above.
|
|
234
|
-
If you connect a site on your machine, the software sends its numeric
|
|
235
|
-
site ID, sitekey, requested report type, date range, and row limit directly to
|
|
236
|
-
Clicky over HTTPS. It can read the traffic data that sitekey permits. The
|
|
237
|
-
project maintainer does not receive the request or response.
|
|
238
|
-
|
|
239
|
-
The site ID is saved in the local configuration. The sitekey uses the operating
|
|
240
|
-
system keychain when available, with a private local file fallback. Agents and
|
|
241
|
-
CI can use `SEO_CLICKY_SITEKEY` without saving it. Clicky responses are cached
|
|
242
|
-
locally for up to 24 hours, and cache keys and cached responses do not contain
|
|
243
|
-
the sitekey.
|
|
244
|
-
|
|
245
|
-
## Bing data the software can access
|
|
246
|
-
|
|
247
|
-
Bing access is optional. In the command-line tool and local MCP server, you
|
|
248
|
-
save a Bing Webmaster API key with `seo providers bing connect`, or set
|
|
249
|
-
`SEO_BING_API_KEY`. The key is saved in the system keychain when available,
|
|
250
|
-
with a private local file fallback. Requests go directly from your machine to
|
|
251
|
-
Bing over HTTPS and can read the sites that key can read. Run
|
|
252
|
-
`seo providers bing disconnect` to remove the saved key. A machine linked
|
|
253
|
-
with `seo login` can instead use the Bing account linked on seoskill.dev:
|
|
254
|
-
the server hands it a short-lived token and the machine calls Bing directly.
|
|
255
|
-
The hosted MCP server itself does not read Bing data.
|
|
256
|
-
|
|
257
|
-
## How Google data is protected
|
|
258
|
-
|
|
259
|
-
The software stores settings, OAuth tokens, cached API responses, and logs in
|
|
260
|
-
local user directories. It does not save reports or crawls, except the
|
|
261
|
-
issues list you ask for with `seo report --section issues`, which it keeps
|
|
262
|
-
in `issues.json` in its config folder. It does not
|
|
263
|
-
upload Google API responses to a hosted SEO account or project database.
|
|
264
|
-
Google API requests go directly from your machine to Google over HTTPS. The
|
|
265
|
-
software does not send Search Console data to a research provider. `seo
|
|
266
|
-
research` sends only the keywords or target you give it.
|
|
267
|
-
|
|
268
|
-
OAuth tokens use the operating system keychain when that option is enabled.
|
|
269
|
-
The fallback token file and any bring-your-own OAuth client file are written
|
|
270
|
-
with user-only file permissions. Config, cache, and log directories are also
|
|
271
|
-
created with user-only permissions on supported systems. `seo privacy` prints
|
|
272
|
-
the relevant local paths and file permissions so you can inspect them.
|
|
273
|
-
|
|
274
|
-
The local cache is not a substitute for device security or disk encryption. A
|
|
275
|
-
person or process with access to your operating system account may be able to
|
|
276
|
-
read local reports and caches. You are responsible for the security of your
|
|
277
|
-
device, backups, shell history, exported reports, and any environment variables
|
|
278
|
-
you create.
|
|
279
|
-
|
|
280
|
-
## How long Google data is kept
|
|
281
|
-
|
|
282
|
-
OAuth tokens remain on your machine until you run `seo auth logout` or
|
|
283
|
-
`seo reset --yes`. Revoking SEO Skill from your Google Account invalidates the
|
|
284
|
-
grant. You should still run `seo auth logout` if you also want to remove the
|
|
285
|
-
local token record.
|
|
286
|
-
|
|
287
|
-
Google Analytics and Search Console API responses are cached locally so repeat
|
|
288
|
-
commands do not make the same request unnecessarily. A cached response is
|
|
289
|
-
eligible for reuse for up to 24 hours. URL Inspection results (Google's index
|
|
290
|
-
status for each URL, keyed by property and URL) are kept so `seo index` can
|
|
291
|
-
page through or repeat a result without asking Google again; each is reused
|
|
292
|
-
for up to 7 days. Expired cache rows are removed during
|
|
293
|
-
automatic cache maintenance, which also removes cache rows older than 30 days
|
|
294
|
-
and enforces local size limits. On a machine where the command is no longer
|
|
295
|
-
run, expired rows may remain in the local cache file until you delete them.
|
|
296
|
-
|
|
297
|
-
Run `seo cache clear --provider google-analytics` to remove cached Google
|
|
298
|
-
Analytics responses immediately. Run `seo cache clear --provider gsc` to do
|
|
299
|
-
the same for Search Console, including saved URL Inspection results. Run `seo cache clear --provider clicky` to remove
|
|
300
|
-
cached Clicky responses. Settings and saved provider credentials remain until
|
|
301
|
-
you delete them with the relevant command or run `seo reset --yes`. The reset
|
|
302
|
-
command removes Google tokens, local configuration, caches, logs, any
|
|
303
|
-
histories or reports saved by earlier versions, and saved provider
|
|
304
|
-
credentials. It removes active keychain credentials before deleting local
|
|
305
|
-
files. If the keychain refuses a deletion, reset stops and tells you to unlock
|
|
306
|
-
it before trying again.
|
|
307
|
-
|
|
308
|
-
## Optional research provider requests
|
|
309
|
-
|
|
310
|
-
Research-provider requests send only the inputs needed for the selected
|
|
311
|
-
operation. Depending on the provider and report, these can include:
|
|
312
|
-
|
|
313
|
-
- keywords, domains, URLs, result limits, country, and language.
|
|
314
|
-
|
|
315
|
-
DataForSEO requests use your login and API password. Ahrefs requests use your API v3 bearer key and can include the
|
|
316
|
-
target mode and country filter. Each provider also receives ordinary network
|
|
317
|
-
metadata.
|
|
318
|
-
|
|
319
|
-
`seo internal-links` sends page text to TypeSafe when a TypeSafe key is set
|
|
320
|
-
(`TYPESAFE_API_KEY` on your machine, or saved on your seoskill.dev account
|
|
321
|
-
and delivered by `seo login`). For each crawled page it sends the URL,
|
|
322
|
-
title, description, headings and opening sentences, and for each link it
|
|
323
|
-
judges, the source sentences that could hold the link and the target's
|
|
324
|
-
title, description and opening. The requests go from your machine with your
|
|
325
|
-
key, and TypeSafe processes them under the
|
|
326
|
-
[TypeSafe privacy policy](https://typesafe.ai/legal/privacy-policy). Without a key, nothing
|
|
327
|
-
is sent to TypeSafe.
|
|
328
|
-
|
|
329
|
-
The project maintainer does not receive these credentials, inputs, or
|
|
330
|
-
responses. DataForSEO processes them under its
|
|
331
|
-
[privacy policy](https://dataforseo.com/privacy-policy). As of the date of this
|
|
332
|
-
policy, DataForSEO says it stores API task data for 365 days. Its policy and
|
|
333
|
-
retention can change independently of this project. Ahrefs processes requests
|
|
334
|
-
under the [Ahrefs privacy policy](https://ahrefs.com/legal/privacy-policy).
|
|
335
|
-
|
|
336
|
-
Importing a local DataForSEO or Ahrefs file does not upload it to the
|
|
337
|
-
provider or the project maintainer.
|
|
338
|
-
|
|
339
|
-
## Other network requests
|
|
340
|
-
|
|
341
|
-
Other commands can make these direct requests:
|
|
342
|
-
|
|
343
|
-
- Crawls request the public pages, sitemaps, robots files, and agent files you
|
|
344
|
-
select. External-link checks can request linked third-party pages. Browser
|
|
345
|
-
rendering can also load scripts, images, fonts, and other resources embedded
|
|
346
|
-
by a page.
|
|
347
|
-
- Chrome UX Report requests send the requested URL or origin, form factor,
|
|
348
|
-
metrics, and your API key to Google.
|
|
349
|
-
- Search status checks request Google's public incident feed without sending a
|
|
350
|
-
site or property.
|
|
351
|
-
- Package update checks can request current package information from the npm
|
|
352
|
-
registry.
|
|
353
|
-
- Anonymous usage events can be sent to seoskill.dev as described in the next
|
|
354
|
-
section.
|
|
355
|
-
|
|
356
|
-
The remote service receives ordinary network metadata in addition to the
|
|
357
|
-
listed inputs and handles it under its own terms and privacy policy.
|
|
358
|
-
|
|
359
|
-
When an agent or MCP client runs the software, that client may send tool
|
|
360
|
-
inputs, report output, or conversation context to its chosen model provider.
|
|
361
|
-
That transfer is controlled by the client and model service, not by the local
|
|
362
|
-
`seo` process. Check the privacy settings and policy of the agent you use.
|
|
363
|
-
|
|
364
|
-
## How long research data is kept locally
|
|
365
|
-
|
|
366
|
-
`seo research` does not cache DataForSEO or Ahrefs responses. Older versions
|
|
367
|
-
did, and cache maintenance removes those entries once they are 30 days old.
|
|
368
|
-
On a machine where the command is no longer run, they can remain until you
|
|
369
|
-
clear the cache or reset the software. Older versions also kept a local
|
|
370
|
-
provider spend ledger. The software deletes it the next time it opens its
|
|
371
|
-
cache.
|
|
372
|
-
|
|
373
|
-
Run `seo cache clear --provider dataforseo` or
|
|
374
|
-
`seo cache clear --provider ahrefs` to remove one provider's cached responses.
|
|
375
|
-
Run the matching `seo providers <provider> disconnect` command to remove its
|
|
376
|
-
saved credential. These commands do not delete data already processed by an
|
|
377
|
-
external provider. Run `seo reset --yes` to remove every saved provider
|
|
378
|
-
credential along with local configuration, caches, histories, logs, and saved
|
|
379
|
-
reports.
|
|
380
|
-
|
|
381
|
-
## Anonymous tool usage
|
|
382
|
-
|
|
383
|
-
Anonymous usage telemetry is enabled by default with a one-time first-run
|
|
384
|
-
notice. It describes use of the tool, not the site or Google data being
|
|
385
|
-
analysed. Events can contain only a fixed event name, public report identifier
|
|
386
|
-
or top-level command name, package version, detected agent category, operating
|
|
387
|
-
system, architecture, Node major version, first-run ISO week, wire schema
|
|
388
|
-
version, and fixed failure classification for failed runs. The classification
|
|
389
|
-
can include a category, reason, and one allowlisted code context. It never
|
|
390
|
-
contains the underlying error text or a user-supplied value.
|
|
391
|
-
|
|
392
|
-
Telemetry never contains a user ID, machine ID, UUID, fingerprint, audited
|
|
393
|
-
domain, URL, hostname, page content, report content, Search Console or Google
|
|
394
|
-
Analytics response, Google property ID, token, secret, file path, username,
|
|
395
|
-
local hostname, raw error message, command argument, IP address, or location.
|
|
396
|
-
The complete event and field catalogue is published at
|
|
397
|
-
[seoskill.dev/telemetry](https://seoskill.dev/telemetry).
|
|
398
|
-
|
|
399
|
-
Once-only event state stays in a private local file in the existing SEO config
|
|
400
|
-
directory. The telemetry endpoint accepts only the published fixed schema and
|
|
401
|
-
writes those fields to a dedicated Cloudflare D1 table. The server adds only
|
|
402
|
-
the UTC receipt month, such as `2026-07`, so it can publish monthly totals
|
|
403
|
-
without storing an exact request time. The table has no account or identity
|
|
404
|
-
column. It does not use KV, R2, or Analytics Engine. Worker request logging is
|
|
405
|
-
disabled. The ingest code does not read request IP or Cloudflare location
|
|
406
|
-
fields, and neither is written to D1. Cloudflare still handles the ordinary
|
|
407
|
-
network request at its edge.
|
|
408
|
-
|
|
409
|
-
Disable all telemetry network calls with `seo telemetry disable`,
|
|
410
|
-
`DO_NOT_TRACK=1`, `SEOSKILL_TELEMETRY_DISABLED=1`, or
|
|
411
|
-
`SEO_TELEMETRY_DISABLED=1`. It is automatically disabled in common CI
|
|
412
|
-
environments. Use `seo telemetry status` to inspect the effective setting and
|
|
413
|
-
`seo telemetry enable` to turn the local setting back on. Environment and CI
|
|
414
|
-
overrides always win.
|
|
415
|
-
|
|
416
|
-
An unexpected CLI error can print a prefilled GitHub issue link. The link
|
|
417
|
-
contains only the package version, Node major, operating system, architecture,
|
|
418
|
-
fixed report or command name, and fixed failure classification. It does not
|
|
419
|
-
contain the raw error or command arguments. Nothing is sent to GitHub unless
|
|
420
|
-
you open the link, and you can review the form before submitting it.
|
|
421
|
-
|
|
422
|
-
Aggregate event counts are public at
|
|
423
|
-
[seoskill.dev/stats](https://seoskill.dev/stats). Failure counts, setup
|
|
424
|
-
completions and retention are not shown there; the maintainer reads them
|
|
425
|
-
privately to find and fix problems, including a weekly Telegram message with
|
|
426
|
-
failure totals, first audit rates and retention by version. The
|
|
427
|
-
public counts are described as installs, active machines, and audits, never
|
|
428
|
-
users. One person can have several installs, and clearing local state creates
|
|
429
|
-
a new install.
|
|
430
|
-
|
|
431
|
-
Once a day the CLI and local MCP server ask the npm registry for the latest
|
|
432
|
-
version number of `seo`, so they can say when an update is out. The request
|
|
433
|
-
sends nothing about you or your sites. Set `NO_UPDATE_NOTIFIER=1` to turn it
|
|
434
|
-
off.
|
|
435
|
-
|
|
436
|
-
Installing the package through npm or using GitHub is covered by the policies
|
|
437
|
-
of those services.
|
|
438
|
-
|
|
439
|
-
The seoskill.dev website uses [Clicky](https://clicky.com/terms/privacy) to
|
|
440
|
-
count visits and see which pages people use. Tracking cookies are disabled in
|
|
441
|
-
the website code. Clicky receives normal browser and request information such
|
|
442
|
-
as the page, referrer, device, and IP address.
|
|
443
|
-
|
|
444
|
-
On your first visit, the website sets one first-party cookie, `seo_first`,
|
|
445
|
-
for 30 days. It holds the host name of the site that sent you (never the full
|
|
446
|
-
address), the first page you opened without its query string, and any
|
|
447
|
-
`utm_source`, `utm_medium` and `utm_campaign` tags in that link. Later visits
|
|
448
|
-
never change it, and it is not set when your browser sends Global Privacy
|
|
449
|
-
Control. It is not sent to anyone else. The hosted MCP server reads it only
|
|
450
|
-
when you first sign up, as described above.
|
|
451
|
-
|
|
452
|
-
The website host and security provider may also process normal web request
|
|
453
|
-
data such as an IP address, user agent, requested path, and timestamp. Website
|
|
454
|
-
analytics and logs do not include the reports, tokens, or Google API responses
|
|
455
|
-
stored by the local software.
|
|
456
|
-
|
|
457
|
-
## Website tool requests
|
|
458
|
-
|
|
459
|
-
Most browser tool input stays in the browser. The log file analyzer, word
|
|
460
|
-
combiner, and pasted or uploaded validator modes do not upload their input to
|
|
461
|
-
seoskill.dev. A tool that fetches a public URL must send that URL to the
|
|
462
|
-
seoskill.dev Cloudflare Worker because normal browser cross-origin rules often
|
|
463
|
-
prevent a direct request. This includes live llms.txt, sitemap, robots.txt, and
|
|
464
|
-
favicon checks. The target server receives an ordinary request from
|
|
465
|
-
Cloudflare and can record it in its own logs.
|
|
466
|
-
|
|
467
|
-
Three provider-backed website tools send a target and the inputs needed for
|
|
468
|
-
the selected check from the Worker to an outside provider:
|
|
469
|
-
|
|
470
|
-
- Spam Score sends the domain or page to DataForSEO.
|
|
471
|
-
- Website traffic estimates send the domain, country, and language to
|
|
472
|
-
DataForSEO.
|
|
473
|
-
- Domain Rating sends the domain to Ahrefs.
|
|
474
|
-
|
|
475
|
-
The provider credentials remain in encrypted Cloudflare Worker secrets. The
|
|
476
|
-
Worker returns a small normalized result and does not save submitted targets
|
|
477
|
-
or provider responses in a product database or public recent-search list.
|
|
478
|
-
DataForSEO and Ahrefs process these requests under the provider privacy
|
|
479
|
-
policies linked in the research-provider section above.
|
|
480
|
-
|
|
481
|
-
Provider-backed forms use Cloudflare Turnstile to limit automated use. The
|
|
482
|
-
browser sends challenge information to Cloudflare and the Worker validates the
|
|
483
|
-
single-use token before calling a provider. Every tool that reaches the Worker
|
|
484
|
-
also creates a daily HMAC from the Cloudflare-provided connecting IP address.
|
|
485
|
-
Only the HMAC, tool, date, and counters are stored in a Durable Object. The raw
|
|
486
|
-
IP is not stored in the counter, the HMAC changes each UTC day, and the object
|
|
487
|
-
deletes its stored data after 48 hours. People on one shared network can share
|
|
488
|
-
the same daily allowance.
|
|
489
|
-
|
|
490
|
-
## Sharing and sale
|
|
491
|
-
|
|
492
|
-
The project maintainer does not receive or sell the reports, connected account
|
|
493
|
-
data, or provider request data processed by the local software. A service you
|
|
494
|
-
choose receives only the request inputs needed for the operation you start, as
|
|
495
|
-
described above.
|
|
496
|
-
|
|
497
|
-
No local report is shared with another person or service unless you export,
|
|
498
|
-
copy, publish, transmit, or pass it to an agent or application yourself.
|
|
499
|
-
|
|
500
|
-
## Removing access and local data
|
|
501
|
-
|
|
502
|
-
Use `seo auth logout` to remove local Google tokens. Use
|
|
503
|
-
`seo providers dataforseo disconnect`, `seo providers ahrefs disconnect` or
|
|
504
|
-
`seo providers bing disconnect` to remove the corresponding saved credential.
|
|
505
|
-
To remove what the hosted MCP keeps, use **Delete everything** on the
|
|
506
|
-
[account page](https://seoskill.dev/account). Environment variables are
|
|
507
|
-
controlled by your shell or runtime and are not changed by these commands. Use `seo privacy` to
|
|
508
|
-
inspect local paths and `seo reset --yes` to remove every saved credential and
|
|
509
|
-
local file managed by the software.
|
|
510
|
-
|
|
511
|
-
You can also revoke the app from your
|
|
199
|
+
You can remove our access at any time in your
|
|
512
200
|
[Google Account connections](https://myaccount.google.com/connections).
|
|
513
|
-
Deleting local files does not delete data already held by Google, a research
|
|
514
|
-
provider, npm, GitHub, a site you crawled, an agent or model
|
|
515
|
-
provider, or your operating system backups.
|
|
516
201
|
|
|
517
|
-
##
|
|
202
|
+
## Other services
|
|
518
203
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
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.
|
|
522
209
|
|
|
523
|
-
|
|
210
|
+
Your AI agent sends tool results to its model provider. That is up to your
|
|
211
|
+
agent and its settings, not us.
|
|
524
212
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
a
|
|
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.
|