Every AI coding agent runs inside your shell. Your API keys, database URLs, and credentials are right there - readable, exfiltrable, permanent. ironrun injects secrets below the AI layer so the model never sees them.
Everything in your environment is readable. $STRIPE_SECRET. $DATABASE_URL. Every key you've ever exported. Claude Code logs every tool call to ~/.claude/projects/ -- every argument, every value that passes through a command. If a secret touched a subprocess, it's in that file. Your keys are probably in there right now.
Drop a YAML file in your project. ironrun handles the vault, the subprocess, and the output. Your agent calls a tool, gets a result code. That's it. It never sees what ran inside.
Secrets stay in your vault until the moment they're needed. 1Password, Doppler, Infisical, or a local envfile. Pulled at exec time. Never written to disk.
provider: 1password commands: - id: deploy env: STRIPE_SECRET: op://vault/stripe/key AWS_SECRET: op://vault/aws/secret
Command runs sealed. Parent env stripped. No shell - argv is exec'd directly, so no $(), no backticks, no pipes. Only the exact command you named can run.
commands: - id: deploy argv: [./deploy.sh, --prod] ttl: 30s no_network: true
Every byte of output runs through a rolling pattern match before the agent sees it. A secret shows up in stdout? Gone before it leaves the process.
# What the agent receives: exit_code: 0 duration_ms: 191 stdout: "Deployed. key=[REDACTED]" # secret values: [REDACTED]
the agent runs above the line
ironrun assumes your agent is compromised. Every layer independently blocks exfiltration. Fail any one, the others hold. This is defense in depth -- not a tagline, the actual design.
Secrets exist only inside the sealed process. Never serialized. Never logged. Never in the agent's context. This isn't a wrapper around your commands. It's a wall between your secrets and the model.
ironrun sits between your agent and the shell. If it runs shell commands, it works with ironrun.
Native MCP support means zero config for modern agents -- just ironrun init and done.
Install, initialize, done. ironrun init
writes your policy, the MCP config, and a CLAUDE.md - so the agent runs commands through ironrun automatically.
One binary. macOS and Linux, arm64 and amd64. No runtime, no daemon.
# Homebrew $ brew install generalized-labs/tap/ironrun
Detects your project and writes ironrun.yml, .claude/mcp.json, and a CLAUDE.md. Edit the policy to name your commands and secrets.
$ cd your-project $ ironrun init - Created ironrun.yml - Created .claude/mcp.json - Created CLAUDE.md
Your agent calls the run_sealed MCP tool instead of the shell. Secrets go in, only redacted output comes back.
# Agent calls the MCP tool: run_sealed("test") exit_code: 0 stdout: "ok - key=[REDACTED]"
One YAML file. Full protection. Open source forever.
Get started on GitHub