Skip to main content
floo’s primary config file is 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:
Then keep the app shape in config:

Inline multi-service

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:
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.
If no service declares 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>.
Credentials are injected per-service via the [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.
Supported modes:
  • empty provisions fresh preview branches and copies no data.
  • seed provisions fresh preview branches, runs migrations, then runs seed_command once in a preview-scoped job.
  • clone-dev copies 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.
Unsupported modes fail closed. Raw prod clone is not supported, and sanitized prod clone is unavailable until the admin-gated runner exists. See Preview Environments.

[postgres], [redis], [storage] (deprecated)

Deprecated in favor of [managed.<name>]. Top-level [postgres] / [redis] / [storage] sections still auto-provision on first deploy during the deprecation window, but every deploy that processes them emits a deprecation warning. Run floo services migrate to move an existing app onto CLI-managed state in .floo/services.lock — it is idempotent and has zero data impact.
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.
Per-environment access_mode is currently a no-op on push deploys: the schema validates the value (so a typo is caught at preflight), but the server does not apply it. The reason is safety — applying env overrides through the same column as the global default would silently downgrade sibling envs, which is the failure shape the post-2026-04-30 doctrine exists to prevent. The fix is a deferred-apply column on the deploy row, tracked as a follow-up. Until that lands, set one mode under [app] and use floo deploy --access-mode <mode> --app <name> for any env-specific override.

[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.
Previews are off unless 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:
  1. --app <name> flag
  2. Nearest floo.service.toml
  3. Nearest floo.app.toml
Access mode resolution:
  1. [environments.<env>].access_mode
  2. [app].access_mode in floo.app.toml
Resource precedence: per-service values override global [resources].

Validation

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