An encrypted workspace for humans and AI agents

Run agents.
Not your secrets.

Every AI agent runs inside your shell, wired straight to your real API keys, database URLs, and tokens. It doesn't forget what it reads, either. ironrun seals them in one encrypted workspace, hands the agent a time-boxed lease instead of the value, and redacts anything that slips into output. The agent finishes the job. It never sees the secret.

01 [ 01 / 07 ] The Exposure

Your agent can read
every secret you've got.

Keys, database URLs, tokens: if it's in your environment, the agent can read it. And it doesn't forget. Claude Code logs every tool call to ~/.claude/projects, argument by argument. A secret that passed through one command is sitting in that file, in plaintext, right now.

Commits co-authored by Claude Code leak secrets at roughly twice the rate of human-authored ones. AI-service credential leaks grew 81% in a single year. GitGuardian · State of Secrets Sprawl 2026
Without ironrun
# Agent runs your deploy script
$ ./deploy.sh --prod

# Your secrets hit stdout
STRIPE_SECRET=sk-live-...
AWS_SECRET=wJalrX...
# Now in the model's context.
# Logged to disk. Sent upstream. Permanent.
With ironrun
# Agent asks once; you approve in the TUI
$ ironrun run deploy

Deploying to prod...
using key=[REDACTED]
exit_code: 0

# Pulled from your workspace, injected below the agent.
# Never in its context. Nothing to leak.
02 [ 02 / 07 ] Mechanism

One encrypted workspace.
The value never reaches the model.

Drop a YAML file in your project. ironrun handles the vault, the subprocess, and the output. Your agent calls one tool. It gets back exit code, timing, and redacted output. Never the secret values that ran inside.

1

Vault

Secrets live in ironrun's local encrypted vault: AES-256-GCM, on your machine. Or federate to 1Password, Vault, Doppler, or Infisical. Pulled at exec time. Never written to disk.

version: "2"
environment_set: active
commands:
  - id: deploy
    secrets: [STRIPE_SECRET, AWS_SECRET]
2

Execute

Runs with a clean environment and no shell. Nothing to inject through. Only the command you named runs.

commands:
  - id: deploy
    argv: [./deploy.sh, --prod]
    ttl: 30s
    no_network: true
3

Redact

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]
03 [ 03 / 07 ] Security Model

Eight layers because one isn't enough.

ironrun assumes your agent is compromised. Every layer blocks exfiltration on its own. Fail one, the others hold.

Threat: assume the agent is compromised
1
Encrypted Vault Secrets sit in an AES-256-GCM vault at rest, on your machine. Nothing in plaintext on disk.
2
Scoped Leases Agents get time-boxed, command-scoped access you approve once. Leases auto-expire and revoke on demand.
3
Shell Denial Commands run directly, never through a shell. No backticks, $(), or pipes to abuse.
4
Env Sanitize Parent environment stripped. Only declared variables injected. The subprocess starts clean.
5
Binary Allowlist Only named executables can run. Everything else denied. No curl to arbitrary endpoints.
6
Rolling Redactor Streaming match on stdout/stderr. Secrets replaced before buffering. Catches partial leaks across chunks.
7
TTL Enforcement Commands have a time-to-live. Exceed it, the process is killed. No hanging shells leaking in the background.
8
Value-Blind Audit A hash-chained log records command names and redaction counts, never secret values. Tamper-evident.
Secrets: sealed, never in the agent's context
04 [ 04 / 07 ] Architecture

The wall is structural.

The agent asks for access, you approve a time-boxed lease, and only then does a sealed process ever touch a secret. Secrets exist only inside that 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.

Agent
ironrun exec
Lease
Human approves
Policy
Validate + Allow
Sealed Zone
Secrets + Process
Redactor
Strip + Return
Agent
Safe output
05 [ 05 / 07 ] Objections

Yes, it's a vault.
Built for the agent boundary.

ironrun stores secrets in a local AES-256-GCM vault, or federates to the 1Password, Vault, Doppler, or Infisical you already run. What it adds: agents get time-boxed access, secrets inject below them, and values are redacted from everything they see. Here is what that covers and what it does not.

$ ironrun why
0x01> "Why not just use scoped, short-lived tokens?"
Scoped tokens limit blast radius. They do not stop the value from being logged to ~/.claude/projects and shipped upstream. ironrun redacts the value too. Defense in depth, not a replacement.
0x02> "Shouldn't agents just never get production credentials?"
Agreed, for prod. But dev database URLs, test API keys, and personal tokens are still real secrets that end up in agent logs. ironrun is for every credential the agent legitimately needs, not just the risky ones.
0x03> "Isn't this just security theater?"
The threat isn't the model provider. It's prompt injection from untrusted code, issues, or web content (the lethal trifecta), plus a plaintext local log any future breach can read. ironrun removes the value from both.
0x04> "Can't redaction be bypassed?"
ironrun injects the secret below the agent layer, so the value is never in the agent's environment or context to leak in the first place. The rolling redactor is the backstop, not the primary control.
0x05> "I already have a vault. Do I need this?"
Keep it. ironrun federates to 1Password, Vault, Doppler, and Infisical and reads from the vault you already trust. It adds the layer none of them have: secrets inject below the agent and get redacted from its output, so nothing lands in agent context or logs. Want everything local instead? ironrun's own AES-256-GCM vault works offline.

What ironrun doesn't do

ironrun is defense in depth, not a guarantee. A seatbelt, not an armored car. It composes with the controls you already trust (scoped tokens, read-only database users, a sandboxed agent) and adds the layer they miss: the secret value never enters the agent's environment or context, so it can't be logged, cached, or exfiltrated through it.

06 [ 06 / 07 ] Works With

One policy file. Every agent.

ironrun sits between your agent and the shell. If it runs shell commands, it works with ironrun. Native MCP support gives your agent twelve tools with zero config: run sealed, request access, propose commands. Just ironrun init and done.

AgentClaude CodeMCP / CLI
AgentCursorMCP tool
AgentOpenAI CodexCLI wrapper
AgentWindsurfMCP tool
ironrun.yml one policy file
CIGitHub Actionsnative action
ProtocolAny MCP Clientbuilt-in server
PlatformmacOSarm64 + amd64
PlatformLinuxarm64 + amd64
PlatformWindowsx86_64 · beta
07 [ 07 / 07 ] Quickstart

Install. Init. Sealed.

Install it, run ironrun init, and your agent is wired up. The policy, MCP config, and CLAUDE.md get written for you.

1

Install

A single binary. macOS and Linux, arm64 and amd64. Nothing else to run.

# verifies the checksum before running
$ curl -fsSL https://ironrun.dev/install.sh | bash
2

Initialize

ironrun init detects your project, creates an encrypted dev environment, and writes the policy, MCP config, and agent instructions. Add your commands and secrets to the workspace.

$ cd your-project
$ ironrun init
  - Created ironrun.yml
  - Created encrypted environment dev
  - Created .mcp.json
  - Created CLAUDE.md
3

Run sealed

Your agent asks for access once; you approve in the TUI. Then it calls run_sealed instead of the shell. Secrets go in, redacted output comes back.

# Agent calls the MCP tool:
run_sealed("test")
exit_code: 0
stdout: "ok - key=[REDACTED]"

Stop hoping the agent won't look.

One YAML file. Secrets sealed below the agent. MIT licensed, forever.