Isolation layers
FTL enforces zero-trust through multiple isolation mechanisms working together:1. Docker sandbox
The agent runs entirely inside a Docker container. Your real project files never enter the container — instead, FTL creates a snapshot and mounts it read-only:The
:ro flag ensures snapshots are read-only. The agent can only modify /workspace, which is wiped on every task reset.- Memory: 2GB
- CPU: 2 cores
- Network: Bridge mode with host gateway for proxy access
2. Shadow credentials
Your real API keys never enter the container. FTL generates fake shadow values and injects them as environment variables:3. Network proxy (optional)
When the proxy is enabled, shadow credentials are swapped back to real values at the network layer:The proxy is optional. Install with
pip install -e ".[proxy]". Without it, the agent can only use shadow values — live API calls will fail unless you use test/sandbox API keys.4. Human-in-the-loop approval
No changes touch your real filesystem without explicit approval. After the agent finishes, FTL shows you a diff and waits for your decision:Guardrails
Local lint scanner
By default, FTL runs a static analysis pass over the diff before showing the review prompt:Bedrock Guardrails (AWS mode)
Whenguardrail_id is set in .ftlconfig, FTL applies a Bedrock Guardrail to the full diff text before the human review step:
Agent authentication
The agent needs its own API key to make LLM calls (e.g., Claude Code needsANTHROPIC_API_KEY). FTL forwards these from the host environment:
Agent auth keys are separate from project secrets. The agent’s
ANTHROPIC_API_KEY is for making LLM calls. Shadow credentials are for the agent’s generated code to call external APIs.Rollback and snapshots
Every task creates a snapshot before the agent runs. If you reject changes, the snapshot remains available:~/.ftl/snapshots/<id>/ by default, or S3 when "snapshot_backend": "s3" is configured.
Threat model
FTL defends against:- Credential leaks: Agent writes
STRIPE_SECRET_KEY=sk_live_...to a config file - Filesystem access: Agent tries to read
~/.ssh/id_rsaor modify files outside/workspace - Resource exhaustion: Agent spawns infinite loops or forkbombs (constrained by Docker memory/CPU limits)
- Accidental destructive operations: Agent runs
rm -rf /orDROP DATABASE production
- Intentional misuse of live API calls: If the proxy is enabled and you approve code that calls
stripe.charges.create()with real keys, the charge will go through - Social engineering: The agent can write code that looks safe but contains logic bombs triggered later
- Supply chain attacks: If the agent’s dependencies (Claude Code, Aider, etc.) are compromised, FTL cannot detect it