Skip to main content
Starts every service in a floo app locally, with credentials for its floo-managed services injected.
Run it from the project tree containing floo.app.toml. It takes no path argument.

Flags

The --fixture-* flags take effect only for apps with access_mode = "accounts"; for any other mode floo dev warns and skips the proxy. Walkthrough: App sign-in → Local development.

What happens

  1. Resolve: reads floo.app.toml and collects every service’s dev_command
  2. Session: creates a dev session through the floo API
  3. Env injection: readable dev config and managed credentials follow the service’s env.managed attachment plan. Write-only secrets are withheld; their names appear in withheld_secret_keys and each affected process’s FLOO_WITHHELD_SECRET_KEYS. Supply those values from your local environment or a local secret store.
  4. Migrations: a service’s migrate_command, if set, runs before that service starts
  5. Start: each dev_command is spawned in its service’s path directory with a colored terminal prefix
  6. Cleanup: on Ctrl+C, all child processes are terminated and the dev session is deleted

Requirements

  • floo.app.toml must exist in the project directory
  • Every service must declare dev_command, except services with repo = "owner/repo", which are skipped with a warning
  • Every service floo dev starts must have path and port set
  • Each service must use a unique port

Example

Terminal output:

Discovery vars

Each service receives env vars pointing to the other local services: For example, a web service in a web + api app receives API_URL=http://localhost:8000 and NEXT_PUBLIC_API_URL=http://localhost:8000.

JSON output

floo dev --json redacts secret-shaped values by default and sets contains_secrets: true so agent harnesses can reject the payload. Use --reveal-secrets only when you control the destination, such as a local file outside agent context. The child processes still receive the real values.
Startup emits a single JSON object. postgres_authorized is a compatibility field and is false; postgres_reachable is null when no legacy authorization probe ran:
Log lines stream as newline-delimited JSON events:
Session end:

Errors