Output Contract
Every command supports two modes:Human mode
- human-oriented output goes to stderr
- tables, progress, warnings, and success messages stay readable in a terminal
- stdout is kept clean unless a command intentionally prints raw data
JSON mode
- JSON goes to stdout
- human-oriented progress still goes to stderr
- success responses use
{ "success": true, "data": ... } - failures use
{ "success": false, "error": { "code": "...", "message": "...", "suggestion": "..." } }
floo ... --json 2>/dev/null works well for agents.
App Inference
Most app-scoped commands can infer the app from local config. The shipped CLI resolves app context in this order:--app <name>- nearest
floo.service.toml - nearest
floo.app.toml
--app explicitly.
Dry Run
Use--dry-run when you want to validate without mutating anything.
redeploypreflightenv setenv removeenv importapps deletedomains adddomains removedeploys rollback
Self-Discovery
Use the CLI itself when you want the most accurate picture of the shipped surface:floo docs services, floo docs config, floo docs deploy. Use floo commands --json for the full machine-readable command tree.
Configuration Files
The CLI reads these files:floo.app.toml— primary config file. Services are declared inline under[services.<name>]; managed services (Postgres, Redis, Storage) are top-level sections.floo.service.toml— optional per-service file used only in the delegated multi-service layout.~/.floo/config.json— auth and API settings.
Most-Used Command Families
| Area | Commands |
|---|---|
| setup | floo auth, floo init, floo version |
| deploys | floo preflight, floo redeploy, floo deploys watch, floo deploys rollback |
| local dev | floo dev, floo run |
| app operations | floo apps, floo env, floo domains, floo logs |
| release and billing | floo releases, floo billing, floo analytics |
| discovery | floo docs, floo commands, floo update |
Deploy Flow
Pushing to GitHub triggers a deploy automatically. Watch it withfloo deploys watch:
floo redeploy only to force a redeploy without a code change — for example, after updating env vars: