Computers Compared
C.S. Peirce said: "Truth is the opinion fated to be agreed on by all who investigate", and we can reasonably assume his agent didn't come up with that for him.
Over the past year or so, Mr Peirce's sentiment has pretty much defined the agent infra space. We were all using the tools we know and putting agents in environments that conventional wisdom told us were appropriate for the work they had to do and the security threats they represented. Ephemeral was fine.
But deep down, we knew it wasn't. With every hour we spent tinkering with agent plumbing instead of using them, the feeling began to compound. We could see the unprecedented capabilities of agents and the opportunities they represented, but only in brief windows. Because sandboxes were never right for agents.
Agents need computers.
Fly.io first shared our opinion on the matter with the release of Sprites in early '26. In the last six months, the whole industry seems to have converged on "computers for agents" and when that happens, it's usually an attempt to get a word to do all the work that a product should.
That's not the case here though. In the space as we see it today, there are several divergent and entirely defensible engineering approaches to building computers for agents. Trying to identify one as correct or "better" than any other is marketing drivel at this point. So rather than trying to dress this up like a totally objective comparison that we somehow inevitably win, this post has 3 objectives:
- Explain what we think computers for agents should be
- Explain what our competitors think they should be
- Explain why our opinion is our opinion
A definition
At its foundation, we believe a computer for an agent must do four boring things. We're going to hold every platform mentioned here against these:
- A computer keeps your files
- A computer keeps running your programs
- A computer answers at an address
- A computer can log into things on your behalf without handing over your keys
A computer keeps your files
Obviously. Which is why everyone does it now. Progress! Two years ago the entire category was stateless and proud of it.
E2B preserves the filesystem and the memory on pause, keeps paused sandboxes indefinitely with no TTL, and lets you disable memory capture if you only want the disk. Blaxel keeps filesystem and process state through standby. Vercel made persistence the default earlier this year, with snapshots and Drives on top. Daytona graduated forking and snapshots to stable. Northflank will give you a volume between 4GB and 64TB.
So everyone gives you file storage, the difference is the retention policy. Modal's memory snapshots are alpha, capped at seven days, and the cap is not extendable. Its filesystem and directory snapshots expire after thirty days by default. Vercel's snapshots expire thirty days after last use. Those are all defensible engineering decisions and they are all, structurally, a countdown on your environment.
Blaxel's default filesystem is tmpfs sized at roughly half your available memory. It's fast, and it's the default, and it means your disk is coupled to your RAM until you go configure disk-backed storage. That's a reasonable default for short work, but it is not how a disk behaves.
A Sprite gets 100GB of ext4. It does not expire and it is not a volume you attach nor a tmpfs that survives. The storage layer underneath it (we call it SBD) presents an S3 bucket to the kernel as a block device and runs ordinary ext4 on top, so you get block-level snapshots with deduplication and copy-on-write clones, and there's no metadata database to keep consistent. Checkpoints are unlimited and they don't rot. Nothing on your Sprite is on a timer.
It keeps running your programs
If you've ever had to climb a staircase with your laptop open, you get why we think this is so important.
The industry's answer to "does my process survive" is mostly "yes if it survives cryostasis." The most common approach is freeze it and thaw it. E2B preserves memory on pause and restores it. Blaxel keeps memory intact through standby and resumes in under 25 milliseconds (that is insanely fast BTW). Modal's memory snapshots restore every process still running, in the same state.
Freezing is not running though. E2B's pause costs about four seconds per gigabyte of RAM, so a 16GB environment takes something like a minute to put down. Blaxel is upfront that a restored snapshot brings back your processes but not your external connections; database handles, message queues, and HTTP pools all time out and close, so anything long-lived has to reconnect. Modal's restore is the sharpest example, because restoring doesn't resume your sandbox at all. It creates a new one. It's a clone, which matters if anything outside it is holding a reference to the original. The restored sandbox has its own identity, so a stored sandbox ID, a URL you handed to a webhook, or a job queued against the old one are all now pointing at something that isn't there.
We also need to talk about time limits, because it's a weird thing for a computer to have one. Vercel Sandbox caps out at 24 hours on Pro and Enterprise, and 45 minutes on Hobby, with a five minute default you extend by calling a function. AWS AgentCore sessions cap at eight hours. Cloudflare is the exception here, because it sets no maximum lifetime at all. Its containers sleep after ten minutes of inactivity, and that's a default you can change rather than a ceiling you can't.
E2B has a 24 hour continuous runtime limit on Pro and one hour on Hobby. But the limit resets every time you pause and resume, so your total lifetime is effectively unbounded. It just means the platform decides when your processes stop, on its schedule, and you pay the pause tax each time.
Sprites have no duration cap of any kind. More to the point, in place of systemd, a Sprite runs services; long-lived processes with dependency ordering and automatic restart on crash, backing off from one second to sixty, persisted to disk and relaunched on boot. Your dev server, your database, your queue worker; they are supervised, they survive a reboot, and they come back on their own when something kills them, because they're real services and not a frozen memory image.
Sleep keeps your memory. The suspend snapshots RAM and the Sprite picks up mid-thought, which is why we bother warming the page cache on the way down. What sleep doesn't keep is your connections, and if the far end gave up while you were away your client re-dials, the same as it would after any network blip. Nothing needs reconfiguring, because nothing about the Sprite changed.
It answers at an address
We still think this is a big one, but the industry doesn't seem as enthused and I don't know why.
Every Sprite has a public HTTPS URL with automatic TLS. A request to that URL wakes the Sprite if it's asleep and gets served. That's it… That's the whole feature. But it's the dividing line between a computer and a job.
It matters because of what it lets you do without any additional machinery. OAuth callbacks land. Webhooks land. You point Stripe or GitHub or Slack at the URL and it works. No tunnel, no ngrok, no relay process babysitting a connection. Your agent can build a thing, start it, and hand you a link.
Some on the field have a version of this. Blaxel and Daytona both do preview URLs. Vercel exposes ports, capped at fifteen. But an exposed port on a sandbox with a 24 hour ceiling is not the same thing as an address. The URL only means something if the machine behind it is still there tomorrow and wakes up when someone knocks.
It can log in without holding your keys
It's astonishing how quickly we accepted that agents need to connect to 3rd-party services to be useful, but here we are. The default answer across this industry is still the worst one. Put the API key in an environment variable inside the sandbox and hope the model doesn't print it. This is nuts, guys. You are handing live credentials to a process whose entire job is to run code that a language model wrote, and the security boundary is vibes.
Two players have actually built a real answer though. Vercel runs a proxy outside the sandbox boundary that intercepts outbound requests and injects credentials into the headers in transit. If the code inside tries to set those same headers to redirect the authenticated request somewhere else, the proxy overwrites them. Their egress firewall resolves deny before allow, which is the correct precedence and not the obvious one. Runloop has Agent Gateways and an MCP Hub for the same purpose, explicitly so real credentials never reach the devbox.
What we built is the same shape and goes further down. Sprites has Connectors; real OAuth flows to OpenRouter, GitHub, Slack, Discourse, or any HTTP API with the custom Connector. The credential lives in the control plane. The Sprite never holds it. The gateway proxies the request and attaches the credential, and every request to a customer-chosen host passes an SSRF guard that checks self-targeting along with private and link-local addresses before anything leaves.
The Discourse connector is the one I'd shine the spotlight on, because it shows the difference between injecting a key and brokering an identity. It uses Discourse's User API Key flow, so you approve the connection on your own forum and the credential that comes back inherits your permissions and nothing more. A Sprite acting on your behalf on a Discourse instance can only do what you can do. It never holds site-wide admin, because it was never issued site-wide admin.
That's the gap between a static key in a proxy rule and a scoped identity. Injecting a header keeps the secret out of the sandbox. Brokering an identity also bounds the blast radius when the request is legitimate and the agent is just wrong about what it should be doing, which is the failure mode I actually lose sleep over.
What's under all of it
Let's talk about what these computers actually run on, because if isolation is soft, this is all really just a big waste of time.
Computer as a contested term
Modal is straightforward and public: gVisor, which their security docs describe as containerizing and virtualizing compute jobs using the sandboxing technology Google built and runs Cloud Run on. gVisor is a user-space kernel intercepting syscalls. It is a real boundary, it is well regarded, and Google bets a public cloud product on it. It is also not a per-tenant hardware boundary, and that distinction is worth knowing when you decide what you're comfortable running. Modal has since added VM Sandboxes, in beta, which run a full VM with a real kernel, so this one is moving. gVisor is still what you get by default.
E2B and Vercel both run Firecracker microVMs, same as Sprites. Northflank will let you pick per workload between Kata, Firecracker, and gVisor, which is a genuinely good idea.
And then there are the ones that don't say. Daytona's docs claim "complete isolation, a dedicated kernel, filesystem, network stack", but never name what provides it. Blaxel's docs say "instant-launching virtual machines" and never name the microVM type. I've read third-party analyses making confident claims about both, which I shall not utter here.
Sprites are Firecracker microVMs. That is not a configuration option and there is no faster mode that quietly shares a kernel, nor is there a tier where you get less of it.
While we're being precise about isolation; network egress on a Sprite ships permissive. You can lock a Sprite down to an allowlist, but the default is unrestricted, and privileges and resource limits have no default caps either. The distinction I'd draw is that the layer that's optional for us sits above the kernel boundary, and the kernel boundary itself is never on the table.
| Platform | Files survive | Processes survive | Real address | Brokers credentials | Hardware isolation | No duration cap |
|---|---|---|---|---|---|---|
| Sprites | yes | yes | yes | yes | yes | yes |
| E2B | yes | frozen and thawed | not documented | no | yes | resets on cycle |
| Modal | 7 to 30 day TTL | clone, not resume | not documented | no | gVisor, VM in beta | not documented |
| Daytona | yes | auto-stop | preview URLs | not documented | undisclosed | not documented |
| Blaxel | yes, tmpfs default | yes | preview URLs | not documented | undisclosed | not documented |
| Runloop | suspend and resume | yes | not documented | yes | VM, unspecified | not documented |
| Vercel | yes, 30 day snapshots | yes | 15 ports | yes | yes | 24 hours |
| Northflank | yes | yes | yes | not documented | your choice | yes |
"Not documented" means we could not find the answer in the vendor's own public documentation, not that the answer is no.
By our definition of a computer, Sprites and Northflank are neck and neck. But Northflank is a general-purpose workload platform, not something built specifically for agents. It doesn't have preinstalled coding agents or checkpoint and restore, and it doesn't document a credential broker for agent traffic.
Where are the GPUs
They're gone OK, please. Let them rest... Seriously, if your agent needs to train or serve a model in the same environment it's writing code in, Modal is better at this than Sprites. Northflank and Daytona will also sell you GPUs.
What about my milliseconds?
Blaxel resumes from standby in under 25 milliseconds while Sprites take about a second. boxd, a self-hosted Rust binary, claims sub-millisecond. Daytona keeps warm pools and starts in milliseconds. So no, Sprites are not the cheetahs in this savannah.
It's true that anyone telling you a second is indistinguishable from 25 milliseconds is selling you something, but in some cases it matters because the tax compounds. A thousand wakes at a second each is sixteen minutes you'll never see again, but that math only matters in the case of workloads where something wakes the box constantly and does a tiny amount of work each time. If an agent is supposed to wake up and work for twenty minutes, now we're splitting hairs. Optimizing for whether the environment it wakes into still has your services running and your files where you left them is a better use of the milliseconds you could have saved.
The tell
I've been staring at this wondering how to conclude for hours and I keep coming back to this:
The difference between a sandbox and a computer isn't persistence, or isolation, or wake latency. It's what happens when you stop paying attention to it.
A sandbox is something you hold open. There's a session, and a handle, and a timeout, and somewhere in your code there's a try block making sure the thing gets torn down. You are always, at some level, managing its existence.
A computer is just there. You pretend like you're doing some work, you leave your desk and you come back next Thursday. The editor is open, the server is still running on port 3000, the branch is where you left it. Nothing asked you for permission to keep existing. You don't think about it, which is the entire point. It's why I've never written a blog about my laptop persisting overnight.
Every platform in this market now seems to agree that agents should get the latter. We just think that means four boring things. A real disk, real supervised processes, a real address, and a real way to hold credentials that an LLM can't touch, even by mistake.
We think those four things define computers for agents, and we think you have to do all four or you've built a sandbox with better marketing.
Need a truly wild number
of Sprites? No problem.