One line from an access log, checked

203.0.113.9 - - [17/Oct/2026:09:14:02 -0700] "GET /pricing/ HTTP/1.1" 200 5120 "-"
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot"
spoofed 203.0.113.9 claims chatgpt-user (chatgpt, answer) but is not in openai.com/chatgpt-user.json (234 prefixes)

Who read your site this week, was it good, and what to write next

From your server's access log and a Search Console export. Every crawler is checked against the list its vendor publishes, so a scanner wearing ChatGPT's user-agent is not counted as ChatGPT. It runs on your machine and sends nothing unless you choose to share.

npx siteread check <ip> "<user-agent>" See how sites compare
217 of 221

ChatGPT-User requests from outside OpenAI's list came from IPs that also probed for scanner paths.

100 %

of the requests claiming DeepSeekBot, CCBot, Grok, Perplexity-User or Claude-SearchBot were fake.

1 bad link

was enough for a rule-of-thumb filter to call a real ClaudeBot spoofed. So where a vendor list exists, the list decides.

One site's nginx log, 30 days to 2026-10-16.

How a weekly read works

1 · digest

Turn the files into numbers

People by first touch, Search Console weeks with impression-weighted position, every crawler verified against its vendor's list.

npx siteread digest --gsc export.zip \
  --log access.log --out .siteread/digests
2 · memo

Read it as a dated memo

The seo-read skill for Claude Code writes the week up: what changed, who came from where, which crawler read what, and two to four things to do next.

"my weekly seo read"
3 · share, if you want

See where you stand

Send one week's numbers to the benchmark and see where each stands among the published quartiles. It prints every byte first and sends nothing without a yes.

npx siteread share --dry-run

Read the docs: every command, the share payload, the library.

What the memo says

From the test site example.org, the one the tests run on

### 2026-10-21: GSC 2026-09-21→10-18 (export gsc.zip) + log 2026-10-05→10-18

A steady week on small numbers: impressions rose to 34 a day and position improved to 17.9, while clicks stayed at 3. The sample is small, so the read rests on the four-week trend.

Number2026-10-05→10-112026-10-12→10-18
Impressions / day2734
Clicks43
CTR2.1 %1.3 %
Weighted position21.417.9
People (log, unique)34

Crawlers. Googlebot, verified, fetched 7 sitemap URLs last week against 4 the week before, and still asks for /old-page/, which is not in the sitemap. ClaudeBot, verified, read 2 pages. One ChatGPT-User request came from outside OpenAI's list: spoofed, not counted.

The benchmark

Anonymous weekly numbers from sites that chose to share, with the count printed on every row. Small and dated, and it says so.

Open the benchmark