Deploy your project to floo, or manage deploy history with subcommands.
Arguments
| Argument | Description | Default |
|---|
PATH | Project directory to deploy | . (current directory) |
Flags
| Flag | Description |
|---|
--app APP | Existing app name or UUID to deploy to |
--services NAME | Deploy only specific services (repeatable) |
--restart | Restart the app without rebuilding (redeploy existing images with fresh env vars) |
--sync-env | Re-sync env vars from configured env_file before deploying |
--dry-run | Preview what would be deployed without executing |
Examples
# Deploy current directory
floo deploy
# Deploy a specific directory
floo deploy ./my-project
# Redeploy to an existing app
floo deploy --app my-app
# Restart without rebuilding (pick up new env vars)
floo deploy --restart --app my-app
# Preview deploy (no auth required)
floo deploy --dry-run --json
# Deploy only specific services (multi-service app)
floo deploy --services api --services web
# Agent workflow: deploy and extract URL
floo deploy --json 2>/dev/null | jq -r '.data.deploy.url'
What happens
- Config — floo reads
floo.app.toml / floo.service.toml from your project
- Detect — Scans project files to detect the runtime and framework
- Preflight — Validates config, checks ports, service names, env files
- API — Sends deploy request to the floo API
- Build — API pulls source from connected GitHub repo, builds via Railpack or Dockerfile using Cloud Build
- Deploy — Image is pushed to Artifact Registry and deployed to Cloud Run
- URL — Live URL is returned
Deploys are sourced from GitHub. Source is never uploaded from your machine. Connect your repo with floo apps github connect owner/repo --app my-app.
Runtime detection
| File | Runtime | Framework |
|---|
Dockerfile | Docker (direct) | — |
package.json + next | Node.js | Next.js |
package.json + vite | Node.js | Vite |
package.json + express | Node.js | Express |
package.json + fastify | Node.js | Fastify |
requirements.txt + fastapi | Python | FastAPI |
requirements.txt + flask | Python | Flask |
requirements.txt + django | Python | Django |
pyproject.toml | Python | (detected from deps) |
go.mod | Go | — |
index.html (no backend) | Static | — |
Detection priority: Dockerfile > package.json > pyproject.toml/requirements.txt > go.mod > index.html.
If a Dockerfile is present, floo uses it directly — no auto-detection.
Subcommands
floo deploy list
List deploy history for an app, newest first.
floo deploy list --app my-app
| Flag | Description |
|---|
--app APP | App name or UUID |
floo deploy logs DEPLOY_ID
Show build logs for a specific deploy.
floo deploy logs abc123 --app my-app
floo deploy logs abc123 --app my-app --follow
| Flag | Description |
|---|
--app APP | App name or UUID |
--follow | Stream logs in real-time for active deploys |
floo deploy watch
Stream deploy progress in real-time. Waits for the deploy to finish and shows build logs as they arrive.
floo deploy watch --app my-app
floo deploy watch --app my-app --commit abc1234
| Flag | Description |
|---|
--app APP | App name or UUID |
--commit SHA | Match a deploy by commit SHA prefix (waits up to 120s) |
floo deploy rollback APP DEPLOY_ID
Rollback to a previous deploy.
floo deploy rollback my-app abc123
floo deploy rollback my-app abc123 --force --json
| Flag | Description |
|---|
--force | Skip confirmation prompt |
JSON output
{
"success": true,
"data": {
"app": {
"id": "a1b2c3d4-...",
"name": "my-app",
"status": "live",
"url": "https://my-app-abc123.us-central1.run.app"
},
"deploy": {
"id": "e5f6g7h8-...",
"status": "live",
"url": "https://my-app-abc123.us-central1.run.app",
"build_logs": "..."
},
"detection": {
"runtime": "nodejs",
"framework": "Next.js",
"version": "^14.0.0",
"confidence": "high",
"reason": "Found next in package.json dependencies"
},
"services": ["web"]
}
}
Errors
| Code | Meaning |
|---|
NOT_AUTHENTICATED | Run floo auth login first |
INVALID_PATH | Path is not a valid directory |
NO_CONFIG_FOUND | No floo.app.toml or floo.service.toml found. Run floo init first |
CONFIG_INVALID | Preflight validation failed (duplicate service names, invalid ports, etc.) |
APP_NOT_FOUND | The --app value doesn’t match any existing app |
DEPLOY_FAILED | Build or deploy failed. Check build logs |
DEPLOY_TIMEOUT | Deploy timed out after 10 minutes |
NO_RUNTIME_DETECTED | No supported project files found |