diff --git a/src/drivers/webextension/images/icons/6sense.svg b/src/drivers/webextension/images/icons/6sense.svg
new file mode 100644
index 000000000..d84b87cc3
--- /dev/null
+++ b/src/drivers/webextension/images/icons/6sense.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/drivers/webextension/images/icons/CallTrackingMetrics.svg b/src/drivers/webextension/images/icons/CallTrackingMetrics.svg
new file mode 100644
index 000000000..8c2cdd311
--- /dev/null
+++ b/src/drivers/webextension/images/icons/CallTrackingMetrics.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/drivers/webextension/images/icons/Hatena.svg b/src/drivers/webextension/images/icons/Hatena.svg
new file mode 100644
index 000000000..64e640f9a
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Hatena.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/drivers/webextension/images/icons/Hyva Themes.svg b/src/drivers/webextension/images/icons/Hyva Themes.svg
new file mode 100644
index 000000000..4bfcfe3df
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Hyva Themes.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/drivers/webextension/images/icons/Hyva.svg b/src/drivers/webextension/images/icons/Hyva.svg
deleted file mode 100644
index 6b35be07e..000000000
--- a/src/drivers/webextension/images/icons/Hyva.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/src/drivers/webextension/images/icons/Naive UI.svg b/src/drivers/webextension/images/icons/Naive UI.svg
new file mode 100644
index 000000000..890cbe51f
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Naive UI.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/drivers/webextension/images/icons/Shoefitr.io.svg b/src/drivers/webextension/images/icons/Shoefitr.io.svg
new file mode 100644
index 000000000..5d63a8804
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Shoefitr.io.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/drivers/webextension/images/icons/Ubiliz.svg b/src/drivers/webextension/images/icons/Ubiliz.svg
new file mode 100644
index 000000000..daf74411f
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Ubiliz.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/drivers/webextension/images/icons/Ubuntu.png b/src/drivers/webextension/images/icons/Ubuntu.png
deleted file mode 100644
index d47da3c61..000000000
Binary files a/src/drivers/webextension/images/icons/Ubuntu.png and /dev/null differ
diff --git a/src/drivers/webextension/images/icons/Ubuntu.svg b/src/drivers/webextension/images/icons/Ubuntu.svg
new file mode 100644
index 000000000..b4ede814f
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Ubuntu.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/drivers/webextension/images/icons/Upfluence.svg b/src/drivers/webextension/images/icons/Upfluence.svg
new file mode 100644
index 000000000..cf9b2f47a
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Upfluence.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js
index 200c80f83..db2aecaab 100644
--- a/src/drivers/webextension/js/driver.js
+++ b/src/drivers/webextension/js/driver.js
@@ -12,7 +12,9 @@ const {
} = Wappalyzer
const { agent, promisify, getOption, setOption, open, globEscape } = Utils
-const expiry = 1000 * 60 * 60 * 24
+const expiry = 1000 * 60 * 60 * 12
+
+const maxHostnames = 100
const hostnameIgnoreList =
/\b((local|dev(elop(ment)?)?|sandbox|stag(e|ing)?|preprod|production|preview|test(ing)?|[^a-z]demo(shop)?|cache)[.-]|dev\d|localhost|((wappalyzer|google|bing|baidu|microsoft|duckduckgo|facebook|adobe|twitter|reddit|yahoo|wikipedia|amazon|amazonaws|youtube|stackoverflow|github|stackexchange|w3schools|twitch)\.)|(live|office|herokuapp|shopifypreview)\.com|\.local|\.test|\.netlify\.app|web\.archive\.org|zoom\.us|^([0-9.]+|[\d.]+)$|^([a-f0-9:]+:+)+[a-f0-9]+$)/
@@ -593,18 +595,24 @@ const Driver = {
cache.language = cache.language || language
// Expire cache
- Driver.cache.hostnames = Object.keys(Driver.cache.hostnames).reduce(
- (hostnames, hostname) => {
+ Driver.cache.hostnames = Object.keys(Driver.cache.hostnames)
+ .sort((a, b) =>
+ Driver.cache.hostnames[a].dateTime > Driver.cache.hostnames[b].dateTime
+ ? -1
+ : 1
+ )
+ .reduce((hostnames, hostname) => {
const cache = Driver.cache.hostnames[hostname]
- if (cache.dateTime > Date.now() - expiry) {
+ if (
+ cache.dateTime > Date.now() - expiry &&
+ Object.keys(hostnames).length < maxHostnames
+ ) {
hostnames[hostname] = cache
}
return hostnames
- },
- {}
- )
+ }, {})
await setOption(
'hostnames',
@@ -905,7 +913,7 @@ const Driver = {
const url = `http${https ? 's' : ''}://${hostname}`
- if (!hostnameIgnoreList.test(hostname) && hits >= 3) {
+ if (!hostnameIgnoreList.test(hostname) && hits) {
urls[url] = urls[url] || {
technologies: resolve(detections).reduce(
(technologies, { name, confidence, version }) => {
@@ -939,7 +947,9 @@ const Driver = {
urls,
})
- await setOption('hostnames', (Driver.cache.hostnames = {}))
+ Object.keys(Driver.cache.hostnames).forEach((hostname) => {
+ Driver.cache.hostnames[hostname].hits = 0
+ })
Driver.lastPing = Date.now()
}
diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js
index ac582ef33..ba8b753da 100644
--- a/src/drivers/webextension/js/popup.js
+++ b/src/drivers/webextension/js/popup.js
@@ -565,6 +565,7 @@ const Popup = {
el.empty.classList.add('empty--hidden')
el.detections.classList.remove('detections--hidden')
+ el.issue.classList.remove('issue--hidden')
el.plusDownload.classList.remove('plus-download--hidden')
while (el.detections.firstChild) {
diff --git a/src/technologies/_.json b/src/technologies/_.json
index 5c6b6f191..fa0abe0f8 100644
--- a/src/technologies/_.json
+++ b/src/technologies/_.json
@@ -101,6 +101,7 @@
"scriptSrc": "4tellcdn\\.azureedge\\.net",
"website": "https://4-tell.com"
},
+
"51.LA": {
"cats": [
10
@@ -118,6 +119,25 @@
],
"website": "https://www.51.la"
},
+ "6sense": {
+ "cats": [
+ 32,
+ 76
+ ],
+ "description": "6sense is a B2B predictive intelligence platform for marketing and sales.",
+ "icon": "6sense.svg",
+ "headers": {
+ "Content-Security-Policy": "\\.6sc\\.co/"
+ },
+ "scriptSrc": "\\.6sc\\.co/",
+ "saas": true,
+ "pricing": [
+ "poa",
+ "high",
+ "recurring"
+ ],
+ "website": "https://6sense.com"
+ },
"8base": {
"cats": [
3,
diff --git a/src/technologies/c.json b/src/technologies/c.json
index 98657a8ac..934c58bdf 100644
--- a/src/technologies/c.json
+++ b/src/technologies/c.json
@@ -360,6 +360,23 @@
"saas": true,
"website": "https://www.callrail.com"
},
+ "CallTrackingMetrics": {
+ "cats": [
+ 10
+ ],
+ "description": "CallTrackingMetrics is a call tracking and marketing attribution solution for contact centers and agencies.",
+ "icon": "CallTrackingMetrics.svg",
+ "js": {
+ "__ctm_tracked_numbers": "",
+ "__ctm.numbers": ""
+ },
+ "pricing": [
+ "mid",
+ "recurring"
+ ],
+ "saas": true,
+ "website": "https://www.calltrackingmetrics.com"
+ },
"Callbell": {
"cats": [
52
@@ -1595,11 +1612,13 @@
32,
51
],
- "description": "Clickfunnels is an online sales funnel builder that helps businesses market, sell, and deliver their products online.",
+ "description": "ClickFunnels is an online sales funnel builder that helps businesses market, sell, and deliver their products online.",
"icon": "ClickFunnels.svg",
"js": {
"CFAppDomain": "app\\.clickfunnels\\.com",
- "CFSurveyParticipantID": ""
+ "CFSurveyParticipantID": "",
+ "cfAddPolyfill": "",
+ "ClickFunnels": ""
},
"meta": {
"cf:app_domain:": "app\\.clickfunnels\\.com"
diff --git a/src/technologies/g.json b/src/technologies/g.json
index 06cf70d19..5a1e9b14d 100644
--- a/src/technologies/g.json
+++ b/src/technologies/g.json
@@ -1872,6 +1872,18 @@
},
"website": "https://grandnode.com"
},
+ "Granim.js": {
+ "cats": [
+ 59
+ ],
+ "description": "Granim.js is a lightweight javascript library to create fluid and interactive gradients animations.",
+ "icon": "default.svg",
+ "js": {
+ "Granim": ""
+ },
+ "oss": true,
+ "website": "https://sarcadass.github.io/granim.js"
+ },
"GrapesJS": {
"cats": [
51,
diff --git a/src/technologies/h.json b/src/technologies/h.json
index 3ac043f0c..020a8beb7 100644
--- a/src/technologies/h.json
+++ b/src/technologies/h.json
@@ -353,6 +353,21 @@
"icon": "Haskell.png",
"website": "http://wiki.haskell.org/Haskell"
},
+ "Hatena Blog": {
+ "cats": [
+ 1,
+ 11
+ ],
+ "description": "Hatena Blog is one of the traditional blog platforms in Japan.",
+ "icon": "Hatena.svg",
+ "scriptSrc": "cdn\\.blog\\.st-hatena\\.com/",
+ "pricing": [
+ "freemium",
+ "low",
+ "recurring"
+ ],
+ "website": "https://hatenablog.com"
+ },
"HeadJS": {
"cats": [
59
@@ -1563,19 +1578,23 @@
"scriptSrc": "merchant\\.cdn\\.hoolah\\.co/",
"website": "https://www.hoolah.co"
},
- "hyva": {
+ "Hyva Themes": {
"cats": [
19
],
- "description": "Hyvä themes is a frontend for Magento 2.",
+ "description": "Hyva Themes is an optimised theme for Magento 2 which eliminated the third-party libraries and having only two dependencies Alpine.js and Tailwind CSS.",
"headers": {
"X-Built-With": "^Hyva Themes$"
},
- "icon": "Hyva.svg",
- "implies": "Magento\\;version:2",
+ "icon": "Hyva Themes.svg",
+ "implies": [
+ "Magento\\;version:2",
+ "Tailwind CSS",
+ "Alpine.js"
+ ],
"pricing": [
"onetime"
],
- "website": "https://hyva.io/"
+ "website": "https://hyva.io"
}
}
\ No newline at end of file
diff --git a/src/technologies/n.json b/src/technologies/n.json
index 91ecad20e..8caa14715 100644
--- a/src/technologies/n.json
+++ b/src/technologies/n.json
@@ -130,6 +130,26 @@
],
"website": "https://www.nagish.li"
},
+ "Naive UI": {
+ "cats": [
+ 66
+ ],
+ "description": "Naive UI is a Vue.js UI library written in TypeScript, offering more than 80 treeshakable components.",
+ "icon": "Naive UI.svg",
+ "implies": [
+ "Vue.js",
+ "TypeScript"
+ ],
+ "dom": {
+ "style[cssr-id^='n-']": {
+ "attributes": {
+ "cssr-id": "^n-[a-z-]+$\\;confidence:99"
+ }
+ }
+ },
+ "oss": true,
+ "website": "https://www.naiveui.com"
+ },
"Najva": {
"cats": [
32
diff --git a/src/technologies/s.json b/src/technologies/s.json
index 5f6ce7385..15802fa23 100644
--- a/src/technologies/s.json
+++ b/src/technologies/s.json
@@ -2009,6 +2009,21 @@
"saas": true,
"website": "https://www.shippypro.com"
},
+ "Shoefitr.io": {
+ "cats": [
+ 76
+ ],
+ "description": "Shoefitr.io is data-based shoe size advice service where we measure the length, width, ball, and instep.",
+ "icon": "Shoefitr.io.svg",
+ "dom":"a[href*='api.shoefitr.io/']",
+ "saas": true,
+ "pricing": [
+ "payg",
+ "high",
+ "recurring"
+ ],
+ "website": "https://www.shoefitr.io"
+ },
"Shogun": {
"cats": [
51
diff --git a/src/technologies/u.json b/src/technologies/u.json
index dfc809782..2ded1a2e5 100644
--- a/src/technologies/u.json
+++ b/src/technologies/u.json
@@ -123,6 +123,24 @@
"scriptSrc": "uc_cart/uc_cart_block\\.js",
"website": "http://www.ubercart.org"
},
+ "Ubiliz": {
+ "cats": [
+ 5,
+ 6
+ ],
+ "description": "Ubiliz is a gift voucher ecommerce solution.",
+ "icon": "Ubiliz.svg",
+ "js": {
+ "ubilizSettings": ""
+ },
+ "saas": true,
+ "pricing": [
+ "freemium",
+ "mid",
+ "recurring"
+ ],
+ "website": "https://www.ubiliz.com"
+ },
"Ubuntu": {
"cats": [
28
@@ -133,7 +151,7 @@
"Server": "Ubuntu",
"X-Powered-By": "Ubuntu"
},
- "icon": "Ubuntu.png",
+ "icon": "Ubuntu.svg",
"website": "http://www.ubuntu.com/server"
},
"Ueeshop": {
@@ -423,6 +441,19 @@
"scriptSrc": "www\\.upsellit\\.com/",
"website": "https://us.upsellit.com"
},
+ "Upfluence": {
+ "cats": [
+ 71
+ ],
+ "description": "Upfluence is the all-in-one affiliate and influencer marketing platform for ecommerce and direct-to-consumer brands.",
+ "icon": "Upfluence.svg",
+ "pricing": [
+ "poa"
+ ],
+ "saas": true,
+ "scriptSrc": "\\.upfluence\\.co/",
+ "website": "https://www.upfluence.com"
+ },
"Uploadcare": {
"cats": [
31
diff --git a/src/technologies/v.json b/src/technologies/v.json
index 8b77e9f6c..b2c0cbc97 100644
--- a/src/technologies/v.json
+++ b/src/technologies/v.json
@@ -293,6 +293,20 @@
"icon": "vercel.svg",
"website": "https://vercel.com"
},
+ "Vercel Analytics": {
+ "cats": [
+ 10
+ ],
+ "js": {
+ "va": ""
+ },
+ "scriptSrc": "/va/script\\.js",
+ "requires": [
+ "Vercel"
+ ],
+ "icon": "vercel.svg",
+ "website": "https://vercel.com/analytics"
+ },
"Verifone 2Checkout": {
"cats": [
41
@@ -1068,4 +1082,4 @@
},
"website": "http://vibecommerce.com.br"
}
-}
\ No newline at end of file
+}