Skip to main content
FTL uses a layered configuration system: global defaults in ~/.ftl/config.json set during ftl setup, overridden by per-project .ftlconfig files.

Configuration Files

Global Configuration

~/.ftl/config.json stores machine-wide defaults set by ftl setup:
~/.ftl/config.json
Global config is used as the template when you run ftl init in a new project.

Project Configuration

.ftlconfig in your project root defines per-project settings:
.ftlconfig

Configuration Precedence

Settings are merged in this order:
  1. Default values - Built-in FTL defaults
  2. Global config - ~/.ftl/config.json
  3. Project config - .ftlconfig in project root

Full Configuration Schema

.ftlconfig

Configuration Fields

Core Settings

string
default:"claude-code"
required
Agent to run. Options: "claude-code", "codex", "aider", "kiro"
string
default:"claude-haiku-4-5-20251001"
required
LiteLLM model string for adversarial test generation

Environment Variables

array
default:"[]"
Extra environment variable names to shadow beyond what’s in .env
array
default:"[]"
Environment variables from your host to forward into the sandbox

Setup Hook

string
Shell command run once on a fresh container only, before the agent starts
The true at the end prevents missing files from failing the boot. On warm container reuse, this command is skipped.

Snapshot Storage

string
default:"local"
Snapshot storage backend: "local" or "s3"
string
S3 bucket name. Required when snapshot_backend is "s3"

AWS Integration

string
CloudWatch log group for session traces
string
AWS Secrets Manager prefix. When set, replaces .env as the secrets source
Secrets with JSON object values are expanded into individual keys. Plain-string secrets use the last path segment as the key name, uppercased.
string
Bedrock Guardrail ID. When set, replaces the local lint scan with a Bedrock Guardrail that hard-blocks merge if it intervenes
string
default:"DRAFT"
Guardrail version to apply

Tester Model Configuration

The tester field accepts any LiteLLM-supported model:
Default option using Anthropic API:
.ftlconfig
Requires ANTHROPIC_API_KEY.
The tester runs in parallel with the agent, so model latency doesn’t add to wall-clock time.

Setup Examples

Basic Python Project

.ftlconfig

Node.js Project

.ftlconfig

Full-Stack with AWS

.ftlconfig

Initializing Configuration

1

Run ftl init

Create .ftlconfig in your project root:
This creates .ftlconfig with values from your global config.
2

Edit .ftlconfig

Customize settings for your project:
.ftlconfig
3

Commit to Git

Add .ftlconfig to version control:

AWS Quick Setup

Provision all AWS resources and update .ftlconfig in one command:
This wizard:
1

Reads AWS Identity

Uses STS to get your account ID and region
2

Creates S3 Bucket

Creates ftl-<account>-<region> (idempotent)
3

Creates CloudWatch Log Group

Creates /ftl/<project-name> (idempotent)
4

Creates Bedrock Guardrail

Creates ftl-<project-name> with PII and credential blocking
5

Prompts for Secrets Manager

Optional Secrets Manager prefix for secret storage
6

Updates .ftlconfig

Merges all resource IDs into your project config
Running ftl config --aws requires:
  • pip install -e ".[aws]" for boto3
  • AWS credentials configured (via aws configure or ftl auth)

Finding Configuration

FTL walks up from the current directory to find .ftlconfig, similar to how Git finds .git:
This allows you to run ftl commands from any subdirectory in your project.

Configuration Validation

FTL validates that required keys are present:
If validation fails, FTL exits with a clear error message.