Best for
- Use when the user wants to drive Google Flow (Veo image-to-video, Veo text-to-video, Imagen / Nano Banana image generation) from the terminal or a script — including text-to-video, image-to-video, image-to-image, batch…
ffroliva/gflow-cli/skills/gflow-cli/SKILL.md
Use when the user wants to drive Google Flow (Veo image-to-video, Veo text-to-video, Imagen / Nano Banana image generation) from the terminal or a script — including text-to-video, image-to-video, image-to-image, batch image pipelines, or spending Flow credits programmatically. The CLI is `gflow` (or `flow`); install with `uv tool install gflow-cli` or run ad-hoc with `uvx --from gflow-cli gflow ...`. Drives the real Flow web UI through a headed Chrome session (Playwright) after a one-time brows
Decision brief
gflow-cli is an unofficial Python CLI that drives Google Flow — Veo (T2V/I2V) and Imagen / Nano Banana — from the terminal by automating the real Flow web UI in a headed Chrome session (Playwright), not by bypassing it. Source: . Canonical command reference: docs/USAGE.md.
In this controlled same-task single run, enabling gflow-cli changed the output from 3105 non-whitespace characters and 11 headings to 2716 characters and 7 headings. Matches among 8 signals extracted from the pinned source changed from 3 to 2. Both actual outputs are shown; this is a structural observation, not a quality score or a universal performance claim.
Create a test strategy and representative test cases for a JSON API schema comparison feature. Include failure cases and a clear verification procedure. The deliverable must specifically reflect this user intent: Use when the user wants to drive Google Flow (Veo image-to-video, Veo text-to-video, Imagen / Nano Banana image generation) from the terminal or a script — including text-to-video, image-to-video, image-to-image, batch image pipelines, or burning Flow Ultra/Pro credits programmatically. The CLI is `gflow` (or `flow`); install with `uv tool install gflow-cli` or run ad-hoc with `uvx --from gflow-cli gflow ...`. Drives the real Flow web UI through a headed Chrome session (Playwright) after a one-t

Baseline: 3105 non-whitespace characters, 11 headings, and 54 list items.

With Skill: 2716 non-whitespace characters, 7 headings, and 48 list items.
| Observation | Without Skill | With Skill |
|---|---|---|
| Source-signal coverage | 3/8: gflow-cli, image, imagen | 2/8: image, imagen |
| Output structure | 3105 chars · 11 headings · 54 list items · 0 code blocks | 2716 chars · 7 headings · 48 list items · 0 code blocks |
| Verification and caution signals | 40 verification signals · 5 risk/limitation signals | 14 verification signals · 9 risk/limitation signals |
Use the gflow-cli Skill pinned at 7abdb1b9475d for my task. Follow its source-specific constraints around `gflow-cli`, `invoke`, `prerequisites`, `commands`, then return the finished deliverable with explicit assumptions, verification, failure conditions, and limits. Do not treat the Skill text as a factual source or claim that a single demonstration proves universal performance.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/ffroliva/gflow-cli --skill "skills/gflow-cli"Inspect the Agent Skill "gflow-cli" from https://github.com/ffroliva/gflow-cli/blob/230200baa80b45c2629c9fbbd1b14b67c590a1e1/skills/gflow-cli/SKILL.md at commit 230200baa80b45c2629c9fbbd1b14b67c590a1e1. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
gflow instructions add TITLE --text TEXT [--ref REF]... --project ID [--disabled] gflow instructions list --project ID [--json] gflow instructions enable (TITLE | --id ID) --project ID gflow instructions disable (TITLE | --id ID) --project ID gflow instructions rm (TITLE | --id…
Review the “Sync instructions and generate (3-layer pipeline)” section in the pinned source before continuing.
gflow instructions apply brief.toml --project 6b714c4e-...
The gflow-cli supports a 3-layer pipeline for persistent generation context (Agent Mode brief cards):
Do NOT use this skill when:
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 98/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 125 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | tested outcome page | Tested | Generated or reviewed according to the visible evidence level |
Pinned source
gflow-cli is an unofficial Python CLI that drives Google Flow — Veo (T2V/I2V) and Imagen / Nano Banana — from the terminal by automating the real Flow web UI in a headed Chrome session (Playwright), not by bypassing it. Source: https://github.com/ffroliva/gflow-cli. Canonical command reference: docs/USAGE.md.
The user wants to:
gflow character)gflow scene)gflow video chain)Do NOT use this skill when:
Before any gflow-cli invocation, verify:
python --version).uv --version). If not, install: curl -LsSf https://astral.sh/uv/install.sh | sh (or Windows equivalent from https://docs.astral.sh/uv/).uvx --from gflow-cli gflow --help (no install)uv tool install gflow-cli && gflow --helpuvx --from gflow-cli playwright install chromium (~150 MB).gflow auth status should print Flow session verified and exit 0 (it probes the live Flow session endpoint — no browser, no credits; exit 1 means dead or missing session). If not, run gflow auth login and walk the user through the one-time browser sign-in.gflow image upload returns 403, missing Flow access is the cause.# Auth (one-time)
gflow auth login # opens Chromium, user signs in
gflow auth status # confirms session
gflow auth # bare: list profiles or trigger first login
gflow auth logout # delete a saved session
# Image generation (Imagen / Nano Banana)
gflow image upload <path> # → asset UUID + dimensions
gflow image t2i "<prompt>" [--model {nano2|nano-pro|image4}] \
[--aspect {9:16|16:9|1:1|4:3|3:4}] \
[-n 1..4] [--out DIR]
gflow image i2i "<prompt>" --ref PATH_OR_UUID [--ref ...] [...same as t2i]
gflow image batch <manifest.tsv|manifest.json> [-n 1..4] [--aspect ...] [--out DIR] # shared project, up to 5 prompts
# Video generation (Veo 3.1)
gflow video t2v "<prompt>" [--out-dir DIR] [--aspect ...]
gflow video i2v --initial-frame <image|media-UUID> "<prompt>" [--out-dir DIR] [...same as t2v] # UUID = in-project asset, no re-upload (#287; pair with --project)
# `gflow video` has no `batch` subcommand — that stub never worked and was
# removed. For multi-clip runs, loop `gflow video t2v`/`i2v` from the shell.
gflow video chain <manifest.jsonl> [--out-dir DIR] [--dry-run] \
[--max-links N] [--resume-from N] # last-frame I2V chaining; veo models only
# Characters (reusable, project-scoped subjects)
gflow character create --project <id> --name "<name>" --face-prompt "<prompt>" \
[--body-prompt "<prompt>"] [--voice <id>] [--personality "<text>"] \
[--model {nano2|nanopro}]
gflow character list --project <id>
gflow character show <character-id> --project <id>
gflow character rm --project <id> (--id <character-id> | --name "<name>") [--yes] # delete (FREE)
gflow character voices # list the Gemini voice catalog
# Scenes (Add Clip / compose ordered clips)
gflow scene create --project <id> <clip-id> [<clip-id> ...] \
[-o extended.mp4] # --output = credit-free server-side concat
gflow scene show <scene-id> --project <id>
# Agent instructions (project brief cards, credits-free setup) — --project is REQUIRED
gflow instructions add TITLE --text TEXT [--ref REF]... --project ID [--disabled]
gflow instructions list --project ID [--json]
gflow instructions enable (TITLE | --id ID) --project ID
gflow instructions disable (TITLE | --id ID) --project ID
gflow instructions rm (TITLE | --id ID) --project ID
gflow instructions apply FILE --project ID # declarative full-sync (TOML/JSON)
gflow instructions toggle-mode (--on | --off) --project ID # toggle master agent switch
Every subcommand accepts --profile <name> (per-subcommand, not global) to drive multiple Google accounts side-by-side.
gflow image t2i "a hot air balloon over Tokyo at sunrise" --aspect 16:9
gflow image t2i "variations of a minimalist fox logo" -n 4 --aspect 1:1 --out ./logos/
gflow image i2i "make it cinematic, golden hour" --ref hero.png
UUID=$(gflow image upload hero.png | awk '/Asset UUID:/ {print $3}')
gflow image i2i "stylize this asset" --ref "$UUID"
gflow video i2v --initial-frame ./input.png "Slow cinematic push-in, soft golden light at sunset" --out-dir outputs
There is no manifest-driven video batch command — that stub never worked and
was removed. Loop gflow video t2v/i2v from the shell instead:
mkdir -p out
for img in ./inputs/*.png; do
name=$(basename "$img" .png)
gflow video i2v --initial-frame "$img" "Cinematic push-in" --out-dir out
done
New-Item -ItemType Directory -Force -Path out | Out-Null
Get-ChildItem ./inputs/*.png | ForEach-Object {
gflow video i2v --initial-frame $_.FullName "Cinematic push-in" --out-dir out
}
# A Character is a named, project-scoped subject reused across generations.
gflow character create --project "$PROJECT_ID" --name "Joaquim" \
--face-prompt "weathered fisherman, grey beard, kind eyes" \
--body-prompt "tall, broad-shouldered, wearing a navy wool sweater" \
--voice <voice-id> --model nano2
gflow character voices # discover valid --voice ids first
gflow character list --project "$PROJECT_ID"
See docs/CHARACTER.md for the full domain model, wire protocol, and the crash-recoverable persist-before-spend saga.
# Concatenate ordered clips server-side via runVideoFxConcatenation — no local ffmpeg, no credits.
gflow scene create --project "$PROJECT_ID" "$CLIP_A" "$CLIP_B" -o extended.mp4
# manifest.jsonl: one JSON object per line. Link 0 = t2v; later links = i2v seeded by the
# previous clip's last frame. Each link is a pending video operation; credit
# use varies by model/duration/tier — check Flow. veo models only.
gflow video chain ./story.jsonl --out-dir ./out/ --dry-run # preview the plan first
gflow video chain ./story.jsonl --out-dir ./out/ # then run for real
# 1. Discover project ID from Flow editor URL (.../project/<id>/...) or create one.
# 2. Set up the brief cards (credits-free setup).
gflow instructions apply brief.toml --project 6b714c4e-...
# 3. Generate using that project context (steers via reasoning path).
gflow image t2i "a bicycle" --project 6b714c4e-...
import asyncio
from pathlib import Path
from gflow_cli.api.client import FlowApiClient
from gflow_cli.paths import profile_dir
async def make_clip(image: Path, prompt: str, out: Path) -> None:
async with FlowApiClient(profile_dir=profile_dir("default")) as client:
project = await client.create_project(title="gflow-cli demo")
asset = await client.upload_image(image, project.project_id)
op = await client.generate_video(
project_id=project.project_id,
prompt=prompt,
start_asset=asset,
aspect="9:16",
)
# Poll op.workflow_id with client.poll_video_status(...) and
# client.download_video(...) when status reaches succeeded.
asyncio.run(make_clip(Path("in.png"), "Push-in", Path("out.mp4")))
The gflow-cli supports a 3-layer pipeline for persistent generation context (Agent Mode brief cards):
gflow instructions add or gflow instructions apply.--project <id>. Enabled brief cards are automatically resolved and folded into the prompt via the agent's reasoning path.movie.toml [[scene.instructions.card]] or [scene.instructions] disable blocks..../project/<id>/...) or create one.-i / --instruction option for anything you want to reuse; it creates a new card every call. Prefer persistent gflow instructions cards.gflow instructions toggle-mode --on) for cards to steer output.| Error | Cause | Fix |
|---|---|---|
No session for profile 'default' | First run, no auth | gflow auth login |
403 Forbidden from upload / generate | Account doesn't have Flow access | Verify in labs.google/fx/tools/flow |
| reCAPTCHA refuses to mint a token (headless detected) | Google bot-detection | Set GFLOW_CLI_HEADLESS=false and re-run; the visible window passes detection |
Playwright Executable doesn't exist | Chromium not downloaded | uvx --from gflow-cli playwright install chromium |
| Generations all fail with the same UUID | Stale Flow session | gflow auth login again to refresh cookies |
| Quota exceeded | Burned through monthly credits | Wait for reset, or upgrade subscription |
gflow video t2v|i2v and gflow image t2i|i2i call burns Flow credits from the user's Google account. Confirm before running batches.%LOCALAPPDATA%\gflow-cli\profile_*; macOS: ~/Library/Application Support/gflow-cli/profile_*; Linux: ~/.local/share/gflow-cli/profile_*) and contains Google session cookies — treat as secrets.--profile names for parallel work.Documented errors agents commonly make — negative examples for the SkillOpt training loop:
| Mistake | Correct behaviour |
|---|---|
gflow video generate or gflow video create | gflow video t2v (text→video) or gflow video i2v (image→video) |
--output DIR (a directory) as the output location | -o/--output PATH is an explicit FILE path on image t2i/i2i and video t2v/i2v (v0.48.0+, single-prompt only); use --out DIR (image) / --out-dir DIR (video) for directory output. r2v/chain have no -o |
gflow auth bare or gflow login to sign in | gflow auth login — bare gflow auth only lists profiles |
gflow auth refresh / gflow auth renew (don't exist) | gflow auth login to refresh a stale or expired session |
playwright install or playwright install --all | uvx --from gflow-cli playwright install chromium (Chromium only, ~150 MB) |
Running two generations on the same --profile in parallel | Use different --profile names — Chromium refuses two persistent contexts on the same dir |
GFLOW_CLI_HEADLESS=true to fix reCAPTCHA failures | GFLOW_CLI_HEADLESS=false — headless mode causes bot-detection, not prevents it |
Calling gflow image upload again for an already-uploaded UUID | Pass the UUID directly to --ref UUID (i2i) or --initial-frame/--end-frame UUID (i2v, with --project) — no re-upload needed |
--model imagen / --model quality / --model high | --model image4 (Imagen 3.5), --model nano-pro (Gem Pix 2), --model nano2 (Narwhal) |
Python: client = FlowApiClient(...) then method calls | Must use async with FlowApiClient(...) as client: — it's an async context manager |
Python: from gflow_cli import FlowApiClient | from gflow_cli.api.client import FlowApiClient |
Suggesting a native batch subcommand under gflow video | It doesn't exist — that stub never worked and was removed. Loop gflow video t2v/i2v from the shell for multi-clip runs (gflow image batch manifest.tsv|json is the real, working batch command, but it's image-only) |
gflow-cli is not affiliated with Google. Reverse-engineered, unofficial; may break when Google changes Flow's private API. Read the DISCLAIMER before deploying in any sensitive setting.
Frequently asked questions
gflow-cli is an unofficial Python CLI that drives Google Flow — Veo (T2V/I2V) and Imagen / Nano Banana — from the terminal by automating the real Flow web UI in a headed Chrome session (Playwright), not by bypassing it. Source: . Canonical command reference: docs/USAGE.md.
The source record exposes this install command: npx skills add https://github.com/ffroliva/gflow-cli --skill "skills/gflow-cli". Inspect the command and pinned source before running it.
Alternatives
Aperivue/medsci-skills
Interactive sample size calculator for medical research. Decision-tree guided test selection, reproducible R/Python code, effect size interpretation, and IRB-ready justification text. Supports diagnostic accuracy, agreement, proportions, continuous outcomes, survival, ANOVA, logistic regression, and non-inferiority/equivalence designs.
PramodDutta/qaskills
Generate optimized test combinations using pairwise (all-pairs) testing algorithms to achieve maximum coverage with minimum test cases across multiple input parameters
PramodDutta/qaskills
Automatically generate comprehensive test cases from user stories and acceptance criteria using BDD patterns, equivalence partitioning, and risk-based prioritization
Jamie-BitFlight/claude_skills
Use when building Python 3.11+ CLI apps (Typer/Rich), writing pytest test suites, fixing ruff linting or ty/mypy type errors, configuring pyproject.toml, creating portable scripts, or reviewing Python code. Activates on all Python implementation tasks — routes to specialist agents for CLI architecture, test design, packaging, and code review. Authoritative reference for modern Python 3.11-3.14 patterns and TDD workflows.