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.
deployenv setenv removeenv importapps deletedomains adddomains removedeploy 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.service.tomlfor single-service appsfloo.app.tomlfor multi-service apps, app-level overrides, and managed services~/.floo/config.jsonfor auth and API settings
Most-Used Command Families
| Area | Commands |
|---|---|
| setup | floo auth, floo init, floo version |
| deploys | floo deploy, floo deploy watch, floo deploy rollback |
| local dev | floo dev |
| 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 deploy watch:
floo deploy (without watch) only to force a redeploy without a code change — for example, after updating env vars: