Skip to content

0.2.0: denyCidrs, chargeSpoofedBrowsers, exempt - #1

Merged
ralyodio merged 1 commit into
mainfrom
worktree-edge-controls
Sep 5, 2026
Merged

ralyodio merged 1 commit into
mainfrom
worktree-edge-controls

Conversation

@ralyodio

@ralyodio ralyodio commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Adds three options for crawlers that do not name themselves:

  • denyCidrs: IPv4 ranges answered 403 before anything else (a VPS fleet's hosting provider).
  • chargeSpoofedBrowsers: a request claiming Chrome/… without the Sec-Fetch-Mode header every Chromium sends is charged like a training crawler.
  • exempt: a predicate for requests never charged (signed-in cookie).

Motivation: rssamplifier is being walked by a residential-proxy rotation (499 distinct IPs in 500 requests, three Chrome strings, 25 to 250 req/s) that an IP block cannot touch, on top of the OVH fleet measured in August.

38 tests pass on Node and Bun.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WJaXiqE9BDoNfoJBhfXroC

Two crawlers that never say who they are: a VPS fleet wearing "Chrome/148",
and a residential-proxy rotation cycling three Chrome strings across five
hundred addresses at up to 250 requests a second, walking a directory's
topic and author pages at 2.8s a render. Neither is on any user-agent list.

`denyCidrs` answers a hosting provider's ranges with a tiny 403 before
anything else runs. `chargeSpoofedBrowsers` asks the question only a browser
can answer: every Chromium since 76 sends Sec-Fetch-Mode on every request
and nothing can remove it, so a "Chrome/…" request without it is an HTTP
client with a copied string, and gets the same 402 as GPTBot. `exempt`
lets a site keep its signed-in readers out of either check.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WJaXiqE9BDoNfoJBhfXroC
@ralyodio
ralyodio merged commit 14e62d6 into main Sep 5, 2026
@ralyodio
ralyodio deleted the worktree-edge-controls branch September 5, 2026 17:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant