A Firefox fingerprint spoofing setup
- π Rotating User-Agent spoofing
- π Domain-consistent User-Agent persistence
- π§© Worker, Blob Worker, and Navigator User-Agent patching
- π Timezone spoofing with Worker support
- π VPN-aware timezone synchronization
- π‘οΈ Fallback protection against common timezone leaks
- π₯οΈ Desktop Firefox support
Note
- Desktop Firefox only.
- The Focus is less on Consistancy but on Preventing Leaks
Warning
- This is Aggressive Anti-Fingerprinting which means some sites might have issues
- it works on Photopea and Figma and Major Websites like Youtube
Caution
Read the Timezone Configuration section before using the timezone script.
Most User-Agent or timezone spoofing solutions only modify the obvious browser surfaces.
Modern fingerprinting frameworks such as CreepJS perform JavaScript execution inside:
- Dedicated Workers
- Blob Workers
- Nested execution contexts
to retrieve values that many spoofing extensions fail to patch.
As a result, your browser may report:
- A spoofed User-Agent in the main page
- Your real User-Agent inside Workers
- A spoofed timezone in the main page
- Your real timezone inside Workers
This mismatch is highly fingerprintable.
Agent-Spoof attempts to keep these surfaces synchronized.
Install the Tampermonkey extension for Firefox.
From the Scripts folder:
- Import
Agent.js - Import
Time.js
Important: Import them as separate scripts.
Do not merge them together.
Open:
about:debugging
Navigate to:
This Firefox
Click:
Load Temporary Add-on...
Select:
Extension/manifest.json
- Enable both Tampermonkey scripts.
- Ensure the extension is loaded.
Test your setup using:
- https://abrahamjuliot.github.io/creepjs/
- https://creepjs.org/checker
- https://www.whatismybrowser.com/
Fingerprinting frameworks do not trust values exposed directly through:
navigator.userAgentInstead, they execute code inside Workers and compare the results.
Example:
const blob = new Blob([`
postMessage({
tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
offset: new Date().getTimezoneOffset(),
lang: navigator.language
})
`]);
const worker = new Worker(URL.createObjectURL(blob));
worker.onmessage = e => console.log(e.data);Many Firefox spoofing extensions fail to patch this execution context.
Running code like the example above may reveal your:
- Real timezone
- Real locale
- Real User-Agent
even when the main page appears spoofed.
Tampermonkey executes very early in the page lifecycle and is well-suited for intercepting:
- Worker()
- Blob Workers
- Navigator properties
- JavaScript fingerprinting surfaces
This makes Worker patching significantly easier.
However, Tampermonkey cannot modify:
User-Agent:HTTP request headers.
The project splits responsibilities:
Responsible for:
- HTTP User-Agent spoofing
- User-Agent rotation
- Storing the selected User-Agent in a cookie (
_spoof)
Responsible for:
- Worker patching
- Blob Worker patching
- Navigator spoofing
- Reading the
_spoofcookie - Applying the same User-Agent inside JavaScript contexts
This ensures that:
HTTP User-Agent
=
Navigator User-Agent
=
Worker User-Agent
=
Blob Worker User-Agent
which significantly reduces inconsistencies.
User-Agents are fetched from:
https://microlink.io/user-agents
The timezone script:
- Detects your public Geo-IP location.
- Determines the corresponding timezone.
- Applies timezone spoofing.
- Patches Worker contexts to prevent leaks.
Additional configuration is required before first use.
See the section below.
Instead of creating one large extension, the project separates responsibilities between:
- Extension = Brain
- Tampermonkey = Muscle
| Feature | Hybrid (Extension + Tampermonkey) | All-in-One Extension |
|---|---|---|
| Complexity | Medium | Low |
| Worker / Blob Patching | Excellent | Good |
| Rotation Logic | Easy (GM_setValue) | More Complex (browser.storage) |
| Debugging | Easy | Harder |
| Portability | Requires Tampermonkey | Extension Only |
| Detection Risk | Very Low | Very Low |
The hybrid design was chosen primarily because Worker patching is easier to develop, debug, and maintain through Tampermonkey.
Caution
This step is mandatory.
Before importing Time.js into Tampermonkey, locate the following constant:
const TEHRAN_TZ = 'Asia/Tehran';Replace:
Asia/Tehranwith your real timezone so when not using a VPN, the Fallback Logic set your Time to UTC.
Examples:
const TEHRAN_TZ = 'Europe/London';const TEHRAN_TZ = 'America/New_York';const TEHRAN_TZ = 'Europe/Berlin';const TEHRAN_TZ = 'Asia/Tokyo';Do not rename the variable:
TEHRAN_TZOnly change the timezone string.
- Firefox only.
- Desktop only.
- Temporary extension loading must be repeated after browser restart.
- HTTP header spoofing requires the extension.
- Worker spoofing requires the Tampermonkey scripts.
- Incorrect timezone configuration may introduce fingerprint inconsistencies.
- Some websites where they rely on workers might not work
This project is intended for browser fingerprint research, testing, and privacy experimentation.
No spoofing solution can guarantee 100% anonymity or perfect resistance against advanced fingerprinting systems.