Backstory: I've been using many agents in parallel as I work on a somewhat ambitious financial analysis tool. I was juggling agents working on epics for the linear solver, the persistence layer, the front-end, and planning for the second-generation solver. I was losing my mind playing whack-a-mole with the permission prompts. YOLO mode felt so tempting. And yet.
Then it occurred to me: what if YOLO mode isn't so bad? Decision fatigue is a thing. If I could cap the blast radius of a confused agent, maybe I could just review once. Wouldn't that be safer?
So that day, while my kids were taking a nap, I decided to see if I could put YOLO-mode Claude inside a sandbox that blocks exfiltration and regulates git access. The result is yolo-cage.
Also: the AI wrote its own containment system from inside the system's own prototype. Which is either very aligned or very meta, depending on how you look at it.
And adding the fact that you used AI to write the supposed containment system, I'm really not seeing the safety benefits here.
The docs also seem very AI-generated (see below). What part did you yourself play in actually putting this together? How can you be sure that filtering a few specific (listed) commands will actually give any sort of safety guarantees?
https://github.com/borenstein/yolo-cage/blob/main/docs/archi...
What's my role here? Over the past year, it's become clear to me that there are really two distinct activities to the business of software development. The first is the articulation of a process by which an intent gets actualized into an automation. The second is the translation of that intent into instructions that a machine can follow. I'm pretty sure only the first one is actually engineering. The second is, in some sense, mechanical. It reminds me of the relationship between an architect and a draftsperson.
I have been much freer to think about engineering and objectives since handing off the coding to the machine. There was an Ars Technica article on this the other day that really nails the way I've been experiencing this: https://arstechnica.com/information-technology/2026/01/10-th...
Why do I trust the finished product if I don't trust the environment? This one feels a little more straightforward: it's for the same reason that construction workers wear hard hats in environments that will eventually be safe for children. The process of building things involves dangerous tools and exposed surfaces. I need the guardrails while I'm building, even though I'm confident in what I've built.
Good response, but more practically, when you are developing a project you allow the agent to do many things on that VM, but when you deliver code it has to actually pass tests. The agent working is not being tested live, but the code delivered is tested before use. I think tests are the core of the new agent engineering skill - if you can have good tests you automated your human in the loop work to a large degree. You can only trust a code up to the level of its testing. LGTM is just vibes.
IMO this pattern fails on non-trivial problems because you don't know how the intent can be actualized into automation without doing a lot of the mechanical conversion first to figure out how the intent maps to the automation. This mapping is the engineering. If you can map the intent to actualization without doing it, then this is a solved problem in engineering and be usable by non-engineers. Relating this to your simile, it is more like a developer vs. an architect where the developer uses pre-designed building vs. the architect which needs to design a new building to meet a certain set of design requirements.
(I am not saying one way is better than the other, it’s just different modes of engaging with risk. I obviously understand that having a helmet can and would save my life should an accident occur. The keyword here is “should/would/can” which some people believe in “shall/will/does” and prefer to live this way. Call it different faith or belief systems I guess)
It looks like secret scanning is outsourced by the proxy to LLM-Guard right now, which is configured here: https://github.com/borenstein/yolo-cage/blob/d235fd70cb8c2b4...
Here's the LLM Guard image it uses: https://hub.docker.com/r/laiyer/llm-guard-api - which is this project on GitHub (laiyer renamed to protectai): https://github.com/protectai/llm-guard
Since this only uses the "secrets" mechanism in LLM Guard I suggest ditching that dependency entirely, it uses LLM Guard as a pretty expensive wrapper around some regular expressions.
("But David," you might object, "you said you were using this to build a financial analysis tool!" Quite so, but the tool is basically a fancy calculator with no account access, and the persistence layer is E2EE.)
I continue to think about Gödelian limits of prompt-safe AI.¹
¹ https://matthodges.com/posts/2025-08-26-music-to-break-model...
I think a lot of this current sandboxing interest is coming from a break in assumptions. Traditional security mostly assumed a human was driving. Actions are chained together slowly and there’s time to notice and intervene. Agents have root access/tons of privilege but they execute at machine speed. The controls (firewalls/IAM) all still “work,” but the thing they were implicitly relying on (human judgment + hesitation) isn’t there anymore.
Since that assumption went away, we're all looking for ways to contain this risk + limiting what can happen if the coding agent does something unintended. Seeing a lot of people turn toward containers, VMs, and other variants of them for this.
Full disclosure: I’m at Docker. We’ve seen a lot of developers immediately reach for Docker as a quick way to fence agents in. This pushed us to build Docker Sandboxes, specifically for coding agents. It’s early, and we’re iterating, including moving toward microVM-based isolation and network access controls soon (update within weeks).
The exfiltration controls are interesting. Have you thought about extending this to rate limiting and cost controls as well? We've been working on similar problems at keypost.ai - deterministic policy enforcement for MCP tool calls (rate limits, access control, cost caps).
One thing we've found is that the enforcement layer needs to be in-path rather than advisory - agents can be creative about working around soft limits. Curious how you're handling the boundary between "blocked" and "allowed but logged"?
Great work shipping this - the agent security space needs more practical tools.
That said, I have not yet started playing with MCP servers. I suspect that they are completely broken inside yolo-cage right now, as they almost certainly get stopped by the proxy.
Anthropic is trying to earn developer trust; they have a strong incentive to make sure that private keys and other details that the agent sees do not leak into the training data. But the agent itself is just a glorified autocomplete, and it can get confused and do stupid stuff. So I put it in a transparent prison that it can see out of but can't leave.
That definitely helps with the main failure modes I was worrying about, but it's just one layer. You definitely want to make sure that your production secrets are in an external vault (Hashicorp Vault, Google Secret Store, GitHub secrets, etc) that the agent can't access.
The things that agent is seeing should be dev secrets that maybe could be used as the start of a sophisticated exploit, but not the end of it. There's no such thing as perfect security, only very low probabilities of breach. Adding systems that are very annoying to breach and have little offer when you do greatly lowers the odds.
If you want to build some greenfield auxiliary tools fine, agents make sense but I find that even gemini's webui has gotten good enough to create multiple files instead of putting everything in one file.
This way I also dont get locked in to any provider
As far as lock-in, though, that's been much less of a problem. It's insanely easy to switch because these tools are largely interchangeable. Yes, this project is currently built around Claude code, but that's probably a one-hour spike away from flexibility.
I actually think the _lack_ of lock-in is the single biggest threat to the hyperscalers. The technology can be perfectly transformative and still not profitable, especially given the current business model. I have Qwen models running on my Mac Studio that give frontier models a run for their money on many tasks. And I literally bought this hardware in a shopping mall.
As a matter of fact, the tool is zero-knowledge by design: state is decrypted in your browser and encrypted again before it leaves. There are no account integrations. The persistence layer sees noise. There are a couple of stateless backend tools that transiently see anonymous data to perform numerical optimizations.
But that's a story for another Show HN...
Of course the question comes because we always lack tokens and have to dance around many providers.
For Claude specifically, there are two places where it tracks state:
~/.claude.json -- contains a bunch of identity stuff and something about oauth
~/claude/ -- also contains something about oauth, plus conversation history, etc
If they're not _both_ present and well-formed, then it forces you back through the auth flow. On an ordinary desktop setup, that's transparent. But if you want to sandbox each thread, then sharing just the token requires a level of involvement that feels icky, even if the purpose is TOS-compliant.
I have my own Docker image for similar purpose, which is for multiple agent providers. Works great so far.
On the one hand, you're right: those commit messages are proof positive that the security is not perfect. On the other hand, the threat model is that most threats from AI agents stem from human inattention, and that agents powered by hyperscaler models are unlikely to be overtly malicious without an outside attacker.
There are some known limitations of the security model, and they are limitations that I can accept. But I do believe that yolo-cage provides security in depth, and that the security it provides is greater than what is achieved through permission prompts that pop up during agent turns in Claude Code.
- Think codesandbox, how much time does it take for a VM here to boot?
- How safe do you think this solution would be to let users execute untrusted code inside while being able to pip install and npm install all sorts of libraries and
- how do you deploy this inside AWS Lambda/Fargate for the same usecase?
It's designed to be fairly safe in exactly that situation, because it's sandboxed twice over: once in a container and once in a VM. You start to layer on risk when you punch holes in it (adding domains to the whitelist, port-forwarding, etc).
> how do you deploy this inside AWS Lambda/Fargate for the same usecase These both seem like poor fits. I suspect Lambda is simply a non-starter. For Fargate, you'd be running k8s inside a VM inside a pod inside k8s. As an alternative, you could construct an AMI that runs the yolo-cage microk8s cluster without the VM, and then you could deploy it to EC2.
The only Yolo I know about is an object detection model :/
These tools generally offer the ability to simply shut off these guardrails. When you do this, you're in what has come to be called "yolo mode."
I am arguing that, sandboxed correctly, this mode is actually safer than the standard one because it mitigates my own fatigue and frustration. These threats surface every hour of every day. Malicious actors are definitely a thing, but your own exhaustion is a far more present danger.
I think it's the convergence of two things. First, the agents themselves make it easier to get exactly what you want; and second, the OEM solutions to these things really, really aren't good enough. CC Cloud and Codex are sort of like this, except they're opaque and locked down, and they work for you or they don't.
It reminds me a fair bit of 3D printer modding, but with higher stakes.
https://www.anthropic.com/research/small-samples-poison
(A small number of samples can poison LLMs of any size) to save clicks to read the headline
The way I think of it is, coding agents are power tools. They can be incredibly useful, but can also wreak a lot of havoc. Anthropic (et al) is marketing them to beginners and inevitably someone is going to lose their fingers.
And once you put the agent in a VM/container it's much easier to run 10 of them in parallel without mutual interference.
Then I was talking to a security engineer at my company, who pointed out that a VM would make him feel better about the whole thing anyway. And it occurred to me: if I packaged it as a VM, then I'd get both isolation and determinism. It would be easier to install and easier to debug.
So that's why I decided to go with a Vagrant-based installation. The obvious downside is that it's harder now to integrate it with external systems or to use the full power of whatever environment you deploy it in.
I peeked at the Vagrantfile, and I noticed that you rsync the working directory into the VM. I have two more questions.
1. Is it safe to assume that I am expected to develop inside the VM? How do run IDE/vim as well as using Claude code, while the true copy of the code lives in the VM?
2. What does yolo-cage provide on top of just running a VM? I mean, there is a lot of code in the GitHub. Is this the glue code to prepare the VM? Is this just QOL scripts to run/attach to the VM?
2. The VM is, in some sense, packaging. The main value adds are the two indirections between the agent and the outside world. Its access to `git` and `gh` are both mediated by a rules-based dispatcher that exercises fine-grained control in excess of what can be achieved with a PAT. HTTP requests pass through a middleware that block requests based on configurable rules.
> I want to be direct: containers are not a sufficient security boundary for hostile code. They can be hardened, and that matters. But they still share the host kernel. The failure modes I see most often are misconfiguration and kernel/runtime bugs — plus a third one that shows up in AI systems: policy leakage.
Instead I'm using LXC containers in a VM, which are containers that look and feel like a VM.
It wasn't "vibe coded" in the sense that I was just describing what I want and letting the agent build it. But it definitely was built indirectly, and in an area that is not my primary focus. A charitable read is that I am borrowing epistemic fire from the gods; an uncharitable one is that I am simply playing with fire.
I am not apologetic about this approach, as I think it's the next step in a series of abstractions for software implementation. There was a time when I sometimes took some time to look at Java bytecode, but doing so today would feel silly.
Abstracting to what is in essence a non-deterministic compiler is going to bring with it a whole new set of engineering practices and disciplines. I would not recommend that anyone start with it, as it's a layer on top of SWE. I compare it to visual vs instrument flight rules.