Skip to main content
floo uses two config files: floo.service.toml for single-service apps and floo.app.toml for multi-service apps or apps with managed services. floo init creates these files. This page is the full reference.

Config shapes

ShapeFilesWhen to use
Single servicefloo.service.tomlOne service, no managed services
Single service + managedfloo.app.tomlOne service with Postgres, Redis, or Storage
Inline multi-servicefloo.app.tomlAll services defined in one file
Delegated multi-servicefloo.app.toml + per-service floo.service.tomlService config lives alongside service code

Single service

[app]
name = "my-app"
access_mode = "public"

[service]
name = "web"
type = "web"
port = 3000
ingress = "public"
env_file = ".env"

[resources]
cpu = "1"
memory = "512Mi"
max_instances = 10

Single service with managed services

[app]
name = "crm"

[postgres]
tier = "basic"

[redis]

[storage]

[services.web]
type = "web"
path = "."
port = 3000
ingress = "public"

Inline multi-service

[app]
name = "full-stack"
access_mode = "password"

[postgres]
tier = "basic"

[redis]

[resources]
cpu = "1"
memory = "512Mi"
max_instances = 10

[services.web]
type = "web"
path = "./web"
port = 3000
ingress = "public"

[services.api]
type = "api"
path = "./api"
port = 8080
env_file = "./api/.env"

[services.worker]
type = "worker"
path = "./worker"
port = 8081
ingress = "internal"
cpu = "2"
memory = "2Gi"
Inline and delegated are mutually exclusive per service. If a service has type and port in floo.app.toml, do not also place a floo.service.toml in that service’s directory. The CLI rejects this during preflight.

Delegated multi-service

Root floo.app.toml:
[app]
name = "full-stack"

[postgres]

[services.web]
path = "./web"

[services.api]
path = "./api"
web/floo.service.toml:
[app]
name = "full-stack"

[service]
name = "web"
type = "web"
port = 3000
ingress = "public"
api/floo.service.toml:
[app]
name = "full-stack"

[service]
name = "api"
type = "api"
port = 8080
ingress = "public"
env_file = ".env"

Field reference

[app]

FieldTypeDefaultDescription
namestringrequiredApp name (DNS-safe)
access_modestring"public"public, password, accounts, sso

[service] (floo.service.toml only)

FieldTypeDefaultDescription
namestringrequiredService name (DNS-safe, 2-21 chars)
typestringrequiredweb, api, worker
portintegerrequiredPort the service listens on
ingressstring"public"public or internal
env_filestringnoneRelative path to env file synced on deploy

[services.<name>] (floo.app.toml)

Same fields as [service] above, plus:
FieldTypeDefaultDescription
pathstringrequiredRelative path to service directory
dev_commandstringnoneShell command run by floo dev to start the service locally. Example: "npm run dev"
migrate_commandstringnoneShell command run before floo dev starts the service (and after each deploy). Example: "alembic upgrade head"
domainstringnoneCustom domain for this service. Example: "api.example.com"

[resources]

FieldTypeDefaultDescription
cpustring"1"vCPU allocation
memorystring"512Mi"Memory allocation
max_instancesinteger10Max instance count
Per-service resource fields override the global [resources] section.

[postgres], [redis], [storage]

FieldTypeDefaultDescription
tierstring"basic"basic, standard, performance
Managed services are top-level sections in floo.app.toml. They are not placed under [services.*].

[auth]

FieldTypeDefaultDescription
redirect_urisarraynoneOAuth callback URLs for accounts mode

[environments.<name>]

FieldTypeDefaultDescription
access_modestringnoneOverride access mode per environment

Precedence

When you run a command without --app, the CLI resolves the app in this order:
  1. --app <name> flag
  2. Nearest floo.service.toml
  3. Nearest floo.app.toml
Access mode resolution:
  1. [environments.dev].access_mode
  2. [app].access_mode in floo.app.toml
  3. [app].access_mode in floo.service.toml
Resource precedence: per-service values override global [resources].

Validation

floo deploy --dry-run --json
The CLI fails preflight if:
  • service names are duplicated
  • a service port is invalid
  • an inline service also has a floo.service.toml in its directory
  • a multi-service app has no public service
  • managed service sections are placed in floo.service.toml instead of floo.app.toml