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 get your percentile back. 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