Skip to main content

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 rsync

Step 1: Install FTL

Use a virtual environment to avoid conflicts:

Step 2: Run setup wizard

The one-time setup wizard configures your agent, tester model, and API credentials:
You’ll be prompted to:
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 ANTHROPIC_API_KEY yet:
Your key is saved to ~/.ftl/credentials (mode 600) and loaded automatically on every invocation
Your choices are saved globally to ~/.ftl/config.json and used as defaults for every new project.
Docker Hub images are pulled automatically:
  • vvenne/ftl:latest — Claude Code
  • vvenne/ftl:codex — Codex
  • vvenne/ftl:aider — Aider
  • vvenne/ftl:kiro — Kiro
  • vvenne/ftl:full — All agents
If the pull fails, FTL builds the image locally from your cloned Dockerfile.

Step 3: Initialize your project

Navigate to your project directory and create a .ftlconfig:
This creates .ftlconfig with values from your global setup:
.ftlconfig
Edit .ftlconfig to override settings per-project. See Configuration reference for all available fields.

Step 4: Run your first task

1

Snapshot

FTL snapshots your project to ~/.ftl/snapshots/<id> using rsync
2

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:
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.
If you have a .env file in your project root:
.env
FTL generates shadow values and injects them into the sandbox:
Sandbox environment
Your real keys never enter the container. The agent writes code using shadow values.
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.
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, TRUNCATE without WHERE)
  • Dangerous shell commands (rm -rf, chmod -R 777)
Findings are displayed as warnings but never block review (unless you configure Bedrock Guardrails).

Next steps

Interactive shell

Use ftl (no arguments) for follow-up instructions without cold boots

Adding credentials

Learn about ftl auth for saving additional API keys

AWS setup

Configure S3 snapshots, CloudWatch tracing, and Bedrock Guardrails

Configuration reference

All available .ftlconfig fields and their defaults

Troubleshooting

Solution: Install Docker Desktop from docs.docker.com/get-docker and ensure it’s running.
Solution: Navigate to your project directory and run ftl init.
Solution: Save your API key:
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.