Cloudflare Workers cold-start a new V8 isolate in single-digit milliseconds — Cloudflare's own numbers put it around 5ms, roughly a hundred times faster than booting a fresh Node process in a container or VM. That speed is the entire pitch of edge compute: no server to boot, just a JavaScript context that already exists spinning up to handle your request. Until recently, getting that speed meant renting Cloudflare's edge. In 2026, two open-source projects — OpenWorkers and Vorker — will let you run the same isolate-per-request model on hardware you own.
That's a genuinely different trade than the usual "run a container yourself instead of paying a PaaS" story. A container is a process with its own filesystem, its own memory space, potentially its own kernel view — it boots in tens of milliseconds at best. A V8 isolate is a JavaScript sandbox inside an already-running process, sharing that process's memory across thousands of tenants. It starts faster because it's fundamentally lighter weight, and it's lighter weight because it can do less. Here's the actual comparison — what an isolate-per-request runtime buys you, what it can't do at all, and where it fits next to a container-based git-push PaaS like bex rather than replacing one.
Two Ways to Self-Host the Isolate Model
OpenWorkers is a from-scratch Rust runtime, not a wrapper around Cloudflare's code. It's built on openworkers-v8, a fork of the rusty_v8 bindings with isolate-pooling support the upstream project doesn't expose — isolates are created once and checked out per request rather than spun up cold every time. That pooling is why OpenWorkers advertises roughly 10 microseconds for a warm isolate and about 100 microseconds cold, an order of magnitude tighter than Workers' own single-digit-millisecond figure, because a pooled isolate skips the JS-context-initialization step Workers still pays on every genuine cold start.
Each isolate gets a 100ms CPU budget and a 128MB memory ceiling — the same numbers Cloudflare enforces, since the constraint is inherent to running thousands of isolates in one process, not a Workers-specific policy. Deployment is a single Docker Compose file plus one PostgreSQL database; OpenWorkers ships built-in KV storage, direct Postgres access, and S3/R2-compatible object storage bindings so a worker can persist state without wiring up your own backing services.
Vorker takes the opposite approach: it's a thin Go management and admin-UI layer built directly on top of workerd, the actual open-source runtime Cloudflare extracted from Workers and publishes on GitHub. Where OpenWorkers reimplements the isolate host, Vorker just orchestrates the real thing — you get a web dashboard at :8888/admin for deploying and managing workers, with configuration for worker URL suffixes, cookie domains, and JWT/agent secrets, all running in a single Docker container.
Because it's running unmodified workerd, Vorker's cold-start and memory numbers are Cloudflare's own published figures for the runtime itself: single-digit-millisecond cold starts and the same 128MB-per-isolate ceiling, not OpenWorkers' faster pooled-isolate variant. That's a real architectural difference, not just a rebrand — OpenWorkers trades runtime-compatibility purity for a custom pooling layer that's measurably faster; Vorker trades that speed ceiling for running the exact binary Cloudflare ships, so anything that works on workerd locally via Wrangler works on Vorker unmodified.
Both are answering the same question a self-hosted Postgres or self-hosted object storage answers: does this primitive have to come from the vendor that invented it, or can you run it yourself? For isolates, as of 2026, the answer is now "run it yourself" too — you just inherit whichever runtime's tradeoffs you picked.
The Actual Numbers: Isolate vs. Container
This is the comparison a container-based PaaS actually has to answer for, because the two models aren't competing on the same axis — one optimizes for request latency at extreme density, the other for what a single instance is allowed to do once it's running.
| OpenWorkers | Vorker / workerd | Bare container | Firecracker microVM | Kata Containers | |
|---|---|---|---|---|---|
| Cold start | ~100µs (pooled) | ~5ms (Cloudflare's published figure) | ~50ms | ~125ms | ~150–300ms |
| Warm start | ~10µs | sub-ms (isolate reuse) | N/A (process stays up) | N/A | N/A |
| Memory ceiling | 128MB / isolate | 128MB / isolate | GBs, operator-set | GBs, operator-set | GBs, operator-set |
| CPU budget | 100ms / request | Workers' own CPU-time limits | Whatever the host allows | Whatever the host allows | Whatever the host allows |
| Persistent filesystem | No — KV/Postgres/R2 bindings only | No — Workers-compatible bindings only | Yes, real disk | Yes, real disk | Yes, real disk |
| Long-running processes / WebSockets | No — request-scoped execution | No — same Workers execution model | Yes | Yes | Yes |
| Language runtime | JS / Wasm only | JS / Wasm only (workerd's surface) | Any | Any | Any |
| Isolation boundary | V8 sandbox (shared process) | V8 sandbox (shared process) | Shared kernel | Independent guest kernel | Independent guest kernel (VM-backed) |
The pattern holds regardless of which isolate runtime you pick: two to three orders of magnitude faster to start than any container-based option, and two to three orders of magnitude more restrictive in what a single instance is allowed to hold in memory or touch on disk. That's not a bug either implementation should fix — it's the mechanism the speed comes from. Thousands of isolates share one OS process's memory space; the moment you give one of them a persistent filesystem handle or an unbounded memory allocation, you've broken the isolation model that made 128MB and no-disk possible in the first place. A container gets a full filesystem and gigabytes of memory precisely because it doesn't need to start in 5 milliseconds or share a process with nine thousand strangers.
Where Isolate-Per-Request Actually Wins
The workloads that benefit from this model share one property: short, stateless, and numerous. An API gateway doing auth checks and header rewriting on every request. A/B test routing logic. Image-resize-on-the-fly transforms. Webhook validators. Anything that reads as "a few milliseconds of JavaScript, then hand off to something else" is exactly what an isolate is built for — the request finishes well inside the 100ms CPU budget, the 128MB ceiling is never in danger of being hit, and the cold-start speed means you can run this in front of traffic patterns too bursty for a container fleet's autoscaler to track.
The other real win is independence from Cloudflare's specific edge. Running OpenWorkers or Vorker on your own boxes means Workers-style code — the fetch()-based, Web-standard-APIs execution model — runs the same way whether it's on Cloudflare's network, a VPS in your own datacenter, or a laptop for local testing. For a team that's already written middleware against the Workers API surface and doesn't want that logic locked to one vendor's edge, that portability is the actual product, not just a cost play.
Where It Structurally Can't Substitute for a Container
Everything the isolate model trades away to get that speed is a hard wall, not a rough edge to smooth over. A WebSocket server holding open connections for minutes at a time has nowhere to run — Workers-style execution is request-scoped, and neither OpenWorkers nor Vorker changes that, because it's inherited from the runtime they're both built on. A persistent database connection pool doesn't fit either; you get KV, object storage, and Postgres bindings, not a process that keeps a connection alive between requests. Anything requiring a native npm binding compiled against a real filesystem — sharp for image processing, most ML inference libraries, anything shelling out to a system tool — simply won't load in a V8 isolate, because there's no filesystem and no subprocess to shell out to.
And the language constraint is absolute: this is a JavaScript and WebAssembly runtime. A Python data pipeline, a Go worker, a Rust batch job — none of it runs here, full stop, regardless of which self-hosted isolate implementation you pick. A container-based git-push PaaS doesn't have any of these limits because it was never trying to solve the same problem; it hands you a real Linux environment, in exchange for a cold start measured in tens of milliseconds instead of microseconds.
The Honest Verdict
A container-based git-push PaaS doesn't need to bolt on a V8-isolate runtime to compete with Cloudflare Workers, because they're not actually competing for the same deploy. bex runs your App as a real container on a Cluster-API-managed fleet — a full filesystem, any language, long-running processes, WebSockets, all the things an isolate structurally can't offer — because most of what a team deploys (the API server, the background worker, the app that holds a database connection open) needs exactly that. Shipping a second, incompatible execution model to chase Workers' cold-start number would mean maintaining two runtimes for two different classes of workload, when the actual majority of tenant deploys only need one of them.
Where a bex tenant would still reach for OpenWorkers or Vorker: the specific slice of their stack that is short, stateless, and latency-sensitive at the edge — an auth-check middleware layer, a webhook receiver, a header-rewriting proxy in front of the main app. Nothing stops you from deploying OpenWorkers itself as just another App on a self-hosted PaaS, pushed from a git repo like anything else, running the edge-function slice of your architecture next to the container that runs everything else. That's the real shape of the answer: not "containers or isolates," but a container-based platform that owns the machines, with an isolate runtime as one more thing you can choose to run on them when the workload actually calls for it.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.
Sources
- GitHub - openworkers/openworkers-runtime-v8
- Introducing OpenWorkers – Self-hosted Cloudflare Workers in Rust
- Openworkers docs
- GitHub - VaalaCat/vorker
- Introducing workerd: the Open Source Workers runtime
- GitHub - cloudflare/workerd
- Eliminating cold starts with Cloudflare Workers
- How Workers works · Cloudflare Workers docs
- Cloudflare Workers docs — Limits
- Firecracker vs gVisor: Which isolation technology should you use? — Northflank
- Kata Containers vs Firecracker vs gVisor — Northflank



