Skip to main content
Manage releases and promote apps to production via GitHub releases.

list

List releases for an app.
floo releases list --app my-app

Flags

FlagDescription
--app APPApp name or UUID

JSON output

{
  "success": true,
  "data": {
    "releases": [
      {
        "id": "r1a2b3c4-...",
        "tag": "v1.2.0",
        "commit_sha": "abc1234",
        "promoted_by": "you@example.com",
        "deploy_id": "d5e6f7g8-...",
        "created_at": "2026-03-01T14:00:00Z"
      }
    ]
  }
}

show

Show details for a specific release (tag, commit, promoted by, deploy ID, image digest).
floo releases show r1a2b3c4 --app my-app

Flags

FlagDescription
--app APPApp name or UUID

JSON output

{
  "success": true,
  "data": {
    "id": "r1a2b3c4-...",
    "tag": "v1.2.0",
    "commit_sha": "abc1234",
    "promoted_by": "you@example.com",
    "deploy_id": "d5e6f7g8-...",
    "image_digest": "sha256:abcdef123456...",
    "created_at": "2026-03-01T14:00:00Z"
  }
}

promote

Promote the latest live dev deploy to production. Creates a GitHub release if GitHub is connected.
floo releases promote --app my-app

What happens during promote

Promote copies dev images to prod Cloud Run without rebuilding (fast path), or rebuilds with prod build-time env vars if any VITE_* / NEXT_PUBLIC_* vars differ. In addition to deploying the images, promote also:
  1. Runs database migrations — for each service with a migrate_command set in floo.app.toml, runs the command as a Cloud Run Job against the prod schema. Migration failures are logged but do not block the promote from going live.
  2. Creates gateway routes for all environments — both the shared app host ({app}.on.getfloo.com) and per-service hosts ({app}-{svc}.on.getfloo.com) are upserted on every promote, so stale routes from before service renaming are corrected automatically.
  3. Grants IAM — gateway SA run.invoker is granted on all public services; the app SA is granted on internal services.
  4. Auto-registers /auth/callback — for apps using access_mode = "accounts", {prod_url}/auth/callback is automatically added to app.auth_redirect_uris if not already present. You never need to manually add callback URLs to floo.app.toml for new environments.

Flags

FlagDescription
--app APPApp name or UUID
--tag TAGRelease tag (auto-generated if omitted, e.g., v1.2.1)

Examples

# Promote with auto-generated tag
floo releases promote --app my-app

# Promote with explicit tag
floo releases promote --app my-app --tag v2.0.0

# Agent workflow: promote and extract tag
floo releases promote --app my-app --json 2>/dev/null | jq -r '.data.tag'

JSON output

{
  "success": true,
  "data": {
    "id": "r9a8b7c6-...",
    "tag": "v1.2.1",
    "commit_sha": "def5678",
    "deploy_id": "d1e2f3g4-...",
    "release_url": "https://github.com/you/my-app/releases/tag/v1.2.1"
  }
}

Errors

CodeMeaning
NOT_AUTHENTICATEDRun floo auth login first
APP_NOT_FOUNDNo app with that name or ID
NO_DEV_DEPLOYDeploy to dev first before promoting
RELEASE_TAG_EXISTSA release with that tag already exists. Use a different --tag
RELEASE_NOT_FOUNDNo release with that ID