Compare / versions
Opera developer vs stable
Opera's developer channel next to stable on the fleet. Both are on Chromium 155, so the web platform and the TLS and HTTP/2 fingerprint are identical. What gives the developer build away is the "(Edition developer)" suffix in its user agent.
On the fleet, Opera runs as stable and developer. Opera stopped shipping Linux betas, so developer is its only pre-release channel; beta is still accepted as a deprecated alias for it. Measured the same night: Opera 140.0.6072.0 developer on Chromium 155.0.8059.2, and Opera 139.0.6053.38 stable on Chromium 155.0.8059.85. That's a new Opera major on the same Chromium major. Unlike Chrome, Opera has no pinned versions, so this page compares the next release with the current one. How Opera differs from Chrome is in Opera vs Chrome; what changed in the last stable major is in the Opera 139 post.
What differs, measured on the fleet
- The user agent: developer ends in
OPR/140.0.0.0 (Edition developer), stable inOPR/139.0.0.0. Both sayChrome/155.0.0.0. - The client hints: brands
Opera 140vsOpera 139; both sendChromium 155and the sameNot(A:Brand 24placeholder, in the same order. In the full version list the Chromium build is155.0.8059.2on developer and155.0.8059.85on stable. - Nothing else. Every web platform feature in our probe reads the same on both builds. That includes the Chromium 155 set (
margin-trim,symbols(),text-decoration-skip-spaces, themedia-playback-while-not-visiblepolicy) and Topics, Protected Audience, fenced frames andnavigator.connection. Neither build has the Chromium 156 or 157 features (CSSrandom(),scroll-snap-type: pair,text-decoration-inset,streamAppendHTML).
What a site sees
| Opera developer (140) | Opera stable (139) | |
|---|---|---|
| User agent | Chrome/155.0.0.0 … OPR/140.0.0.0 (Edition developer). | Chrome/155.0.0.0 … OPR/139.0.0.0. |
| Client hints | Opera 140, Chromium 155, Not(A:Brand 24; full versions 140.0.6072.0 / 155.0.8059.2. | Opera 139, Chromium 155, Not(A:Brand 24; full versions 139.0.6053.38 / 155.0.8059.85. |
| TLS and HTTP/2 | JA4 t13d1517h2_8daaf6152771_cb7bf5808d99, 16 ciphers / 19 extensions, plus the same peetprint, HTTP/2 SETTINGS and header order. JA3 differs between connections because of GREASE. | Identical. |
| Fingerprint | Canvas hash f5a94624, SwiftShader WebGL, 5 plugins, PDF viewer, en-US, en, UTC, 1280×720 screen, webdriver false. | Identical. |
| 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. |
| Playwright | Main-world evaluate, console events, init scripts, routing, screenshots, PDF, device emulation and tracing all work. | The same. |
For scraping and detection
- "(Edition developer)" is a tell. A site that logs user agents sees a pre-release Opera build, which few real visitors run. Use
channel: "developer"to see what the next Opera changes, not to blend in. - The developer build gives you nothing new to test today. Its web platform is stable's, so a site behaves the same on both unless it reads the version strings.
- Both builds have the same TLS and HTTP/2 fingerprint. JA4
t13d1517(19 extensions) is the one Chrome sent in Opera vs Chrome. Brave sendst13d1516(Brave beta vs stable), so Opera's fingerprint is one extension apart from Brave's on either channel. - Plain HTTP works on both, because both are still on Chromium 155. Chromium 157 turns on HTTPS-First mode, which upgrades or blocks
http://URLs (Chrome 157 post). Our nodes switch it off for Chrome, Chromium, Brave and Edge, but that switch-off doesn't cover Opera yet. Re-check plain-HTTP targets when Opera moves to Chromium 157. - The core count (8 vs 64) differed because the two sessions landed on different nodes. It isn't a version difference.
Configurable — by you, by us, by nobody
| Item | Who controls it | How |
|---|---|---|
| Which build runs | You | channel: "developer" for 140 (not "dev"; "beta" is a deprecated alias), nothing for stable (139). See the opera-developer recipe and the Opera page. |
| The "(Edition developer)" suffix | Opera | Part of the developer build's own user agent; stable doesn't send it. |
| Chromium base of each channel | Opera | Both channels are on Chromium 155 today. |
| CDP access | You | cdp: true works on both channels (see the opera-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, and core counts are the node's.
Launch and cost
Single run; timings depend on the proxy and on fleet load.
| Opera developer | Opera stable | |
|---|---|---|
| Launch body | {"headless":false,"channel":"developer"} | {"headless":false} |
| Threads used | 2 (linux_headful) | 2 (linux_headful) |
| Browser version | 155.0.8059.2 | 155.0.8059.85 |
| Launch request → browser ready | 0.5 s | 0.6 s |
| Playwright connect | 0.0 s | 0.1 s |
| Load example.com | 0.7 s | 1.2 s |
| Load tls.peet.ws/api/all | 1.5 s | 1.2 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.
| Opera developer | Opera stable | |
|---|---|---|
| HTTP version | h2 | h2 |
| JA4 | t13d1517h2_8daaf6152771_cb7bf5808d99 | t13d1517h2_8daaf6152771_cb7bf5808d99 |
| Peetprint hash | fc97c1cdfb1409c9a9326c1b726d1dee | fc97c1cdfb1409c9a9326c1b726d1dee |
| 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 / 19 |
| 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.
| Opera developer | Opera stable | |
|---|---|---|
| navigator.userAgent | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36 OPR/140.0.0.0 (Edition developer) | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36 OPR/139.0.0.0 |
| UA-CH brands | Opera 140 · Chromium 155 · Not(A:Brand 24 | Opera 139 · Chromium 155 · Not(A:Brand 24 |
| UA-CH full version list | Opera 140.0.6072.0 · Chromium 155.0.8059.2 · Not(A:Brand 24.0.0.0 | Opera 139.0.6053.38 · Chromium 155.0.8059.85 · 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, en |
| 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 | 8 / 32 | 64 / 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.
| Opera developer | Opera 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 | 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 | yes |
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) | yes | yes |
CSS corner shorthand (listed for Chrome 160) | no | no |
CSS symbols() (Chrome 155) | yes | yes |
Element.streamAppendHTML (Chrome 157) | no | no |
WebTransport.reliability (on stable from Chrome 157; listed for 158) | no | no |
window.maximize() — Additional Windowing Controls (Chrome 155) | no | no |
Canvas srgb-linear colour space (on stable from Chrome 157) | 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) | yes | yes |
rel=compression-dictionary (Chrome 156 updates) | yes | yes |
bot.sannysoft.com
The classic headless-detection test page; what it marks red.
| Opera developer | Opera 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?
| Opera developer | Opera 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.
| Opera developer | Opera 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:06:47.731Z",
"sides": [
{
"label": "Opera developer",
"engine": "opera",
"body": {
"headless": false,
"channel": "developer"
},
"launch": {
"browser": "opera",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 545,
"connect_ms": 37,
"example_ms": 724,
"peet_ms": 1472
},
"network": {
"http_version": "h2",
"ja4": "t13d1517h2_8daaf6152771_cb7bf5808d99",
"ja3_hash": "83375184e0a7d5b481bb56b9b04f90bc",
"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 OPR/140.0.0.0 (Edition developer)",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US",
"en"
],
"hardware_concurrency": 8,
"device_memory": 32,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Opera",
"version": "140"
},
{
"brand": "Chromium",
"version": "155"
},
{
"brand": "Not(A:Brand",
"version": "24"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Opera",
"version": "140.0.6072.0"
},
{
"brand": "Chromium",
"version": "155.0.8059.2"
},
{
"brand": "Not(A:Brand",
"version": "24.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "140.0.6072.0",
"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": true,
"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.2"
},
{
"label": "Opera stable",
"engine": "opera",
"body": {
"headless": false
},
"launch": {
"browser": "opera",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 591,
"connect_ms": 125,
"example_ms": 1173,
"peet_ms": 1234
},
"network": {
"http_version": "h2",
"ja4": "t13d1517h2_8daaf6152771_cb7bf5808d99",
"ja3_hash": "22fb104ac7d5ee7397570b059e22c421",
"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 OPR/139.0.0.0",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US",
"en"
],
"hardware_concurrency": 64,
"device_memory": 32,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Opera",
"version": "139"
},
{
"brand": "Chromium",
"version": "155"
},
{
"brand": "Not(A:Brand",
"version": "24"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Opera",
"version": "139.0.6053.38"
},
{
"brand": "Chromium",
"version": "155.0.8059.85"
},
{
"brand": "Not(A:Brand",
"version": "24.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "139.0.6053.38",
"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": true,
"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.85"
}
]
}Bottom line
Opera 140 developer is the same browser as 139 stable as far as a page or the network can tell. It runs on the same Chromium 155 and has the same fingerprint, and only the version strings and the "(Edition developer)" suffix differ. Code that runs on stable needs no change.
The developer channel matters once Opera moves to Chromium 157: that is where a new Chromium base should show up first, together with its features and HTTPS-First mode.