Get started in four steps
This guide will take you from zero to running your first AI coding task in an isolated sandbox.Prerequisites: Python 3.11+, Docker Desktop (or Docker Engine on Linux), and an Anthropic API key from console.anthropic.comOn Linux, also install rsync:
apt install rsyncStep 1: Install FTL
Step 2: Run setup wizard
The one-time setup wizard configures your agent, tester model, and API credentials:1
Choose your agent
Select which AI coding agent to use:The wizard pulls the appropriate Docker image from
vvenne/ftl:<tag>2
Choose test generation model
Select the LLM model for adversarial test generation:Tests generate in parallel while the agent codes, so there’s no added latency
3
Save your API key
If you haven’t set Your key is saved to
ANTHROPIC_API_KEY yet:~/.ftl/credentials (mode 600) and loaded automatically on every invocation~/.ftl/config.json and used as defaults for every new project.
Step 3: Initialize your project
Navigate to your project directory and create a.ftlconfig:
.ftlconfig with values from your global setup:
.ftlconfig
Step 4: Run your first task
1
Snapshot
FTL snapshots your project to
~/.ftl/snapshots/<id> using rsync2
Boot sandbox
Docker container starts (or reuses existing) with shadow credentials injected
3
Agent + tests run in parallel
Claude Code writes code while adversarial tests generate simultaneously
4
Review and approve
FTL shows you a diff of all changes. You can:
- Type
a— approve and merge changes to your project - Type
r— reject and discard all changes - Type any question — ask the model about the diff (e.g. “does this handle null inputs?”)
Changes only touch your project after you type
a and confirm. The agent never has direct write access to your filesystem.What just happened?
Let’s break down the FTL workflow:Snapshot creation
Snapshot creation
FTL uses rsync to copy your project state to
~/.ftl/snapshots/<id>. Files matching .ftlignore patterns are excluded (similar to .gitignore).The snapshot is mounted read-only into the Docker container at /workspace.Shadow credentials
Shadow credentials
If you have a FTL generates shadow values and injects them into the sandbox:Your real keys never enter the container. The agent writes code using shadow values.
.env file in your project root:.env
Sandbox environment
Parallel test generation
Parallel test generation
While the agent codes, FTL sends your task description to the tester model with a prompt like:Tests run immediately when the agent finishes, catching issues before you review.
Credential linting
Credential linting
Before showing the diff, FTL scans for:
- Hardcoded shadow values (
ftl_shadow_*pattern) - Known credential patterns (Stripe keys, AWS keys, GitHub tokens, etc.)
- Dangerous SQL operations (
DROP TABLE,TRUNCATEwithoutWHERE) - Dangerous shell commands (
rm -rf,chmod -R 777)
Next steps
Interactive shell
Use
ftl (no arguments) for follow-up instructions without cold bootsAdding credentials
Learn about
ftl auth for saving additional API keysAWS setup
Configure S3 snapshots, CloudWatch tracing, and Bedrock Guardrails
Configuration reference
All available
.ftlconfig fields and their defaultsTroubleshooting
Docker not found or not running
Docker not found or not running
No .ftlconfig found
No .ftlconfig found
ftl init.ANTHROPIC_API_KEY is not set
ANTHROPIC_API_KEY is not set
Image pull fails
Image pull fails
If
ftl setup can’t pull from Docker Hub, it falls back to building locally. This requires the Dockerfile in your cloned ftl repository.If the build fails, check that you cloned the full repository and didn’t just install via pip.Need more help? Join our GitHub Discussions or file an issue.