dotvitals

Where every technology fingerprint came from

dotvitals identifies the software behind a site from141 fingerprints it wrote itself. Each one records the primary source it was written from, and this page is generated from those records — not from a summary of them — so you can check any single claim rather than take the promise on trust.

What a fingerprint is

A fingerprint is one observable thing in an HTTP response, plus the technology that thing implies, plus how much a match of it alone is worth. Nothing more. There is no JavaScript execution, no port scan and no crawl behind a technology result: one page is fetched, and the response is compared against the corpus below.

The kinds of signal a fingerprint can read, and how many read each
SignalFingerprintsWhat it reads
Response header value41A named header whose value matches a pattern. Often carries a version.
Response header present25The mere presence of a header only one vendor emits. No value is read.
Cookie name10The name of a cookie the site sets. The value is never inspected.
Generator meta tag18The content of <meta name="generator">, which is the site declaring itself.
Page body string47A string in the HTML, such as a script host. The weakest kind: a tutorial can quote it. Never reaches confirmed.

Cookie names are read; cookie values never are. A detection is always a read of what the site chose to disclose, never an inventory of what it runs, and a result that finds nothing is not a clean bill of health — a CDN that rewrites headers hides real technologies.

What we refuse to do

dotvitals does not use a third-party fingerprint dataset, and never has. Not as a source, not as a starting point, not as a reference to check a name against.

Fingerprint datasets dotvitals does not consult
DatasetLicence
Wappalyzer (the original dataset and its forks)GPL-3.0
enthec/webappanalyzerGPL-3.0
The HTTP Archive Wappalyzer forkGPL-3.0
WhatWebGPL-2.0
wappalyzergoMIT wrapper over a GPL dataset
BuiltWithproprietary, licensed per seat

The GPL ones are the reason the rule is written as "do not consult" rather than "do not copy". Rewriting or reformatting a GPL dataset still produces a derivative work of it: changing the form does not change the origin. A corpus assembled by paraphrasing someone else's regular expressions is that dataset wearing different punctuation, whatever the commit history says.

Writing our own is slower and the corpus is smaller than a mature dataset's. What it buys is that every detection can say which signal it came from and why that signal is trusted at the level it is — which is the whole content of this page, and is not something an imported list could support.

What provenance means here

Provenance is a required field of the fingerprint itself, not a document kept alongside it. A parallel document drifts; a required field cannot be omitted. Each record names a primary source — one of three things, and nothing else.

Primary source types, and how many fingerprints rest on each
Source typeFingerprintsWhat it means
Vendor documentation55The company that makes the product says in its own public documentation that the product emits this signal. The strongest source available, because it is the vendor describing its own behaviour.
Standards document0An RFC or a W3C/WHATWG specification defines the signal. Used where the signal is a standard mechanism rather than a product's own marker.
Direct observation86We fetched a named site on a named date and recorded the exact bytes it sent. Reproducible by anyone, and never enough on its own to reach confirmed.

Every record carries the source URL, the day it was read, and what that source states. A direct observation additionally carries the exact bytes we saw, so a reviewer can reproduce the finding instead of taking our word for it. All86of our 86 observations do.

A fingerprint without complete provenance fails the build. Not a review habit — a test. packages/technology/test/provenance.test.ts rejects a missing or non-HTTPS source URL, a missing or unparseable date, a placeholder description of what the source says, and an observation with no recorded bytes. It runs on every commit, and the reason it exists is that the only moment this rule is ever tested is the moment somebody adds a fingerprint in a hurry.

All 141 of the 141fingerprints shipping today carry a complete record. The same data generatesdocs/30-technology-fingerprint-provenance.md in the repository, and a second test fails if that file and this corpus disagree.

How confidence is priced

A detection is an inference from bytes a server chose to send, and some inferences are far weaker than others. The confidence attached to a fingerprint records what a match ofthat signal alone is worth, and it is never promoted: two low signals stay low.

Confidence levels and how many fingerprints hold each
ConfidenceFingerprintsWhat it means
confirmed15The vendor documents the signal and the signal names the product. No inference is involved.
high97A marker only one vendor emits, but which does not name the product.
medium24A marker the product emits which others plausibly emit too.
low5A build artefact or a widely copied convention. A hint, not an identification.

Two limits on confirmed follow from that, and both are counted off the corpus rather than promised:

  • An observation alone is never confirmed. A signal we saw on one live site is an inference by definition, however convincing it looked. Fingerprints that are confirmed on an observation alone:0.
  • A page-body match is never confirmed. A string in an HTML document is copyable, cacheable and frequently pasted into unrelated templates — a changelog can quote a vendor's script host without the site using the product. Confirmed body matches:0.

Both numbers are zero because the build refuses to let them be anything else. They are printed rather than asserted so you can check them against the table below, where every fingerprint's confidence, signal kind and source type are shown side by side.

The corpus: 141 fingerprints

Fingerprints by technology category
CategoryFingerprints
Web servers8
Reverse proxies4
CDNs15
Web application firewalls7
Content management systems23
Ecommerce platforms11
JavaScript frameworks and site generators26
Analytics14
Tag managers4
Language runtimes12
Hosting platforms17

Every fingerprint, with its evidence

One row per fingerprint: what we look at, what a match is worth, and the source that entitles us to say so. Open a category to read it. This is the part of the page that makes the rest checkable — if a claim above is wrong, it is wrong here first.

Analytics (14)

Adobe Analytics adobe-analytics-appmeasurement

Signal
page body matching \bAppMeasurement\.js
Confidence
high — AppMeasurement.js is the library Adobe documents for sending data to Adobe Analytics.
Source
Vendor documentation · https://experienceleague.adobe.com/en/docs/analytics/implementation/js/overview · read
What the source states
The implementation overview states that the AppMeasurement.js code "contains the libraries required to send data to Adobe" and should be added to the site template's head, with s.t() used to send the data.

Amplitude amplitude-cdn-script

Signal
page body matching cdn\.amplitude\.com\/script\/
Confidence
high — The browser SDK is loaded from Amplitude's own CDN host.
Source
Direct observation · https://amplitude.com/ · read
What the source states
The Amplitude home page loads its browser SDK from the vendor CDN.
Bytes observed
cdn.amplitude.com/script/e3e918f274fa30555c627abdb29840d5.

Cloudflare Web Analytics cloudflare-web-analytics-beacon

Signal
page body matching static\.cloudflareinsights\.com\/beacon\.min\.js
Confidence
high — The Cloudflare Web Analytics beacon is loaded from Cloudflare's own insights host.
Source
Vendor documentation · https://developers.cloudflare.com/web-analytics/get-started/web-analytics-spa/ · read
What the source states
The docs give `<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js" data-cf-beacon='{"token": "...", "spa": false}'></script>` and the equivalent `?token=…&spa=false` query-string form.

Fathom Analytics fathom-analytics-script

Signal
page body matching cdn\.usefathom\.com\/script\.js
Confidence
high — The script is loaded from Fathom's own CDN host, exactly as Fathom documents it.
Source
Vendor documentation · https://usefathom.com/docs/script/script · read
What the source states
The embed documentation gives `<script src="https://cdn.usefathom.com/script.js" data-site="ABCDEFG" defer></script>`.

Google Analytics 4 google-analytics-4-gtag

Signal
page body matching www\.googletagmanager\.com\/gtag\/js\?id=G-[A-Z0-9]{4,16}
Confidence
high — The documented Google tag snippet is loaded with a G- measurement ID, which is the GA4 identifier format.
Source
Vendor documentation · https://developers.google.com/tag-platform/gtagjs/install · read
What the source states
The install page gives `<script async src="https://www.googletagmanager.com/gtag/js?id=TAG_ID"></script>` followed by `gtag('config', 'TAG_ID')`, where TAG_ID is the Google tag identifier issued by products including Analytics.

Matomo matomo-paq-global

Signal
page body matching window\._paq\s{0,4}=
Confidence
high — Matomo's documented tracking code queues commands on a window._paq array.
Source
Vendor documentation · https://developer.matomo.org/guides/tracking-javascript-guide · read
What the source states
The standard tracking code begins `var _paq = window._paq = window._paq || [];` and pushes 'trackPageView' and 'enableLinkTracking'.

Matomo matomo-tracker-script

Signal
page body matching \/matomo\.js\b
Confidence
medium — Matomo's documented snippet loads its tracker from a matomo.js file on the Matomo host.
Source
Vendor documentation · https://developer.matomo.org/guides/tracking-javascript-guide · read
What the source states
The snippet sets `g.src=u+'matomo.js'` where u is the operator's own {$MATOMO_URL}, and posts events to matomo.php.

Mixpanel mixpanel-cdn-library

Signal
page body matching cdn\.mxpnl\.com\/libs\/mixpanel-
Confidence
high — The browser library is loaded from Mixpanel's own CDN under a path that names it.
Source
Direct observation · https://mixpanel.com/ · read
What the source states
The Mixpanel home page loads its own browser library from the vendor CDN.
Bytes observed
cdn.mxpnl.com/libs/mixpanel-

New Relic Browser new-relic-browser-agent

Signal
page body matching js-agent\.newrelic\.com\/
Confidence
high — The browser agent loader is served from New Relic's own agent host.
Source
Direct observation · https://newrelic.com/ · read
What the source states
The New Relic home page loads the browser agent and defines the NREUM bootstrap global.
Bytes observed
js-agent.newrelic.com

New Relic Browser new-relic-nreum-global

Signal
page body matching \bNREUM\b
Confidence
medium — The New Relic browser agent bootstraps itself through an NREUM global.
Source
Direct observation · https://newrelic.com/ · read
What the source states
The New Relic home page defines the agent's bootstrap global alongside the js-agent script.
Bytes observed
NREUM

PostHog posthog-ingestion-host

Signal
page body matching \.i\.posthog\.com\b
Confidence
high — The page points at PostHog's own ingestion host, which names the product.
Source
Vendor documentation · https://posthog.com/docs/libraries/js · read
What the source states
The install snippet calls posthog.init with `api_host: 'https://us.i.posthog.com'`, and the loader rewrites that host to `-assets.i.posthog.com` before appending /static/array.js.

PostHog posthog-init-call

Signal
page body matching posthog\.init\s{0,4}\(
Confidence
high — PostHog's documented snippet bootstraps the SDK with a posthog.init call.
Source
Vendor documentation · https://posthog.com/docs/libraries/js · read
What the source states
The recommended HTML snippet ends with `posthog.init('<ph_project_token>', { api_host: 'https://us.i.posthog.com', defaults: '2026-05-30' })`.

Segment segment-analytics-js

Signal
page body matching cdn\.segment\.com\/analytics\.js
Confidence
high — Analytics.js is loaded from Segment's own CDN host.
Source
Direct observation · https://segment.com/ · read
What the source states
The Segment home page loads Analytics.js from the vendor CDN.
Bytes observed
cdn.segment.com/analytics.js

Sentry sentry-browser-cdn

Signal
page body matching (?:js|browser)\.sentry-cdn\.com\/
Confidence
high — The SDK is loaded from Sentry's own CDN, which names the product.
Source
Vendor documentation · https://docs.sentry.io/platforms/javascript/install/loader/ · read
What the source states
The loader documentation gives `<script src="https://js.sentry-cdn.com/<your-public-key>.min.js" crossorigin="anonymous"></script>` and refers to the CDN bundles hosted at https://browser.sentry-cdn.com/.
CDNs (15)

Akamai akamai-ghost-server-header

Signal
response header server: ^AkamaiGHost
Confidence
high — AkamaiGHost is the Server value Akamai's edge ghost servers return.
Source
Direct observation · https://www.usbank.com/ · read
What the source states
An Akamai-delivered production site answers with a Server header naming Akamai's edge software. Several other large sites fetched the same day returned the identical value.
Bytes observed
server: AkamaiGHost

Akamai akamai-grn-header

Signal
presence of the response header akamai-grn
Confidence
high — Akamai-GRN carries Akamai's Global Request Number for a request.
Source
Vendor documentation · https://techdocs.akamai.com/property-mgr/docs/global-req-number · read
What the source states
The Global Request Number behaviour 'generates a unique identifier for each request on the Akamai edge network, for use in logging and debugging', in a format such as 0.05313217.1567801841.1457a3, and can be output as a response header named Akamai-GRN.

Akamai NetStorage akamai-netstorage-server-header

Signal
response header server: ^AkamaiNetStorage
Confidence
high — Akamai's NetStorage origin names itself in the Server header.
Source
Direct observation · https://www.microsoft.com/ · read
What the source states
A site served from Akamai NetStorage answers with a Server header naming that product rather than the edge ghost value.
Bytes observed
server: AkamaiNetStorage

Amazon CloudFront cloudfront-via-header

Signal
response header via: \.cloudfront\.net \(CloudFront\)
Confidence
confirmed — CloudFront rewrites Via to name itself and its distribution host.
Source
Vendor documentation · https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html · read
What the source states
'Via – CloudFront sets the value to the following in the response to the viewer: Via: {{http-version}} {{alphanumeric-string}}.cloudfront.net (CloudFront)', with the example 'Via: 1.1 1026589cc7887e7a0dc7827b4example.cloudfront.net (CloudFront)'.

Amazon CloudFront cloudfront-x-amz-cf-id

Signal
presence of the response header x-amz-cf-id
Confidence
high — X-Amz-Cf-Id is CloudFront's per-request identifier.
Source
Direct observation · https://aws.amazon.com/ · read
What the source states
A CloudFront-fronted host returns X-Amz-Cf-Id on the viewer response. AWS documents the same header on the request it forwards to the origin, describing it as 'an encrypted string that uniquely identifies the request'.
Bytes observed
x-amz-cf-id: WRhhsnjY4NLgfvVuVFdeu0AK9aS3uOOoyEYUtvhIcKuES-L5S_9tmA==

Amazon CloudFront cloudfront-x-amz-cf-pop

Signal
presence of the response header x-amz-cf-pop
Confidence
high — X-Amz-Cf-Pop names the CloudFront edge location that served the response.
Source
Direct observation · https://aws.amazon.com/ · read
What the source states
The same CloudFront-fronted response carries an edge-location code in X-Amz-Cf-Pop next to the CloudFront Via header.
Bytes observed
x-amz-cf-pop: VIE50-P3

Azure Front Door azure-front-door-x-azure-ref

Signal
presence of the response header x-azure-ref
Confidence
high — Azure Front Door attaches X-Azure-Ref to every response it serves.
Source
Vendor documentation · https://learn.microsoft.com/en-us/azure/frontdoor/front-door-http-headers-protocol · read
What the source states
Under 'From the Front Door to the client': 'Front Door also attaches the following headers to all responses to the client' — X-Azure-Ref, 'a unique reference string that identifies a request served by Front Door, which is critical for troubleshooting as it's used to search access logs.'

bunny.net bunnycdn-pullzone-header

Signal
presence of the response header cdn-pullzone
Confidence
high — cdn-pullzone identifies the bunny.net pull zone that served the response.
Source
Direct observation · https://bunny.net/ · read
What the source states
The response carries a family of CDN-* headers — cdn-pullzone, cdn-requestid, cdn-cache, cdn-edgestorageid — of which cdn-pullzone names the bunny.net pull zone id.
Bytes observed
cdn-pullzone: 876725

bunny.net bunnycdn-server-header

Signal
response header server: ^BunnyCDN
Confidence
high — bunny.net edge nodes name the product and the node in the Server header.
Source
Direct observation · https://bunny.net/ · read
What the source states
bunny.net's own site is delivered from its CDN and answers with a Server header of the form BunnyCDN-<pop>-<node>.
Bytes observed
server: BunnyCDN-BU1-717

Cloudflare cloudflare-cf-cache-status

Signal
presence of the response header cf-cache-status
Confidence
high — Cf-Cache-Status is Cloudflare's cache-outcome header.
Source
Vendor documentation · https://developers.cloudflare.com/fundamentals/reference/http-headers/ · read
What the source states
The page lists Cf-Cache-Status among the headers Cloudflare adds, noting that 'A list of all possible `Cf-Cache-Status` values is contained in Cloudflare cache responses.'

Cloudflare cloudflare-cf-ray

Signal
presence of the response header cf-ray
Confidence
high — Cf-Ray is Cloudflare's per-request identifier and is emitted by no one else.
Source
Vendor documentation · https://developers.cloudflare.com/fundamentals/reference/http-headers/ · read
What the source states
'The `Cf-Ray` header (otherwise known as a Ray ID) is a hashed value that encodes information about the data center and the visitor's request.'

Cloudflare cloudflare-server-header

Signal
response header server: ^cloudflare$
Confidence
high — Cloudflare's edge replaces the origin's Server header with its own name.
Source
Direct observation · https://www.cloudflare.com/ · read
What the source states
Cloudflare's own site, and every other Cloudflare-proxied host fetched on the same day, answered with a lower-case Server header containing exactly the product name.
Bytes observed
server: cloudflare

Fastly fastly-x-served-by

Signal
response header x-served-by: \bcache-[a-z0-9-]{4,40}-[A-Z]{3,4}\b
Confidence
high — Fastly names the delivering cache node in X-Served-By using its cache-POP format.
Source
Vendor documentation · https://www.fastly.com/documentation/reference/http/http-headers/X-Served-By/ · read
What the source states
Fastly sets this header on all responses it processes; it 'contains the identity of the cache server acting as the delivery node', in the form cache-{datacenter}{nodeid}-{datacenter}, and may list several entries separated by commas when shielding is in use.

Fastly fastly-x-timer

Signal
presence of the response header x-timer
Confidence
high — X-Timer is Fastly's edge timing header.
Source
Direct observation · https://www.fastly.com/ · read
What the source states
Fastly's own site returns an X-Timer header encoding start time and VCL segment durations, alongside X-Served-By and X-Cache.
Bytes observed
x-timer: S1789037489.110849,VS0,VE3

KeyCDN keycdn-server-header

Signal
response header server: ^keycdn$
Confidence
high — KeyCDN edge servers answer with the product name in the Server header.
Source
Direct observation · https://www.keycdn.com/ · read
What the source states
KeyCDN's own site answers from its CDN with a lower-case Server header containing exactly the product name, next to an x-edge-location header.
Bytes observed
server: keycdn
Content management systems (23)

Blogger blogger-generator-meta

Signal
<meta name="generator"> matching ^blogger\s*$
Confidence
high — Blogger-hosted blogs carry a fixed generator meta tag naming Blogger.
Source
Direct observation · https://opensource.googleblog.com/ · read
What the source states
A Blogger-hosted blog emits a single-quoted generator meta tag whose content is the literal string blogger.
Bytes observed
<meta content='blogger' name='generator'/>

Craft CMS craft-cms-powered-by-header

Signal
response header x-powered-by: (?:^|,\s*)Craft CMS\b
Confidence
confirmed — Craft CMS sends X-Powered-By: Craft CMS unless the site disables sendPoweredByHeader.
Source
Vendor documentation · https://craftcms.com/docs/5.x/reference/config/general.html · read
What the source states
The sendPoweredByHeader general config setting is documented as enabled by default and causes Craft to send an X-Powered-By header identifying Craft CMS; it can be disabled via config or the CRAFT_SEND_POWERED_BY_HEADER environment variable.

Discourse discourse-generator-meta

Signal
<meta name="generator"> matching ^Discourse\s+([0-9][0-9A-Za-z.-]{0,24})
Confidence
high — Discourse writes its name and running version into the generator meta tag.
Source
Direct observation · https://meta.discourse.org/ · read
What the source states
Discourse's own instance emits a generator meta tag naming Discourse, its version and the exact deployed commit.
Bytes observed
<meta name="generator" content="Discourse 2026.9.0-latest - https://github.com/discourse/discourse version a876083897d5366b7f6074e6aabff34c679ce6ae">

Discourse discourse-route-header

Signal
presence of the response header x-discourse-route
Confidence
high — X-Discourse-Route names the Rails route that served the page and is emitted only by Discourse.
Source
Direct observation · https://meta.discourse.org/ · read
What the source states
The response carries several X-Discourse-* headers describing the route, the crawler view and the cache result.
Bytes observed
x-discourse-route: list/latest

Drupal drupal-cache-header

Signal
presence of the response header x-drupal-cache
Confidence
high — X-Drupal-Cache is emitted by Drupal's internal page cache and by no other platform.
Source
Direct observation · https://www.drupal.org/ · read
What the source states
The response carries an X-Drupal-Cache header reporting the page cache result, and a companion X-Drupal-Dynamic-Cache header.
Bytes observed
x-drupal-cache: MISS

Drupal drupal-generator-meta

Signal
<meta name="generator"> matching ^Drupal\s+([0-9]{1,3}(?:\.[0-9]{1,4}){0,3})
Confidence
high — Drupal writes the same name-and-version string into the generator meta tag.
Source
Direct observation · https://new.drupal.org/ · read
What the source states
The page head carries a Generator meta tag with the same value as the header.
Bytes observed
<meta name="Generator" content="Drupal 11 (https://www.drupal.org)" />

Drupal drupal-x-generator-header

Signal
response header x-generator: ^Drupal\s+([0-9]{1,3}(?:\.[0-9]{1,4}){0,3})
Confidence
high — Drupal announces itself and its major version in the X-Generator response header.
Source
Direct observation · https://new.drupal.org/ · read
What the source states
The Drupal project's own site returns an X-Generator response header naming Drupal and its major version, alongside Drupal-specific cache headers.
Bytes observed
x-generator: Drupal 11 (https://www.drupal.org)

Duda duda-cdn-body

Signal
page body matching \/\/irp\.cdn-website\.com\/
Confidence
medium — Duda serves site media from its irp.cdn-website.com asset host.
Source
Direct observation · https://www.duda.co/ · read
What the source states
Duda's own site loads its media from the irp.cdn-website.com host.
Bytes observed
//irp.cdn-website.com/a8ff2f1c/dms3rep/multi/appfol

Framer framer-generator-meta

Signal
<meta name="generator"> matching ^Framer(?:\s+[0-9a-f]{6,40})?\s*$
Confidence
high — Framer-published sites carry a generator meta tag naming Framer and its build hash.
Source
Direct observation · https://www.framer.com/ · read
What the source states
The page head carries a Framer generator meta tag and the response Server header names Framer and the same build.
Bytes observed
<meta name="generator" content="Framer cd6e634">

Framer framer-server-header

Signal
response header server: ^Framer(?:\/[0-9a-f]{6,40})?\s*$
Confidence
high — Framer's hosting identifies itself in the Server header.
Source
Direct observation · https://www.framer.com/ · read
What the source states
The response Server header reads Framer followed by the build hash.
Bytes observed
server: Framer/bea9510

Ghost ghost-generator-meta

Signal
<meta name="generator"> matching ^Ghost(?:\s+([0-9]{1,3}(?:\.[0-9]{1,5}){0,3}))?\s*$
Confidence
high — Ghost's {{ghost_head}} helper writes the product name and version into the generator meta tag.
Source
Direct observation · https://www.404media.co/ · read
What the source states
A production Ghost publication emits a generator meta tag naming Ghost and its version.
Bytes observed
<meta name="generator" content="Ghost 6.63">

HubSpot CMS hubspot-generator-meta

Signal
<meta name="generator"> matching ^HubSpot\s*$
Confidence
high — Pages served by HubSpot CMS carry a fixed generator meta tag naming HubSpot.
Source
Direct observation · https://www.hubspot.com/ · read
What the source states
The response carries X-HS-* headers describing the HubSpot content object and a generator meta tag reading HubSpot.
Bytes observed
<meta name="generator" content="HubSpot">

HubSpot CMS hubspot-hub-id-header

Signal
presence of the response header x-hs-hub-id
Confidence
high — X-HS-Hub-Id identifies the HubSpot portal that served the page and is emitted only by HubSpot.
Source
Direct observation · https://www.hubspot.com/ · read
What the source states
The response carries X-HS-Hub-Id, X-HS-Portal-Id and X-HS-Content-Id headers identifying the HubSpot-hosted page.
Bytes observed
x-hs-hub-id: 53

Joomla! joomla-generator-meta

Signal
<meta name="generator"> matching ^Joomla!(?:\s|$)
Confidence
high — The default Joomla! template writes its product name into the generator meta tag.
Source
Direct observation · https://www.joomla.org/ · read
What the source states
The Joomla project's own site emits the stock generator meta tag with the default Joomla! string.
Bytes observed
<meta name="generator" content="Joomla! - Open Source Content Management">

MediaWiki mediawiki-generator-meta

Signal
<meta name="generator"> matching ^MediaWiki\s+([0-9][0-9A-Za-z.-]{0,24})
Confidence
high — MediaWiki writes its name and running version into the generator meta tag.
Source
Direct observation · https://www.mediawiki.org/wiki/MediaWiki · read
What the source states
The MediaWiki project wiki emits a generator meta tag naming MediaWiki and its exact deployed version.
Bytes observed
<meta name="generator" content="MediaWiki 1.47.0-wmf.18">

Squarespace squarespace-server-header

Signal
response header server: ^Squarespace\s*$
Confidence
high — Squarespace-hosted sites are served by an origin that identifies itself as Squarespace.
Source
Direct observation · https://www.squarespace.com/ · read
What the source states
The response Server header reads Squarespace and the platform sets its own SS_MID and crumb cookies.
Bytes observed
server: Squarespace

TYPO3 CMS typo3-generator-meta

Signal
<meta name="generator"> matching ^TYPO3\s+CMS(?:\s|$)
Confidence
high — TYPO3 emits a fixed generator meta tag naming the product.
Source
Direct observation · https://typo3.org/ · read
What the source states
The TYPO3 project site emits a generator meta tag reading TYPO3 CMS, with no version.
Bytes observed
<meta name="generator" content="TYPO3 CMS">

Webflow webflow-generator-meta

Signal
<meta name="generator"> matching ^Webflow\s*$
Confidence
high — Webflow-published sites carry a fixed generator meta tag naming Webflow.
Source
Direct observation · https://webflow.com/ · read
What the source states
The page head carries a generator meta tag reading Webflow (attributes in content-then-name order), alongside X-Wf-* response headers.
Bytes observed
<meta content="Webflow" name="generator"/>

Weebly weebly-cdn-body

Signal
page body matching \/\/cdn[0-9]{0,2}\.editmysite\.com\/
Confidence
medium — Weebly serves theme and site assets from its editmysite.com CDN.
Source
Direct observation · https://www.weebly.com/ · read
What the source states
Weebly's own site loads stylesheets and images from numbered cdn*.editmysite.com hosts.
Bytes observed
//cdn11.editmysite.com/css/landing-pages/home-com-fo

Wix wix-generator-meta

Signal
<meta name="generator"> matching ^Wix\.com Website Builder\s*$
Confidence
high — Wix-hosted sites carry a fixed generator meta tag naming the Wix website builder.
Source
Direct observation · https://www.wix.com/ · read
What the source states
The response declares itself a Wix site via an X-Meta-Site-Is-Wix-Site header and carries the stock Wix generator meta tag.
Bytes observed
<meta name="generator" content="Wix.com Website Builder"/>

Wix wix-site-header

Signal
presence of the response header x-wix-request-id
Confidence
high — Wix's edge tags every response it serves with its own request identifier header.
Source
Direct observation · https://www.wix.com/ · read
What the source states
The response carries an X-Wix-Request-Id header from the Wix edge, together with X-Meta-Site-Is-Wix-Site: 1.
Bytes observed
x-wix-request-id: 1789037535.664040910537532981

WordPress wordpress-generator-meta

Signal
<meta name="generator"> matching ^WordPress(?:\s+([0-9][0-9A-Za-z.-]{0,24}))?\s*$
Confidence
confirmed — WordPress writes its own name, and by default its version, into <meta name="generator">.
Source
Vendor documentation · https://developer.wordpress.org/reference/functions/wp_generator/ · read
What the source states
wp_generator() "Displays the XHTML generator that is generated on the wp_head hook", outputs a generator meta tag containing the WordPress version, and is removed with remove_action( 'wp_head', 'wp_generator' ).

WordPress wordpress-wp-content-path

Signal
page body matching \/wp-content\/(?:themes|plugins|uploads)\/
Confidence
medium — Asset URLs under the default wp-content layout that WordPress ships with.
Source
Vendor documentation · https://developer.wordpress.org/plugins/plugin-basics/determining-plugin-and-content-directories/ · read
What the source states
Plugins live in wp-content/plugins, themes in wp-content/themes and uploads in wp-content/uploads by default, but the handbook warns that users may place the wp-content directory anywhere and rename it, so the location must never be assumed.
Ecommerce platforms (11)

BigCommerce bigcommerce-cdn-body

Signal
page body matching \/\/cdn[0-9]{1,2}\.bigcommerce\.com\/
Confidence
high — BigCommerce Stencil storefronts serve theme assets and product images from cdn*.bigcommerce.com.
Source
Vendor documentation · https://docs.bigcommerce.com/developer/docs/storefront/catalyst/development/cdn-and-images · read
What the source states
BigCommerce's CDN and images documentation gives storefront image URLs in the form https://cdn11.bigcommerce.com/s-<store hash>/images/stencil/<size>/products/... and describes the {{cdn}} helper that produces them.

Ecwid ecwid-storefront-script

Signal
page body matching app\.ecwid\.com\/script\.js
Confidence
high — The Ecwid storefront widget is installed by loading app.ecwid.com/script.js with the store id.
Source
Vendor documentation · https://support.ecwid.com/hc/en-us/articles/115004678945-Ecwid-for-any-website · read
What the source states
Ecwid's installation instructions tell merchants to paste a snippet loading https://app.ecwid.com/script.js?STOREID&data_platform=code together with a my-store-STOREID container div.

Magento / Adobe Commerce magento-cache-debug-header

Signal
presence of the response header x-magento-cache-debug
Confidence
high — Adobe Commerce reports its full-page cache result in the X-Magento-Cache-Debug header.
Source
Vendor documentation · https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish-final · read
What the source states
Adobe's Varnish verification page lists the important response headers as X-Magento-Cache-Control, Age and "X-Magento-Cache-Debug: MISS", noting that "X-Magento-Cache-Debug: HIT" is also acceptable.

Salesforce B2C Commerce salesforce-commerce-static-url

Signal
page body matching \/on\/demandware\.static\/
Confidence
high — Static storefront assets on Salesforce B2C Commerce are served under /on/demandware.static/.
Source
Direct observation · https://www.columbia.com/ · read
What the source states
A production B2C Commerce storefront emits both the /on/demandware.store/Sites-<id>-Site/ controller form and /on/demandware.static/ asset URLs.
Bytes observed
/on/demandware.store/Sites-Columbia_US-Site/en_US/

Salesforce B2C Commerce salesforce-commerce-store-url

Signal
page body matching \/on\/demandware\.store\/Sites-[A-Za-z0-9_-]{1,60}-Site\/
Confidence
high — Salesforce B2C Commerce controller URLs use the /on/demandware.store/Sites-<id>-Site/ form.
Source
Vendor documentation · https://salesforcecommercecloud.github.io/b2c-dev-doc/docs/current/scriptapi/html/api/class_dw_web_URLUtils.html · read
What the source states
The URLUtils Script API reference states that url(), http(), https() and abs() generate a Commerce Cloud Digital URL of the form "/on/demandware.store/..." by default, and Salesforce's SFRA guide gives the example https://localhost/on/demandware.store/Sites-RefArch-Site/default/Hello-World.

Shopify shopify-cdn-body

Signal
page body matching \/\/cdn\.shopify\.com\/
Confidence
high — Shopify serves theme and storefront assets from its own cdn.shopify.com host.
Source
Vendor documentation · https://shopify.dev/docs/storefronts/themes/best-practices/performance/platform · read
What the source states
Shopify's theme performance guidance describes the Shopify CDN and tells theme developers "You don't need to hard-code the cdn.shopify.com domain in your theme", confirming cdn.shopify.com as the platform's asset host.

Shopify shopify-essential-cookie

Signal
a cookie whose name matches ^_shopify_essential$
Confidence
high — Shopify storefronts set the _shopify_essential session cookie on the first response.
Source
Direct observation · https://www.allbirds.com/ · read
What the source states
The storefront's first response sets _shopify_essential alongside Shopify's localization and cart_currency cookies.
Bytes observed
set-cookie: _shopify_essential=:AaCK8pljAAEA...:; Max-Age=31536000; Path=/; HttpOnly; Secure

Shopify shopify-shop-global

Signal
page body matching Shopify\.shop\s*=\s*"[A-Za-z0-9.-]{1,120}\.myshopify\.com"
Confidence
high — The storefront runtime assigns the shop's myshopify.com handle to the global Shopify.shop.
Source
Direct observation · https://www.allbirds.com/ · read
What the source states
A production Shopify storefront inlines a script that sets Shopify.shop to the store's myshopify.com handle, and loads storefront modules from cdn.shopify.com/shopifycloud/.
Bytes observed
Shopify.shop = "weareallbirds.myshopify.com"

Shopware shopware-cache-hash-cookie

Signal
a cookie whose name matches ^sw-cache-hash$
Confidence
high — Shopware's storefront HTTP cache sets the sw-cache-hash cookie to key the cached response.
Source
Vendor documentation · https://developer.shopware.com/docs/concepts/framework/http_cache.html · read
What the source states
Shopware's HTTP cache documentation describes sw-cache-hash as containing "the hash of all cache-relevant information (e.g. is the user logged-in, what tax state and what currency do they use, which cache-relevant rules have matched)".

Shopware shopware-states-cookie

Signal
a cookie whose name matches ^sw-states$
Confidence
high — Shopware sets the sw-states cookie to describe the session for cache invalidation.
Source
Vendor documentation · https://developer.shopware.com/docs/concepts/framework/http_cache.html · read
What the source states
The same page states that sw-states "describes the current session in simple tags like cart-filled and logged-in" and is matched against the sw-invalidation-states response header; it also notes the cookie is deprecated and will be removed in v6.8.0.0.

WooCommerce woocommerce-generator-meta

Signal
<meta name="generator"> matching ^WooCommerce\s+([0-9][0-9A-Za-z.-]{0,28})
Confidence
high — WooCommerce adds a second generator meta tag naming itself and its plugin version.
Source
Direct observation · https://woocommerce.com/ · read
What the source states
The page head carries two generator meta tags: one for WordPress and a second for WooCommerce with its plugin version.
Bytes observed
<meta name="generator" content="WooCommerce 11.2.0-dev.20260909" />
Hosting platforms (17)

Amazon S3 amazon-s3-server-header

Signal
response header server: ^AmazonS3$
Confidence
high — S3, including its static website endpoints, answers with server: AmazonS3.
Source
Direct observation · https://s3.amazonaws.com/ · read
What the source states
Both the S3 REST endpoint and the s3-website-us-east-1.amazonaws.com static hosting endpoint answered with a Server header containing exactly this value, next to x-amz-request-id.
Bytes observed
Server: AmazonS3

Fly.io fly-io-request-id

Signal
presence of the response header fly-request-id
Confidence
high — fly-request-id is the identifier Fly.io's proxy attaches to each response.
Source
Direct observation · https://fly.io/ · read
What the source states
The response carries a fly-request-id whose suffix is the Fly region that handled the request.
Bytes observed
fly-request-id: 01M25F409EK7HSPYM2N6C701DV-lhr

Fly.io fly-io-server-header

Signal
response header server: ^Fly\/
Confidence
high — Fly.io's proxy answers with a Server header naming Fly and its build.
Source
Direct observation · https://fly.io/ · read
What the source states
Fly.io's own site answers with a Server header of the form Fly/<build> (<date>), alongside a Via header naming fly.io.
Bytes observed
server: Fly/c06d5eb70e (2026-09-07)

GitHub Pages github-pages-request-id

Signal
presence of the response header x-github-request-id
Confidence
medium — x-github-request-id is emitted by GitHub's own frontends, Pages included.
Source
Direct observation · https://pages.github.com/ · read
What the source states
The Pages response carries a GitHub request identifier. GitHub's API and web frontends emit the same header, so this signal narrows the host to GitHub rather than to Pages specifically.
Bytes observed
x-github-request-id: E6B6:21BD69:14536CE:148F498:6AA28AAF

GitHub Pages github-pages-server-header

Signal
response header server: ^GitHub\.com$
Confidence
high — GitHub Pages sites answer with server: GitHub.com.
Source
Direct observation · https://pages.github.com/ · read
What the source states
The GitHub Pages project site answers with a Server header naming GitHub, alongside x-github-request-id and x-github-edge-region.
Bytes observed
server: GitHub.com

Google Cloud Storage google-cloud-storage-server-header

Signal
response header server: ^UploadServer$
Confidence
medium — Google Cloud Storage's frontend answers with the token UploadServer.
Source
Direct observation · https://storage.googleapis.com/ · read
What the source states
Requests to the Cloud Storage endpoint answered with this Server token; the same token appeared on a Google-hosted response carrying an x-guploader-uploadid header.
Bytes observed
server: UploadServer

Heroku heroku-spaces-router-via

Signal
response header via: \bspaces-router\b
Confidence
medium — Heroku's Private Spaces router inserts itself into the Via chain.
Source
Direct observation · https://status.heroku.com/ · read
What the source states
Heroku's own status site returns a Via chain whose first hop is the Heroku spaces router, ahead of a CloudFront hop.
Bytes observed
via: 1.1 spaces-router (fcf88487e179), 1.1 2d148e8afd5950255ce014a0e33236f4.cloudfront.net (CloudFront)

Kinsta kinsta-cache-header

Signal
presence of the response header x-kinsta-cache
Confidence
high — x-kinsta-cache reports the outcome of Kinsta's server-level page cache.
Source
Direct observation · https://kinsta.com/ · read
What the source states
Kinsta's own site returns a vendor-named cache-status header even though Cloudflare fronts it and owns the Server header.
Bytes observed
x-kinsta-cache: HIT

Netlify netlify-server-header

Signal
response header server: ^Netlify$
Confidence
high — Netlify's edge answers with the product name in the Server header.
Source
Direct observation · https://www.netlify.com/ · read
What the source states
Netlify's own site and app.netlify.com both answer with a Server header containing exactly the product name, alongside x-nf-request-id.
Bytes observed
server: Netlify

Netlify netlify-x-nf-request-id

Signal
presence of the response header x-nf-request-id
Confidence
high — x-nf-request-id is Netlify's per-request identifier.
Source
Direct observation · https://www.netlify.com/ · read
What the source states
Every Netlify-served response observed carried a ULID-shaped x-nf-request-id header; Netlify support asks site owners for this value when debugging.
Bytes observed
x-nf-request-id: 01M25F3DFHVEQ60SJ4K18VSHS8

Pantheon pantheon-styx-hostname

Signal
presence of the response header x-pantheon-styx-hostname
Confidence
high — Pantheon's Styx routing layer names itself and its host in a vendor-prefixed header.
Source
Direct observation · https://pantheon.io/ · read
What the source states
Pantheon's own site returns the hostname of the Styx router that handled the request, alongside an x-styx-req-id header.
Bytes observed
x-pantheon-styx-hostname: styx-us-a-54cd58dc45-mpd5h

Render render-origin-server-header

Signal
response header x-render-origin-server: ^Render$
Confidence
high — x-render-origin-server names Render as the origin behind the response.
Source
Direct observation · https://render.com/ · read
What the source states
The response identifies its origin platform by name in a vendor-prefixed header, even though a CDN sits in front and owns the Server header.
Bytes observed
x-render-origin-server: Render

Render render-rndr-id

Signal
presence of the response header rndr-id
Confidence
medium — rndr-id is the per-request identifier Render's edge adds.
Source
Direct observation · https://render.com/ · read
What the source states
Render's own site returns an rndr-id header together with x-render-origin-server: Render, which is what ties the abbreviated header name to the vendor.
Bytes observed
rndr-id: 5b169814-e841-4a42

Vercel vercel-server-header

Signal
response header server: ^Vercel$
Confidence
confirmed — Vercel documents that its deployments answer with server: Vercel.
Source
Vendor documentation · https://vercel.com/docs/headers/response-headers · read
What the source states
Under the heading '`server: Vercel`': 'Shows where the request came from. This header can be overridden by other proxies (e.g., Cloudflare).'

Vercel vercel-x-vercel-cache

Signal
presence of the response header x-vercel-cache
Confidence
high — x-vercel-cache reports the cache outcome from Vercel's CDN.
Source
Vendor documentation · https://vercel.com/docs/headers/response-headers · read
What the source states
'The `x-vercel-cache` header indicates the cache status of static assets and responses from Vercel's CDN', with the documented values HIT, MISS, STALE, PRERENDER, REVALIDATED and BYPASS.

Vercel vercel-x-vercel-id

Signal
presence of the response header x-vercel-id
Confidence
high — x-vercel-id records the Vercel regions a request passed through.
Source
Vendor documentation · https://vercel.com/docs/headers/response-headers · read
What the source states
'This header contains a list of Vercel regions your request hit, as well as the region the function was executed in (for both Edge and Serverless).'

WP Engine wp-engine-powered-by

Signal
response header x-powered-by: ^WP Engine
Confidence
medium — WP Engine names itself in X-Powered-By on the platforms it serves.
Source
Direct observation · https://wpengine.com/ · read
What the source states
WP Engine's own site returns an X-Powered-By header naming the vendor's headless platform.
Bytes observed
x-powered-by: WP Engine Headless Platform
JavaScript frameworks and site generators (26)

Alpine.js alpinejs-cdn-script

Signal
page body matching cdn\.jsdelivr\.net\/npm\/alpinejs@(\d{1,2}(?:\.\d{1,4}){0,2})
Confidence
high — Alpine.js documents this CDN URL as its installation snippet.
Source
Vendor documentation · https://alpinejs.dev/essentials/installation · read
What the source states
The installation page gives `<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>` and advises hardcoding a version in production.

Alpine.js alpinejs-x-data-attribute

Signal
page body matching \sx-data\s{0,4}=
Confidence
medium — Alpine.js requires an x-data attribute to initialise any component.
Source
Vendor documentation · https://alpinejs.dev/essentials/installation · read
What the source states
"you will still need to define a component with x-data in order for any Alpine.js attributes to work".

Angular angular-ng-version

Signal
page body matching \sng-version="(\d{1,3}(?:\.\d{1,5}){0,3})
Confidence
medium — Angular stamps the framework version onto the application root element as ng-version.
Source
Direct observation · https://angular.dev/ · read
What the source states
The Angular project home page carries ng-version, ng-app-id and ng-server-context attributes on its root element.
Bytes observed
ng-version="22.1.6+sha-da8dac6"

Angular angular-server-context

Signal
page body matching \sng-server-context="
Confidence
medium — Angular's server-side rendering marks the rendered root with ng-server-context.
Source
Direct observation · https://angular.dev/ · read
What the source states
The Angular project home page is prerendered and marks the root element accordingly.
Bytes observed
ng-server-context="ssg"

Astro astro-meta-generator

Signal
<meta name="generator"> matching ^Astro(?:\s+v?(\d{1,3}(?:\.\d{1,5}){0,3}))?
Confidence
confirmed — Astro documents the generator string it produces, and the string names Astro and its version.
Source
Vendor documentation · https://docs.astro.build/en/reference/api-reference/ · read
What the source states
"generator provides the current version of Astro your project is running. This is a convenient way to add a <meta name="generator"> tag with your current version of Astro. It follows the format "Astro v5.x.x"." The docs show `<meta name="generator" content={Astro.generator} />`.

Astro astro-scoped-style-attribute

Signal
page body matching \sdata-astro-cid-[0-9a-z]{4,16}
Confidence
low — Astro's scoped styles add a data-astro-cid-* attribute to component elements.
Source
Direct observation · https://astro.build/ · read
What the source states
The Astro project home page, which also declares Astro in its generator meta tag, carries data-astro-cid-* attributes.
Bytes observed
data-astro-cid

Docusaurus docusaurus-meta-generator

Signal
<meta name="generator"> matching ^Docusaurus\s+v(\d{1,3}(?:\.\d{1,5}){0,3})
Confidence
high — The page declares Docusaurus and its version in its own generator meta tag.
Source
Direct observation · https://docusaurus.io/ · read
What the source states
The Docusaurus project home page declares itself in a generator meta tag.
Bytes observed
<meta name="generator" content="Docusaurus v3.10.1">

Eleventy eleventy-meta-generator

Signal
<meta name="generator"> matching ^Eleventy(?:[^\d]{0,40}v(\d{1,3}(?:\.\d{1,5}){0,3}))?
Confidence
high — The page declares Eleventy in its own generator meta tag.
Source
Direct observation · https://www.11ty.dev/ · read
What the source states
The Eleventy project home page declares itself in a generator meta tag, with a site-customised label between the product name and the version.
Bytes observed
<meta name="generator" content="Eleventy (Build Awesome) v4.0.0" />

Gatsby gatsby-chunk-mapping-global

Signal
page body matching window\.___chunkMapping
Confidence
medium — Gatsby's webpack runtime publishes its chunk map as window.___chunkMapping.
Source
Direct observation · https://www.gatsbyjs.com/ · read
What the source states
The Gatsby project site defines the chunk-mapping global alongside the ___gatsby mount element.
Bytes observed
window.___chunkMapping

Gatsby gatsby-root-element

Signal
page body matching id="___gatsby"
Confidence
high — Gatsby mounts the application into an element with id ___gatsby, which names the framework.
Source
Direct observation · https://www.gatsbyjs.com/ · read
What the source states
The Gatsby project site renders its application into the ___gatsby mount element and defines window.___chunkMapping.
Bytes observed
id="___gatsby"

htmx htmx-cdn-script

Signal
page body matching cdn\.jsdelivr\.net\/npm\/htmx\.org@(\d{1,2}(?:\.\d{1,4}){0,2})
Confidence
high — htmx documents this CDN URL as the fastest way to install it.
Source
Vendor documentation · https://htmx.org/docs/ · read
What the source states
"The fastest way to get going with htmx is to load it via a CDN. You can simply add this to your head tag and get going: <script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.10/dist/htmx.min.js">".

htmx htmx-hx-attributes

Signal
page body matching \shx-(?:get|post|put|patch|delete|boost|swap|target|trigger)\s{0,4}=
Confidence
high — htmx drives requests entirely from its documented hx-* attribute namespace.
Source
Vendor documentation · https://htmx.org/docs/ · read
What the source states
The docs define hx-get, which "issues a GET request to the given URL", and hx-post, which "issues a POST request to the given URL", as the core AJAX attributes.

Hugo hugo-meta-generator

Signal
<meta name="generator"> matching ^Hugo\s+v?(\d{1,3}(?:\.\d{1,5}){0,3})
Confidence
confirmed — Hugo's own generator function emits this self-declaration, naming Hugo and its version.
Source
Vendor documentation · https://gohugo.io/functions/hugo/generator/ · read
What the source states
hugo.Generator "Renders an HTML meta element identifying the software that generated the site", with the example output `<meta name="generator" content="Hugo 0.166.0">`.

Jekyll jekyll-meta-generator

Signal
<meta name="generator"> matching ^Jekyll\s+v(\d{1,3}(?:\.\d{1,5}){0,3})
Confidence
high — The page declares Jekyll and its version in its own generator meta tag.
Source
Direct observation · https://jekyllrb.com/ · read
What the source states
The Jekyll project home page declares itself in a generator meta tag.
Bytes observed
<meta name="generator" content="Jekyll v4.4.1" />

jQuery jquery-official-cdn

Signal
page body matching code\.jquery\.com\/jquery-(\d{1,2}(?:\.\d{1,3}){0,2})(?:\.slim)?(?:\.min)?\.js
Confidence
high — The script is loaded from jQuery's own CDN, which names both the library and its version.
Source
Vendor documentation · https://releases.jquery.com/jquery/ · read
What the source states
The official release listing publishes CDN URLs of the form https://code.jquery.com/jquery-3.7.1.min.js and https://code.jquery.com/jquery-3.7.1.slim.min.js.

jQuery jquery-script-filename

Signal
page body matching \bjquery(?:-(\d{1,2}(?:\.\d{1,3}){0,2}))?(?:\.slim)?(?:\.min)?\.js
Confidence
low — A script named jquery*.js is loaded, which is the conventional filename for the library.
Source
Vendor documentation · https://releases.jquery.com/jquery/ · read
What the source states
The official release listing names the distributed files jquery-<version>.js, jquery-<version>.min.js and jquery-<version>.slim.min.js; those filenames are commonly self-hosted.

Next.js nextjs-flight-payload-global

Signal
page body matching __next_f\b
Confidence
medium — The App Router streams its server payload into a __next_f buffer.
Source
Direct observation · https://nextjs.org/ · read
What the source states
The Next.js home page, which the header observation above also identifies as Next.js, contains the __next_f streaming buffer in inline scripts.
Bytes observed
__next_f

Next.js nextjs-powered-by

Signal
response header x-powered-by: ^Next\.js$
Confidence
confirmed — Next.js adds this header by default and names itself in the value.
Source
Vendor documentation · https://nextjs.org/docs/app/api-reference/config/next-config-js/poweredByHeader · read
What the source states
"By default Next.js will add the `x-powered-by` header. To opt-out of it, open next.config.js and disable the poweredByHeader config."

Next.js nextjs-static-asset-path

Signal
page body matching \/_next\/static\/
Confidence
high — Next.js serves its build output from the /_next/static path.
Source
Vendor documentation · https://nextjs.org/docs/app/api-reference/config/next-config-js/assetPrefix · read
What the source states
"Next.js will automatically use your asset prefix for the JavaScript and CSS files it loads from the /_next/ path (.next/static/ folder)", with the example request path /_next/static/chunks/….js

Nuxt nuxt-build-asset-path

Signal
page body matching \/_nuxt\/
Confidence
low — Nuxt's default build directory is served from /_nuxt/.
Source
Direct observation · https://nuxt.com/ · read
What the source states
The Nuxt project home page loads its bundles from the /_nuxt/ path.
Bytes observed
/_nuxt/

Nuxt nuxt-hydration-global

Signal
page body matching window\.__NUXT__
Confidence
high — Nuxt serialises its hydration payload into a window.__NUXT__ global that names the framework.
Source
Direct observation · https://nuxt.com/ · read
What the source states
The Nuxt project home page emits the hydration global and the __NUXT_DATA__ payload script.
Bytes observed
window.__NUXT__

Nuxt nuxt-root-element

Signal
page body matching id="__nuxt"
Confidence
medium — Nuxt mounts the application into an element with id __nuxt.
Source
Direct observation · https://nuxt.com/ · read
What the source states
The Nuxt project home page wraps its application in the __nuxt mount element.
Bytes observed
id="__nuxt"

Qwik qwik-container-attribute

Signal
page body matching \sq:container\s{0,4}=
Confidence
medium — Qwik marks the resumable container root with a q:container attribute.
Source
Direct observation · https://qwik.dev/ · read
What the source states
The Qwik project home page carries q:container and q:base attributes on its container element.
Bytes observed
q:container

SvelteKit sveltekit-immutable-asset-path

Signal
page body matching \/_app\/immutable\/
Confidence
low — SvelteKit's build places content-hashed assets under /_app/immutable/.
Source
Direct observation · https://svelte.dev/ · read
What the source states
The Svelte project site loads its bundles from /_app/immutable/ and defines a __sveltekit_* bootstrap global.
Bytes observed
/_app/immutable/

SvelteKit sveltekit-preload-data-attribute

Signal
page body matching data-sveltekit-preload-data
Confidence
high — SvelteKit documents this link option, and the attribute name spells out the framework.
Source
Vendor documentation · https://svelte.dev/docs/kit/link-options · read
What the source states
The link options page documents `data-sveltekit-preload-data` with the values "hover" ("preloading will start if the mouse comes to a rest over a link") and "tap".

Vue.js vue-scoped-style-attribute

Signal
page body matching \sdata-v-[0-9a-f]{6,10}\b
Confidence
low — Vue's scoped single-file-component styles add a data-v-* attribute to elements.
Source
Vendor documentation · https://vuejs.org/api/sfc-css-features.html · read
What the source states
The SFC CSS features page shows `<style scoped>` transformed by PostCSS so that `<div class="example">hi</div>` becomes `<div class="example" data-v-f3f3eg9>hi</div>`.
Language runtimes (12)

ASP.NET aspnet-powered-by

Signal
response header x-powered-by: ^ASP\.NET$
Confidence
high — The server names ASP.NET in its X-Powered-By header.
Source
Direct observation · https://www.iis.net/ · read
What the source states
The IIS project site returns the ASP.NET powered-by header alongside X-AspNet-Version and X-AspNetMvc-Version. The same header was observed on https://dotnet.microsoft.com/ on the same date.
Bytes observed
x-powered-by: ASP.NET

ASP.NET aspnet-session-cookie

Signal
a cookie whose name matches ^ASP\.NET_SessionId$
Confidence
confirmed — ASP.NET_SessionId is the documented default session cookie name and names the framework.
Source
Vendor documentation · https://learn.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiename · read
What the source states
SessionStateSection.CookieName is declared `[ConfigurationProperty("cookieName", DefaultValue="ASP.NET_SessionId")]`, and the Remarks state "The default value is \"ASP.NET_SessionId\"".

ASP.NET aspnet-version-header

Signal
response header x-aspnet-version: ^(\d{1,2}(?:\.\d{1,6}){0,3})$
Confidence
high — The X-AspNet-Version header is emitted by the ASP.NET runtime and carries its version.
Source
Direct observation · https://www.iis.net/ · read
What the source states
The IIS project site returns the ASP.NET runtime version header.
Bytes observed
x-aspnet-version: 4.0.30319

ASP.NET MVC aspnet-mvc-version-header

Signal
response header x-aspnetmvc-version: ^(\d{1,2}(?:\.\d{1,4}){0,2})$
Confidence
high — The X-AspNetMvc-Version header is emitted by the ASP.NET MVC framework and carries its version.
Source
Direct observation · https://www.iis.net/ · read
What the source states
The IIS project site returns the ASP.NET MVC version header.
Bytes observed
x-aspnetmvc-version: 5.3

Django django-csrf-cookie

Signal
a cookie whose name matches ^csrftoken$
Confidence
high — csrftoken is Django's documented default CSRF cookie name.
Source
Vendor documentation · https://docs.djangoproject.com/en/5.2/ref/settings/ · read
What the source states
CSRF_COOKIE_NAME has "Default: 'csrftoken'" — "The name of the cookie to use for the CSRF authentication token."

Express express-powered-by

Signal
response header x-powered-by: ^Express$
Confidence
confirmed — Express sends this header by default and names itself in the value.
Source
Vendor documentation · https://expressjs.com/en/advanced/best-practice-security.html · read
What the source states
"By default, Express sends the X-Powered-By response header that you can disable using the app.disable() method", shown as `app.disable('x-powered-by')`.

Java Servlet container servlet-container-jsessionid

Signal
a cookie whose name matches ^JSESSIONID$
Confidence
high — JSESSIONID is the servlet platform's fallback session cookie name, shared by Tomcat, Jetty and other containers.
Source
Vendor documentation · https://tomcat.apache.org/tomcat-10.1-doc/config/context.html · read
What the source states
sessionCookieName is "The name to be used for all session cookies created for this context… If not set, the value specified by the web application, if any, will be used, or the name JSESSIONID if the web application does not explicitly set one."

Laravel laravel-xsrf-token-cookie

Signal
a cookie whose name matches ^XSRF-TOKEN$
Confidence
medium — Laravel sets an encrypted XSRF-TOKEN cookie on every response it generates.
Source
Vendor documentation · https://laravel.com/docs/12.x/csrf · read
What the source states
"Laravel stores the current CSRF token in an encrypted XSRF-TOKEN cookie that is included with each response generated by the framework… some JavaScript frameworks and libraries, like Angular and Axios, automatically place its value in the X-XSRF-TOKEN header."

Perl perl-server-header

Signal
response header server: \bPerl\b
Confidence
high — The server names Perl in its Server header.
Source
Direct observation · https://www.perl.org/ · read
What the source states
The Perl project site advertises its Plack-based Perl application server in the Server header.
Bytes observed
server: Combust/Plack (Perl)

PHP php-powered-by

Signal
response header x-powered-by: ^PHP\/(\d{1,2}(?:\.\d{1,4}){0,3})
Confidence
confirmed — PHP names itself and its version in this header whenever expose_php is left at its default.
Source
Vendor documentation · https://www.php.net/manual/en/ini.core.php · read
What the source states
expose_php "Exposes to the world that PHP is installed on the server, which includes the PHP version within the HTTP header (e.g., X-Powered-By: PHP/5.3.7)", with a documented default of "1".

PHP php-session-cookie

Signal
a cookie whose name matches ^PHPSESSID$
Confidence
high — PHPSESSID is PHP's documented default session cookie name.
Source
Vendor documentation · https://php.net/manual/en/session.configuration.php · read
What the source states
"session.name specifies the name of the session which is used as cookie name. It should only contain alphanumeric characters. Defaults to PHPSESSID."

Ruby on Rails rails-x-runtime

Signal
response header x-runtime: ^\d{1,6}(?:\.\d{1,9})?$
Confidence
medium — Rails includes Rack::Runtime in its default middleware stack, which sets X-Runtime to the request duration.
Source
Vendor documentation · https://guides.rubyonrails.org/rails_on_rack.html · read
What the source states
The internal middleware stack lists Rack::Runtime, which "Sets an X-Runtime header, containing the time (in seconds) taken to execute the request."
Reverse proxies (4)

AWS Elastic Load Balancing aws-elb-server-header

Signal
response header server: ^awselb(?:\/(\d{1,3}(?:\.\d{1,3}){0,2}))?
Confidence
confirmed — An Application Load Balancer adds server:awselb/2.0 to responses unless the operator disables it.
Source
Vendor documentation · https://docs.aws.amazon.com/elasticloadbalancing/latest/application/header-modification.html · read
What the source states
'Using disable headers, you can configure your Application Load Balancer to disable the `server:awselb/2.0` header from the responses.' The controlling attribute is routing.http.response.server.enabled, whose default value is true.

Envoy envoy-server-header

Signal
response header server: ^envoy$
Confidence
confirmed — Envoy's HTTP connection manager writes 'envoy' to the Server header by default.
Source
Vendor documentation · https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto · read
What the source states
server_name is 'An optional override that the connection manager will write to the server header in responses. If not set, the default is `envoy`.'

Varnish varnish-server-header

Signal
response header server: ^Varnish$
Confidence
medium — Some Varnish deployments answer with the product name in the Server header.
Source
Direct observation · https://www.nintendo.com/ · read
What the source states
A production site fronted by Varnish overrides the Server header with the product name. This is a deployment choice rather than a Varnish default, which is why it is only medium.
Bytes observed
server: Varnish

Varnish varnish-via-header

Signal
response header via: \bvarnish\b(?:\s*\(Varnish\/(\d{1,3}(?:\.\d{1,3}){0,2})\))?
Confidence
high — Varnish inserts itself as a Via intermediary, optionally with its version.
Source
Direct observation · https://varnish-cache.org/ · read
What the source states
The Varnish project site is fronted by Varnish, which adds itself to the Via chain with a parenthesised product/version pseudonym.
Bytes observed
via: 1.1 varnish (Varnish/6.0)
Tag managers (4)

Adobe Experience Platform Launch adobe-launch-tag-property

Signal
page body matching assets\.adobedtm\.com\/
Confidence
high — A tag property is loaded from Adobe's tag-delivery host, whose name is Adobe's own DTM/Launch service.
Source
Direct observation · https://segment.com/ · read
What the source states
The page loads an Adobe tag property from Adobe's tag-delivery host under a launch-* library path.
Bytes observed
assets.adobedtm.com/a62564f453ce/b1b9d7ec982b/launch-29605e749a31

Google Tag Manager google-tag-manager-container

Signal
page body matching www\.googletagmanager\.com\/gtm\.js\?id=GTM-[A-Z0-9]{4,12}
Confidence
high — A Google Tag Manager container is loaded from Google's tag host with a GTM- container ID.
Source
Direct observation · https://www.cloudflare.com/ · read
What the source states
The Cloudflare home page loads a Google Tag Manager container. Google's public documentation for the container snippet is behind an account flow, so this entry rests on observation; the host and the GTM- container-ID prefix both name the product.
Bytes observed
www.googletagmanager.com/gtm.js?id=GTM-NDGPDFZ

Google Tag Manager google-tag-manager-noscript-iframe

Signal
page body matching www\.googletagmanager\.com\/ns\.html\?id=GTM-[A-Z0-9]{4,12}
Confidence
high — The noscript iframe of the Google Tag Manager container snippet, carrying a literal GTM container id on a host only Google serves.
Source
Direct observation · https://wordpress.org/news/ · read
What the source states
The served HTML contains the Google Tag Manager noscript fallback iframe with a literal GTM container id, while the script-tag half of the same snippet has its id injected at runtime and so carries none.
Bytes observed
https://www.googletagmanager.com/ns.html?id=GTM-P24PF4B

Tealium tealium-utag-loader

Signal
page body matching tags\.tiqcdn\.com\/utag\/
Confidence
medium — The utag loader is served from Tealium's tag CDN.
Source
Direct observation · https://tealium.com/ · read
What the source states
The Tealium home page loads its own utag tag container from the vendor CDN.
Bytes observed
tags.tiqcdn.com/utag/
Web application firewalls (7)

Cloudflare Bot Management cloudflare-cf-bm-cookie

Signal
a cookie whose name matches ^__cf_bm$
Confidence
medium — __cf_bm is the cookie Cloudflare's bot-management challenge sets.
Source
Direct observation · https://www.cloudflare.com/ · read
What the source states
Cloudflare's own site sets a short-lived, host-scoped __cf_bm cookie on a plain GET, next to its cf-ray and Server headers.
Bytes observed
set-cookie: __cf_bm=nJNVJoCs91ceCii5fDB100UZf.biXY8ddttl1hMovdU-1789037488.8967206-1.0.1.1-...; HttpOnly; SameSite=None; Secure; Path=/; Domain=www.cloudflare.com

Imperva imperva-incapsula-cookies

Signal
a cookie whose name matches ^(?:visid_incap_|incap_ses_|nlbi_)\d{1,12}(?:_\d{1,12})?$
Confidence
high — Imperva's Incapsula edge sets visid_incap_, incap_ses_ and nlbi_ session cookies.
Source
Direct observation · https://www.imperva.com/ · read
What the source states
The response sets three cookies whose names carry the Incapsula prefixes followed by the numeric site id.
Bytes observed
set-cookie: visid_incap_2439=JrdfI5tRQ7u8xvoYzPL+ArOLomoAAAAAQUIPAAAAAAAKNqFN3PQ+6AwBxcqbZtln; expires=Thu, 09 Sep 2027 22:20:42 GMT; HttpOnly; path=/; Domain=.imperva.com; Secure; SameSite=None

Imperva imperva-x-cdn-header

Signal
response header x-cdn: ^Imperva$
Confidence
high — Imperva's edge stamps X-CDN with its own name.
Source
Direct observation · https://www.imperva.com/ · read
What the source states
Imperva's own site is delivered through its cloud WAF and returns an X-CDN header containing exactly the vendor name.
Bytes observed
x-cdn: Imperva

Imperva imperva-x-iinfo-header

Signal
presence of the response header x-iinfo
Confidence
high — X-Iinfo is the Imperva (Incapsula) edge's request-trace header.
Source
Direct observation · https://www.imperva.com/ · read
What the source states
The same response carries an X-Iinfo header encoding proxy ids and routing state, a header seen only behind Imperva's Incapsula edge.
Bytes observed
x-iinfo: 52-48019040-48019050 2NNN RT(1789037492554 39) q(0 1 1 0) r(18 18) U18

Sucuri Website Firewall sucuri-server-header

Signal
response header server: ^Sucuri\/
Confidence
confirmed — The Sucuri Firewall replaces the origin's Server header with its own product name.
Source
Vendor documentation · https://docs.sucuri.net/website-firewall/troubleshooting/investigating-cache-headers/ · read
What the source states
Sucuri's own troubleshooting page shows a firewall-fronted response whose headers include 'Server: Sucuri/Website Firewall' and 'X-Sucuri-ID: 11005'.

Sucuri Website Firewall sucuri-x-sucuri-cache

Signal
presence of the response header x-sucuri-cache
Confidence
high — X-Sucuri-Cache reports the Sucuri edge cache outcome.
Source
Direct observation · https://sucuri.net/ · read
What the source states
Sucuri's own site is served through its firewall and returns a cache-outcome header carrying the product name, next to x-sucuri-id and a Sucuri Server header.
Bytes observed
x-sucuri-cache: HIT

Sucuri Website Firewall sucuri-x-sucuri-id

Signal
presence of the response header x-sucuri-id
Confidence
high — X-Sucuri-ID identifies the Sucuri edge node that answered the request.
Source
Vendor documentation · https://docs.sucuri.net/website-firewall/troubleshooting/investigating-cache-headers/ · read
What the source states
The documented example response from a firewall-protected site includes 'X-Sucuri-ID: 11005' alongside 'Server: Sucuri/Website Firewall'.
Web servers (8)

Apache HTTP Server apache-httpd-server-header

Signal
response header server: ^Apache(?:\/(\d{1,4}(?:\.\d{1,4}){0,3}))?
Confidence
confirmed — httpd sets the Server header from ServerTokens; every setting from Prod upward starts with the literal 'Apache'.
Source
Vendor documentation · https://httpd.apache.org/docs/2.4/mod/core.html#servertokens · read
What the source states
ServerTokens 'Determines what the server returns in the Server HTTP response header', with example values 'Server: Apache' (Prod), 'Server: Apache/2.4' (Minor), 'Server: Apache/2.4.41 (Ubuntu)' (OS) and the default Full 'Server: Apache/2.4.41 (Ubuntu) OpenSSL/1.1.1 (some modules)'.

Caddy caddy-server-header

Signal
response header server: ^Caddy$
Confidence
high — Caddy identifies itself by name in the Server header.
Source
Direct observation · https://caddyserver.com/ · read
What the source states
The Caddy project's own site answers with a Server header containing exactly the product name and no version.
Bytes observed
server: Caddy

Google Web Server google-web-server-header

Signal
response header server: ^gws$
Confidence
medium — Google's own web frontend answers with the token gws in the Server header.
Source
Direct observation · https://www.google.com/ · read
What the source states
Google Search answers with a three-letter Server token and no version.
Bytes observed
server: gws

Kestrel kestrel-server-header

Signal
response header server: ^Kestrel$
Confidence
high — Kestrel, the ASP.NET Core HTTP server, names itself in the Server header.
Source
Direct observation · https://iis.net/ · read
What the source states
The host answers with a Server header naming Kestrel and carrying no version.
Bytes observed
server: Kestrel

LiteSpeed litespeed-cache-header

Signal
presence of the response header x-litespeed-cache
Confidence
medium — The x-litespeed-cache header is written by LiteSpeed's built-in page cache.
Source
Direct observation · https://openlitespeed.org/ · read
What the source states
The OpenLiteSpeed project site returns a cache-status header carrying the LiteSpeed name alongside its Server: LiteSpeed header.
Bytes observed
x-litespeed-cache: hit

LiteSpeed litespeed-server-header

Signal
response header server: ^LiteSpeed
Confidence
high — LiteSpeed Web Server and OpenLiteSpeed both answer with Server: LiteSpeed.
Source
Direct observation · https://www.litespeedtech.com/ · read
What the source states
The vendor's own site answers with a Server header naming LiteSpeed. openlitespeed.org, fetched the same day, sends the identical value, so the header does not distinguish the open-source build from the commercial one.
Bytes observed
server: LiteSpeed

Microsoft IIS microsoft-iis-server-header

Signal
response header server: ^Microsoft-IIS(?:\/(\d{1,3}(?:\.\d{1,3}){0,2}))?
Confidence
high — IIS emits a Server header identifying itself unless removeServerHeader is set.
Source
Vendor documentation · https://learn.microsoft.com/en-us/iis/configuration/system.webserver/security/requestfiltering/ · read
What the source states
'IIS 10.0 added the removeServerHeader attribute to suppress sending the HTTP server header to remote clients.' The attribute table adds: 'If set to true, request filtering will suppress the IIS server header. If set to false, IIS will return the default server header.'

nginx nginx-server-header

Signal
response header server: ^nginx(?:\/(\d{1,4}(?:\.\d{1,4}){0,3}))?
Confidence
confirmed — nginx writes its own name, and by default its version, into the Server header.
Source
Vendor documentation · https://nginx.org/en/docs/http/ngx_http_core_module.html · read
What the source states
The server_tokens directive 'Enables or disables emitting nginx version on error pages and in the "Server" response header field.' Its default is `server_tokens on;`, and an empty string value 'disables the emission of the "Server" field.'

Where this fits

Technology detection is reported, never scored: identifying a product is not a fault, and the check deducts nothing. How the rest of a report is scored is published the same way, on the scoring methodology page, and the check itself lives atTechnology Lookup.