Compare / versions
Brave beta vs stable
Brave's beta channel next to stable on the fleet. Right now the beta is the older engine: Brave 1.100 beta is on Chromium 156, while 1.99 stable already moved to Chromium 157. TLS and HTTP/2 are identical, and five web APIs differ.
On the fleet, Brave runs as stable (1.99.55) and beta (1.100.44); there are no pinned versions. You'd expect the beta to be ahead, but today it is a major behind: stable 1.99.55 moved to Chromium 157.0.8103.39 (Brave 1.99 post), while beta 1.100.44 still runs Chromium 156.0.8078.74, measured the same night. Brave doesn't expose its own version number to pages, so the 1.99/1.100 numbers come from our catalog; everything else below was measured from inside a page and on the wire. How Brave differs from Chrome and Edge is covered in Chrome vs Brave and Edge vs Brave.
What differs, measured on the fleet
The rows highlighted in the table below. Every one of them follows from the Chromium base, not from Brave itself:
- Only on stable (Chromium 157): CSS
text-decoration-inset,Element.prototype.streamAppendHTML,WebTransport.reliabilityand the canvassrgb-linearcolour space. These are the same four that Chrome 157 added (Chrome 157 post). - Only on beta (Chromium 156): Protected Audience (
navigator.joinAdInterestGroup). Chromium 157 removed it, so stable no longer has it. - Present in both: the Chromium 156 features (CSS
random(),scroll-snap-type: pair,rel=compression-dictionary) and the 155 ones (margin-trim,symbols(), themedia-playback-while-not-visiblepolicy). - Absent in both: the Topics API, fenced frames, Shared Storage, Attribution Reporting, Private Aggregation,
requestStorageAccessForandnavigator.connection.
What a site sees
| Brave beta (1.100.44) | Brave stable (1.99.55) | |
|---|---|---|
| User agent | Chrome/156.0.0.0 Safari/537.36: no Brave token. | Chrome/157.0.0.0 Safari/537.36. |
| Client hints | Brands Not:A-Brand 8, Chromium 156, Brave 156; full versions reduced to 156.0.0.0. | Brands Not-A.Brand 99, Brave 157, Chromium 157: a different placeholder brand, and Brave listed before Chromium. Full versions 157.0.0.0. |
| TLS and HTTP/2 | JA4 t13d1516h2_8daaf6152771_806a8c22fdea, 16 ciphers / 18 extensions, the same peetprint, HTTP/2 SETTINGS and header order (with sec-gpc). JA3 differs between connections because of GREASE. | Identical. |
| Fingerprint | SwiftShader WebGL, 7 plugins, PDF viewer, en-US, UTC, webdriver false. | The same. |
| Bot checks | bot.sannysoft.com: 1 of 57 flagged ("WebGL Renderer"). | The same. |
| Plain HTTP | http://ip-api.com/json loaded over HTTP (200), no warning page. | The same. Chromium 157's HTTPS-First mode is switched off on every node for Brave. |
| Playwright | Main-world evaluate, console events, init scripts, routing, screenshots, PDF, device emulation and tracing all work. | The same. |
For scraping and detection
- Don't assume the beta is newer. Today
channel: "beta"gives you an *older* engine than stable. If you want to test a site against the next Chromium, use Chrome's or Edge's beta channel (Chromium 158), not Brave's. - The version is declared three ways, and they must match: the reduced user agent,
sec-ch-uaandnavigator.userAgentData. Between 156 and 157 the placeholder brand and the brand order both change, so a brand list copied from one build looks wrong next to the other build's user agent. - Five feature probes tell the two builds apart.
CSS.supports("text-decoration-inset", "1px")returns true only on stable, andtypeof navigator.joinAdInterestGroup === "function"only on beta. A "Chrome/157" user agent that still has Protected Audience is running a 156 engine. - Nothing changes on the wire. JA4, peetprint, HTTP/2 and header order are the same on both channels, so network-level scoring treats them alike.
- Farbled values are not channel differences. The canvas hash (
5644a34bvs904ca97a) andhardwareConcurrency(36 vs 17) differ in the table below because Brave randomizes them for each session (case 83). Two sessions on the same channel would differ just as much. Both sides reported the same screen (1366×768) and 8 GB of memory.
Configurable — by you, by us, by nobody
| Item | Who controls it | How |
|---|---|---|
| Which build runs | You | channel: "beta" for 1.100, nothing for stable (1.99). Brave has no version pins on the fleet; the Brave page lists the current channels. |
| Which Chromium each channel is on | Brave | Set by Brave's releases. The order can flip while a new release rolls out, as it has today. |
Shields, sec-gpc, farbling | Nobody, per channel | The same on both channels. |
| Fingerprint surface (UA, client hints, screen) | You, per context | newContext options, as on stable. |
| CDP access | You | cdp: true works on both channels (see the brave-cdp recipe). |
Measured on the fleet (2026-11-08)
One headful launch of each channel on the production fleet, through the same proxy, probed from inside a page and via tls.peet.ws. Timings are a single sample. Canvas, cores and memory are farbled by Brave and change on every session.
Launch and cost
Single run; timings depend on the proxy and on fleet load.
| Brave beta | Brave stable | |
|---|---|---|
| Launch body | {"headless":false,"channel":"beta"} | {"headless":false} |
| Threads used | 2 (linux_headful) | 2 (linux_headful) |
| Browser version | 156.0.8078.74 | 157.0.8103.39 |
| Launch request → browser ready | 0.5 s | 0.7 s |
| Playwright connect | 0.1 s | 0.0 s |
| Load example.com | 1.5 s | 1.6 s |
| Load tls.peet.ws/api/all | 2.2 s | 1.7 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.
| Brave beta | Brave stable | |
|---|---|---|
| HTTP version | h2 | h2 |
| JA4 | t13d1516h2_8daaf6152771_806a8c22fdea | t13d1516h2_8daaf6152771_806a8c22fdea |
| Peetprint hash | 8f568b2a409b82d0ec24cb84bf3bc3fc | 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 / 18 | 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-gpc, sec-fetch-site | 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.
| Brave beta | Brave stable | |
|---|---|---|
| navigator.userAgent | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36 | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36 |
| UA-CH brands | Not:A-Brand 8 · Chromium 156 · Brave 156 | Not-A.Brand 99 · Brave 157 · Chromium 157 |
| UA-CH full version list | Not:A-Brand 8.0.0.0 · Chromium 156.0.0.0 · Brave 156.0.0.0 | Not-A.Brand 99.0.0.0 · Brave 157.0.0.0 · Chromium 157.0.0.0 |
| navigator.platform / vendor | Linux x86_64 / Google Inc. | Linux x86_64 / Google Inc. |
| Languages | en-US | en-US |
| Timezone / locale | UTC / en-US | UTC / en-US |
| Screen (w×h×availW×availH×depth) | 1366x768x1366x768x24 | 1366x768x1366x768x24 |
| Window outer / inner / DPR | 1281x722 / 1280x720 / 1 | 1281x723 / 1280x720 / 1 |
| hardwareConcurrency / deviceMemory | 36 / 8 | 17 / 8 |
| 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 | 5644a34b | 904ca97a |
| navigator.webdriver | no | no |
| window.chrome / navigator.connection | yes / no | yes / no |
| Plugins / PDF viewer | 7 / 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.
| Brave beta | Brave stable | |
|---|---|---|
Iterator.prototype.includes (new in Chrome 154) | yes | yes |
FontFace.width (new in Chrome 154) | yes | yes |
CSS text-decoration-inset (Chrome 157) | no | yes |
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) | no | no |
Protected Audience (navigator.joinAdInterestGroup) | yes | no |
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 (listed for Chrome 160) | no | no |
CSS symbols() (Chrome 155) | yes | yes |
Element.streamAppendHTML (Chrome 157) | no | yes |
WebTransport.reliability (on stable from Chrome 157; listed for 158) | no | yes |
window.maximize() — Additional Windowing Controls (Chrome 155) | no | no |
Canvas srgb-linear colour space (on stable from Chrome 157) | no | yes |
Permission policy media-playback-while-not-visible (Chrome 155) | yes | yes |
CSS random() (Chrome 156) | yes | yes |
CSS scroll-snap-type: pair (Chrome 156) | yes | yes |
Fenced frames (window.fence) | no | no |
rel=compression-dictionary (Chrome 156 updates) | yes | yes |
bot.sannysoft.com
The classic headless-detection test page; what it marks red.
| Brave beta | Brave stable | |
|---|---|---|
| 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?
| Brave beta | Brave stable | |
|---|---|---|
| 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.
| Brave beta | Brave stable | |
|---|---|---|
| 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-11-08T02:05:53.339Z",
"sides": [
{
"label": "Brave beta",
"engine": "brave",
"body": {
"headless": false,
"channel": "beta"
},
"launch": {
"browser": "brave",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 534,
"connect_ms": 142,
"example_ms": 1456,
"peet_ms": 2207
},
"network": {
"http_version": "h2",
"ja4": "t13d1516h2_8daaf6152771_806a8c22fdea",
"ja3_hash": "bbf9378f3d72016dc812ca0b3a73d882",
"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/156.0.0.0 Safari/537.36",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US"
],
"hardware_concurrency": 36,
"device_memory": 8,
"max_touch_points": 0,
"webdriver": false,
"plugins": 7,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Not:A-Brand",
"version": "8"
},
{
"brand": "Chromium",
"version": "156"
},
{
"brand": "Brave",
"version": "156"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Not:A-Brand",
"version": "8.0.0.0"
},
{
"brand": "Chromium",
"version": "156.0.0.0"
},
{
"brand": "Brave",
"version": "156.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "156.0.0.0",
"wow64": false
},
"screen": "1366x768x1366x768x24",
"window": {
"outer": "1281x722",
"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": "5644a34b",
"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": true,
"css_scroll_snap_pair": true,
"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": "156.0.8078.74"
},
{
"label": "Brave stable",
"engine": "brave",
"body": {
"headless": false
},
"launch": {
"browser": "brave",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 691,
"connect_ms": 19,
"example_ms": 1600,
"peet_ms": 1738
},
"network": {
"http_version": "h2",
"ja4": "t13d1516h2_8daaf6152771_806a8c22fdea",
"ja3_hash": "ac06e71a5304e5ff67d65517f739cda7",
"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/157.0.0.0 Safari/537.36",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US"
],
"hardware_concurrency": 17,
"device_memory": 8,
"max_touch_points": 0,
"webdriver": false,
"plugins": 7,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Not-A.Brand",
"version": "99"
},
{
"brand": "Brave",
"version": "157"
},
{
"brand": "Chromium",
"version": "157"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Not-A.Brand",
"version": "99.0.0.0"
},
{
"brand": "Brave",
"version": "157.0.0.0"
},
{
"brand": "Chromium",
"version": "157.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "157.0.0.0",
"wow64": false
},
"screen": "1366x768x1366x768x24",
"window": {
"outer": "1281x723",
"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": "904ca97a",
"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": true,
"css_scroll_axis_lock": false,
"websocket_options_bag": null,
"camera_element": true,
"topics_api": false,
"protected_audience": false,
"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": true,
"webtransport_reliability": true,
"window_maximize": false,
"canvas_srgb_linear": true,
"policy_media_playback_while_not_visible": true,
"css_random": true,
"css_scroll_snap_pair": true,
"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": "157.0.8103.39"
}
]
}Bottom line
Brave's beta channel isn't a preview of the next engine right now: 1.100 beta is a Chromium major behind 1.99 stable. Its TLS and HTTP/2 fingerprint is the same as stable's, but it has an older Chromium's API surface. That puts it in a smaller group of visitors without giving you anything new to test.
For scraping, stay on stable. A script that works on one Brave channel needs no change on the other, unless it relies on one of the five APIs listed above.