Compare / browsers
Chrome vs Brave
The same Chromium 155 underneath, two very different faces: Brave calls itself Chrome in the user agent but Brave in the client hints, randomises cores, screen and canvas, sends Sec-GPC, drops a TLS extension and switches off Google's Topics and Fenced Frames.
Brave and Chrome on the fleet are the same Chromium release — 155.0.8059.39 against .40, measured the same morning. What separates them is everything Brave adds on top: Shields (ad and tracker blocking, on by default), fingerprint "farbling", and a privacy stance that shows up in the headers. For a scraper that's a trade-off: fewer requests and a moving fingerprint, but a browser that announces itself as Brave to anyone reading client hints.
As a developer: driving them
| Google Chrome | Brave | |
|---|---|---|
| Version on the fleet | Chrome 155 stable, with beta and dev channels and pinned previous majors. | Brave 1.97 on Chromium 155 (the same build week as Chrome), with a beta channel (1.98); no dev channel, no pinned majors. |
| Playwright client, options | chromium 1.60; channel, version, cdp, live_view, screen_size. | chromium 1.60; channel, cdp, live_view, screen_size. |
| Playwright features | Main-world evaluate, console events, init scripts, routing, screenshots, PDF, device emulation, tracing — all work (measured). | The same list, all working (measured). |
| Page weight | Loads everything the page asks for. | Shields (ad and tracker blocking) are on by default, but on a news front page (theguardian.com, two runs each) Brave made 65–70 requests against Chrome's 60–91 — within run-to-run noise. Don't count on traffic savings; block what you don't need with routing (bandwidth diet). |
| Web platform | Everything in Chromium 155, including Google's Topics API, Fenced Frames and navigator.connection. | Chromium 155 without the Topics API, Fenced Frames and navigator.connection (measured) — privacy features Brave removes. Code that relies on them behaves differently. |
As a scraper: what the site sees
| Google Chrome | Brave | |
|---|---|---|
| User agent | Chrome/155.0.0.0 on Linux. | The identical string — Brave doesn't name itself in the user agent. |
| Client hints | Brands Google Chrome 155, Chromium 155; full version 155.0.8059.39. | Brands Brave 155, Chromium 155; full versions reduced to 155.0.0.0. Anything reading Sec-CH-UA sees Brave, not Chrome. |
| Headers | Chromium's order: … accept, sec-fetch-site, sec-fetch-mode … | Adds sec-gpc: 1 (Global Privacy Control) before the fetch metadata — a header Chrome never sends. |
| TLS | JA4 t13d1517h2_8daaf6152771_… — 19 extensions. | JA4 t13d1516h2_8daaf6152771_… — 18 extensions; same ciphers, different full fingerprint. |
| HTTP/2 | Chromium's SETTINGS and WINDOW_UPDATE. | Identical (measured). |
| Fingerprint values | The machine's own: 36 cores, a 1280×720 screen, one canvas hash for every site. | Farbled: 8 cores, a 1280×800 screen and a different canvas hash — plausible values that change between sessions and sites, so a fingerprint taken today won't match tomorrow's. |
| Languages, plugins | navigator.languages en-US, en; 5 plugins. | en-US only; 7 plugins. |
| Bot checks | bot.sannysoft.com: only "WebGL Renderer" flagged (SwiftShader on a GPU-less server). | The same single flag (measured). |
Which to pick
- Chrome when the site should see the most common browser on the web: the
Google Chromebrand, full version numbers, no extra headers, a stable fingerprint that matches what millions of users send. - Brave when a moving fingerprint is worth more than blending in: sites that track devices across sessions get different cores, screen and canvas every time.
- Don't expect Brave to pass as Chrome: its user agent says Chrome, but the client hints, the
sec-gpcheader and the TLS fingerprint all say Brave. Pick it for what it is.
Measured on the fleet (2026-10-09)
One headful launch of each through the same proxy, probed from inside a page and via tls.peet.ws.
Launch and cost
Single run; timings depend on the proxy and on fleet load.
| Google Chrome | Brave | |
|---|---|---|
| Launch body | {"headless":false} | {"headless":false} |
| Threads used | 2 (linux_headful) | 2 (linux_headful) |
| Browser version | 155.0.8059.39 | 155.0.8059.40 |
| Launch request → browser ready | 1.2 s | 1.5 s |
| Playwright connect | 0.1 s | 0.3 s |
| Load example.com | 2.9 s | 0.5 s |
| Load tls.peet.ws/api/all | 5.4 s | 1.5 s |
What the network sees
From tls.peet.ws/api/all, requested by the browser itself. JA3 hashes change between runs of the same build (GREASE), so compare JA4 and the HTTP/2 fingerprint.
| Google Chrome | Brave | |
|---|---|---|
| HTTP version | h2 | h2 |
| JA4 | t13d1517h2_8daaf6152771_cb7bf5808d99 | t13d1516h2_8daaf6152771_806a8c22fdea |
| Peetprint hash | fc97c1cdfb1409c9a9326c1b726d1dee | 8f568b2a409b82d0ec24cb84bf3bc3fc |
| Akamai HTTP/2 fingerprint | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p |
| Cipher suites / extensions | 16 / 19 | 16 / 18 |
| Header order (first 12) | method, authority, scheme, path, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, upgrade-insecure-requests, user-agent, accept, sec-fetch-site, sec-fetch-mode | method, authority, scheme, path, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, upgrade-insecure-requests, user-agent, accept, sec-gpc, sec-fetch-site |
What page scripts see
Read with page.evaluate on example.com. Cores and memory are the server's and vary between fleet nodes.
| Google Chrome | Brave | |
|---|---|---|
| navigator.userAgent | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36 | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36 |
| UA-CH brands | Google Chrome 155 · Chromium 155 · Not(A:Brand 24 | Brave 155 · Chromium 155 · Not(A:Brand 24 |
| UA-CH full version list | Google Chrome 155.0.8059.39 · Chromium 155.0.8059.39 · Not(A:Brand 24.0.0.0 | Brave 155.0.0.0 · Chromium 155.0.0.0 · Not(A:Brand 24.0.0.0 |
| navigator.platform / vendor | Linux x86_64 / Google Inc. | Linux x86_64 / Google Inc. |
| Languages | en-US, en | en-US |
| Timezone / locale | UTC / en-US | UTC / en-US |
| Screen (w×h×availW×availH×depth) | 1280x720x1280x720x24 | 1280x800x1280x800x24 |
| Window outer / inner / DPR | 1288x805 / 1280x720 / 1 | 1280x727 / 1280x720 / 1 |
| hardwareConcurrency / deviceMemory | 36 / 32 | 8 / 32 |
| WebGL vendor | Google Inc. (Google) | Google Inc. (Google) |
| WebGL renderer | ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver) | ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver) |
| WebGL version | WebGL 2.0 (OpenGL ES 3.0 Chromium) | WebGL 2.0 (OpenGL ES 3.0 Chromium) |
| WebGPU (navigator.gpu) | yes | yes |
| Canvas hash | f5a94624 | 2025530b |
| navigator.webdriver | no | no |
| window.chrome / navigator.connection | yes / yes | yes / no |
| Plugins / PDF viewer | 5 / yes | 7 / yes |
| Notification.permission / permissions.query | default / prompt | default / prompt |
Web platform features
Presence probes; a user agent that claims one version while exposing another's features is a detectable inconsistency.
| Google Chrome | Brave | |
|---|---|---|
Iterator.prototype.includes (new in Chrome 154) | yes | yes |
FontFace.width (new in Chrome 154) | yes | yes |
CSS text-decoration-inset (new in Chrome 154) | no | no |
Iterator.prototype.join (Chrome 153) | yes | yes |
Iterator.zip (Chrome 153) | yes | yes |
CSS scroll-axis-lock (Chrome 153) | no | no |
<camera> element (Chrome 153) | yes | yes |
document.requestStorageAccessFor (deprecated in 153) | no | no |
Topics API (document.browsingTopics) | yes | no |
Protected Audience (navigator.joinAdInterestGroup) | yes | yes |
Shared Storage (window.sharedStorage) | no | no |
Attribution Reporting (window.attributionReporting) | no | no |
| Private Aggregation | no | no |
WebHID (navigator.hid) | yes | yes |
CSS margin-trim (Chrome 155) | yes | yes |
CSS text-decoration-skip-spaces (Chrome 155) | no | no |
CSS corner shorthand (Chrome 155) | no | no |
CSS symbols() (Chrome 155) | yes | yes |
Element.streamAppendHTML (Chrome 155) | no | no |
WebTransport.reliability (Chrome 155) | no | no |
window.maximize() — Additional Windowing Controls (Chrome 155) | no | no |
Canvas srgb-linear colour space (Chrome 155) | no | no |
Permission policy media-playback-while-not-visible (Chrome 155) | yes | yes |
CSS random() (Chrome 156) | no | no |
CSS scroll-snap-type: pair (Chrome 156) | no | no |
Fenced frames (window.fence) — removal starts in 157 | yes | no |
rel=compression-dictionary (Chrome 156 updates) | yes | yes |
bot.sannysoft.com
The classic headless-detection test page; what it marks red.
| Google Chrome | Brave | |
|---|---|---|
| Checks / failed | 57 / 1 | 57 / 1 |
| Failed checks | WebGL Renderer | WebGL Renderer |
A plain-HTTP URL (http://ip-api.com/json)
Chrome 154 warns before loading insecure HTTP by default — does that reach an automated session?
| Google Chrome | Brave | |
|---|---|---|
| Final URL | http://ip-api.com/json/?fields=status | http://ip-api.com/json/?fields=status |
| HTTP status | 200 | 200 |
| Content loaded / warning page first | yes / no | yes / no |
Playwright over the remote connection
Which client features work on this side.
| Google Chrome | Brave | |
|---|---|---|
| page.evaluate runs in the page's own world | yes | yes |
| addInitScript visible to page scripts | yes | yes |
| Console events | yes | yes |
| Request interception (page.route) | yes | yes |
| Screenshot | yes | yes |
| yes | yes | |
| Mobile device emulation | yes | yes |
| Tracing | yes | yes |
Rows where the two sides differ are highlighted. IP addresses are replaced with placeholders (203.0.113.x). The probe is compare/probe.mjs in our repository; the raw result is below.
Raw output
{
"ran_at": "2026-10-09T01:48:56.848Z",
"sides": [
{
"label": "Google Chrome",
"engine": "chrome",
"body": {
"headless": false
},
"launch": {
"browser": "chrome",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 1240,
"connect_ms": 132,
"example_ms": 2891,
"peet_ms": 5401
},
"network": {
"http_version": "h2",
"ja4": "t13d1517h2_8daaf6152771_cb7bf5808d99",
"ja3_hash": "84b0f69cba23976c531c60f56f17aeea",
"peetprint_hash": "fc97c1cdfb1409c9a9326c1b726d1dee",
"ciphers": 16,
"extensions": 19,
"akamai_h2": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p",
"akamai_h2_hash": "52d84b11737d980aef856699f885ca86",
"header_order": [
"method",
"authority",
"scheme",
"path",
"sec-ch-ua",
"sec-ch-ua-mobile",
"sec-ch-ua-platform",
"upgrade-insecure-requests",
"user-agent",
"accept",
"sec-fetch-site",
"sec-fetch-mode"
]
},
"page": {
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US",
"en"
],
"hardware_concurrency": 36,
"device_memory": 32,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Google Chrome",
"version": "155"
},
{
"brand": "Chromium",
"version": "155"
},
{
"brand": "Not(A:Brand",
"version": "24"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Google Chrome",
"version": "155.0.8059.39"
},
{
"brand": "Chromium",
"version": "155.0.8059.39"
},
{
"brand": "Not(A:Brand",
"version": "24.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "155.0.8059.39",
"wow64": false
},
"screen": "1280x720x1280x720x24",
"window": {
"outer": "1288x805",
"inner": "1280x720",
"dpr": 1
},
"timezone": "UTC",
"locale": "en-US",
"webgl": {
"vendor": "Google Inc. (Google)",
"renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"canvas_hash": "f5a94624",
"webgpu": true,
"chrome_object": true,
"chrome_runtime": false,
"notification_permission": "default",
"notification_query": "prompt",
"has_focus": true,
"connection_api": true,
"stack_read_by_debugger": false,
"features": {
"iterator_includes": true,
"iterator_join": true,
"iterator_zip": true,
"fontface_width": true,
"css_text_decoration_inset": false,
"css_scroll_axis_lock": false,
"websocket_options_bag": null,
"camera_element": true,
"topics_api": true,
"protected_audience": true,
"shared_storage": false,
"attribution_reporting": false,
"request_storage_access_for": false,
"webhid": true,
"private_aggregation": false,
"css_margin_trim": true,
"css_text_decoration_skip_spaces": false,
"css_corner_shorthand": false,
"css_symbols": true,
"stream_append_html": false,
"webtransport_reliability": false,
"window_maximize": false,
"canvas_srgb_linear": false,
"policy_media_playback_while_not_visible": true,
"css_random": false,
"css_scroll_snap_pair": false,
"fenced_frames": true,
"compression_dictionary": true
}
},
"page_main_world": null,
"sannysoft": {
"checks": 57,
"failed": 1,
"failed_names": [
"WebGL Renderer"
],
"passed": 30
},
"plain_http": {
"final_url": "http://ip-api.com/json/?fields=status",
"status": 200,
"title": "",
"loaded": true,
"warning_page": false,
"page_text": "{\"status\":\"success\"}"
},
"playwright": {
"evaluate_in_main_world": true,
"console_events": true,
"init_script": true,
"route": true,
"screenshot": true,
"pdf": true,
"mobile_emulation": true,
"tracing": true
},
"browser_version": "155.0.8059.39"
},
{
"label": "Brave",
"engine": "brave",
"body": {
"headless": false
},
"launch": {
"browser": "brave",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 1542,
"connect_ms": 286,
"example_ms": 504,
"peet_ms": 1463
},
"network": {
"http_version": "h2",
"ja4": "t13d1516h2_8daaf6152771_806a8c22fdea",
"ja3_hash": "38839c09cb2e2b08b44c991a1b255c5f",
"peetprint_hash": "8f568b2a409b82d0ec24cb84bf3bc3fc",
"ciphers": 16,
"extensions": 18,
"akamai_h2": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p",
"akamai_h2_hash": "52d84b11737d980aef856699f885ca86",
"header_order": [
"method",
"authority",
"scheme",
"path",
"sec-ch-ua",
"sec-ch-ua-mobile",
"sec-ch-ua-platform",
"upgrade-insecure-requests",
"user-agent",
"accept",
"sec-gpc",
"sec-fetch-site"
]
},
"page": {
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US"
],
"hardware_concurrency": 8,
"device_memory": 32,
"max_touch_points": 0,
"webdriver": false,
"plugins": 7,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Brave",
"version": "155"
},
{
"brand": "Chromium",
"version": "155"
},
{
"brand": "Not(A:Brand",
"version": "24"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Brave",
"version": "155.0.0.0"
},
{
"brand": "Chromium",
"version": "155.0.0.0"
},
{
"brand": "Not(A:Brand",
"version": "24.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "155.0.0.0",
"wow64": false
},
"screen": "1280x800x1280x800x24",
"window": {
"outer": "1280x727",
"inner": "1280x720",
"dpr": 1
},
"timezone": "UTC",
"locale": "en-US",
"webgl": {
"vendor": "Google Inc. (Google)",
"renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"canvas_hash": "2025530b",
"webgpu": true,
"chrome_object": true,
"chrome_runtime": false,
"notification_permission": "default",
"notification_query": "prompt",
"has_focus": true,
"connection_api": false,
"stack_read_by_debugger": false,
"features": {
"iterator_includes": true,
"iterator_join": true,
"iterator_zip": true,
"fontface_width": true,
"css_text_decoration_inset": false,
"css_scroll_axis_lock": false,
"websocket_options_bag": null,
"camera_element": true,
"topics_api": false,
"protected_audience": true,
"shared_storage": false,
"attribution_reporting": false,
"request_storage_access_for": false,
"webhid": true,
"private_aggregation": false,
"css_margin_trim": true,
"css_text_decoration_skip_spaces": false,
"css_corner_shorthand": false,
"css_symbols": true,
"stream_append_html": false,
"webtransport_reliability": false,
"window_maximize": false,
"canvas_srgb_linear": false,
"policy_media_playback_while_not_visible": true,
"css_random": false,
"css_scroll_snap_pair": false,
"fenced_frames": false,
"compression_dictionary": true
}
},
"page_main_world": null,
"sannysoft": {
"checks": 57,
"failed": 1,
"failed_names": [
"WebGL Renderer"
],
"passed": 29
},
"plain_http": {
"final_url": "http://ip-api.com/json/?fields=status",
"status": 200,
"title": "",
"loaded": true,
"warning_page": false,
"page_text": "{\"status\":\"success\"}"
},
"playwright": {
"evaluate_in_main_world": true,
"console_events": true,
"init_script": true,
"route": true,
"screenshot": true,
"pdf": true,
"mobile_emulation": true,
"tracing": true
},
"browser_version": "155.0.8059.40"
}
]
}Bottom line
Brave is Chrome's engine with Brave's opinions: the same rendering and Playwright support, but its own name in the client hints, a privacy header, one TLS extension fewer and fingerprint values that refuse to hold still.
Both cost the same thread on the fleet; choose by what the site should believe about its visitor.