Skip to main content

Your Browser Can Look Real and Still Look Fake

· 17 min read

Your Browser Can Look Real and Still Look Fake

From the AMA

A stealth browser is not judged only by whether one fingerprint looks like Chrome, but by whether its generated population, network identity and runtime behavior keep describing the same believable machine.

The usual way to think about browser stealth is a checklist. Make every browser look different from the next one. Patch the fingerprint surfaces a detector reads. Keep changing the values that might give away automation.

The CloakBrowser AMA points somewhere harder. A browser can be unique without looking real. A change meant to hide automation can make the browser stranger than the machines it is trying to blend into.

And the fingerprint is only one layer. The same browser can fail because the IP was never going to pass, because its profile and fingerprint have drifted into two different identities, or because it behaves unlike stock Chrome once a page goes into the background.

So the thing being graded is not really a bag of browser properties. It is a whole session, and its network identity, browser identity, stored state and behavior all have to agree with each other.

What makes the AMA worth reading is that the team does not present this as solved. They describe patches they shipped and then deleted, production failures they could not explain at first, experiments that ran for days, and one answer they corrected after another practitioner pushed back.

As the CloakBrowser team put it during our recent Reddit AMA:

The AMA was hosted around CloakBrowser, a Chromium binary with fingerprint patches applied at the C++ source level rather than injected from JavaScript, wrapped as a drop-in replacement for Playwright and Puppeteer. The team is three people and stays behind the brand deliberately, since anti-bot vendors watch projects like this. The responding lead engineer describes close to 30 years in software, most of it in defense and embedded work, with time in telecom, finance, real-time systems and driver development. They say the browser started as an internal tool: a client needed heavy automation against a CRM with reCAPTCHA in front of it, nothing on the market stayed stable, so they built their own and ran it for over a year before releasing it.

That background matters because the strongest answers in the thread are about low-feedback debugging and production regressions, not product features.

In our third r/WebScrapingInsider AMA, we asked the CloakBrowser team how a stealth browser gives itself away at population scale, why the browser is often the wrong thing to debug, and how you test something whose only feedback is pass or fail.

Here are the six biggest insights from the discussion.


Unique Fingerprints Can Still Form a Detectable Population

1. Unique Fingerprints Can Still Form a Detectable Population

If every browser in a fleet has its own fingerprint, it is easy to assume the fleet is hard to identify.

Uniqueness and normality are not the same thing. Every instance can pull a different seed and still come out of a generator that leaves the same statistical marks across the whole population.

Each instance draws its fingerprint from a seed, so a different seed gives a different coherent identity. Thousands of developers running the same binary don't share a fingerprint. What they share is the generator.

CloakBrowser team · CloakBrowser

The risk is not that two machines collide. It is that the generator has a shape. Values can land in ranges real hardware rarely produces. Fields that should correlate on a real device can vary independently. A value can appear far more or far less often than it does in the wild. None of that needs a per-instance match to be visible.

That is why "randomize it" is not the strategy it sounds like.

Random is its own tell. What matters is that generated values sit inside the distribution real hardware produces, including how often each value should appear and which values go together.

CloakBrowser team · CloakBrowser

In practice the team says that means drawing from real device lineups rather than a random generator: actual GPU models across vendors and platforms, real voice sets, fonts that match the platform being presented, timezone and locale taken together from the exit IP instead of picked separately. The goal is not maximum entropy. It is landing in the middle of the distribution.

The point isn't to be unlike everyone else, it's to be unremarkable.

CloakBrowser team · CloakBrowser

This is a claim about CloakBrowser's own method and what its team believes detectors reward. It is not proof that every anti-bot system scores populations this way. But it reframes the rest of the article: more randomness is not automatically more cover.


A Stealth Patch Can Become the Fingerprint

2. A Stealth Patch Can Become the Fingerprint

An audio fingerprinting surface looks like an obvious thing to randomize. Fingerprinting libraries read it, so adding noise seems protective.

The team shipped exactly that patch, then measured what real browsers actually produce.

Then we measured what real browsers actually produce and found the field is nearly constant. A couple of values cover the overwhelming majority of real machines.

CloakBrowser team · CloakBrowser

That inverts the purpose of the patch. If almost every real browser reports one of a small set of values and CloakBrowser reports something new on every launch, the noise is not hiding the browser in a crowd. It is the one thing separating it from the crowd.

We'd built a beacon and shipped it as camouflage. So we deleted it. Not tuned down, removed.

CloakBrowser team · CloakBrowser

The team says this has happened repeatedly, and not from carelessness. The field breaks easily. A change that cannot plausibly matter to anyone flips a site from passing to failing, not degrading, failing. And detectors do not agree with each other.

There's no single correct fingerprint, there are several detectors with different ideas of normal, and sometimes you can't satisfy both.

CloakBrowser team · CloakBrowser

This is a directly reported CloakBrowser experience, and it does not generalize to "randomization does not work." The narrower claim is the useful one. Randomization is counterproductive when it moves a browser away from the real distribution, and the only way to know which case you are in is to measure.


The Browser May Not Be the Thing Getting Blocked

3. The Browser May Not Be the Thing Getting Blocked

When a scraper gets blocked, changing the browser feels like progress, because the browser is the part you can see.

The team's experience is that this is often the wrong first move. Stock Chrome, untouched, gets blocked on some connections before any JavaScript runs.

Debugging a fingerprint on an IP that was never going to pass is how people lose a week.

CloakBrowser team · CloakBrowser

The fix is to establish a control path first. Same target, same connection, stock Chrome. If stock Chrome fails there, the browser was never the problem and no fingerprint work will change the result.

No browser fix exists for that, because the browser was never the problem.

CloakBrowser team · CloakBrowser

This section also covers identity continuity, and here the AMA contains a correction worth preserving. Asked how timezone, locale and WebRTC behave when a proxy exit rotates mid-session, the team first said to treat IP, profile and fingerprint seed as one identity and rotate all three together. A participant pushed back: rotating the seed every 30 minutes for one logged-in profile is itself a signal. The team agreed and revised the rule.

The seed follows the profile. Same profile, same seed. New profile, new seed.

CloakBrowser team · CloakBrowser

The IP is a softer binding. It should stay with the profile where possible, but a profile can move across a few addresses without looking strange, because real users do. What matters is volume, not mechanical synchronization on every rotation. The team is also explicit about the limits of its own knowledge here, describing whole proxy ranges going bad at once.

It looks less like individual IPs getting flagged through use and more like whole ranges being identified and written off together. We don't know the mechanism, and we're not going to pretend we do.

CloakBrowser team · CloakBrowser

The IP observations are the team's own experience. The proxy-pool behavior is something they have seen but cannot explain, and that uncertainty is worth keeping. The profile and seed rule is a CloakBrowser recommendation, not an industry standard.


Stealth Engineering Is Black-Box Experimentation

4. Stealth Engineering Is Black-Box Experimentation

A detector that returns a score gives you something to optimize. A production site that returns pass or fail gives you almost nothing.

You can know two builds behave differently on a target without knowing which of hundreds of differences caused it.

So the skill isn't finding differences. Anyone can generate a list of thousands. It's knowing which ones to ignore.

CloakBrowser team · CloakBrowser

Watching what a detector collects tells you its inputs. It does not tell you the decision logic.

You learn what they look at. You never learn the weights, or which value flipped the verdict.

CloakBrowser team · CloakBrowser

So the team works against a fixed reference: a real machine running stock Chrome, pinned to one version with auto-update disabled so the baseline does not drift. Changes go in one at a time, because a build with three changes says nothing about which one moved the result. Individual subsystems can be switched off to bisect a regression. Customer tickets and GitHub issues are not a side channel, they are how the team decides which of the countless environment differences a real system acts on.

And the team is direct that internal testing is not sufficient.

That gate exists because our own testing is not enough, and we know it isn't.

CloakBrowser team · CloakBrowser

This connects back to the audio patch. The intuitive fix looked correct and was measured to be harmful. Measurement, not intuition, is what told them. Claims about the internal logic of specific named detectors stay attributed to the team, because a pass/fail target never confirms them.


Static Fingerprint Equality Does Not Prove Behavioral Equality

5. Static Fingerprint Equality Does Not Prove Behavioral Equality

A fingerprint dump is a snapshot. A browser is a process that changes behavior as a page becomes hidden, backgrounded or throttled.

That gap produces a class of detection difference a static comparison misses entirely, and the AMA has a clean example of it, including the testing method being corrected in real time.

A participant asked whether patching at the C++ level touches page lifecycle behavior. The team said it does not: occlusion, background throttling and visibility state are stock Chromium, so CloakBrowser behaves like Chrome on a backgrounded window. The participant pointed out, and the team agreed, that this holds only until you set a reliability flag like --disable-backgrounding-occluded-windows. That flag keeps timers and animation-frame callbacks firing at full rate on a hidden tab, where stock Chrome would throttle them, and a script sampling timer cadence with document.hidden true can read the difference.

The team's first testing advice had been to diff the static fingerprint surface. The participant's point was that this flag never lands in a property dump.

So the test is cadence, not properties.

CloakBrowser team · CloakBrowser

You're right, and you clearly know this flag better than we do.

CloakBrowser team · CloakBrowser

The revised test: log setTimeout and animation-frame timestamps, drive the page into hidden state, and compare the intervals with the flag and without. A foreground-only comparison would have shown no difference and cleared a flag that is still readable. The wider point stands on its own. Detection increasingly scores behavior as well as properties, and some of it sits outside the browser's self-report.

A perfect fingerprint driving like a robot is still a bot.

CloakBrowser team · CloakBrowser

The lifecycle observation came from the participant, and the team accepted it. The AMA does not include a production measurement showing a specific vendor detects this exact signal, so treat it as an example of why behavioral testing catches what static tests miss, not as proof about a named detector.


Maintenance Velocity Is Part of the Stealth Product

6. Maintenance Velocity Is Part of the Stealth Product

A stealth browser can have a long feature list and still be a poor thing to depend on.

Detection changes. A fingerprint score from today says little about how fast the maintainer can recover when a vendor ships something new tomorrow.

Detection changes constantly, so any tool is only as good as how fast someone responds when it breaks. A brilliant browser whose maintainer lost interest six months ago is worthless.

CloakBrowser team · CloakBrowser

The team's release process is built around the assumption that it ships regressions. Small changes, one variable at a time. Subsystems that can be switched off individually. Then a release candidate that real users, especially large production users, run for about four days before it is considered stable, because they hit site variety the internal suite cannot reproduce.

We assume every release makes something worse somewhere, and the job is finding out where before customers do.

CloakBrowser team · CloakBrowser

That turns into a buying question. The useful signal is not the README or the feature list.

Look at how recently the last fix landed, not the README.

CloakBrowser team · CloakBrowser

CloakBrowser is a vendor in this category, so the argument is not neutral. The team also says its view of competitors is skewed, because the only signal it gets is inbound.

Nobody happily using something else writes to us. We only ever hear from the failures.

CloakBrowser team · CloakBrowser

Conclusion: The Unit of Stealth Is the Session

The AMA opens on browser fingerprints and then keeps moving past them.

A generated browser can be unique and still statistically odd. A patch meant to hide a signal can create one. A capable browser is irrelevant on an IP that stock Chrome cannot pass. A profile and its seed can drift into two identities if you rotate them separately. And a browser that matches every static Chrome property can still behave differently once a page goes to the background.

So the question to ask about a stealth browser is not whether it passes one fingerprint test. It is whether the network identity, browser identity, stored state and behavior hold together as one believable session, and whether the people maintaining it can tell when that stops being true.

The weaker questions:

  • How many fingerprint patches does it have?
  • How random are the fingerprints?
  • Does it pass this one test?
  • Did it pass yesterday?

The better ones:

  • Does the generated population look like real hardware?
  • Which changes have been validated against production behavior, not intuition?
  • Does stock Chrome pass on the same network path?
  • Do profile, seed and IP still describe one identity?
  • Which behavioral states does our testing actually exercise?
  • How fast can the maintainer find and fix a regression?

As the team put it:

Take your real target, your real proxy and your real flow. Run stock Chrome first to see if the path is passable at all, then your current stack, then the candidate, under the same conditions, and judge the whole session rather than one request.