Device fingerprinting
@thumbmarkjs/thumbmarkjs 0.16.0Not a vendor we chose. @thumbmarkjs/thumbmarkjs 0.16.0 is a hard-pinned direct dependency of @dynamic-labs/sdk-react-core 4.89.0 (declared at its package.json line 10). It is listed separately because it reads more about your browser than anything else in this site.
When it runsWhen the Dynamic provider mounts and no fingerprint is already stored, the SDK imports the library and calls getFingerprint(). It performs no consent check, and it does not wait for a sign-in to be attempted or completed.
What it reads, in eleven groups- Canvas — draws a gradient and fixed text to a 280x20 canvas and hashes the pixels; skipped on Firefox.
- Installed fonts — measures a fixed string at 72px against 89 named font families inside a hidden iframe and reports the families whose metrics differ, which is an installed-font list; skipped on Firefox.
- Audio — runs a 1000 Hz oscillator through a compressor in an OfflineAudioContext and hashes the resulting samples.
- WebGL — renders a shape through custom shaders, reads the pixels back and hashes them.
- Graphics hardware — GPU vendor and renderer including the unmasked strings exposed by WEBGL_debug_renderer_info, device memory, the JavaScript heap size limit, and endianness.
- Screen and input — colour depth, touch-point count, and media-query results for pointer, hover, update, forced-colors, inverted-colors, prefers-contrast, prefers-reduced-motion and prefers-reduced-transparency, which together form an accessibility-settings profile.
- System — platform, user agent, browser name and version, logical CPU count, whether cookies are enabled, and the highest Apple Pay version this browser supports.
- Locale — language and IANA time zone.
- Plugins — the navigator.plugins list.
- Permission states — the current granted/denied/prompt state of 28 permissions, including camera, microphone, geolocation, bluetooth, NFC, MIDI, notifications, clipboard read and write, local-fonts, display-capture, the motion and light sensors, payment-handler, storage-access and window-management. Nothing is requested; only the existing state is read, and reading it shows you no prompt.
- Math — floating-point results for 16 functions.
Where the hash goesThe library sends nothing itself — the shipped bundle contains no fetch, XMLHttpRequest, sendBeacon or WebSocket call. It returns a single hash. The SDK stores it in this browser under the localStorage key dynamic_device_fingerprint, and attaches it to its API requests to Dynamic as the HTTP header x-dyn-device-fingerprint (measured in the installed package at src/lib/client/extension/hooks/useInitializeSdkClient/getApiHeaders/getApiHeaders.js). What Dynamic does with it is governed by Dynamic’s privacy policy. NFTeria does not read the value, does not send it anywhere else, and does not use it for analytics or advertising.
How to avoid it: sign in with a browser wallet instead. The wallet path never loads Dynamic and never runs this.