Appearance
Stealth Beta
How the browser looks like a real visitor, and how to keep it that way.
Websites check more than your IP address. They read dozens of values from the browser (screen, fonts, CPU cores, languages, time zone) and compare them with each other and with the IP. A value that doesn't fit, or a sign of automation, is enough to get a challenge or a block.
The Hosted Browser runs a modified Chromium in which each session is one consistent device, built into the browser itself.
Built into the browser, not injected
Most stealth tools patch values with JavaScript before the page loads. Websites can detect those patches: overridden functions, values that differ between the page and its workers, or properties that are missing.
Our browser reports its identity from its own engine. Pages and workers see the same values, and there is no script for a website to find.
A realistic device for each session
Each session gets a device drawn from statistics on real Chrome users, so its values fit together the way they do on real machines:
| Area | What the device sets |
|---|---|
| Operating system | A windows identity reports Windows in the user agent, the client hints and navigator.platform. A linux identity reports the Linux machine it runs on. |
| Screen and window | Screen size, the area left by the taskbar, window size and position, pixel ratio, colour depth |
| Hardware | CPU cores and memory, in values real machines have |
| Input | Touch support, keyboard layout and modifier keys |
| Fonts and voices | A Windows identity gets the fonts and speech voices of Windows 11 |
| Media | Audio settings, media devices and payment methods |
The browser is the same Chrome version for every session; the user agent always matches the browser that sends it.
To keep the same device across sessions, see Persistent identity.
Location that matches the IP
Before a session starts, the browser looks up the proxy's exit IP and sets these to match:
- the time zone,
- the languages (
navigator.languages,Accept-Language) and the locale used to format dates and numbers, - the geolocation returned by
navigator.geolocation.
If the exit IP can't be located, the session does not start (close code 4001) and is not charged, rather than run with a mismatched location.
No automation traces
- Headless: the user agent says
Chrome, neverHeadlessChrome, and the window has a real size and position on the screen. - WebRTC: it reveals no IP address, neither the server's nor the proxy's.
- Popups: blocked without a user gesture, as in a normal Chrome.
Keep your code from undoing it
Puppeteer and Playwright can replace the browser's values with emulated ones, which websites can tell apart. To keep the identity intact:
- Use the existing page. In Puppeteer, connect with
defaultViewport: null. In Playwright, usebrowser.contexts()[0]instead ofbrowser.newContext(), which would be incognito with its own viewport. - Don't set a viewport, a user agent, a time zone, a locale or geolocation yourself. The browser already set them to fit the device and the IP.
- Use
humanizeif the site watches how you click and type. See Parameters and API.

