floo.app.toml. Services are declared inline under [services.<name>]. Managed-service credential attachments live under service env blocks. Managed Postgres, Redis, and Storage are provisioned either with floo services add or by declaring [managed.<name>] blocks — a deploy provisions anything declared-but-missing and never destroys. The legacy top-level [postgres], [redis], and [storage] sections are deprecated in favor of [managed.<name>].
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
Single service
Single service with managed services
Provision the durable resources with the CLI: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]
[services.<name>]
[services.<name>.env]
Per-service env contract for inline services. In delegated layouts and single-service apps, use the same fields in a top-level [env] block inside that service’s floo.service.toml.
managed, managed service credentials are injected into every service for backward compatibility. Once any service declares managed, services without it receive none.
[service] (floo.service.toml)
Used only in the delegated multi-service layout, where each service keeps its own floo.service.toml alongside its code.
[resources]
Per-service resource fields override the global
[resources] section.
[managed.<name>]
Declare a managed service in config. <name> is a logical instance name — declare more than one block to run multiple services of the same type (e.g. [managed.primary] and [managed.analytics]). A deploy provisions any declared service that doesn’t exist yet; it never destroys one. Removing a block leaves the service running and surfaces an orphan warning in floo preflight — destroy it explicitly with floo services remove. The imperative equivalent is floo services add <type> --name <name>.
[services.<name>.env] managed field above.
[preview]
Deprecated for enablement. enabled and ttl_hours are read-time aliases for [github] preview_environments and preview_ttl_hours.
They still work for one migration window,
[github] wins whenever both are present, and each deploy that reads them emits a legacy_preview_toml warning. Move the values into [github] and delete them from [preview].
[preview.data] below is not deprecated and remains the hydration surface.
[preview.data]
Choose how a preview’s managed resources start. Applies to every attached managed Postgres, Redis, and Storage resource.
emptyprovisions fresh preview branches and copies no data.seedprovisions fresh preview branches, runs migrations, then runsseed_commandonce in a preview-scoped job.clone-devcopies dev data from every attached managed resource: Postgres schema data before migrations run, supported Redis key types with their TTLs, and Storage objects by server-side copy. Clone limits and per-resource behavior are in Preview Environments.
[postgres], [redis], [storage] (deprecated)
If you’re still on the legacy authoring path, the sections are top-level in floo.app.toml (not nested under [services.*]).
[environments.<name>]
Per-environment overrides. <name> is the environment slug — dev and production are the two that exist out of the box.
[cron.<name>]
Scheduled jobs run by the platform. Declared as [cron.<name>] sections in floo.app.toml.
Example:
[github]
Controls GitHub integration behavior for the connected repo.
preview_environments = true; a missing key reconciles to off. preview_ttl_hours is only read while previews are enabled, so declaring it next to preview_environments = false has no effect and previews opted in per PR use the 72-hour default.
Any pull request can override the app default with an authorized comment on that PR: /floo preview on opts one PR in, /floo preview off opts one PR out. See Preview Environments.
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