Guide
How to match a browser's timezone and language to its proxy.
On this page
Sites can compare the location of your IP address with the timezone and language your browser reports. A German IP with a US clock and en-US is a strong sign of a proxy, even when nothing else leaks. Donut Browser sets each profile’s timezone and language from its proxy’s exit when it makes the profile, and checks the pair again before each launch. You need a profile with a proxy.
How Donut picks the values
When you create a profile with a proxy, Donut:
- finds the proxy’s exit IP through the proxy, from public echo services such as
api.ipify.org, - looks the IP up in a MaxMind GeoLite2 database on your computer, so the IP is not sent to a lookup service,
- writes the exit’s IANA timezone (for example
Europe/Berlin), its UTC offset, the latitude and longitude the database gives for the IP, and a language.
The language is a weighted random pick among the languages spoken in the exit’s country. The weights come from the share of people who speak each language, so a US exit gives en-US most of the time and es-US some of the time. The languages list holds the locale and its base language, for example de-DE and de.
This happens on every plan. In Create new profile, the box “Automatically configure location information based on proxy configuration or your connection if no proxy provided” must stay checked. It is checked by default.
The values stay fixed after that. Donut does not rewrite them when you change the profile’s proxy, so a mismatch shows up instead of being hidden.
1. Choose the proxy before you create the profile
- Add and check the proxy on Network → Proxies. The check’s Connection details show the exit Timezone, so you know what the profile will get.
- Click New on the Profiles page, choose the proxy in Create new profile, and create the profile.
For a WireGuard VPN, Donut cannot measure the exit at this point and writes no location. See step 5 of the WireGuard guide for the fix.
2. Keep the launch check on
Settings → Privacy → Block on fingerprint mismatch is on by default. Before a launch, Donut measures the exit of the profile’s proxy or VPN and compares:
| Value | Passes when |
|---|---|
| Timezone | The profile’s IANA zone is the exit’s zone. |
| Language | The profile’s language is one that is spoken in the exit’s country. |
Coordinates are not compared. The measured exit is kept for 30 minutes per proxy, so quick relaunches do not measure it again.
The check lets the launch go ahead without a verdict when the exit cannot be measured within 8 seconds, when the GeoIP database is missing, or when the proxy is Shadowsocks. Launches from the local API or MCP never block. They show a warning in the app instead.
3. Fix a mismatch with one click
When the values do not match, the launch stops with the dialog Launch blocked and the heading “The measured exit doesn’t match the fingerprint”. It names the problem, for example “Exit node is in Europe/Berlin but the fingerprint reports America/New_York.”
- Click Match fingerprint to proxy. Donut writes the measured exit’s timezone, offset, coordinates and a new language into the profile.
- Wait for “Fingerprint updated to match the proxy. Relaunch the profile to apply.” Donut cancels this launch.
- Launch the profile again.
Match fingerprint to proxy works on every plan, also on Free and Solo, where you cannot edit the fingerprint by hand. It keeps the rest of the device.
The dialog has two other options. Launch anyway starts the browser with the mismatch. “Don’t block again for this exact mismatch” stops the dialog for this fingerprint and this exit until one of them changes. When you launch several profiles, “Apply this choice to the remaining profiles” uses your answer for all of them.
4. Check what sites see
Launch the profile and open What is my IP. It shows Timezone (from IP) next to Timezone (from browser), and a pair of clocks marked “Same time zone” or “Different time zones”.
You can also read the values in the browser’s DevTools console:
Intl.DateTimeFormat().resolvedOptions().timeZone; // "Europe/Berlin"
new Date().getTimezoneOffset(); // -60 in winter, -120 in summer
navigator.language; // "de-DE"
navigator.languages; // ["de-DE", "de"]A negative offset means the zone is ahead of UTC. Browser fingerprint shows the rest of the device.
When the values change by themselves
Three actions write a new location:
- Regenerate fingerprint in the profile’s Fingerprint section (Pro, Team and Enterprise) makes the new device from your own connection, not through the proxy. The next launch will likely block. Click Match fingerprint to proxy then.
- Generate random fingerprint on every launch measures the exit at each start and writes a matching location, together with a new device.
- Change IP on a rotating proxy can move the exit to another city or country. The launch check reuses the exit it measured in the last 30 minutes, so it can miss the move. Open What is my IP in the profile after a rotation. See How to rotate a proxy’s IP.
Set the location from the API
POST /v1/profiles reads the location through the proxy you pass in proxy_id, as the app does. To pin the location to a known IP, without a probe, pass it in wayfern_config.geoip. To turn location off, pass false.
curl -sS -X POST http://127.0.0.1:10108/v1/profiles \
-H "Authorization: Bearer $DONUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "DE shop", "browser": "wayfern", "proxy_id": "<proxy id>"}'import os, requests
response = requests.post(
"http://127.0.0.1:10108/v1/profiles",
headers={"Authorization": f"Bearer {os.environ['DONUT_API_KEY']}"},
json={
"name": "DE shop",
"browser": "wayfern",
"proxy_id": proxy_id,
"wayfern_config": {"geoip": "203.0.113.80"}, # optional: pin to this IP
},
timeout=60,
)
print(response.status_code, response.json())PUT /v1/profiles/{id} cannot change the location. After a proxy change, launch the profile from the app and use Match fingerprint to proxy.
Troubleshooting
| What you see | What to do |
|---|---|
| “Launch blocked” after you changed the profile’s proxy | The values belong to the old exit. Click Match fingerprint to proxy. |
| “Nothing was verified against the exit” | The profile has no timezone to compare. This happens with profiles made on a VPN. See the WireGuard guide. |
| “Couldn’t match the fingerprint to the proxy.” | The match failed. Check the proxy, then launch again. |
| The language changed after a match | Each match draws the language again from the exit country’s languages. |
| What is my IP shows “Different time zones” with no launch block | The launch came from the API, the check is off, the proxy is Shadowsocks, or you chose “Don’t block again for this exact mismatch”. Launch from the app with the check on, then click Match fingerprint to proxy. |
Related
- Profiles and fingerprints: the fingerprint values you can see and edit.
- Leak protection: the launch checks in Settings → Privacy.
- How to use a SOCKS5 proxy with a username and password
- How to rotate a proxy’s IP with a change-IP link
Donut Browser sets a matching timezone and language on every plan, including Free. Download it for macOS, Windows or Linux.
Last updated .