diff --git a/.opencode/package-lock.json b/.opencode/package-lock.json
new file mode 100644
index 000000000000000..86bbf5645f97940
--- /dev/null
+++ b/.opencode/package-lock.json
@@ -0,0 +1,115 @@
+{
+ "name": ".opencode",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@opencode-ai/plugin": "1.3.17"
+ }
+ },
+ "node_modules/@opencode-ai/plugin": {
+ "version": "1.3.17",
+ "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.3.17.tgz",
+ "integrity": "sha512-N5lckFtYvEu2R8K1um//MIOTHsJHniF2kHoPIWPCrxKG5Jpismt1ISGzIiU3aKI2ht/9VgcqKPC5oZFLdmpxPw==",
+ "license": "MIT",
+ "dependencies": {
+ "@opencode-ai/sdk": "1.3.17",
+ "zod": "4.1.8"
+ },
+ "peerDependencies": {
+ "@opentui/core": ">=0.1.96",
+ "@opentui/solid": ">=0.1.96"
+ },
+ "peerDependenciesMeta": {
+ "@opentui/core": {
+ "optional": true
+ },
+ "@opentui/solid": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@opencode-ai/sdk": {
+ "version": "1.3.17",
+ "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.3.17.tgz",
+ "integrity": "sha512-2+MGgu7wynqTBwxezR01VAGhILXlpcHDY/pF7SWB87WOgLt3kD55HjKHNj6PWxyY8n575AZolR95VUC3gtwfmA==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "7.0.6"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.1.8",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/src/assets/images/workers/platform/limits/connection-cancel-after.svg b/src/assets/images/workers/platform/limits/connection-cancel-after.svg
new file mode 100644
index 000000000000000..a00b9b26b41381d
--- /dev/null
+++ b/src/assets/images/workers/platform/limits/connection-cancel-after.svg
@@ -0,0 +1,70 @@
+
diff --git a/src/assets/images/workers/platform/limits/connection-cancel-before.svg b/src/assets/images/workers/platform/limits/connection-cancel-before.svg
new file mode 100644
index 000000000000000..0edafe66f252fac
--- /dev/null
+++ b/src/assets/images/workers/platform/limits/connection-cancel-before.svg
@@ -0,0 +1,71 @@
+
diff --git a/src/assets/images/workers/platform/limits/connection-limit-after.svg b/src/assets/images/workers/platform/limits/connection-limit-after.svg
new file mode 100644
index 000000000000000..0b2e49a5e18c780
--- /dev/null
+++ b/src/assets/images/workers/platform/limits/connection-limit-after.svg
@@ -0,0 +1,85 @@
+
diff --git a/src/assets/images/workers/platform/limits/connection-limit-before.svg b/src/assets/images/workers/platform/limits/connection-limit-before.svg
new file mode 100644
index 000000000000000..701ea15462f2a7a
--- /dev/null
+++ b/src/assets/images/workers/platform/limits/connection-limit-before.svg
@@ -0,0 +1,93 @@
+
diff --git a/src/content/changelog/workers/2026-04-09-relaxed-connection-limiting.mdx b/src/content/changelog/workers/2026-04-09-relaxed-connection-limiting.mdx
new file mode 100644
index 000000000000000..3c3e34b28d72adb
--- /dev/null
+++ b/src/content/changelog/workers/2026-04-09-relaxed-connection-limiting.mdx
@@ -0,0 +1,27 @@
+---
+title: Relaxed simultaneous connection limiting for Workers
+description: The six-connection limit now only applies while waiting for response headers, allowing Workers to maintain more open connections simultaneously.
+date: 2026-04-09
+---
+
+The [simultaneous open connections limit](/workers/platform/limits/#simultaneous-open-connections) has been relaxed. Previously, each Worker invocation was limited to six open connections at a time for the entire lifetime of each connection, including while reading the response body. Now, a connection is freed as soon as response headers arrive, so the six-connection limit only constrains how many connections can be in the initial "waiting for headers" phase simultaneously.
+
+### Before: New connections are blocked until an earlier connection fully completes
+
+
+
+### After: New connections can start as soon as response headers arrive
+
+
+
+This means Workers can now have many more connections open at the same time without queueing, as long as no more than six are waiting for their initial response. This eliminates the `Response closed due to connection limit` exception that could previously occur when the runtime canceled stalled connections to prevent deadlocks.
+
+Previously, the runtime used a deadlock avoidance algorithm that watched each open connection for I/O activity. If all six connections appeared idle — even momentarily — the runtime would cancel the least-recently-used connection to make room for new requests. In practice, this heuristic was fragile. For example, when a response used `Content-Encoding: gzip`, the runtime's internal decompression created brief gaps between read and write operations. During these gaps, the connection appeared stalled despite being actively read by the Worker. If multiple connections hit these gaps at the same time, the runtime could spuriously cancel a connection that was working correctly. By only counting connections during the waiting-for-headers phase — where the runtime is fully in control and there is no ambiguity about whether the connection is active — this class of bug is eliminated entirely.
+
+### Before: Connections could be canceled during brief internal pauses
+
+
+
+### After: Connections complete normally regardless of internal pauses
+
+
diff --git a/src/content/docs/workers/platform/limits.mdx b/src/content/docs/workers/platform/limits.mdx
index 17a1290ebbec944..d57c1cd1f476232 100644
--- a/src/content/docs/workers/platform/limits.mdx
+++ b/src/content/docs/workers/platform/limits.mdx
@@ -7,7 +7,7 @@ head: []
description: Cloudflare Workers plan and platform limits.
---
-import { Render, WranglerConfig, DashButton } from "~/components";
+import { Render, WranglerConfig, DashButton, TypeScriptExample } from "~/components";
## Account plan limits
@@ -200,7 +200,7 @@ Using global [`fetch()`](/workers/runtime-apis/fetch/) to call another Worker on
## Simultaneous open connections
-Each Worker invocation can open up to six simultaneous connections. The following API calls count toward this limit:
+Each Worker invocation can have up to six connections simultaneously waiting for response headers. The following API calls count toward this limit while the initial connection is being established and the server has not yet responded:
- `fetch()` method of the [Fetch API](/workers/runtime-apis/fetch/)
- `get()`, `put()`, `list()`, and `delete()` methods of [Workers KV namespace objects](/kv/api/)
@@ -211,15 +211,17 @@ Each Worker invocation can open up to six simultaneous connections. The followin
Outbound WebSocket connections also count toward this limit.
-Once six connections are open, the runtime queues additional attempts until an existing connection closes. The runtime may close stalled connections (those not actively reading or writing) with a `Response closed due to connection limit` exception.
+Once response headers arrive for a connection, it no longer counts toward the six-connection limit. This means a Worker can have many connections open simultaneously, as long as no more than six are in the initial "waiting for headers" phase at the same time. If a seventh connection is attempted while six are already waiting for headers, it is queued until one of the existing connections receives its response headers.
-If you use `fetch()` but do not need the response body, call `response.body.cancel()` to free the connection:
+If you use `fetch()` but do not need the response body, calling `response.body.cancel()` is still good practice to free memory:
+
+
```ts
const response = await fetch(url);
// Only read the response body for successful responses
-if (response.statusCode <= 299) {
+if (response.status <= 299) {
// Call response.json(), response.text() or otherwise process the body
} else {
// Explicitly cancel it
@@ -227,7 +229,7 @@ if (response.statusCode <= 299) {
}
```
-If the system detects a deadlock (pending connection attempts with no in-progress reads or writes), it cancels the least-recently-used connection to unblock the Worker.
+
:::note