Managed services are floo’s stateful primitives — Postgres, Redis, and Storage. They hold persistent data, they outlive any single deploy, and destroying them is irreversible. For that reason, floo treats managed services as CLI-canonical: provisioning and removal are explicitDocumentation Index
Fetch the complete documentation index at: https://getfloo.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
floo services commands, never side effects of editing a config file.
Provision a service
Usefloo services add for any managed service. The command is idempotent on (app, type, name), so re-running it is safe.
- Provisions the underlying resource (a Postgres schema + role on the shared instance, an Upstash Redis database, or a GCS bucket).
- Synthesizes the matching env vars and injects them into your app’s environment scope.
- Writes
.floo/services.lock— commit it alongside other changes.
| Service | Type flag | Env vars injected |
|---|---|---|
| Postgres | postgres | DATABASE_URL, PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD |
| Redis | redis | REDIS_URL |
| Storage | storage | STORAGE_BUCKET, STORAGE_URL |
floo.app.toml or .floo/services.lock. They’re synthesized at deploy time and injected directly into the runtime environment. Postgres DATABASE_URL is a standard PostgreSQL URI that mainstream frameworks can parse directly; the PG* vars expose the same default connection as separate fields for tools that prefer them.
Attach Credentials To Services
For single-service apps, managed credentials go to the only runtime service unless top-level[env] managed = [] opts out. For multi-service apps, put the attachment next to the service that needs it:
postgres gives DATABASE_URL plus PG*, redis gives REDIS_URL, and storage gives STORAGE_BUCKET plus STORAGE_URL. Named services use type:name, such as postgres:analytics for DATABASE_URL_ANALYTICS.
If no service declares managed, floo keeps legacy all-service injection. Once any service declares it, services without managed receive no managed-service credentials. floo only strips keys owned by managed-service records, so an external user-managed DATABASE_URL is not swept up by this filter. floo preflight --json shows the exact per-service plan in env_injection_plan.
Inspect
Remove
floo services remove is the only path that destroys managed-service data. Deploy never destroys, regardless of what’s in floo.app.toml.
--force.
The lock file
Everyadd, remove, and migrate updates .floo/services.lock atomically. The file is auto-generated, committed to the repo, and never hand-edited. It’s a record of state, not a source — the platform DB is authoritative. Same model as package-lock.json or Cargo.lock.
floo services command re-syncs the file from platform truth.
Dev and prod isolation
Each service type isolates dev from prod differently. Read this before promoting to prod.| Service | Dev/prod model |
|---|---|
| Postgres | Fully isolated. Provisioning creates both {schema}_dev and {schema}_prod schemas, each with its own role and password. Dev gets DATABASE_URL + PG* for _dev; prod gets a different role/password for _prod. Promote does not need to re-provision. |
| Redis | Shared. A single Upstash database backs both dev and prod. The dev REDIS_URL is mirrored into prod env vars on first prod deploy. If you write to Redis in dev, prod sees it. |
| Storage | Shared. A single GCS bucket backs both dev and prod. The dev STORAGE_BUCKET is mirrored into prod env vars. Uploads from dev are visible in prod. |
dev: / prod: based on a runtime flag).
Preflight reconciliation
floo preflight shows the planner’s view of managed-service state across five bins:
to_provision— declared (via CLI or legacy TOML) but no row exists. Will be created on the next deploy orfloo services add.to_retain— declared and exists. No-op.to_retry— declared and afailedrow exists. The next deploy retries provisioning into the same row.to_orphan— exists, not declared anywhere. Will NOT be deprovisioned. Surfaced as a non-blocking warning telling you to runfloo services removeif you actually want destruction.in_flight_deprovisioning— adeprovisioningrow is mid-flight. Excluded fromto_retain/to_orphanuntil it completes.
remove.
Legacy TOML sections (deprecated)
Earlier versions of floo accepted[postgres], [redis], and [storage] top-level sections in floo.app.toml as a declarative shortcut:
migrate is idempotent and has zero data impact — it records the existing managed-service rows in .floo/services.lock and prints instructions to remove the legacy TOML sections. After migration, your authoring surface is the CLI alone; the underlying managed services are untouched.
After the sunset date, the parser will ignore the legacy sections entirely. Apps that haven’t migrated keep their managed services (the CLI sees them via floo services list); only the authoring surface changes.
Capacity
Every managed Postgres service ships with the same defaults — there are no self-serve tiers to choose between:| Setting | Default |
|---|---|
| Max connections | 25 |
| Statement timeout | 60s |
| Idle-in-transaction timeout | 120s |
| Lock timeout | 10s |
work_mem | 128 MB |
--tier flag on floo services add postgres is accepted for backwards-compatibility but ignored — every value maps to the same defaults.
Redis uses Upstash. Storage uses GCS buckets. Neither has tier choices.
Need more than 25 connections? Email team@getfloo.com — for sustained higher concurrency we provision dedicated Postgres instances rather than a self-serve performance tier.
Connection usage
floo tracks live Postgres connection usage and warns you before you hit the limit:- Dashboard — the managed-Postgres panel shows
N / 25 connections in useand surfaces a warning when you cross 75%. - CLI —
floo db connections --app my-app [--env dev|prod]prints the same data, with a--jsonmode for agents. - Email — the org owners and admins get an email at 75% sustained, with a one-click
mailto:team@getfloo.comfor capacity requests. One email per app per 24h max.
Usage metering
| Resource | Metered by |
|---|---|
| Compute (Cloud Run) | per vCPU-second + per GiB-second |
| Postgres | shared instance, metered by compute |
| Redis | serverless (Upstash), metered by commands |
| Storage | per GB stored + per operation |
| Bandwidth | per GB egress |
Databases
Code examples and debugging for Postgres and Redis.
Cloud Storage
Upload, download, and signed URL patterns.
Cron Jobs
Schedule recurring tasks inside your app’s containers.