Skip to content

feat(devices): name the crawlers production reads generically - #2

Merged
joelwurtz merged 9 commits into
mainfrom
feat/traffic-2026-10-12
Oct 12, 2026
Merged

joelwurtz merged 9 commits into
mainfrom
feat/traffic-2026-10-12

Conversation

@joelwurtz

@joelwurtz joelwurtz commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

Names crawlers, monitors, agents and applications that the detector only read as Generic Bot, or not at all. Each one was looked up on the web. An entry was written where an operator or a project says what it is. Everything else stays generic.

Two commits, one per typology, so a regression bisects to a file.

Bots — src/devices/bots.yml

user agent now page
SofyaBot/1.0 (+https://sofya.co/bot) SofyaBot · Search bot https://sofya.co/bot
NikyBot/0.1 (prototipo NikySearch; +https://nikysearch.it/nikybot.html) NikyBot · Search bot https://nikysearch.it/nikybot.html
AIWebIndex/2.0 (+https://lyrenth.com/bot; AI-readable web index) AIWebIndex · AI Search Crawler https://lyrenth.com/bot
mozilla/5.0 (linux; android 14; pixel 8 pro) applewebkit/537.36 (khtml, like gecko) chrome/149.0.0.0 mobile safari/537.36 (compatible; dola-searchbot; dola-searchbot-feedback@bytedance.com) Dola SearchBot · AI Search Crawler no page; the bytedance.com address in the string
BeansLLM-CorpusBot/1.1 (+https://scrape.beansllm.ai/bot; respects robots.txt) BeansLLM-CorpusBot · AI Data Scraper https://scrape.beansllm.ai/bot
amazon-Quick-on-behalf-of-ded61f40 Amazon Quick · AI Assistant https://docs.aws.amazon.com/quick/latest/userguide/web-crawler-integration.html
amazon-Quick-on-behalf-of-ddbedd22 Amazon Quick · AI Assistant https://docs.aws.amazon.com/quick/latest/userguide/web-crawler-integration.html
amazon-Quick-on-behalf-of-0374f8e5 Amazon Quick · AI Assistant https://docs.aws.amazon.com/quick/latest/userguide/web-crawler-integration.html
amazon-Quick-on-behalf-of-5fdf3a2c Amazon Quick · AI Assistant https://docs.aws.amazon.com/quick/latest/userguide/web-crawler-integration.html
amazon-Quick-on-behalf-of-93f852fb Amazon Quick · AI Assistant https://docs.aws.amazon.com/quick/latest/userguide/web-crawler-integration.html
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; Shap-User/0.1.0 Shap-User · AI Assistant https://parallel.ai/ai/parallel-web-systems-bots
checkmk-active-httpv2/2.5.0 Checkmk · Site Monitor https://checkmk.com/integrations/check_httpv2
mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) distillwebmonitor/4.1.1-beta chrome/140.0.7339.249 electron/38.5.0 safari/537.36 Distill Web Monitor · Site Monitor https://distill.io/kb/help/cloud-local-monitors
mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko) distillwebmonitor/4.1.1-beta chrome/140.0.7339.249 electron/38.5.0 safari/537.36 Distill Web Monitor · Site Monitor https://distill.io/kb/help/cloud-local-monitors
HetrixTools Uptime Monitoring Bot. https://hetrix.tools/uptime-monitoring-bot.html HetrixTools · Site Monitor https://hetrixtools.com/uptime-monitor-bot/
Mozilla/5.0 (compatible; PingBreak Free monitoring; +https://pingbreak.com/) PingBreak · Site Monitor https://pingbreak.com/
Mozilla/4.0 (compatible; ipMonitor 11.1.1) ipMonitor · Site Monitor https://documentation.solarwinds.com/en/success_center/ipmonitor/content/introduction.htm
solarwinds/1.0 (www.solarwinds.com/solarwinds-observability) SolarWinds Observability · Site Monitor https://documentation.solarwinds.com/en/success_center/observability/content/intro/websites/custom-user-agent-headers-guidelines.htm
Photon/1.0 Jetpack Photon · Service Agent https://jetpack.com/support/site-accelerator/ (UA confirmed on wordpress.org/support/?p=16796237)
Stripe/1.0 (+https://stripe.com/docs/webhooks) Stripe Webhooks · Service Agent https://docs.stripe.com/webhooks
Adyen HttpClient 1.0 Adyen · Service Agent https://radar.cloudflare.com/bots/directory/adyen
sendcloud/1.0 (magento_v2; https://www.sendcloud.sc) Sendcloud · Service Agent https://support.sendcloud.com/hc/en-gb/articles/35936346704017-Self-hosted-Shop-Systems-Troubleshooting-Integration-Issues
Shopify Webfile Service. http://www.shopify.com/contact Shopify Webfile Service · Service Agent no page; the shopify.com address in the string
cert-manager/v1.7.1 (clean) cert-manager · Service Agent (existing entry widened) https://github.com/cert-manager/cert-manager/blob/v1.7.1/pkg/util/useragent.go
Overture-Maps-LinkChecker/1.0 (+https://overturemaps.org) Overture Maps LinkChecker · Validator https://overturemaps.org/
EPiServer Link Checker EPiServer Link Checker · Validator https://docs.optimizely.com/cms-12/docs/link-validation
Caliperbot/1.0 (+http://www.conductor.com/caliperbot) Caliperbot · Crawler http://www.conductor.com/caliperbot
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; SEOJuice-SearchBot/1.0; +https://seojuice.io/bot SEOJuice-SearchBot · Crawler https://seojuice.com/bot
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; SEOGetsBot/1.0; +https://seogets.com/bot) SEOGetsBot · Crawler https://seogets.com/bot
oseox/1.0 Oseox · Crawler https://radar.cloudflare.com/bots/directory/oseox
PeecAudit/1.0 (+https://peec.ai) PeecAudit · Crawler https://peec.ai/
Mozilla/5.0 (compatible; SenderBot/1.0; Sender Online Marketing GmbH; +https://sender-marketing.de/bot) SenderBot · Crawler https://sender-marketing.de/bot
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; AudigentAdBot; +http://www.audigent.com/bot.html) Chrome/W.X.Y.Z Safari/537.36 AudigentAdBot · Crawler https://audigent.com/bot.html
captify-crawler Captify · Crawler https://knownagents.com/agents/captify-crawler
Java 1.7 Apache HttpClient (Linux x86_64) / GnowitNewsbot / Contact information at http://www.gnowit.com GnowitNewsbot · Crawler https://darkvisitors.com/agents/gnowitnewsbot
PressEngineBot (+http://pressengine.net/crawl-policy) PressEngineBot · Crawler https://pressengine.net/crawl-policy
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/131.0.0.0 Safari/537.36 CookieInformationScanner Cookie Information Scanner · Crawler https://support.cookieinformation.com/en/articles/5374116-all-you-need-to-know-about-the-scanner
wine-searcherbot (+https://www.wine-searcher.com/technology; crawler@wine-searcher.com) Wine-Searcher · Crawler https://www.wine-searcher.com/technology
Mozilla/5.0 (compatible; BOT guenstiger.de) guenstiger.de · Crawler https://www.guenstiger.de/ (no bot page)
cardpulsebot/0.1 (+https://cardpulse.nl) CardPulse · Crawler https://cardpulse.nl/ (no bot page)
rajahinta-crawler/1.0 (+https://rajahinta.fi) Rajahinta · Crawler https://rajahinta.fi/ (no bot page)
feedparser/6.0.8 +https://github.com/kurtmckee/feedparser/ UniversalFeedParser · Feed Fetcher https://github.com/kurtmckee/feedparser

SofyaBot and NikyBot feed an index of their own, so they take the Search bot category.

Clients — src/devices/clients.yml

user agent now page
Orpiaroundme/1 CFNetwork/3860.700.2 Darwin/25.6.0 client ORPI around me · mobile app https://apps.apple.com/us/app/-/id1279259603
Orpiaroundme/1 CFNetwork/3860.700.1 Darwin/25.6.0 client ORPI around me · mobile app https://apps.apple.com/us/app/-/id1279259603
microsoft office powerpoint 2014 client Microsoft Office PowerPoint · mobile app https://blog.didierstevens.com/2020/03/23/quickpost-user-agent-microsoft-office-excel-2014/
R (4.5.2 x86_64-apple-darwin20 x86_64 darwin20) client R · library https://search.r-project.org/CRAN/refmans/utils/html/download.file.html
Deluge client Deluge · library https://github.com/deluge-torrent/deluge/blob/develop/deluge/httpdownloader.py
Jersey/2.35 (HttpUrlConnection 11.0.32) client Jersey · library https://eclipse-ee4j.github.io/jersey/

Left alone

  • Already named on main: Edge Health Probe, Amazon CloudFront, YisouSpider, NodePing, Zabbix, SEBot-WA, Chrome Privacy Preserving Prefetch Proxy, and the libraries Symfony BrowserKit, rss-parser, MWFeedParser, curl and undici.
  • Names nothing: bare or truncated Mozilla/5.0 strings, and Mozilla/5.0 (compatible; crawler).
  • Already Generic Bot on purpose: node, which is in matomo's own generic list.
  • A site's own front end, app or integration, or a personal scraper: these stay generic. A bot regex for any of them would be a guess.
  • No page the web ties to an operator: AionBot, RetroDocumentResearch, PatteBlancheBot, HomeasyCrawler, MansardBot, RegroupeImmoBot, StudizzWebCrawler, QuotzaBot, AmazonSelectionExplorerBot, WP-Safe-Scanner, WPImageProxy, UrlChecker, msh-pdfmin, MetadataScraper, Pumoxbot, SeltzSitemapFetcher, BLP_bbot, SSLPing / SSLPing-Checker, SFbot (its salesforce.com page is a 404), and similar.
  • com.apple.IdentityLookup.MessageFilter: iOS's SMS filter extension, not a crawler. It reads as Generic Bot through the generic lookup token, which needs its own change.

Proof

  • cargo test --release --no-default-features and cargo test --release: every corpus case, the unit tests and the pinned tests pass.
  • tests/pinned/production.rs pins one case per entry, and each case fails against the database of main. Seven of the strings left alone are pinned as generic.

Matomo 6.5.2

The fixtures move from 5a6f5d0 to e83ce7a (matomo 6.5.2): 38 301 cases, 271 more than before. One commit per typology:

  • bots: google-xrawler, plus Zeno read only as the whole string (matomo's ^Zeno$), which the new Blackview Zeno fixtures would otherwise read as the crawler.
  • clients: ten mobile apps and two PIMs that matomo added, Keeper on Android, ocaml-cohttp. iOS Application becomes Apple Core Media, RoboForm becomes RoboForm Passwort Manager, Iron needs Iron Safari, Chrome Webview also reads Ojxvms/, and the Safari catch-all needs Macintosh to start a word. aria2(?!App) is written as an ordering instead.
  • systems: YodaOS-Master and YaOS. SerenityOS no longer claims Ladybird. Darwin can now be written as Darwin; or Darwin after any token.
  • devices: one entry for each new case. This round's renames: Macs named by their chip, Fairphones by their number, SHIFT, Apple TV, NextBook and Vivo models, Yandex TVs on YaOS, and CHCNAV moving from phones to peripherals.

cargo test --release and cargo test --release --no-default-features both pass: 38 301 corpus cases, the unit tests and the pinned tests.

Bot categories

Bytespider becomes AI Data Scraper, MJ12 Bot becomes Crawler and Meta-ExternalAgent becomes AI Data Scraper. Matomo's fixtures say Search bot, Search bot and AI Assistant. tests/corrections.yml records each disagreement along with its source, and the corpus fails once a correction no longer applies to any case.

…ic of 2026-10-12

A dump of redirection.io's traffic of 2026-10-12 holds 150 user agents production
answers with `Generic Bot`, or with the string itself. Thirty-seven of them name
something whose operator says what it is: the search crawlers of Sofya and
Nikysearch, Lyrenth's AI index, ByteDance's Dola, BeansLLM, Amazon Quick and
Parallel's on-demand fetcher; the Checkmk, Distill, HetrixTools, PingBreak,
ipMonitor and SolarWinds Observability monitors; Jetpack's image CDN, Stripe and
Adyen webhooks, Sendcloud, Shopify and cert-manager outside its challenges; the
Overture Maps and EPiServer link checkers; and the crawlers of Conductor, SEOJuice,
SEO Gets, Oseox, Peec AI, Sender, Audigent, Captify, Gnowit, PressEngine, Cookie
Information, Wine-Searcher, guenstiger.de, CardPulse and Rajahinta. feedparser 6,
which names itself in lower case, now reads as matomo's UniversalFeedParser.

The rest stays generic: a scraper someone wrote for themselves, a customer's own
front end, or a token nothing on the web owns. Seven of those that look like
something they may not be are pinned as generic beside the ones of last month.

SofyaBot and NikyBot feed an index of their own and take the Search bot category,
which moves their rows into the log injector's search-bot column, so
`tests/pinned/traffic/false-negatives.yml` says why production's answer stands.
…2026-10-12

Five more strings production read as nothing: ORPI's property search application,
PowerPoint importing from a URL with the year where the version goes, and three
libraries that send their own name and little else -- R's default HTTPUserAgent,
Deluge's downloader and the Jersey client on its HttpUrlConnection connector.

`Deluge` and `R (...)` are short enough to read inside anything, so both are
anchored on the whole string rather than searched for.
Ten mobile applications and two mail clients matomo added, Keeper's Android
build, ocaml-cohttp, and the renames: `iOS Application` is now `Apple Core
Media` and reads any AppleCoreMedia, RoboForm is `RoboForm Passwort Manager`.
Iron asks for `Iron Safari` and Chrome Webview reads `Ojxvms/` as it reads
`Version/`.

matomo's `aria2(?!App)` is said as an ordering, Aria2App placed after Aria2
in the promoted clients, and `BlackBerry(?!-WorkConnect)` needs nothing:
BlackBerry Work is a PIM, which already sits above the browsers. The two
`^TPA` podcast rules are anchored and stay out, as the generator leaves every
anchored rule out.
YodaOS-Master and YaOS, both in the Android family; SerenityOS no longer
claims Ladybird, which runs elsewhere; and a Mac's Darwin may now be written
`Darwin;` or `Darwin ` after any token rather than after CFNetwork alone.
Searched anywhere, the Internet Archive's crawler took Blackview's Zeno
tablets with it, which matomo 6.5.2 now has fixtures for.
matomo 6.5.2 writes its Safari catch-all as `\bMacintosh`, so the
`Power%20Macintosh` an old CFNetwork string carries for its architecture
names no browser.
The fixtures move to e83ce7a, matomo's 6.5.2: 38 301 cases, 271 more than
before. Every new case has its entry, one per user agent shape, in the
file named after its fixture, tv-6 bringing a file of its own.

What changes for an existing entry is matomo's own renaming: Macs named by
their chip (`MacBook Air M1 13" (2020)`) and the Mac mini in lower case,
Fairphones by their number, `Shift Phones` as `SHIFT`, Apple TVs, NextBook
and Vivo models, Yandex's televisions on YaOS, and CHCNAV moved from the
phones to the peripherals. The reduced user agent matomo now also reads,
`Android 1x; <ten characters>; U;`, is answered from the client hints like
the `K` one.
… belong

matomo calls Bytespider and MJ12bot search bots and Meta-ExternalAgent an AI
assistant. Meta documents its agent as crawling to train foundation models,
Majestic's crawler feeds a backlink index and no search engine, and every
tracker reads Bytespider as ByteDance's training-data collector. They are
now AI Data Scraper, Crawler and AI Data Scraper.

That contradicts the fixtures, so `tests/corrections.yml` says so: a bot,
the category it gets instead, and the page that says why. The fixture
loader applies it to every case naming that bot, `report` now reads the
fixtures through the same loader, and the corpus fails on a correction no
case needs any more, so it goes once matomo agrees.

The two that left the search-bot column move to the log injector's tool
one, which `tests/pinned/traffic/false-negatives.yml` excuses.
@joelwurtz
joelwurtz merged commit 27f930e into main Oct 12, 2026
2 checks passed
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