floo.app.toml. Services are declared inline under [services.<name>]. Managed services (Postgres, Redis, Storage) are top-level sections in the same file.
floo.service.toml is an optional per-service config file used only when you want service configuration to live alongside each service’s code (the “delegated” layout).
floo init creates floo.app.toml with your service declared inline. This page is the full reference.
Config shapes
| Shape | Files | When to use |
|---|---|---|
| Single service | floo.app.toml | One service, with or without managed services |
| Inline multi-service | floo.app.toml | All services defined in one file |
| Delegated multi-service | floo.app.toml + per-service floo.service.toml | Service config lives alongside service code |
Single service
Single service with managed services
Inline multi-service
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
Rootfloo.app.toml:
web/floo.service.toml:
api/floo.service.toml:
Field reference
[app]
| Field | Type | Default | Description |
|---|---|---|---|
name | string | required | App name (DNS-safe) |
access_mode | string | "public" | public, password, accounts, sso (coming soon) |
[services.<name>]
| Field | Type | Default | Description |
|---|---|---|---|
type | string | required | web, api, worker |
port | integer | required | Port the service listens on |
ingress | string | "public" | public (internet-facing) or internal (only reachable by other services in the same app) |
env_file | string | none | Relative path to env file synced on deploy |
path | string | . | Relative path to service directory (multi-service apps) |
dev_command | string | none | Shell command run by floo dev to start the service locally. Example: "npm run dev" |
migrate_command | string | none | Shell command run before floo dev starts the service (and after each deploy). Example: "alembic upgrade head" |
domain | string | none | Custom domain for this service. Example: "api.example.com" |
[service] (floo.service.toml)
Used only in the delegated multi-service layout, where each service keeps its own floo.service.toml alongside its code.
| Field | Type | Default | Description |
|---|---|---|---|
name | string | required | Service name (DNS-safe, 2-21 chars) |
type | string | required | web, api, worker |
port | integer | required | Port the service listens on |
ingress | string | "public" | public or internal |
env_file | string | none | Relative path to env file synced on deploy |
[resources]
| Field | Type | Default | Description |
|---|---|---|---|
cpu | string | "1" | vCPU allocation |
memory | string | "512Mi" | Memory allocation |
min_instances | integer | 0 | Min instance count (0 allows scale to zero) |
max_instances | integer | 10 | Max instance count |
[resources] section.
[postgres], [redis], [storage]
Managed services are top-level sections in floo.app.toml — not placed under [services.*].
| Field | Type | Default | Description |
|---|---|---|---|
tier | string | "basic" | Postgres only: basic, standard, performance. Redis and Storage use a single shared tier — omit the field. |
[auth]
| Field | Type | Default | Description |
|---|---|---|---|
redirect_uris | array | none | OAuth callback URLs for accounts mode |
[environments.<name>]
| Field | Type | Default | Description |
|---|---|---|---|
access_mode | string | none | Override access mode per environment |
[cron.<name>]
Scheduled jobs run by the platform. Declared as [cron.<name>] sections in floo.app.toml.
| Field | Type | Default | Description |
|---|---|---|---|
schedule | string | required | Cron expression, e.g. "0 9 * * *" for 9am UTC daily |
command | string | required | Shell command executed in the target service container |
service | string | required | Name of the service whose image runs the command |
timeout | integer | 300 | Maximum execution time in seconds |
[github]
Controls GitHub integration behavior for the connected repo.
| Field | Type | Default | Description |
|---|---|---|---|
deploy_on_push | boolean | true | When false, GitHub push webhooks do not trigger deploys — the agent deploys manually |
Precedence
When you run a command without--app, the CLI resolves the app in this order:
--app <name>flag- Nearest
floo.service.toml - Nearest
floo.app.toml
[environments.<env>].access_mode[app].access_modeinfloo.app.toml
[resources].
Validation
- service names are duplicated
- a service port is invalid
- an inline service also has a
floo.service.tomlin its directory - a multi-service app has no public service
- managed service sections are placed in
floo.service.tomlinstead offloo.app.toml