releases.shpreview
Cloudflare/Cloudflare Changelog/Sandbox services now shareable via quick or named tunnels

Sandbox services now shareable via quick or named tunnels

1 featureThis release1 featureNew capabilitiesAI-tallied from the release notes

Sandboxes can expose a service running inside the container on a public preview URL through the sandbox.tunnels namespace. The SDK uses cloudflared inside the sandbox so you can share a running service without configuring exposePort() or a custom domain.

By default, sandbox.tunnels.get(port) creates a quick tunnel on a zero-config *.trycloudflare.com URL — no Cloudflare account, DNS record, or custom domain required. This is perfect for quick development and for .workers.dev deployments.

  • JavaScript

    <div><div><span>import </span><span>{</span><span><span> </span><span>getSandbox</span><span> </span></span><span>}</span><span> from </span><span>"@cloudflare/sandbox"</span><span>;</span></div></div><div><div>
    </div></div><div><div><span>const</span><span> </span><span>sandbox</span><span> </span><span>=</span><span> </span><span>getSandbox</span><span>(</span><span>env</span><span>.</span><span>Sandbox</span><span>,</span><span> </span><span>"my-sandbox"</span><span>)</span><span>;</span></div></div><div><div><span>await</span><span> </span><span>sandbox</span><span>.</span><span>startProcess</span><span>(</span><span>"python -m http.server 8080"</span><span>)</span><span>;</span></div></div><div><div>
    </div></div><div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://random-words-here.trycloudflare.com</span></div></div>
  • TypeScript

    <div><div><span>import </span><span>{</span><span><span> </span><span>getSandbox</span><span> </span></span><span>}</span><span> from </span><span>"@cloudflare/sandbox"</span><span>;</span></div></div><div><div>
    </div></div><div><div><span>const</span><span> </span><span>sandbox</span><span> </span><span>=</span><span> </span><span>getSandbox</span><span>(</span><span>env</span><span>.</span><span>Sandbox</span><span>,</span><span> </span><span>"my-sandbox"</span><span>)</span><span>;</span></div></div><div><div><span>await</span><span> </span><span>sandbox</span><span>.</span><span>startProcess</span><span>(</span><span>"python -m http.server 8080"</span><span>)</span><span>;</span></div></div><div><div>
    </div></div><div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://random-words-here.trycloudflare.com</span></div></div>

Named tunnels

For more control you can create a named tunnel through sandbox.tunnels.get(port, { name }). A named tunnel binds a hostname (<name>.<your-zone>) backed by a Cloudflare Tunnel and a CNAME record on your zone resulting in something like https://my-app-preview.example.com.

Unlike quick tunnels, which generate a new random URL each time, a named tunnel produces a persistent URL that survives container restarts. This makes named tunnels suitable for production use cases where you want control over the tunnel and it's origin.

  • JavaScript

    <div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>,</span><span> </span><span>{</span><span> name</span><span>:</span><span> </span><span>"my-app-preview"</span><span> </span><span>}</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://my-app-preview.example.com</span></div></div>
  • TypeScript

    <div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>,</span><span> </span><span>{</span><span> name</span><span>:</span><span> </span><span>"my-app-preview"</span><span> </span><span>}</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://my-app-preview.example.com</span></div></div>

Calling sandbox.destroy() tears down the Cloudflare Tunnel and the associated DNS record alongside the container, so you do not leave dangling tunnels or records behind.

Upgrade

To update to the latest version:

<span>npm</span><span> i @cloudflare/sandbox@latest</span>
<span>yarn</span><span> add @cloudflare/sandbox@latest</span>
<span>pnpm</span><span> add @cloudflare/sandbox@latest</span>
<span>bun</span><span> add @cloudflare/sandbox@latest</span>

For full API details, refer to the Sandbox tunnels reference.

Fetched June 1, 2026