fingerprint-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/LICENSE +663 -0
  2. package/README.ar.md +767 -0
  3. package/README.bn.md +767 -0
  4. package/README.bs.md +767 -0
  5. package/README.da.md +767 -0
  6. package/README.de.md +770 -0
  7. package/README.el.md +767 -0
  8. package/README.es.md +769 -0
  9. package/README.fr.md +769 -0
  10. package/README.hi.md +767 -0
  11. package/README.it.md +767 -0
  12. package/README.ja.md +767 -0
  13. package/README.ko.md +772 -0
  14. package/README.md +767 -0
  15. package/README.no.md +767 -0
  16. package/README.pl.md +767 -0
  17. package/README.pt-BR.md +767 -0
  18. package/README.ru.md +767 -0
  19. package/README.th.md +767 -0
  20. package/README.tr.md +767 -0
  21. package/README.uk.md +767 -0
  22. package/README.vi.md +767 -0
  23. package/README.zh-TW.md +768 -0
  24. package/README.zh.md +768 -0
  25. package/dist/app/index.d.ts +3 -0
  26. package/dist/app/index.d.ts.map +1 -0
  27. package/dist/app/index.js +614 -0
  28. package/dist/app/index.js.map +1 -0
  29. package/dist/composite/analyze.d.ts +3 -0
  30. package/dist/composite/analyze.d.ts.map +1 -0
  31. package/dist/composite/analyze.js +59 -0
  32. package/dist/composite/analyze.js.map +1 -0
  33. package/dist/composite/correlate.d.ts +3 -0
  34. package/dist/composite/correlate.d.ts.map +1 -0
  35. package/dist/composite/correlate.js +184 -0
  36. package/dist/composite/correlate.js.map +1 -0
  37. package/dist/composite/enumerate.d.ts +3 -0
  38. package/dist/composite/enumerate.d.ts.map +1 -0
  39. package/dist/composite/enumerate.js +94 -0
  40. package/dist/composite/enumerate.js.map +1 -0
  41. package/dist/composite/helpers.d.ts +22 -0
  42. package/dist/composite/helpers.d.ts.map +1 -0
  43. package/dist/composite/helpers.js +111 -0
  44. package/dist/composite/helpers.js.map +1 -0
  45. package/dist/composite/index.d.ts +3 -0
  46. package/dist/composite/index.d.ts.map +1 -0
  47. package/dist/composite/index.js +29 -0
  48. package/dist/composite/index.js.map +1 -0
  49. package/dist/composite/meta.d.ts +3 -0
  50. package/dist/composite/meta.d.ts.map +1 -0
  51. package/dist/composite/meta.js +23 -0
  52. package/dist/composite/meta.js.map +1 -0
  53. package/dist/composite/osint.d.ts +3 -0
  54. package/dist/composite/osint.d.ts.map +1 -0
  55. package/dist/composite/osint.js +40 -0
  56. package/dist/composite/osint.js.map +1 -0
  57. package/dist/composite/recon.d.ts +3 -0
  58. package/dist/composite/recon.d.ts.map +1 -0
  59. package/dist/composite/recon.js +131 -0
  60. package/dist/composite/recon.js.map +1 -0
  61. package/dist/composite/scan-dns.d.ts +3 -0
  62. package/dist/composite/scan-dns.d.ts.map +1 -0
  63. package/dist/composite/scan-dns.js +44 -0
  64. package/dist/composite/scan-dns.js.map +1 -0
  65. package/dist/composite/scan-http.d.ts +3 -0
  66. package/dist/composite/scan-http.d.ts.map +1 -0
  67. package/dist/composite/scan-http.js +68 -0
  68. package/dist/composite/scan-http.js.map +1 -0
  69. package/dist/composite/scan-paths.d.ts +3 -0
  70. package/dist/composite/scan-paths.d.ts.map +1 -0
  71. package/dist/composite/scan-paths.js +32 -0
  72. package/dist/composite/scan-paths.js.map +1 -0
  73. package/dist/composite/scan-ports.d.ts +3 -0
  74. package/dist/composite/scan-ports.d.ts.map +1 -0
  75. package/dist/composite/scan-ports.js +79 -0
  76. package/dist/composite/scan-ports.js.map +1 -0
  77. package/dist/composite/scan-services.d.ts +3 -0
  78. package/dist/composite/scan-services.d.ts.map +1 -0
  79. package/dist/composite/scan-services.js +111 -0
  80. package/dist/composite/scan-services.js.map +1 -0
  81. package/dist/composite/scan-tls.d.ts +3 -0
  82. package/dist/composite/scan-tls.d.ts.map +1 -0
  83. package/dist/composite/scan-tls.js +32 -0
  84. package/dist/composite/scan-tls.js.map +1 -0
  85. package/dist/composite/scan-waf.d.ts +3 -0
  86. package/dist/composite/scan-waf.d.ts.map +1 -0
  87. package/dist/composite/scan-waf.js +35 -0
  88. package/dist/composite/scan-waf.js.map +1 -0
  89. package/dist/correlation/index.d.ts +3 -0
  90. package/dist/correlation/index.d.ts.map +1 -0
  91. package/dist/correlation/index.js +1044 -0
  92. package/dist/correlation/index.js.map +1 -0
  93. package/dist/data/analytics-patterns.d.ts +21 -0
  94. package/dist/data/analytics-patterns.d.ts.map +1 -0
  95. package/dist/data/analytics-patterns.js +449 -0
  96. package/dist/data/analytics-patterns.js.map +1 -0
  97. package/dist/data/app-signatures.d.ts +52 -0
  98. package/dist/data/app-signatures.d.ts.map +1 -0
  99. package/dist/data/app-signatures.js +1143 -0
  100. package/dist/data/app-signatures.js.map +1 -0
  101. package/dist/data/c2-signatures.d.ts +54 -0
  102. package/dist/data/c2-signatures.d.ts.map +1 -0
  103. package/dist/data/c2-signatures.js +256 -0
  104. package/dist/data/c2-signatures.js.map +1 -0
  105. package/dist/data/cloud-ranges.d.ts +34 -0
  106. package/dist/data/cloud-ranges.d.ts.map +1 -0
  107. package/dist/data/cloud-ranges.js +628 -0
  108. package/dist/data/cloud-ranges.js.map +1 -0
  109. package/dist/data/cookie-patterns.d.ts +28 -0
  110. package/dist/data/cookie-patterns.d.ts.map +1 -0
  111. package/dist/data/cookie-patterns.js +225 -0
  112. package/dist/data/cookie-patterns.js.map +1 -0
  113. package/dist/data/error-signatures.d.ts +19 -0
  114. package/dist/data/error-signatures.d.ts.map +1 -0
  115. package/dist/data/error-signatures.js +321 -0
  116. package/dist/data/error-signatures.js.map +1 -0
  117. package/dist/data/favicon-hashes.d.ts +25 -0
  118. package/dist/data/favicon-hashes.d.ts.map +1 -0
  119. package/dist/data/favicon-hashes.js +249 -0
  120. package/dist/data/favicon-hashes.js.map +1 -0
  121. package/dist/data/h2-signatures.d.ts +50 -0
  122. package/dist/data/h2-signatures.d.ts.map +1 -0
  123. package/dist/data/h2-signatures.js +211 -0
  124. package/dist/data/h2-signatures.js.map +1 -0
  125. package/dist/data/header-order.d.ts +38 -0
  126. package/dist/data/header-order.d.ts.map +1 -0
  127. package/dist/data/header-order.js +185 -0
  128. package/dist/data/header-order.js.map +1 -0
  129. package/dist/data/jarm-signatures.d.ts +25 -0
  130. package/dist/data/jarm-signatures.d.ts.map +1 -0
  131. package/dist/data/jarm-signatures.js +213 -0
  132. package/dist/data/jarm-signatures.js.map +1 -0
  133. package/dist/data/saas-patterns.d.ts +23 -0
  134. package/dist/data/saas-patterns.d.ts.map +1 -0
  135. package/dist/data/saas-patterns.js +139 -0
  136. package/dist/data/saas-patterns.js.map +1 -0
  137. package/dist/data/sensitive-paths.d.ts +12 -0
  138. package/dist/data/sensitive-paths.d.ts.map +1 -0
  139. package/dist/data/sensitive-paths.js +1539 -0
  140. package/dist/data/sensitive-paths.js.map +1 -0
  141. package/dist/data/service-banners.d.ts +59 -0
  142. package/dist/data/service-banners.d.ts.map +1 -0
  143. package/dist/data/service-banners.js +323 -0
  144. package/dist/data/service-banners.js.map +1 -0
  145. package/dist/data/smtp-signatures.d.ts +12 -0
  146. package/dist/data/smtp-signatures.d.ts.map +1 -0
  147. package/dist/data/smtp-signatures.js +350 -0
  148. package/dist/data/smtp-signatures.js.map +1 -0
  149. package/dist/data/takeover-patterns.d.ts +37 -0
  150. package/dist/data/takeover-patterns.d.ts.map +1 -0
  151. package/dist/data/takeover-patterns.js +249 -0
  152. package/dist/data/takeover-patterns.js.map +1 -0
  153. package/dist/data/tech-patterns.d.ts +44 -0
  154. package/dist/data/tech-patterns.d.ts.map +1 -0
  155. package/dist/data/tech-patterns.js +690 -0
  156. package/dist/data/tech-patterns.js.map +1 -0
  157. package/dist/data/waf-signatures.d.ts +21 -0
  158. package/dist/data/waf-signatures.d.ts.map +1 -0
  159. package/dist/data/waf-signatures.js +318 -0
  160. package/dist/data/waf-signatures.js.map +1 -0
  161. package/dist/dns/index.d.ts +3 -0
  162. package/dist/dns/index.d.ts.map +1 -0
  163. package/dist/dns/index.js +1067 -0
  164. package/dist/dns/index.js.map +1 -0
  165. package/dist/enum/index.d.ts +3 -0
  166. package/dist/enum/index.d.ts.map +1 -0
  167. package/dist/enum/index.js +818 -0
  168. package/dist/enum/index.js.map +1 -0
  169. package/dist/h2/index.d.ts +3 -0
  170. package/dist/h2/index.d.ts.map +1 -0
  171. package/dist/h2/index.js +414 -0
  172. package/dist/h2/index.js.map +1 -0
  173. package/dist/http/index.d.ts +3 -0
  174. package/dist/http/index.d.ts.map +1 -0
  175. package/dist/http/index.js +2444 -0
  176. package/dist/http/index.js.map +1 -0
  177. package/dist/identify/index.d.ts +3 -0
  178. package/dist/identify/index.d.ts.map +1 -0
  179. package/dist/identify/index.js +447 -0
  180. package/dist/identify/index.js.map +1 -0
  181. package/dist/index.d.ts +3 -0
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/index.js +165 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/infra/index.d.ts +3 -0
  186. package/dist/infra/index.d.ts.map +1 -0
  187. package/dist/infra/index.js +989 -0
  188. package/dist/infra/index.js.map +1 -0
  189. package/dist/iot/index.d.ts +3 -0
  190. package/dist/iot/index.d.ts.map +1 -0
  191. package/dist/iot/index.js +610 -0
  192. package/dist/iot/index.js.map +1 -0
  193. package/dist/meta/index.d.ts +3 -0
  194. package/dist/meta/index.d.ts.map +1 -0
  195. package/dist/meta/index.js +442 -0
  196. package/dist/meta/index.js.map +1 -0
  197. package/dist/osint/index.d.ts +3 -0
  198. package/dist/osint/index.d.ts.map +1 -0
  199. package/dist/osint/index.js +687 -0
  200. package/dist/osint/index.js.map +1 -0
  201. package/dist/passive/index.d.ts +3 -0
  202. package/dist/passive/index.d.ts.map +1 -0
  203. package/dist/passive/index.js +944 -0
  204. package/dist/passive/index.js.map +1 -0
  205. package/dist/path/index.d.ts +3 -0
  206. package/dist/path/index.d.ts.map +1 -0
  207. package/dist/path/index.js +878 -0
  208. package/dist/path/index.js.map +1 -0
  209. package/dist/protocol/mcp-server.d.ts +4 -0
  210. package/dist/protocol/mcp-server.d.ts.map +1 -0
  211. package/dist/protocol/mcp-server.js +32 -0
  212. package/dist/protocol/mcp-server.js.map +1 -0
  213. package/dist/protocol/tools.d.ts +3 -0
  214. package/dist/protocol/tools.d.ts.map +1 -0
  215. package/dist/protocol/tools.js +5 -0
  216. package/dist/protocol/tools.js.map +1 -0
  217. package/dist/service/index.d.ts +3 -0
  218. package/dist/service/index.d.ts.map +1 -0
  219. package/dist/service/index.js +1053 -0
  220. package/dist/service/index.js.map +1 -0
  221. package/dist/smtp/index.d.ts +3 -0
  222. package/dist/smtp/index.d.ts.map +1 -0
  223. package/dist/smtp/index.js +437 -0
  224. package/dist/smtp/index.js.map +1 -0
  225. package/dist/ssh/index.d.ts +3 -0
  226. package/dist/ssh/index.d.ts.map +1 -0
  227. package/dist/ssh/index.js +676 -0
  228. package/dist/ssh/index.js.map +1 -0
  229. package/dist/tcp/index.d.ts +3 -0
  230. package/dist/tcp/index.d.ts.map +1 -0
  231. package/dist/tcp/index.js +369 -0
  232. package/dist/tcp/index.js.map +1 -0
  233. package/dist/timing/index.d.ts +3 -0
  234. package/dist/timing/index.d.ts.map +1 -0
  235. package/dist/timing/index.js +425 -0
  236. package/dist/timing/index.js.map +1 -0
  237. package/dist/tls/index.d.ts +3 -0
  238. package/dist/tls/index.d.ts.map +1 -0
  239. package/dist/tls/index.js +1332 -0
  240. package/dist/tls/index.js.map +1 -0
  241. package/dist/types/index.d.ts +26 -0
  242. package/dist/types/index.d.ts.map +1 -0
  243. package/dist/types/index.js +8 -0
  244. package/dist/types/index.js.map +1 -0
  245. package/dist/utils/cache.d.ts +11 -0
  246. package/dist/utils/cache.d.ts.map +1 -0
  247. package/dist/utils/cache.js +35 -0
  248. package/dist/utils/cache.js.map +1 -0
  249. package/dist/utils/murmurhash3.d.ts +3 -0
  250. package/dist/utils/murmurhash3.d.ts.map +1 -0
  251. package/dist/utils/murmurhash3.js +57 -0
  252. package/dist/utils/murmurhash3.js.map +1 -0
  253. package/dist/utils/rate-limiter.d.ts +10 -0
  254. package/dist/utils/rate-limiter.d.ts.map +1 -0
  255. package/dist/utils/rate-limiter.js +35 -0
  256. package/dist/utils/rate-limiter.js.map +1 -0
  257. package/dist/utils/require-key.d.ts +2 -0
  258. package/dist/utils/require-key.d.ts.map +1 -0
  259. package/dist/utils/require-key.js +8 -0
  260. package/dist/utils/require-key.js.map +1 -0
  261. package/dist/waf/index.d.ts +3 -0
  262. package/dist/waf/index.d.ts.map +1 -0
  263. package/dist/waf/index.js +767 -0
  264. package/dist/waf/index.js.map +1 -0
  265. package/dist/web/index.d.ts +3 -0
  266. package/dist/web/index.d.ts.map +1 -0
  267. package/dist/web/index.js +1366 -0
  268. package/dist/web/index.js.map +1 -0
  269. package/package.json +66 -0
@@ -0,0 +1,1143 @@
1
+ /**
2
+ * Application detection signatures for CMS platforms, e-commerce solutions,
3
+ * and backend frameworks.
4
+ *
5
+ * Each entry defines multiple detection vectors: meta tags, characteristic
6
+ * URL paths, script/global patterns, cookie names, HTTP headers, and body
7
+ * content patterns. Matching any subset of these signals with sufficient
8
+ * confidence identifies the technology.
9
+ *
10
+ * Version detection methods (where available) describe how to extract the
11
+ * exact version from a response — typically via generator meta tags, static
12
+ * file checksums, or error page content.
13
+ *
14
+ * References:
15
+ * - https://www.wappalyzer.com/
16
+ * - https://builtwith.com/
17
+ */
18
+ export const APP_SIGNATURES = [
19
+ // ══════════════════════════════════════════════════
20
+ // CMS Platforms
21
+ // ══════════════════════════════════════════════════
22
+ // ──────────────────────────────────────────────────
23
+ // WordPress
24
+ // ──────────────────────────────────────────────────
25
+ {
26
+ name: "WordPress",
27
+ category: "cms",
28
+ detection: {
29
+ meta: [
30
+ '<meta[^>]+name=["\']generator["\'][^>]+WordPress\\s+([\\d.]+)',
31
+ ],
32
+ paths: [
33
+ "/wp-content/",
34
+ "/wp-includes/",
35
+ "/wp-admin/",
36
+ "/wp-login.php",
37
+ "/wp-json/",
38
+ "/xmlrpc.php",
39
+ "/wp-cron.php",
40
+ ],
41
+ scripts: [
42
+ "/wp-includes/js/",
43
+ "/wp-content/themes/",
44
+ "/wp-content/plugins/",
45
+ "wp-emoji-release\\.min\\.js",
46
+ ],
47
+ globals: ["wp", "wp.customize", "wpApiSettings", "wp.i18n"],
48
+ cookies: ["wordpress_logged_in_[a-f0-9]+", "wp-settings-\\d+"],
49
+ headers: {
50
+ "x-powered-by": "WordPress",
51
+ link: "<.*>; rel=\"https://api\\.w\\.org/\"",
52
+ "x-pingback": ".*/xmlrpc\\.php$",
53
+ },
54
+ body: [
55
+ 'class="wp-',
56
+ "wp-content/uploads/",
57
+ "wp-json",
58
+ ],
59
+ },
60
+ versionDetection: {
61
+ method: "meta generator tag or /feed/ response",
62
+ pattern: "WordPress\\s+([\\d.]+)",
63
+ },
64
+ },
65
+ // ──────────────────────────────────────────────────
66
+ // Drupal
67
+ // ──────────────────────────────────────────────────
68
+ {
69
+ name: "Drupal",
70
+ category: "cms",
71
+ detection: {
72
+ meta: [
73
+ '<meta[^>]+name=["\']Generator["\'][^>]+Drupal\\s+([\\d.]+)',
74
+ ],
75
+ paths: [
76
+ "/sites/default/files/",
77
+ "/core/misc/drupal.js",
78
+ "/node/",
79
+ "/user/login",
80
+ "/admin/content",
81
+ "/core/themes/",
82
+ "/modules/",
83
+ ],
84
+ scripts: [
85
+ "drupal\\.js",
86
+ "/core/misc/",
87
+ "Drupal\\.settings",
88
+ "/sites/all/modules/",
89
+ ],
90
+ globals: ["Drupal", "Drupal.settings", "drupalSettings"],
91
+ cookies: ["SESS[a-f0-9]{32}", "Drupal\\.visitor"],
92
+ headers: {
93
+ "x-drupal-cache": "^(HIT|MISS)$",
94
+ "x-drupal-dynamic-cache": "^(HIT|MISS|UNCACHEABLE)$",
95
+ "x-generator": "^Drupal",
96
+ },
97
+ body: [
98
+ 'data-drupal-selector',
99
+ "drupal-ajax",
100
+ 'class="drupal-',
101
+ ],
102
+ },
103
+ versionDetection: {
104
+ method: "meta generator tag or CHANGELOG.txt",
105
+ pattern: "Drupal\\s+([\\d.]+)",
106
+ },
107
+ },
108
+ // ──────────────────────────────────────────────────
109
+ // Joomla
110
+ // ──────────────────────────────────────────────────
111
+ {
112
+ name: "Joomla",
113
+ category: "cms",
114
+ detection: {
115
+ meta: [
116
+ '<meta[^>]+name=["\']generator["\'][^>]+Joomla',
117
+ ],
118
+ paths: [
119
+ "/administrator/",
120
+ "/components/",
121
+ "/modules/",
122
+ "/templates/",
123
+ "/media/system/js/",
124
+ "/plugins/",
125
+ "/configuration.php",
126
+ ],
127
+ scripts: [
128
+ "/media/system/js/core\\.js",
129
+ "/media/jui/js/",
130
+ "Joomla\\.optionsStorage",
131
+ ],
132
+ globals: ["Joomla", "Joomla.optionsStorage"],
133
+ cookies: ["[a-f0-9]{32}"],
134
+ headers: {},
135
+ body: [
136
+ "com_content",
137
+ "/media/system/css/",
138
+ ],
139
+ },
140
+ versionDetection: {
141
+ method: "meta generator tag or /administrator/manifests/files/joomla.xml",
142
+ pattern: "Joomla![\\s!]*(\\d+\\.\\d+\\.?\\d*)",
143
+ },
144
+ },
145
+ // ──────────────────────────────────────────────────
146
+ // Ghost CMS
147
+ // ──────────────────────────────────────────────────
148
+ {
149
+ name: "Ghost",
150
+ category: "cms",
151
+ detection: {
152
+ meta: [
153
+ '<meta[^>]+name=["\']generator["\'][^>]+Ghost\\s+([\\d.]+)',
154
+ ],
155
+ paths: [
156
+ "/ghost/api/",
157
+ "/ghost/",
158
+ "/content/images/",
159
+ "/assets/built/",
160
+ ],
161
+ scripts: [
162
+ "/assets/built/casper\\.js",
163
+ "/public/ghost-sdk\\.min\\.js",
164
+ ],
165
+ globals: ["ghost"],
166
+ headers: {
167
+ "x-ghost-cache-status": ".",
168
+ },
169
+ body: [
170
+ "ghost-post",
171
+ "ghost-page",
172
+ 'class="gh-',
173
+ ],
174
+ },
175
+ versionDetection: {
176
+ method: "meta generator tag",
177
+ pattern: "Ghost\\s+([\\d.]+)",
178
+ },
179
+ },
180
+ // ──────────────────────────────────────────────────
181
+ // TYPO3
182
+ // ──────────────────────────────────────────────────
183
+ {
184
+ name: "TYPO3",
185
+ category: "cms",
186
+ detection: {
187
+ meta: [
188
+ '<meta[^>]+name=["\']generator["\'][^>]+TYPO3',
189
+ ],
190
+ paths: [
191
+ "/typo3/",
192
+ "/typo3conf/",
193
+ "/typo3temp/",
194
+ "/fileadmin/",
195
+ "/uploads/",
196
+ ],
197
+ scripts: [
198
+ "/typo3conf/ext/",
199
+ "/typo3/sysext/",
200
+ ],
201
+ globals: ["TYPO3"],
202
+ headers: {},
203
+ body: [
204
+ "typo3temp",
205
+ "tx_[a-z]+",
206
+ ],
207
+ },
208
+ versionDetection: {
209
+ method: "meta generator tag or /typo3/index.php",
210
+ pattern: "TYPO3 CMS[\\sv]*(\\d+\\.\\d+\\.?\\d*)",
211
+ },
212
+ },
213
+ // ──────────────────────────────────────────────────
214
+ // Hugo
215
+ // ──────────────────────────────────────────────────
216
+ {
217
+ name: "Hugo",
218
+ category: "cms",
219
+ detection: {
220
+ meta: [
221
+ '<meta[^>]+name=["\']generator["\'][^>]+Hugo\\s+([\\d.]+)',
222
+ ],
223
+ paths: [],
224
+ body: [
225
+ "Powered by.*Hugo",
226
+ ],
227
+ },
228
+ versionDetection: {
229
+ method: "meta generator tag",
230
+ pattern: "Hugo\\s+([\\d.]+)",
231
+ },
232
+ },
233
+ // ──────────────────────────────────────────────────
234
+ // Gatsby
235
+ // ──────────────────────────────────────────────────
236
+ {
237
+ name: "Gatsby",
238
+ category: "cms",
239
+ detection: {
240
+ meta: [
241
+ '<meta[^>]+name=["\']generator["\'][^>]+Gatsby',
242
+ ],
243
+ paths: [
244
+ "/page-data/",
245
+ "/static/",
246
+ ],
247
+ scripts: [
248
+ "/commons-[a-f0-9]+\\.js",
249
+ "/app-[a-f0-9]+\\.js",
250
+ "/framework-[a-f0-9]+\\.js",
251
+ ],
252
+ globals: ["___gatsby", "___loader"],
253
+ body: [
254
+ "gatsby-image",
255
+ "gatsby-resp-image",
256
+ "id=\"___gatsby\"",
257
+ ],
258
+ },
259
+ versionDetection: {
260
+ method: "meta generator tag",
261
+ pattern: "Gatsby\\s+([\\d.]+)",
262
+ },
263
+ },
264
+ // ──────────────────────────────────────────────────
265
+ // Contentful (headless CMS)
266
+ // ──────────────────────────────────────────────────
267
+ {
268
+ name: "Contentful",
269
+ category: "cms",
270
+ detection: {
271
+ scripts: [
272
+ "contentful\\.com",
273
+ "cdn\\.contentful\\.com",
274
+ ],
275
+ body: [
276
+ "contentful",
277
+ ],
278
+ },
279
+ },
280
+ // ──────────────────────────────────────────────────
281
+ // Strapi
282
+ // ──────────────────────────────────────────────────
283
+ {
284
+ name: "Strapi",
285
+ category: "cms",
286
+ detection: {
287
+ paths: [
288
+ "/admin/",
289
+ "/api/",
290
+ "/uploads/",
291
+ ],
292
+ headers: {
293
+ "x-powered-by": "^Strapi",
294
+ },
295
+ },
296
+ },
297
+ // ──────────────────────────────────────────────────
298
+ // Sanity
299
+ // ──────────────────────────────────────────────────
300
+ {
301
+ name: "Sanity",
302
+ category: "cms",
303
+ detection: {
304
+ scripts: [
305
+ "cdn\\.sanity\\.io",
306
+ "sanity-client",
307
+ ],
308
+ body: [
309
+ "sanity\\.io",
310
+ ],
311
+ },
312
+ },
313
+ // ──────────────────────────────────────────────────
314
+ // Webflow
315
+ // ──────────────────────────────────────────────────
316
+ {
317
+ name: "Webflow",
318
+ category: "cms",
319
+ detection: {
320
+ meta: [
321
+ '<meta[^>]+name=["\']generator["\'][^>]+Webflow',
322
+ ],
323
+ scripts: [
324
+ "assets\\.website-files\\.com",
325
+ "webflow\\.js",
326
+ ],
327
+ globals: ["Webflow"],
328
+ body: [
329
+ "data-wf-domain",
330
+ "data-wf-page",
331
+ "data-wf-site",
332
+ "w-nav",
333
+ ],
334
+ },
335
+ },
336
+ // ──────────────────────────────────────────────────
337
+ // Squarespace
338
+ // ──────────────────────────────────────────────────
339
+ {
340
+ name: "Squarespace",
341
+ category: "cms",
342
+ detection: {
343
+ meta: [
344
+ '<meta[^>]+name=["\']generator["\'][^>]+Squarespace',
345
+ ],
346
+ scripts: [
347
+ "static\\d?\\.squarespace\\.com",
348
+ "squarespace\\.com/universal/scripts-compressed",
349
+ ],
350
+ globals: ["Static", "SQUARESPACE_ROLLUPS"],
351
+ body: [
352
+ "squarespace-headers",
353
+ "sqs-block",
354
+ ],
355
+ },
356
+ },
357
+ // ──────────────────────────────────────────────────
358
+ // Wix
359
+ // ──────────────────────────────────────────────────
360
+ {
361
+ name: "Wix",
362
+ category: "cms",
363
+ detection: {
364
+ meta: [
365
+ '<meta[^>]+name=["\']generator["\'][^>]+Wix\\.com',
366
+ ],
367
+ scripts: [
368
+ "static\\.parastorage\\.com",
369
+ "static\\.wixstatic\\.com",
370
+ ],
371
+ headers: {
372
+ "x-wix-request-id": ".",
373
+ },
374
+ body: [
375
+ "wixsite\\.com",
376
+ "_wix_browser_sess",
377
+ ],
378
+ },
379
+ },
380
+ // ══════════════════════════════════════════════════
381
+ // E-commerce Platforms
382
+ // ══════════════════════════════════════════════════
383
+ // ──────────────────────────────────────────────────
384
+ // Shopify
385
+ // ──────────────────────────────────────────────────
386
+ {
387
+ name: "Shopify",
388
+ category: "ecommerce",
389
+ detection: {
390
+ paths: [
391
+ "/collections/",
392
+ "/products/",
393
+ "/cart",
394
+ "/checkouts/",
395
+ "/admin/",
396
+ ],
397
+ scripts: [
398
+ "cdn\\.shopify\\.com",
399
+ "sdks\\.shopifycdn\\.com",
400
+ "Shopify\\.theme",
401
+ "Shopify\\.shop",
402
+ ],
403
+ globals: ["Shopify", "ShopifyAnalytics", "Shopify.theme"],
404
+ cookies: ["_shopify_s", "_shopify_y", "cart_sig"],
405
+ headers: {
406
+ "x-shopify-stage": ".",
407
+ "x-shopid": "^\\d+$",
408
+ "x-sorting-hat-podid": ".",
409
+ "x-shardid": ".",
410
+ },
411
+ body: [
412
+ "cdn\\.shopify\\.com/s/files/",
413
+ "shopify-section",
414
+ "Shopify\\.cdnHost",
415
+ ],
416
+ },
417
+ versionDetection: {
418
+ method: "Shopify.theme.schema_version global",
419
+ pattern: "Shopify\\.theme.*?schema_version.*?[\"'](\\d+\\.\\d+)[\"']",
420
+ },
421
+ },
422
+ // ──────────────────────────────────────────────────
423
+ // WooCommerce (WordPress plugin)
424
+ // ──────────────────────────────────────────────────
425
+ {
426
+ name: "WooCommerce",
427
+ category: "ecommerce",
428
+ detection: {
429
+ meta: [
430
+ '<meta[^>]+name=["\']generator["\'][^>]+WooCommerce\\s+([\\d.]+)',
431
+ ],
432
+ paths: [
433
+ "/wp-content/plugins/woocommerce/",
434
+ "/wc-api/",
435
+ "/shop/",
436
+ "/product-category/",
437
+ "/?wc-ajax=",
438
+ ],
439
+ scripts: [
440
+ "woocommerce",
441
+ "wc_add_to_cart_params",
442
+ "wc_cart_fragments_params",
443
+ "wc-blocks",
444
+ ],
445
+ globals: ["wc_add_to_cart_params", "wc_cart_fragments_params", "wc"],
446
+ cookies: [
447
+ "woocommerce_cart_hash",
448
+ "woocommerce_items_in_cart",
449
+ "wp_woocommerce_session_[a-f0-9]+",
450
+ ],
451
+ body: [
452
+ "woocommerce",
453
+ "wc-block-grid",
454
+ ],
455
+ },
456
+ versionDetection: {
457
+ method: "meta generator tag",
458
+ pattern: "WooCommerce\\s+([\\d.]+)",
459
+ },
460
+ },
461
+ // ──────────────────────────────────────────────────
462
+ // Magento / Adobe Commerce
463
+ // ──────────────────────────────────────────────────
464
+ {
465
+ name: "Magento",
466
+ category: "ecommerce",
467
+ detection: {
468
+ paths: [
469
+ "/checkout/cart/",
470
+ "/customer/account/login/",
471
+ "/catalog/product/",
472
+ "/catalogsearch/result/",
473
+ "/static/version",
474
+ "/pub/static/",
475
+ ],
476
+ scripts: [
477
+ "mage/requirejs/",
478
+ "requirejs/require\\.js",
479
+ "mage/cookies",
480
+ "Magento_Ui",
481
+ ],
482
+ globals: ["Mage", "require.config"],
483
+ cookies: [
484
+ "PHPSESSID",
485
+ "form_key",
486
+ "mage-cache-sessid",
487
+ "mage-cache-storage",
488
+ "mage-messages",
489
+ ],
490
+ headers: {
491
+ "x-magento-vary": ".",
492
+ "x-magento-cache-control": ".",
493
+ },
494
+ body: [
495
+ "Mage\\.Cookies",
496
+ "data-mage-init",
497
+ "mage/url",
498
+ ],
499
+ },
500
+ versionDetection: {
501
+ method: "version indicator in /magento_version or /pub/static/deployed_version.txt",
502
+ pattern: "Magento/([\\d.]+)",
503
+ },
504
+ },
505
+ // ──────────────────────────────────────────────────
506
+ // BigCommerce
507
+ // ──────────────────────────────────────────────────
508
+ {
509
+ name: "BigCommerce",
510
+ category: "ecommerce",
511
+ detection: {
512
+ paths: [
513
+ "/product/",
514
+ "/cart.php",
515
+ "/account.php",
516
+ ],
517
+ scripts: [
518
+ "cdn\\d+\\.bigcommerce\\.com",
519
+ "bigcommerce\\.com/s-[a-z0-9]+/",
520
+ ],
521
+ globals: ["BCData", "stencilBootstrap"],
522
+ cookies: [
523
+ "SHOP_SESSION_TOKEN",
524
+ "STORE_VISITOR",
525
+ "fornax_anonymousId",
526
+ ],
527
+ headers: {
528
+ "x-bc-store-version": ".",
529
+ },
530
+ body: [
531
+ "bigcommerce\\.com",
532
+ "data-content-region",
533
+ ],
534
+ },
535
+ },
536
+ // ──────────────────────────────────────────────────
537
+ // PrestaShop
538
+ // ──────────────────────────────────────────────────
539
+ {
540
+ name: "PrestaShop",
541
+ category: "ecommerce",
542
+ detection: {
543
+ meta: [
544
+ '<meta[^>]+name=["\']generator["\'][^>]+PrestaShop',
545
+ ],
546
+ paths: [
547
+ "/modules/",
548
+ "/themes/",
549
+ "/index.php?controller=",
550
+ "/en/cart",
551
+ ],
552
+ scripts: [
553
+ "prestashop",
554
+ "/js/jquery/plugins/",
555
+ ],
556
+ globals: ["prestashop"],
557
+ cookies: ["PrestaShop-[a-f0-9]+"],
558
+ body: [
559
+ "prestashop",
560
+ "id_product",
561
+ ],
562
+ },
563
+ versionDetection: {
564
+ method: "meta generator tag",
565
+ pattern: "PrestaShop\\s+([\\d.]+)",
566
+ },
567
+ },
568
+ // ──────────────────────────────────────────────────
569
+ // OpenCart
570
+ // ──────────────────────────────────────────────────
571
+ {
572
+ name: "OpenCart",
573
+ category: "ecommerce",
574
+ detection: {
575
+ paths: [
576
+ "/index.php?route=common/home",
577
+ "/index.php?route=checkout/cart",
578
+ "/index.php?route=account/login",
579
+ "/catalog/view/theme/",
580
+ ],
581
+ scripts: [
582
+ "catalog/view/javascript/",
583
+ ],
584
+ cookies: [
585
+ "OCSESSID",
586
+ "currency",
587
+ "language",
588
+ ],
589
+ body: [
590
+ "route=product/product",
591
+ "route=common/home",
592
+ ],
593
+ },
594
+ versionDetection: {
595
+ method: "admin footer or /admin/ login page source",
596
+ pattern: "OpenCart\\s+([\\d.]+)",
597
+ },
598
+ },
599
+ // ──────────────────────────────────────────────────
600
+ // Medusa.js
601
+ // ──────────────────────────────────────────────────
602
+ {
603
+ name: "Medusa",
604
+ category: "ecommerce",
605
+ detection: {
606
+ paths: [
607
+ "/store/products",
608
+ "/store/carts",
609
+ "/admin/products",
610
+ ],
611
+ headers: {
612
+ "x-medusa-version": ".",
613
+ },
614
+ },
615
+ },
616
+ // ──────────────────────────────────────────────────
617
+ // Saleor
618
+ // ──────────────────────────────────────────────────
619
+ {
620
+ name: "Saleor",
621
+ category: "ecommerce",
622
+ detection: {
623
+ paths: [
624
+ "/graphql/",
625
+ "/dashboard/",
626
+ ],
627
+ body: [
628
+ "saleor",
629
+ ],
630
+ },
631
+ },
632
+ // ══════════════════════════════════════════════════
633
+ // Backend Frameworks
634
+ // ══════════════════════════════════════════════════
635
+ // ──────────────────────────────────────────────────
636
+ // Spring Boot (Java)
637
+ // ──────────────────────────────────────────────────
638
+ {
639
+ name: "Spring Boot",
640
+ category: "framework",
641
+ detection: {
642
+ paths: [
643
+ "/actuator",
644
+ "/actuator/health",
645
+ "/actuator/info",
646
+ "/actuator/env",
647
+ "/error",
648
+ "/swagger-ui.html",
649
+ "/v3/api-docs",
650
+ ],
651
+ headers: {
652
+ "x-application-context": ".",
653
+ },
654
+ cookies: ["JSESSIONID"],
655
+ errorFormat: '\\{"timestamp":"[^"]+","status":\\d+,"error":"[^"]+","path":"[^"]+"\\}',
656
+ body: [
657
+ "Whitelabel Error Page",
658
+ "There was an unexpected error",
659
+ '"timestamp":.*"status":.*"error":',
660
+ ],
661
+ },
662
+ },
663
+ // ──────────────────────────────────────────────────
664
+ // Django (Python)
665
+ // ──────────────────────────────────────────────────
666
+ {
667
+ name: "Django",
668
+ category: "framework",
669
+ detection: {
670
+ paths: [
671
+ "/admin/",
672
+ "/admin/login/",
673
+ "/static/admin/",
674
+ ],
675
+ headers: {
676
+ "x-frame-options": "^DENY$",
677
+ },
678
+ cookies: ["csrftoken", "sessionid", "django_language"],
679
+ errorFormat: "You're seeing this error because you have.*DEBUG\\s*=\\s*True",
680
+ body: [
681
+ "csrfmiddlewaretoken",
682
+ "__admin_media_prefix__",
683
+ "djdt",
684
+ "django\\.contrib",
685
+ ],
686
+ },
687
+ },
688
+ // ──────────────────────────────────────────────────
689
+ // FastAPI (Python)
690
+ // ──────────────────────────────────────────────────
691
+ {
692
+ name: "FastAPI",
693
+ category: "framework",
694
+ detection: {
695
+ paths: [
696
+ "/docs",
697
+ "/redoc",
698
+ "/openapi.json",
699
+ ],
700
+ headers: {},
701
+ errorFormat: '\\{"detail":\\[?\\{"loc":\\[.*\\],"msg":".*","type":".*"\\}',
702
+ body: [
703
+ "FastAPI",
704
+ "Swagger UI",
705
+ '"openapi":"3\\.',
706
+ ],
707
+ },
708
+ },
709
+ // ──────────────────────────────────────────────────
710
+ // Flask (Python)
711
+ // ──────────────────────────────────────────────────
712
+ {
713
+ name: "Flask",
714
+ category: "framework",
715
+ detection: {
716
+ paths: [],
717
+ headers: {
718
+ server: "^Werkzeug",
719
+ },
720
+ cookies: ["session"],
721
+ errorFormat: "Traceback \\(most recent call last\\)",
722
+ body: [
723
+ "Werkzeug Debugger",
724
+ "werkzeug\\.debug",
725
+ ],
726
+ },
727
+ },
728
+ // ──────────────────────────────────────────────────
729
+ // Laravel (PHP)
730
+ // ──────────────────────────────────────────────────
731
+ {
732
+ name: "Laravel",
733
+ category: "framework",
734
+ detection: {
735
+ paths: [
736
+ "/login",
737
+ "/register",
738
+ "/password/reset",
739
+ "/api/",
740
+ "/storage/",
741
+ "/public/",
742
+ ],
743
+ headers: {
744
+ "set-cookie": "laravel_session=",
745
+ "x-powered-by": "^Laravel$",
746
+ },
747
+ cookies: [
748
+ "laravel_session",
749
+ "XSRF-TOKEN",
750
+ "laravel_token",
751
+ ],
752
+ errorFormat: "Whoops, looks like something went wrong",
753
+ body: [
754
+ "_token",
755
+ "laravel",
756
+ "Illuminate\\\\",
757
+ ],
758
+ },
759
+ },
760
+ // ──────────────────────────────────────────────────
761
+ // Ruby on Rails
762
+ // ──────────────────────────────────────────────────
763
+ {
764
+ name: "Ruby on Rails",
765
+ category: "framework",
766
+ detection: {
767
+ paths: [
768
+ "/rails/info",
769
+ "/rails/mailers",
770
+ ],
771
+ headers: {
772
+ "x-powered-by": "^Phusion Passenger",
773
+ "x-runtime": "^[\\d.]+$",
774
+ "x-request-id": "^[0-9a-f-]{36}$",
775
+ },
776
+ cookies: ["_[a-z]+_session"],
777
+ errorFormat: "ActionController::RoutingError",
778
+ body: [
779
+ "data-turbolinks",
780
+ "csrf-token",
781
+ 'name="csrf-param"',
782
+ "Rails\\.ajax",
783
+ ],
784
+ },
785
+ },
786
+ // ──────────────────────────────────────────────────
787
+ // Express.js (Node.js)
788
+ // ──────────────────────────────────────────────────
789
+ {
790
+ name: "Express.js",
791
+ category: "framework",
792
+ detection: {
793
+ headers: {
794
+ "x-powered-by": "^Express$",
795
+ },
796
+ errorFormat: "Cannot (GET|POST|PUT|DELETE|PATCH) /",
797
+ body: [],
798
+ },
799
+ },
800
+ // ──────────────────────────────────────────────────
801
+ // Koa.js (Node.js)
802
+ // ──────────────────────────────────────────────────
803
+ {
804
+ name: "Koa.js",
805
+ category: "framework",
806
+ detection: {
807
+ headers: {
808
+ "x-powered-by": "^koa$",
809
+ },
810
+ errorFormat: "Not Found",
811
+ },
812
+ },
813
+ // ──────────────────────────────────────────────────
814
+ // Hono (edge runtime)
815
+ // ──────────────────────────────────────────────────
816
+ {
817
+ name: "Hono",
818
+ category: "framework",
819
+ detection: {
820
+ headers: {
821
+ "x-powered-by": "^Hono$",
822
+ },
823
+ errorFormat: '\\{"message":"Not Found"\\}',
824
+ },
825
+ },
826
+ // ──────────────────────────────────────────────────
827
+ // NestJS (Node.js)
828
+ // ──────────────────────────────────────────────────
829
+ {
830
+ name: "NestJS",
831
+ category: "framework",
832
+ detection: {
833
+ headers: {
834
+ "x-powered-by": "^Express$",
835
+ },
836
+ errorFormat: '\\{"statusCode":\\d+,"message":".*","error":".*"\\}',
837
+ body: [],
838
+ },
839
+ },
840
+ // ──────────────────────────────────────────────────
841
+ // Gin (Go)
842
+ // ──────────────────────────────────────────────────
843
+ {
844
+ name: "Gin",
845
+ category: "framework",
846
+ detection: {
847
+ headers: {
848
+ "x-powered-by": "^go-gin$",
849
+ },
850
+ errorFormat: "404 page not found",
851
+ },
852
+ },
853
+ // ──────────────────────────────────────────────────
854
+ // Fiber (Go)
855
+ // ──────────────────────────────────────────────────
856
+ {
857
+ name: "Fiber",
858
+ category: "framework",
859
+ detection: {
860
+ headers: {
861
+ "x-powered-by": "^Fiber$",
862
+ },
863
+ errorFormat: "Cannot (GET|POST|PUT|DELETE|PATCH) /",
864
+ },
865
+ },
866
+ // ──────────────────────────────────────────────────
867
+ // Echo (Go)
868
+ // ──────────────────────────────────────────────────
869
+ {
870
+ name: "Echo",
871
+ category: "framework",
872
+ detection: {
873
+ headers: {},
874
+ errorFormat: '\\{"message":"Not Found"\\}',
875
+ },
876
+ },
877
+ // ──────────────────────────────────────────────────
878
+ // Chi (Go)
879
+ // ──────────────────────────────────────────────────
880
+ {
881
+ name: "Chi",
882
+ category: "framework",
883
+ detection: {
884
+ errorFormat: "404 page not found",
885
+ },
886
+ },
887
+ // ──────────────────────────────────────────────────
888
+ // ASP.NET / ASP.NET Core
889
+ // ──────────────────────────────────────────────────
890
+ {
891
+ name: "ASP.NET",
892
+ category: "framework",
893
+ detection: {
894
+ headers: {
895
+ "x-powered-by": "^ASP\\.NET$",
896
+ "x-aspnet-version": "^\\d+\\.\\d+",
897
+ "x-aspnetmvc-version": "^\\d+\\.\\d+",
898
+ },
899
+ cookies: [
900
+ "ASP\\.NET_SessionId",
901
+ "\\.AspNetCore\\.Session",
902
+ "\\.AspNetCore\\.Antiforgery\\.",
903
+ "__RequestVerificationToken",
904
+ ],
905
+ body: [
906
+ "__VIEWSTATE",
907
+ "__EVENTVALIDATION",
908
+ "aspnetForm",
909
+ ],
910
+ },
911
+ },
912
+ // ──────────────────────────────────────────────────
913
+ // Symfony (PHP)
914
+ // ──────────────────────────────────────────────────
915
+ {
916
+ name: "Symfony",
917
+ category: "framework",
918
+ detection: {
919
+ paths: [
920
+ "/_profiler/",
921
+ "/_wdt/",
922
+ "/bundles/",
923
+ ],
924
+ headers: {
925
+ "x-debug-token": ".",
926
+ "x-debug-token-link": "/_profiler/",
927
+ },
928
+ cookies: ["PHPSESSID"],
929
+ errorFormat: "Oops! An Error Occurred.*The server returned a",
930
+ body: [
931
+ "sf-toolbar",
932
+ "sf-dump",
933
+ "symfony",
934
+ ],
935
+ },
936
+ },
937
+ // ──────────────────────────────────────────────────
938
+ // CodeIgniter (PHP)
939
+ // ──────────────────────────────────────────────────
940
+ {
941
+ name: "CodeIgniter",
942
+ category: "framework",
943
+ detection: {
944
+ cookies: ["ci_session", "csrf_cookie_name"],
945
+ errorFormat: "A PHP Error was encountered",
946
+ body: [
947
+ "codeigniter",
948
+ ],
949
+ },
950
+ },
951
+ // ──────────────────────────────────────────────────
952
+ // CakePHP
953
+ // ──────────────────────────────────────────────────
954
+ {
955
+ name: "CakePHP",
956
+ category: "framework",
957
+ detection: {
958
+ cookies: ["CAKEPHP"],
959
+ errorFormat: "Missing Controller.*CakePHP",
960
+ body: [
961
+ "cakephp",
962
+ ],
963
+ },
964
+ },
965
+ // ──────────────────────────────────────────────────
966
+ // Phoenix (Elixir)
967
+ // ──────────────────────────────────────────────────
968
+ {
969
+ name: "Phoenix",
970
+ category: "framework",
971
+ detection: {
972
+ headers: {
973
+ server: "^Cowboy$",
974
+ "x-request-id": "^[A-Za-z0-9_-]+$",
975
+ },
976
+ cookies: ["_[a-z_]+_key"],
977
+ body: [
978
+ "phx-",
979
+ "phx:page-loading",
980
+ "data-phx-main",
981
+ "Phoenix\\.LiveView",
982
+ ],
983
+ },
984
+ },
985
+ // ──────────────────────────────────────────────────
986
+ // Rocket (Rust)
987
+ // ──────────────────────────────────────────────────
988
+ {
989
+ name: "Rocket",
990
+ category: "framework",
991
+ detection: {
992
+ headers: {
993
+ server: "^Rocket$",
994
+ },
995
+ errorFormat: "404 Not Found.*The requested resource could not be found",
996
+ },
997
+ },
998
+ // ──────────────────────────────────────────────────
999
+ // Actix Web (Rust)
1000
+ // ──────────────────────────────────────────────────
1001
+ {
1002
+ name: "Actix Web",
1003
+ category: "framework",
1004
+ detection: {
1005
+ errorFormat: "^$",
1006
+ },
1007
+ },
1008
+ // ──────────────────────────────────────────────────
1009
+ // Axum (Rust)
1010
+ // ──────────────────────────────────────────────────
1011
+ {
1012
+ name: "Axum",
1013
+ category: "framework",
1014
+ detection: {
1015
+ errorFormat: "^$",
1016
+ },
1017
+ },
1018
+ // ──────────────────────────────────────────────────
1019
+ // AdonisJS (Node.js)
1020
+ // ──────────────────────────────────────────────────
1021
+ {
1022
+ name: "AdonisJS",
1023
+ category: "framework",
1024
+ detection: {
1025
+ cookies: ["adonis-session", "adonis-session-values"],
1026
+ headers: {
1027
+ "x-powered-by": "^AdonisJS$",
1028
+ },
1029
+ errorFormat: '\\{"message":".*"\\}',
1030
+ },
1031
+ },
1032
+ // ──────────────────────────────────────────────────
1033
+ // Fastify (Node.js)
1034
+ // ──────────────────────────────────────────────────
1035
+ {
1036
+ name: "Fastify",
1037
+ category: "framework",
1038
+ detection: {
1039
+ headers: {},
1040
+ errorFormat: '\\{"message":"Route.*not found","error":"Not Found","statusCode":404\\}',
1041
+ },
1042
+ },
1043
+ // ──────────────────────────────────────────────────
1044
+ // Elysia (Bun)
1045
+ // ──────────────────────────────────────────────────
1046
+ {
1047
+ name: "Elysia",
1048
+ category: "framework",
1049
+ detection: {
1050
+ headers: {},
1051
+ errorFormat: "NOT_FOUND",
1052
+ },
1053
+ },
1054
+ // ──────────────────────────────────────────────────
1055
+ // Vapor (Swift)
1056
+ // ──────────────────────────────────────────────────
1057
+ {
1058
+ name: "Vapor",
1059
+ category: "framework",
1060
+ detection: {
1061
+ headers: {
1062
+ server: "^vapor$",
1063
+ },
1064
+ errorFormat: '\\{"error":true,"reason":"Not Found"\\}',
1065
+ },
1066
+ },
1067
+ // ──────────────────────────────────────────────────
1068
+ // Play Framework (Scala/Java)
1069
+ // ──────────────────────────────────────────────────
1070
+ {
1071
+ name: "Play Framework",
1072
+ category: "framework",
1073
+ detection: {
1074
+ cookies: ["PLAY_SESSION"],
1075
+ headers: {},
1076
+ errorFormat: "Action Not Found.*For request",
1077
+ body: [
1078
+ "play-",
1079
+ ],
1080
+ },
1081
+ },
1082
+ // ──────────────────────────────────────────────────
1083
+ // Ktor (Kotlin)
1084
+ // ──────────────────────────────────────────────────
1085
+ {
1086
+ name: "Ktor",
1087
+ category: "framework",
1088
+ detection: {
1089
+ headers: {
1090
+ server: "^ktor",
1091
+ },
1092
+ },
1093
+ },
1094
+ // ──────────────────────────────────────────────────
1095
+ // Micronaut (Java/Kotlin/Groovy)
1096
+ // ──────────────────────────────────────────────────
1097
+ {
1098
+ name: "Micronaut",
1099
+ category: "framework",
1100
+ detection: {
1101
+ errorFormat: '\\{"message":"Page Not Found","_links":\\{"self":\\{"href":".*"\\}\\}\\}',
1102
+ },
1103
+ },
1104
+ // ──────────────────────────────────────────────────
1105
+ // Quarkus (Java)
1106
+ // ──────────────────────────────────────────────────
1107
+ {
1108
+ name: "Quarkus",
1109
+ category: "framework",
1110
+ detection: {
1111
+ paths: [
1112
+ "/q/health",
1113
+ "/q/metrics",
1114
+ "/q/dev/",
1115
+ ],
1116
+ errorFormat: "RESTEASY.*could not find resource",
1117
+ },
1118
+ },
1119
+ // ──────────────────────────────────────────────────
1120
+ // Hapi.js (Node.js)
1121
+ // ──────────────────────────────────────────────────
1122
+ {
1123
+ name: "Hapi.js",
1124
+ category: "framework",
1125
+ detection: {
1126
+ errorFormat: '\\{"statusCode":404,"error":"Not Found","message":"Not Found"\\}',
1127
+ },
1128
+ },
1129
+ // ──────────────────────────────────────────────────
1130
+ // Sails.js (Node.js)
1131
+ // ──────────────────────────────────────────────────
1132
+ {
1133
+ name: "Sails.js",
1134
+ category: "framework",
1135
+ detection: {
1136
+ headers: {
1137
+ "x-powered-by": "^Sails$",
1138
+ },
1139
+ cookies: ["sails.sid"],
1140
+ },
1141
+ },
1142
+ ];
1143
+ //# sourceMappingURL=app-signatures.js.map