Skip to content

Navigator Fingerprinting

The navigator collector reads browser and device metadata exposed through the navigator object. While many of these values are commonly spoofed, they're useful for cross-referencing with other signals.

Collected signals

SignalExampleNotes
userAgentMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...Full UA string
platformMacIntelOS platform
languageen-USPrimary language
languages['en-US', 'en', 'pl']All preferred languages
hardwareConcurrency10CPU logical cores
maxTouchPoints0Touch capability
cookieEnabledtrueCookie support
doNotTrack1 or nullDNT setting
deviceMemory8RAM in GB (Chrome only)
pdfViewerEnabledtrueBuilt-in PDF viewer
webdriverfalseAutomation flag
vendorGoogle Inc.Browser vendor

Entropy and stability

PropertyValue
Entropy~8 bits
Stability0.75
Typical duration<1ms

Cross-browser considerations

hardwareConcurrency and deviceMemory are excluded from crossBrowserId:

  • Safari caps hardwareConcurrency at 8 even on 10+ core machines
  • Safari doesn't expose deviceMemory at all

languages is trimmed to 1 entry in Chrome incognito, making it a signal for incognito detection.

Role in spoofing detection

Navigator values are cross-referenced with other signals:

  • platform says Mac but userAgent says Windows = spoofing
  • webdriver: true = automation framework
  • hardwareConcurrency: 16 with deviceMemory: 2 = inconsistent

Usage

ts
const fp = await neoprint.get({ collectors: ['navigator'] })
const nav = fp.components.navigator.value

console.log(nav.platform)              // MacIntel
console.log(nav.hardwareConcurrency)   // 10
console.log(nav.languages)            // ['en-US', 'pl']

Released under the MIT License.