[Compare](https://cdpfleet.com/docs/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.

[Opera](https://cdpfleet.com/docs/browsers/opera)

On the fleet, [Opera](https://cdpfleet.com/docs/browsers/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](https://cdpfleet.com/docs/compare/opera-vs-chrome); what changed in the last stable major is in the [Opera 139 post](https://cdpfleet.com/docs/updates/opera-139).

## What differs, measured on the fleet

-   **The user agent:** developer ends in `OPR/140.0.0.0 (Edition developer)`, stable in `OPR/139.0.0.0`. Both say `Chrome/155.0.0.0`.
-   **The client hints:** brands `Opera 140` vs `Opera 139`; both send `Chromium 155` and the same `Not(A:Brand 24` placeholder, in the same order. In the full version list the Chromium build is `155.0.8059.2` on developer and `155.0.8059.85` on 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`, the `media-playback-while-not-visible` policy) and Topics, Protected Audience, fenced frames and `navigator.connection`. Neither build has the Chromium 156 or 157 features (CSS `random()`, `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](https://cdpfleet.com/docs/compare/opera-vs-chrome). Brave sends `t13d1516` ([Brave beta vs stable](https://cdpfleet.com/docs/compare/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](https://cdpfleet.com/docs/updates/chrome-157)). 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](https://cdpfleet.com/docs/examples#opera-developer) and the [Opera page](https://cdpfleet.com/docs/browsers/opera). |
| 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](https://cdpfleet.com/docs/examples#opera-cdp)). |

## 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 |
| PDF | 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.

---
Source: https://cdpfleet.com/docs/compare/opera-developer-vs-stable · Markdown: https://cdpfleet.com/docs/compare/opera-developer-vs-stable.md · All docs for AI tools: https://cdpfleet.com/llms.txt
