Compare / browsers
Chrome vs Chromium
Google's Chrome against the Chromium build Playwright ships: seven majors apart, one brand missing from the client hints, one TLS extension fewer — and, contrary to folklore, the same video codecs and DRM.
Chromium on the fleet is the build Playwright downloads for itself — the one most automation runs on by default. Chrome is Google's own release, the browser most of the web's visitors actually use. They share an engine, so the question isn't "which renders better" but "which one does the site think it's talking to", and what each costs you as a developer.
As a developer: driving them
| Google Chrome | Chromium | |
|---|---|---|
| Version on the fleet | 155 stable, with beta (156) and dev (157) channels and pinned previous majors (154, 153). | 148 — the build tied to the Playwright release the fleet runs. One version, no channels, no pinning. |
| Playwright client, options | chromium 1.60; channel, version, cdp, live_view. | chromium 1.60; cdp, live_view. |
| Features | Every Playwright feature (PDF, tracing, device emulation, routing) — measured identical. | The same — measured identical. |
| Video and DRM | H.264, AAC, VP9, AV1 and Widevine (measured). | The same — H.264, AAC, VP9, AV1 and Widevine all reported available (measured), so streaming-site playback isn't a reason to switch on the fleet. |
| Web platform | Current: everything up to 155. | Seven majors behind: no Iterator.prototype.includes, FontFace.width, margin-trim, symbols(), <camera>…; still has APIs Chrome has since removed (document.requestStorageAccessFor, Shared Storage). Code that works in Chromium 148 can break in today's Chrome, and vice versa. |
As a scraper: what the site sees
| Google Chrome | Chromium | |
|---|---|---|
| Client hints | Brands Google Chrome 155, Chromium 155 (+ GREASE). | No Google Chrome brand — only Chromium 148 (+ GREASE). The single easiest server-side way to tell "real Chrome" from an automation browser. |
| User agent | Chrome/155.0.0.0 | Chrome/148.0.0.0 — a version real Chrome users left months ago. |
| TLS | JA4 t13d1517h2_8daaf6152771_… — 19 extensions. | JA4 t13d1516h2_8daaf6152771_… — 18 extensions; same cipher suites, different full fingerprint. |
| HTTP/2 and headers | Chromium's SETTINGS, WINDOW_UPDATE and header order. | Identical (measured). |
| Languages | navigator.languages: en-US, en | en-US only — the shorter list is another small Playwright-default tell. |
| Fingerprint surface | Same canvas hash, WebGL (SwiftShader on the fleet), screen, plugins; webdriver false. | Identical on all of those (measured). |
Which to pick
- Chrome whenever the site scores visitors: the
Google Chromebrand, a current version and the TLS fingerprint real users send. It also lets you test against beta and dev before they ship, or pin an older major to reproduce a bug. - Chromium for workloads where nobody checks — internal tools, your own sites, rendering and PDF jobs — and when you want the exact browser your local Playwright tests run against.
- Patching Chromium to look like Chrome means overriding the brand list and version (possible over CDP, but every override is one more thing that must agree) — and the TLS extension and the 148 feature set can't be changed at all. Launch Chrome instead; it costs the same thread.
Measured on the fleet (2026-10-07)
One headful launch of each through the same proxy, probed from inside a page and via tls.peet.ws; codec and Widevine support checked with canPlayType and requestMediaKeySystemAccess on the same day.
Launch and cost
Single run; timings depend on the proxy and on fleet load.
| Google Chrome | Chromium | |
|---|---|---|
| Launch body | {"headless":false} | {"headless":false} |
| Threads used | 2 (linux_headful) | 2 (linux_headful) |
| Browser version | 155.0.8059.39 | 148.0.7778.96 |
| Launch request → browser ready | 0.8 s | 0.6 s |
| Playwright connect | 1.0 s | 0.2 s |
| Load example.com | 20.3 s | 1.6 s |
| Load tls.peet.ws/api/all | 5.6 s | 3.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.
| Google Chrome | Chromium | |
|---|---|---|
| HTTP version | h2 | h2 |
| JA4 | t13d1517h2_8daaf6152771_cb7bf5808d99 | t13d1516h2_8daaf6152771_d8a2da3f94cd |
| Peetprint hash | fc97c1cdfb1409c9a9326c1b726d1dee | 1d4ffe9b0e34acac0bd883fa7f79d7b5 |
| 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-fetch-site, sec-fetch-mode |
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 | Chromium | |
|---|---|---|
| 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/148.0.0.0 Safari/537.36 |
| UA-CH brands | Google Chrome 155 · Chromium 155 · Not(A:Brand 24 | Not/A)Brand 99 · Chromium 148 |
| UA-CH full version list | Google Chrome 155.0.8059.39 · Chromium 155.0.8059.39 · Not(A:Brand 24.0.0.0 | Not/A)Brand 99.0.0.0 · Chromium 148.0.7778.96 |
| 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 | 1280x720x1280x720x24 |
| Window outer / inner / DPR | 1288x805 / 1280x720 / 1 | 1288x805 / 1280x720 / 1 |
| hardwareConcurrency / deviceMemory | 24 / 32 | 24 / 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 | f5a94624 |
| navigator.webdriver | no | no |
| window.chrome / navigator.connection | yes / yes | yes / yes |
| Plugins / PDF viewer | 5 / yes | 5 / 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 | Chromium | |
|---|---|---|
Iterator.prototype.includes (new in Chrome 154) | yes | no |
FontFace.width (new in Chrome 154) | yes | no |
CSS text-decoration-inset (new in Chrome 154) | no | no |
Iterator.prototype.join (Chrome 153) | yes | no |
Iterator.zip (Chrome 153) | yes | no |
CSS scroll-axis-lock (Chrome 153) | no | no |
<camera> element (Chrome 153) | yes | no |
document.requestStorageAccessFor (deprecated in 153) | no | yes |
Topics API (document.browsingTopics) | yes | yes |
Protected Audience (navigator.joinAdInterestGroup) | yes | yes |
Shared Storage (window.sharedStorage) | no | yes |
Attribution Reporting (window.attributionReporting) | no | no |
| Private Aggregation | no | no |
WebHID (navigator.hid) | yes | yes |
CSS margin-trim (Chrome 155) | yes | no |
CSS text-decoration-skip-spaces (Chrome 155) | no | no |
CSS corner shorthand (Chrome 155) | no | no |
CSS symbols() (Chrome 155) | yes | no |
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 | no |
CSS random() (Chrome 156) | no | no |
CSS scroll-snap-type: pair (Chrome 156) | no | no |
Fenced frames (window.fence) — removal starts in 157 | yes | yes |
rel=compression-dictionary (Chrome 156 updates) | yes | yes |
bot.sannysoft.com
The classic headless-detection test page; what it marks red.
| Google Chrome | Chromium | |
|---|---|---|
| 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 | Chromium | |
|---|---|---|
| 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 | Chromium | |
|---|---|---|
| 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-07T07:44:13.028Z",
"sides": [
{
"label": "Google Chrome",
"engine": "chrome",
"body": {
"headless": false
},
"launch": {
"browser": "chrome",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 849,
"connect_ms": 995,
"example_ms": 20284,
"peet_ms": 5620
},
"network": {
"http_version": "h2",
"ja4": "t13d1517h2_8daaf6152771_cb7bf5808d99",
"ja3_hash": "2aad4b2f7c2d32c0a2e0c063c6d24066",
"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": 24,
"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": "Chromium",
"engine": "chromium",
"body": {
"headless": false
},
"launch": {
"browser": "chromium",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 580,
"connect_ms": 163,
"example_ms": 1647,
"peet_ms": 3670
},
"network": {
"http_version": "h2",
"ja4": "t13d1516h2_8daaf6152771_d8a2da3f94cd",
"ja3_hash": "61c36b4bf24ddf43b4290e86253ec074",
"peetprint_hash": "1d4ffe9b0e34acac0bd883fa7f79d7b5",
"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-fetch-site",
"sec-fetch-mode"
]
},
"page": {
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US"
],
"hardware_concurrency": 24,
"device_memory": 32,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Not/A)Brand",
"version": "99"
},
{
"brand": "Chromium",
"version": "148"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Not/A)Brand",
"version": "99.0.0.0"
},
{
"brand": "Chromium",
"version": "148.0.7778.96"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "148.0.7778.96",
"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": false,
"iterator_join": false,
"iterator_zip": false,
"fontface_width": false,
"css_text_decoration_inset": false,
"css_scroll_axis_lock": false,
"websocket_options_bag": null,
"camera_element": false,
"topics_api": true,
"protected_audience": true,
"shared_storage": true,
"attribution_reporting": false,
"request_storage_access_for": true,
"webhid": true,
"private_aggregation": false,
"css_margin_trim": false,
"css_text_decoration_skip_spaces": false,
"css_corner_shorthand": false,
"css_symbols": false,
"stream_append_html": false,
"webtransport_reliability": false,
"window_maximize": false,
"canvas_srgb_linear": false,
"policy_media_playback_while_not_visible": false,
"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": "148.0.7778.96"
}
]
}Bottom line
Chrome and the Playwright Chromium build are the same engine at different ages wearing different badges. The badges — client-hint brand, version, one TLS extension — are exactly what server-side bot checks read first.
On the fleet both play video and DRM content, so the deciding question is simply whether the site cares which badge it sees. If it might, run Chrome.