Changelog
Every signal set and identifier version so far, and what each one changed.
Since the first collector (30 components, 7 checks) WhiskerJS has grown to 46 components in 7 groups, 14 integrity checks, a structuredId for group-by-group similarity, an anti-replay binding with your server’s nonce, and an opt-in onResult hook, all with no network calls and no storage. The current versions are signalsVersion 5 and idVersion 2. See it run in the live demo.
WhiskerJS has three version numbers in every result:
version: the library release (0.1.0, not yet published).signalsVersion: what is measured: the collectors, the integrity checks
and the exclusion table. A bump can change ids (when a stable component
changes) and flags.idVersion: how the visitorId and structuredId are derived. A bump
changes every id.Compare ids only within the same signalsVersion and idVersion.
Newest first. The live demo runs the current version.
firefox_rfp and lost nine components. The
class now needs every trait at once (an RFP time zone, now also
Atlantic/Reykjavik; screen equal to the content area; no taskbar space;
pixel ratio 1; window at 0,0) and never applies when navigator.webdriver
is true.browser_class and excluded components change.load({ onResult }): off by default; called with a copy of every result.
The library still sends nothing itself.structuredId: the idVersion and one 48-bit part per signal group
(gpu, audio, fonts, device, browser, locale, prefs), so two
results can be compared group by group. New exports ID_GROUPS,
ID_GROUP_ORDER, ID_PART_LENGTH.collect({ binding: { nonce, timestamp } })
echoes them in result.binding with a digest over the whole result;
bindingInput() gives the exact text. Not a signature.whiskerjs/id/2. Id effect: every
visitorId changes.engine_mismatch, iframe_mismatch,
impossible_hardware, permissions_inconsistent, plugins_inconsistent,
prototype_lie, webdriver_writable (14 in total). A clean about:blank
iframe realm is used for the cross-checks.automation_globals knows more tools (CEF, CefSharp, Awesomium, FMiner,
Geb, Phantomas, WebdriverIO and older drivers).webgpu, fonts_canvas and
font_preferences (in the visitorId), and canvas_readback,
audio_latency, content_blockers (not in the visitorId).fonts_canvas added to the Brave exclusions.ua_client_hints, cpu_architecture,
intl_locale, heap_limit, apple_pay, private_click (in the
visitorId), and ua_versions, permissions, keyboard_layout,
screen_frame (not in the visitorId).screen_frame added to the Firefox resistFingerprinting exclusions.load() and agent.collect(), which never throw; a 1000 ms inner timeout
per component, an overall budget (default 5000 ms) and abort support.audio, browser_class, canvas, color_depth,
color_gamut, device_memory, dynamic_range, fonts,
forced_colors, hardware_concurrency, languages, math,
media_codecs, pdf_viewer, pixel_ratio, platform, plugins,
prefers_contrast, reduced_motion, screen_resolution,
speech_voices, storage, time_zone, touch_support, vendor,
vendor_flavors, webgl_image, webgl_params, webgl_renderer,
webgl_vendor.automation_globals, automation_webdriver,
headless_markers, headless_user_agent, native_tampering,
navigator_own_property, software_renderer.whiskerjs/id/1.