1###############
2# Device Detector - The Universal Device Detection library for parsing User Agents
3#
4# @link https://matomo.org
5# @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6###############
7
8- regex: 'PhantomJS(?:/(\d+[.\d]+))?'
9  name: 'PhantomJS'
10  version: '$1'
11  url: 'https://phantomjs.org/'
12
13- regex: 'IPinfoClient/.*/(\d+[.\d]+)'
14  name: 'IPinfo'
15  version: '$1'
16  url: 'https://github.com/ipinfo'
17
18- regex: 'kiwi-tcms/(\d+[.\d]+)'
19  name: 'Kiwi TCMS'
20  version: '$1'
21  url: 'https://kiwitcms.org'
22
23- regex: 'tcms-api/(\d+[.\d]+)'
24  name: 'Kiwi TCMS API'
25  version: '$1'
26  url: 'https://kiwitcms.org'
27
28- regex: 'Fuzz Faster U Fool v(\d+[.\d]+)'
29  name: 'FFUF'
30  version: '$1'
31  url: 'https://github.com/ffuf/ffuf'
32
33- regex: 'Slim Framework'
34  name: 'Slim Framework'
35  version: ''
36  url: 'https://www.slimframework.com/'
37
38- regex: 'msray-plus'
39  name: 'Msray-Plus'
40  version: ''
41  url: 'https://github.com/super-l/msray'
42
43- regex: 'HTMLParser(?:/(\d+[.\d]+))?'
44  name: 'HTML Parser'
45  version: '$1'
46  url: 'https://htmlparser.sourceforge.net/'
47
48# got - a nodejs library
49- regex: '^got(?:/(\d+\.[.\d]+))? \('
50  name: 'got'
51  version: '$1'
52  url: 'https://github.com/sindresorhus/got'
53
54# Typhoeus
55- regex: 'Typhoeus'
56  name: 'Typhoeus'
57  version: ''
58  url: 'https://github.com/typhoeus/typhoeus'
59
60# req
61- regex: 'req/v([.\d]+)'
62  name: 'req'
63  version: '$1'
64  url: 'https://github.com/imroc/req'
65
66# quic-go
67- regex: 'quic-go[ -]HTTP/3'
68  name: 'quic-go'
69  version: ''
70  url: 'https://github.com/lucas-clemente/quic-go'
71
72# Azure Data Factory
73- regex: 'azure-data-factory(?:/(\d+[.\d]+))?'
74  name: 'Azure Data Factory'
75  version: '$1'
76  url: 'https://azure.microsoft.com/en-us/products/data-factory/'
77
78# Dart
79- regex: 'Dart/(\d+[.\d]+)'
80  name: 'Dart'
81  version: '$1'
82  url: 'https://dart.dev/'
83
84# r-curl
85- regex: 'r-curl(?:/(\d+[.\d]+))?'
86  name: 'r-curl'
87  version: '$1'
88  url: 'https://github.com/jeroen/curl'
89
90# HTTPX
91- regex: 'python-httpx(?:/(\d+[.\d]+))?'
92  name: 'HTTPX'
93  version: '$1'
94  url: 'https://www.python-httpx.org/'
95
96# fasthttp
97- regex: 'fasthttp(?:/(\d+[.\d]+))?'
98  name: 'fasthttp'
99  version: '$1'
100  url: 'https://github.com/valyala/fasthttp'
101
102# GeoIP Update
103- regex: 'geoipupdate(?:/(\d+[.\d]+))?'
104  name: 'GeoIP Update'
105  version: '$1'
106  url: 'https://github.com/maxmind/geoipupdate'
107
108# PHP cURL Class
109- regex: 'PHP-Curl-Class(?:/(\d+[.\d]+))?'
110  name: 'PHP cURL Class'
111  version: '$1'
112  url: 'https://github.com/php-curl-class/php-curl-class'
113
114# cPanel HTTP Client
115- regex: 'Cpanel-HTTP-Client(?:/(\d+[.\d]+))?'
116  name: 'cPanel HTTP Client'
117  version: '$1'
118  url: 'https://www.cpanel.net/'
119
120# AnyEvent HTTP
121- regex: 'AnyEvent-HTTP(?:/(\d+[.\d]+))?'
122  name: 'AnyEvent HTTP'
123  version: '$1'
124  url: 'http://software.schmorp.de/pkg/AnyEvent'
125
126# SlimerJS
127- regex: 'SlimerJS/(\d+[.\d]+)'
128  name: 'SlimerJS'
129  version: '$1'
130  url: 'https://www.slimerjs.org/'
131
132# Jaunt
133- regex: 'Jaunt/(\d+[.\d]+)'
134  name: 'Jaunt'
135  version: '$1'
136  url: 'https://jaunt-api.com/'
137
138# Cypress
139- regex: 'Cypress/(\d+[.\d]+)'
140  name: 'Cypress'
141  version: '$1'
142  url: 'https://github.com/cypress-io/cypress'
143
144- regex: 'Wget(?:/(\d+[.\d]+))?'
145  name: 'Wget'
146  version: '$1'
147
148- regex: 'Guzzle(?:Http)?(?:/(\d+[.\d]+))?'
149  name: 'Guzzle (PHP HTTP Client)'
150  version: '$1'
151
152# symphony php http client
153- regex: '^Symfony HttpClient/'
154  name: 'Symfony'
155  version: '$1'
156
157- regex: '(?:lib)?curl(?:/(\d+[.\d]+))?'
158  name: 'curl'
159  version: '$1'
160
161- regex: 'python-requests(?:/(\d+[.\d]+))?'
162  name: 'Python Requests'
163  version: '$1'
164
165- regex: 'Python-httplib2(?:/(\d+[.\d]+))?'
166  name: 'httplib2'
167  version: '$1'
168  url: 'https://pypi.org/project/httplib2/'
169
170- regex: 'Python-urllib3?(?:/?(\d+[.\d]+))?'
171  name: 'Python urllib'
172  version: '$1'
173
174- regex: 'Apache-HttpClient(?:/?(\d+[.\d]+))?'
175  name: 'Apache HTTP Client'
176  version: '$1'
177
178- regex: 'Java-http-client(?:/?(\d+[.\d]+))?'
179  name: 'Java HTTP Client'
180  version: '$1'
181
182- regex: 'Java/?(\d+[.\d]+)'
183  name: 'Java'
184  version: '$1'
185
186- regex: '(?:perlclient|libwww-perl)(?:/?(\d+[.\d]+))?'
187  name: 'Perl'
188  version: '$1'
189
190- regex: 'grpc-java-okhttp/([\d.]+)'
191  name: 'gRPC-Java'
192  version: '$1'
193  url: 'https://github.com/grpc/grpc-java'
194
195# java library
196- regex: '(?:okhttp|network-okhttp3)/([\d.]+)'
197  name: 'OkHttp'
198  version: '$1'
199
200- regex: 'okhttp3-([\d.]+)'
201  name: 'OkHttp'
202  version: '$1'
203
204- regex: 'HTTP_Request2(?:/(\d+[.\d]+))?'
205  name: 'HTTP_Request2'
206  version: '$1'
207  url: 'https://pear.php.net/package/http_request2'
208
209- regex: 'Mechanize(?:/(\d+[.\d]+))?'
210  name: 'Mechanize'
211  version: '$1'
212  url: 'https://github.com/sparklemotion/mechanize'
213
214- regex: 'aiohttp(?:/(\d+[.\d]+))?'
215  name: 'aiohttp'
216  version: '$1'
217
218- regex: 'Google-HTTP-Java-Client(?:/(\d+[\.\w-]+))?'
219  name: 'Google HTTP Java Client'
220  version: '$1'
221
222- regex: 'WWW-Mechanize(?:/(\d+[.\d]+))?'
223  name: 'WWW-Mechanize'
224  version: '$1'
225
226- regex: 'Faraday(?: v(\d+[.\d]+))?'
227  name: 'Faraday'
228  version: '$1'
229  url: 'https://github.com/lostisland/faraday'
230
231- regex: '(?:Go-http-client|^Go )/?(?:(\d+[.\d]+))?(?: package http)?'
232  name: 'Go-http-client'
233  version: '$1'
234
235- regex: 'urlgrabber(?:/(\d+[.\d]+))?'
236  name: 'urlgrabber (yum)'
237  version: '$1'
238
239- regex: 'libdnf(?:/(\d+[.\d]+))?'
240  name: 'libdnf'
241  version: '$1'
242
243- regex: 'HTTPie(?:/(\d+[.\d]+))?'
244  name: 'HTTPie'
245  version: '$1'
246
247- regex: 'rest-client/(\d+\.[.\d]+) .*ruby'
248  name: 'REST Client for Ruby'
249  version: '$1'
250
251- regex: 'RestSharp/(\d+[.\d]+)'
252  name: 'RestSharp'
253  version: '$1'
254  url: 'https://github.com/restsharp/RestSharp'
255
256- regex: 'scalaj-http/(\d+[.\d]+)'
257  name: 'ScalaJ HTTP'
258  version: '$1'
259  url: 'https://github.com/scalaj/scalaj-http'
260
261- regex: 'REST::Client/(\d+)'
262  name: 'Perl REST::Client'
263  version: '$1'
264  url: 'https://metacpan.org/pod/REST::Client'
265
266- regex: 'node-fetch/?(\d+[.\d]+)?'
267  name: 'Node Fetch'
268  version: '$1'
269  url: 'https://github.com/node-fetch/node-fetch'
270
271- regex: 'electron-fetch/?(\d+[.\d]+)?'
272  name: 'Electron Fetch'
273  version: '$1'
274  url: 'https://github.com/arantes555/electron-fetch'
275
276- regex: 'ReactorNetty/(\d+[.\d]+)'
277  name: 'ReactorNetty'
278  version: '$1'
279  url: 'https://github.com/reactor/reactor-netty'
280
281- regex: 'PostmanRuntime(?:/(\d+[.\d]+))?'
282  name: 'Postman Desktop'
283  version: '$1'
284  url: 'https://github.com/postmanlabs/postman-runtime'
285
286- regex: 'insomnia(?:/(\d+[.\d]+))?'
287  name: 'Insomnia REST Client'
288  version: '$1'
289  url: 'https://insomnia.rest'
290
291- regex: 'Jakarta Commons-HttpClient/([.\d]+)'
292  name: 'Jakarta Commons HttpClient'
293  version: '$1'
294  url: 'https://hc.apache.org/httpclient-3.x'
295
296- regex: 'WinHttp\.WinHttpRequest.+([.\d]+)'
297  name: 'WinHttp WinHttpRequest'
298  version: '$1'
299
300- regex: 'WinHTTP'
301  name: 'Windows HTTP'
302  version: ''
303
304# THTTPClient in delphi 10+ default useragent
305- regex: 'Embarcadero URI Client/([.\d]+)'
306  name: 'Embarcadero URI Client'
307  version: '$1'
308
309- regex: 'Mikrotik/([.\d]+)'
310  name: 'Mikrotik Fetch'
311  version: '$1'
312
313- regex: 'GRequests(?:/(\d+[.\d]+))?'
314  name: 'GRequests'
315  version: '$1'
316
317# https://doc.akka.io/
318- regex: 'akka-http/([.\d]+)'
319  name: 'Akka HTTP'
320  version: '$1'
321
322# this added need added tests
323- regex: 'aria2(?:/(\d+[.\d]+))?'
324  name: 'Aria2'
325  version: '$1'
326
327- regex: '(?:BTWebClient/|^uTorrent/)'
328  name: 'uTorrent'
329  version: ''
330
331- regex: 'gvfs/(?:(\d+[.\d]+))?'
332  name: 'gvfs'
333  version: '$1'
334
335# https://openwrt.org/packages/pkgdata/uclient-fetch
336- regex: 'uclient-fetch'
337  name: 'uclient-fetch'
338  version: ''
339
340# https://github.com/microsoft/cpprestsdk
341- regex: 'cpprestsdk/([.\d]+)'
342  name: 'C++ REST SDK'
343  version: '$1'
344
345- regex: 'lua-resty-http/([.\d]+).+ngx_'
346  name: 'LUA OpenResty NGINX'
347  version: '$1'
348
349# https://github.com/Kong/unirest-java
350- regex: 'unirest-java/([.\d]+)'
351  name: 'Unirest for Java'
352  version: '$1'
353
354# jsdom (https://github.com/jsdom/jsdom)
355- regex: 'jsdom/([.\d]+)'
356  name: 'jsdom'
357  version: '$1'
358
359# hackney (https://github.com/benoitc/hackney) (elixir)
360- regex: 'hackney/([.\d]+)'
361  name: 'hackney'
362  version: '$1'
363
364# Resty (https://github.com/go-resty/resty)
365- regex: 'go-resty/([.\d]+)'
366  name: 'Resty'
367  version: '$1'
368
369# Pa11y (https://pa11y.org/)
370- regex: 'pa11y/([.\d]+)'
371  name: 'Pa11y'
372  version: '$1'
373
374# Ultimate Sitemap Parser (https://github.com/mediacloud/ultimate-sitemap-parser)
375- regex: 'ultimate_sitemap_parser/([.\d]+)'
376  name: 'Ultimate Sitemap Parser'
377  version: '$1'
378
379# Container-related useragents
380
381# Artifactory (https://jfrog.com/de/artifactory/)
382- regex: 'Artifactory/([.\d]+)'
383  name: 'Artifactory'
384  version: '$1'
385
386# Open build service (https://build.opensuse.org/)
387- regex: 'BSRPC ([.\d]+)'
388  name: 'Open Build Service'
389  version: '$1'
390
391# Buildah (https://github.com/containers/buildah)
392- regex: 'Buildah/([.\d]+)'
393  name: 'Buildah'
394  version: '$1'
395
396# Buildkit (https://github.com/moby/buildkit)
397- regex: 'buildkit/v?([.\d]+)'
398  name: 'BuildKit'
399  version: '$1'
400
401# containerd (https://github.com/containerd/containerd)
402- regex: 'containerd/v?([.\d]+)'
403  name: 'Containerd'
404  version: '$1'
405
406# containers (https://github.com/containers/image)
407- regex: 'containers/([.\d]+)'
408  name: 'containers'
409  version: '$1'
410
411# cri-o (https://github.com/cri-o/cri-)o
412- regex: 'cri-o/([.\d]+)'
413  name: 'cri-o'
414  version: '$1'
415
416# docker (https://github.com/moby/moby)
417- regex: 'docker/([.\d]+)'
418  name: 'docker'
419  version: '$1'
420
421# gcr (https://github.com/google/go-containerregistry)
422- regex: 'go-containerregistry/v([.\d]+)'
423  name: 'go-container registry'
424  version: '$1'
425
426# libpod (https://github.com/dankohn/libpod)
427- regex: 'libpod/([.\d]+)'
428  name: 'libpod'
429  version: '$1'
430
431# skopeo (https://github.com/containers/skopeo)
432- regex: 'skopeo/([.\d]+)'
433  name: 'Skopeo'
434  version: '$1'
435
436# helm (https://github.com/helm/helm)
437- regex: 'Helm/([.\d]+)'
438  name: 'Helm'
439  version: '$1'
440
441# harbor client (https://goharbor.io/)
442- regex: 'harbor-registry-client'
443  name: 'Harbor registry client'
444  version: ''
445
446# axios http (https://axios-http.com/)
447- regex: 'axios(?:/?(\d+[.\d]+))?'
448  name: Axios
449  version: '$1'
450
451# Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks
452- regex: '^CarrierWave/(\d+\.[.\d]+)'
453  name: 'CarrierWave'
454  version: '$1'
455
456- regex: '^Deno/(\d+\.[.\d]+)'
457  name: 'Deno'
458  version: '$1'
459
460# Streaming downloads using net/http, http.rb, HTTPX or wget (ruby)
461- regex: '^Down/(\d+\.[.\d]+)'
462  name: 'Down'
463  version: '$1'
464
465# various programs can use this, like vlc, but the underlying lib is ffmpeg
466- regex: '^Lavf/'
467  name: 'ffmpeg'
468  version: '$1'
469
470- regex: '^FileDownloader/(\d+\.[.\d]+)'
471  name: 'FileDownloader'
472  version: '$1'
473
474# Allows managing large files with git, without storing the file contents in git
475- regex: '^git-annex/(\d+\.[.\d]+)'
476  name: 'git-annex'
477  version: '$1'
478
479- regex: '^GStreamer(?: souphttpsrc)[ /](\d+\.[.\d]+)?'
480  name: 'GStreamer'
481  version: '$1'
482
483# A small, simple, correct HTTP/1.1 client (Perl)
484- regex: '^HTTP-Tiny/(\d+\.[.\d]+)'
485  name: 'HTTP:Tiny'
486  version: '$1'
487
488- regex: 'KaiOS Downloader'
489  name: 'KaiOS Downloader'
490  version: ''
491
492# HTTP client/server library for GNOME
493- regex: '^libsoup/(\d+\.[.\d]+)'
494  name: 'libsoup'
495  version: '$1'
496
497- regex: '^Android\.LVLDM$'
498  name: 'Android License Verification Library'
499  version: '$1'
500
501# A file downloader library for Android with pause and resume support
502- regex: '^PRDownloader$'
503  name: 'PRDownloader'
504  version: ''
505
506# a rust http library
507- regex: '^reqwest/(\d+\.[.\d]+)'
508  name: 'reqwest'
509  version: '$1'
510
511# lua http library
512- regex: '^resty-requests'
513  name: 'resty-requests'
514  version: ''
515
516# ruby core lib http download
517- regex: '^Ruby'
518  name: 'ruby'
519  version: ''
520
521# SFSafariViewController, some safari service
522- regex: '^SafariViewService/(\d+\.[.\d]+)'
523  name: 'Safari View Service'
524  version: '$1'
525
526# a nodejs lib
527- regex: '^undici$'
528  name: 'undici'
529  version: ''
530
531# URL, an emacs plugin
532- regex: '^URL/Emacs Emacs/(\d+\.[.\d]+)'
533  name: 'Emacs'
534  version: '$1'
535
536- regex: '^FDM[ /]([\d.]+)'
537  name: 'Free Download Manager'
538  version: '$1'
539
540# 'https://github.com/lingochamp/okdownload'
541- regex: 'OkDownload/([\d.]+)'
542  name: 'OKDownload Library'
543  version: '$1'
544
545# podcast host https://libsyn.com (probably an importer)
546- regex: '^Libsyn4-?(?:peek|download)$'
547  name: 'Libsyn'
548  version: ''
549
550# any ios application that uses apple core media but doesn't set its user
551# agent will default to this, always with 1.0.0 version.
552# there was a time when (not even that long ago) apple didn't let you set
553# a user agent so a ton of random applications still identify themselves this way.
554- regex: 'AppleCoreMedia/1\.0\.0'
555  name: 'iOS Application'
556  version: ''
557
558- regex: 'cpp-httplib(?:/(\d+[.\d]+))?'
559  name: 'cpp-httplib'
560  version: '$1'
561  url: 'https://github.com/yhirose/cpp-httplib'
562
563- regex: 'Definitely-Not-Requests'
564  name: 'Requests'
565  version: ''
566  url: 'https://github.com/psf/requests'
567
568- regex: 'Stealer ([\d.]+)'
569  name: 'Stealer'
570  version: '$1'
571  url: 'https://github.com/hotrush/stealer/'
572
573- regex: 'Mandrill-PHP(?:/(\d+[.\d]+))?'
574  name: 'Mandrill PHP'
575  version: '$1'
576  url: 'https://bitbucket.org/mailchimp/mandrill-api-php/src/master/'
577
578- regex: '^Podgrab'
579  name: 'Podgrab'
580  version: ''
581  url: 'https://github.com/akhilrex/podgrab'
582
583- regex: '^Podcast Provider.*?Radio Downloader ([\d.]+)'
584  name: 'Radio Downloader'
585  version: '$1'
586  url: 'https://nerdoftheherd.com/tools/radiodld/'
587
588- regex: '^ESP32 HTTP Client/([\d.]+)'
589  name: 'ESP32 HTTP Client'
590  version: '$1'
591  url: 'https://github.com/espressif/arduino-esp32'
592
593- regex: 'babashka\.http-client(?:/(\d+[.\d]+))?'
594  name: 'Babashka HTTP Client'
595  version: '$1'
596  url: 'https://github.com/babashka/http-client'
597
598- regex: 'http\.rb(?:/(\d+[.\d]+))?'
599  name: 'http.rb'
600  version: '$1'
601  url: 'https://github.com/httprb/http'
602
603- regex: 'node-superagent(?:/(\d+[.\d]+))?'
604  name: 'superagent'
605  version: '$1'
606  url: 'https://github.com/ladjs/superagent'
607
608- regex: 'CakePHP'
609  name: 'CakePHP'
610  version: ''
611  url: 'https://www.cakephp.org/'
612
613- regex: 'request\.js'
614  name: 'request'
615  version: ''
616  url: 'https://github.com/request/request'
617
618- regex: 'qbhttp(?:/(\d+[.\d]+))?'
619  name: 'QbHttp'
620  version: '$1'
621  url: 'https://github.com/OpenQb/QbHttp'
622
623- regex: 'httprs(?:/(\d+[.\d]+))?'
624  name: 'httprs'
625  version: '$1'
626  url: 'https://github.com/http-server-rs/http-server'
627
628- regex: 'Boto3(?:/(\d+[.\d]+))?'
629  name: 'Boto3'
630  version: '$1'
631  url: 'https://github.com/boto/boto3'
632
633- regex: 'Python-xmlrpc(?:/(\d+[.\d]+))?'
634  name: 'XML-RPC'
635  version: '$1'
636  url: 'https://docs.python.org/3/library/xmlrpc.html'
637
638- regex: 'ICAP-Client-Library(?:/(\d+[.\d]+))?'
639  name: 'ICAP Client'
640  version: '$1'
641  url: 'https://github.com/Peoplecantfly/icapserver'
642
643- regex: 'Cygwin-Setup(?:/(\d+[.\d]+))?'
644  name: 'Cygwin'
645  version: '$1'
646  url: 'https://www.cygwin.com/'
647
648- regex: 'azsdk-python-storage-blob(?:/(\d+[.\d]+))?'
649  name: 'Azure Blob Storage'
650  version: '$1'
651  url: 'https://learn.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python'
652
653- regex: 'trafilatura(?:/(\d+[.\d]+))?'
654  name: 'trafilatura'
655  version: '$1'
656  url: 'https://github.com/adbar/trafilatura'
657
658- regex: 'sqlmap(?:/(\d+[.\d]+))?'
659  name: 'sqlmap'
660  version: '$1'
661  url: 'https://sqlmap.org/'
662
663- regex: 'vimeo\.php(?: (\d+[.\d]+))?'
664  name: 'vimeo.php'
665  version: '$1'
666  url: 'https://github.com/vimeo/vimeo.php'
667
668- regex: '^PHP/?(\d+[.\d]+)'
669  name: 'PHP'
670  version: '$1'
671  url: ''
672
673- regex: 'go-network-v(\d+[.\d]+)'
674  name: 'go-network'
675  version: '$1'
676  url: ''
677
678- regex: 'Bun/(\d+\.[.\d]+)'
679  name: 'Bun'
680  version: '$1'
681  url: 'https://bun.sh/'
682
683- regex: 'Apidog/(\d+\.[.\d]+)'
684  name: 'Apidog'
685  version: '$1'
686  url: 'https://apidog.com/'
687
688- regex: 'webchk v(\d+\.[.\d]+)'
689  name: 'webchk'
690  version: '$1'
691  url: 'https://github.com/amgedr/webchk'
692
693- regex: 'MatomoTrackerSDK/(\d+[.\d]+)'
694  name: 'MatomoTracker'
695  version: '$1'
696  url: 'https://github.com/matomo-org/matomo-sdk-ios'
697