Skip to main content
floo services is the canonical surface for managed services (Postgres, Redis, Storage) and the place to inspect any service, managed or application, running in your app. Postgres and Storage hold persistent state. Managed Redis is cache-only: treat its contents as disposable. floo makes no backup, restore, or durability guarantee for it; keep authoritative data in Postgres. The default authoring surface is a [managed.<name>] block in floo.app.toml; a deploy creates declared resources that are missing. floo services add is the operational provisioning lane for an app that already exists. Removing a previously deployed declaration is tier-3. The shared default retains the resource without review or a schedule. An explicit approval policy requires review; an approved Redis/Storage removal schedules a rescindable teardown without deleting data. floo services remove remains the explicit, confirmed terminal deletion executor.
The legacy [postgres], [redis], [storage] sections in floo.app.toml still auto-provision on first deploy during the deprecation window and emit a warning. Use floo services add for each legacy service type; an existing resource is reported as already provisioned. Replace the legacy sections with [managed.<name>] declarations. See Managed Services for the full transition story.

list

List all services for an app, both application services (web, api, worker) and managed services (postgres, redis, storage). The URL column is the reachable address of each service in the environment you asked for: an active custom domain when one is verified, otherwise the floo host. Apps with more than one web or api service get one host per service (<app>-<env>-<service>.on.getfloo.com); single-service apps use the app host. Workers, cron jobs, and internal-ingress services have no URL.

Flags

JSON output

Application-service resource fields preserve the declared values returned by the platform API. A null value means that field was not explicitly configured. runtime_plan separately reports the effective values and their sources for the selected environment. On every plan and in every environment, including production, an omitted HTTP min_instances appears as effective 0 with source platform_default.

show

Show details for one service. Branches automatically: managed services return status and injected env-var keys; application services return port, URL, ingress, and configured CPU, memory, scaling, and request-body limits. You don’t need to know which type a name maps to.

Flags

Connection credentials are never returned by show in plaintext. Use floo env list for masked verification. Secret-shaped values require the global --reveal-secrets flag with floo env get; use it only when you control the output destination. For application services, human output separates configured resources from the effective runtime plan. JSON keeps the same distinction in the top-level resource fields and runtime_plan. See Scaling and Availability.

add

Provision a managed service or re-record a legacy declaration. If the create endpoint returns a MANAGED_SERVICE_ALREADY_EXISTS 409 for (app, type, name), add resolves the existing row and reports it as already provisioned, with already_provisioned: true in JSON.

Arguments

Flags

What it does

  1. Calls POST /v1/apps/{app_id}/managed-services to provision the underlying resource (a Postgres schema and role on the shared instance, a Redis database, or a storage bucket).
  2. Synthesizes the corresponding env var(s). Postgres gets DATABASE_URL + PG*, Redis gets REDIS_URL, Storage gets STORAGE_BUCKET + STORAGE_URL, and injects them into your app’s environment scope.
For multi-service apps, runtime injection is controlled by [services.<name>.env] managed = [...]. Run floo preflight --json to see the exact env_injection_plan. For Postgres, both dev and prod credentials are provisioned up front. Promote does not need to re-provision. Preview environments use separate preview-owned managed resources. For managed Postgres, inspect or reset those preview database branches with floo db branches.

remove

Permanently destroy a managed service and its data. This is a tier-3 destructive operation: it drops the Postgres schemas, deletes the Redis databases, or deletes the storage buckets for the service.

Arguments

Flags

There is no --yes or --force. The flag name is not a bug. floo services remove is the only terminal path that destroys managed-service data. Deploy never performs that deletion. Removing or disabling a modern [managed.<name>] declaration produces a tier-3 to_deprovision proposal. By default, the resource keeps working without review or a schedule. An explicit policy requires review; approval schedules a rescindable teardown for Redis and Storage. Postgres receives no teardown schedule and keeps working. Renaming a block proposes creation under the new name and removal of the old resource. A CLI-added resource that was never declared in config appears as to_orphan until explicitly removed.

Errors