floo.app.toml is the source of truth for app shape and managed-service intent.
Live provider state stays authoritative for the stored data itself.
Agents need a deterministic, reviewable file describing desired state. Keeping
it in git means every change an agent makes arrives as a diff you can review.
What lives in config
Use repo-backed config for app shape:- app and service definitions
- routing,
[domains."host"]custom domain declarations, and edge rules - access mode and sign-in policy
- ports and ingress
- build settings
- service paths
- migrate and dev commands
- managed Postgres, Redis, and Storage declarations
- managed credential attachments
What stays outside config
Some state is intentionally managed outside the repo:- env vars and secrets
- access grants and team membership
- billing
- API keys
- live stored data, backups, and restores
- confirmed terminal deletion, such as app or managed-service deletion
Why this matters for agents
When config lives in the repo:- agents can read and edit it directly
- changes are reviewable in pull requests
- the deploy surface is deterministic
- there is no second config system to reverse-engineer
Service lifecycle
Each[services.NAME] name identifies a distinct application service. A rename
creates a new identity; it does not migrate data or retire the old runtime.
Removing a service block does not retire its runtime, and the consumer CLI has
no application-service retirement command. floo services remove targets
managed resources, not application services, and does not edit the manifest.
If its managed declaration remains, a later push can provision the resource again.
See managed-service removal for review and deletion.
Put service environment contracts under [services.NAME.env], including for
single-service apps. See credential attachments.
After a service change, run floo services list --app my-app --env dev --json.
Compare both app_services and managed_services names with the declarations,
and report missing or extra names. A running status can come from the
environment’s deploy state and does not prove each service is healthy.
A failed managed-service read can appear as an empty list in successful JSON,
with its warning visible only in human output. Repeat the read without --json
and check for that warning. If completeness is uncertain, report verification
failure. Report retained application services, managed resources, and scheduled
jobs explicitly; do not claim cleanup when retention is unverified.
The dashboard is a window
The dashboard is for visibility into the live system. It shows releases, logs, settings, team state, and usage. Custom-domain status and DNS records are read-only; declare or remove a host infloo.app.toml and release to prod.
It does not become a competing source of truth for app shape that already lives in floo.app.toml.
Recommended workflow
- Write or update config in the repo.
- Run preflight and review it in git.
- Commit and push the config.
- Connect GitHub if needed, then watch the deploy.
Configuration
Learn the file shapes and common config patterns.
Dashboard vs CLI
See how the read/write split works in practice.