| name | google-flow |
| description | Use when navigating and operating Google Flow (labs.google/fx/tools/flow) - an AI video generation tool. Helps with project management, scenebuilder interface, prompt entry, preset selection, model configuration, and video generation workflow. |
| domain | productivity |
| author | oyi77 |
| license | Apache-2.0 |
| subdomain | productivity |
| tags | ["flow","google","productivity","time-management","tools","video","workflow"] |
| version | 1.0.0 |
persona:
name: "Domain Expert"
title: "Master of Google Flow"
expertise: ['Specialized Knowledge', 'Best Practices', 'Industry Standards']
philosophy: "Excellence through expertise."
credentials: ['Industry leader', 'Practiced expert', 'Thought leader']
principles: ['Quality first', 'Continuous improvement', 'Evidence-based decisions', 'Customer focus']
Google Flow Skill
Overview
Google Flow is an AI video generation tool that creates videos from text prompts using Google's Veo 3.1 model. This skill provides detailed automation guidance for the Flow interface.
Access: https://labs.google/fx/tools/flow
Model: Veo 3.1 - Fast
Credit Cost: 20 credits per generation (with 1 output)
Anti-Rationalization Table
| Rationalization | Reality |
|---|
| "I'll figure it out as I go" | A structured approach saves time and reduces errors. Follow the workflow in this skill rather than improvising. |
| "I already know this topic" | Familiarity breeds shortcuts. Use the checklist to verify you haven't missed critical steps. |
| "This doesn't apply to my situation" | The patterns here generalize across contexts. Adapt, don't skip — the underlying principles hold. |
| "One more tool will fix it" | Adding complexity rarely solves process gaps. Master the core workflow first. |
When to Use
Trigger phrases:
-
"google flow"
-
"When generating AI videos from text prompts"
-
"When automating Google Flow project management"
-
"When configuring video generation settings"
-
When generating AI videos from text prompts
-
When automating Google Flow project management
-
When configuring video generation settings
-
When building video scenes programmatically
When NOT to Use
- When you need image generation (use
content/gemini-image-generator)
- When you don't have Google Flow access
- When credits are low/empty
Complete Video Generation Workflow
- Receive input and validate format
- Route to appropriate handler based on input type
- Execute core operation with monitoring
- Transform output to expected format
- Return results or trigger follow-up actions
Step 1: Navigate to Google Flow
URL: https://labs.google/fx/tools/flow
Expected State: Flow home page with existing projects or "New project" button
Step 2: Create New Project
Method 1: Click Button
const buttons = Array.from(document.querySelectorAll('button'));
const newProjectButton = buttons.find(b => b.innerText.includes('New project'));
if (newProjectButton) {
newProjectButton.click();
}
Method 2: Direct Navigation
URL: https://labs.google/fx/tools/flow/project/new
Result: Redirects to Scenebuilder view with default project name (e.g., "Feb 16 - 23:39")
Step 3: Rename Project (Optional but Recommended)
Click Edit Project Button:
const editButton = document.querySelector('button[aria-label="Edit project"]') ||
Array.from(document.querySelectorAll('button')).find(b => b.innerText.includes('edit'));
if (editButton) {
editButton.click();
}
Type New Name:
Save Project Name:
- Click checkmark icon to save
- Or press Enter to confirm
Step 4: Configure Settings (Optimize Credits)
Open Settings Dialog:
const tuneButton = Array.from(document.querySelectorAll('i, span, button'))
.find(el => el.innerText === 'tune');
if (tuneButton) {
tuneButton.click();
}
Settings Panel Options:
- Aspect Ratio: Portrait (9:16), Landscape (16:9), Square (1:1)
- Outputs per prompt: 1, 2, 3, or 4 videos
- Default: 2 outputs = 40 credits
- Recommended: 1 output = 20 credits (saves 50% credits)
- Model: Veo 3.1 - Fast (default)
Change Outputs to 1 (Credit Saving):
Close Settings:
- Click outside the dialog
- Or press Escape key
Step 5: Enter Video Prompt
Click Prompt Textarea:
const promptTextarea = document.getElementById('PINHOLE_TEXT_AREA_ELEMENT_ID');
if (promptTextarea) {
promptTextarea.focus();
promptTextarea.click();
}
Alternative Selector:
const textarea = document.querySelector('textarea[placeholder*="Generate a video"]');
Type Your Prompt:
const prompt = "A peaceful ocean wave rolling onto a sandy beach at golden hour";
promptTextarea.value = prompt;
Prompt Writing Tips:
- Be specific about subjects, actions, environments
- Include camera movements: "slow pan", "tracking shot", "aerial view"
- Describe lighting and mood: "golden hour", "dramatic lighting", "soft shadows"
- Mention style: "cinematic", "documentary", "animated", "photorealistic"
- Specify duration hints: "slow motion", "time-lapse"
Example Prompts:
"A serene mountain landscape at sunset with clouds moving slowly across the sky"
"A close-up of a coffee cup with steam rising, cinematic lighting"
"An aerial view of a winding river through a forest, slow pan"
"A time-lapse of a flower blooming, macro photography style"
Step 6: Generate Video
Click Create Button:
const createButton = Array.from(document.querySelectorAll('button'))
.find(b => b.innerText.includes('Create') || b.querySelector('i')?.innerText === 'arrow_forward');
if (createButton) {
createButton.click();
}
Alternative Method:
const createBtn = document.querySelector('button:has(i:contains("arrow_forward"))');
Expected Behavior:
- Button becomes disabled
- Progress indicator appears
- Percentage counter shows progress: "1%... 23%... 62%... 100%"
- Generation typically takes 60-90 seconds
Step 7: Monitor Generation Progress
Progress Indicators:
- Percentage counter in UI
- Progress bar animation
- Notification area updates
Wait for Completion:
Check for Notifications:
- Credit usage notification appears
- Example: "30 credits left" (if started with 50)
Step 8: View Generated Video
Video Appears in Asset Panel:
- Right side panel shows generated video(s)
- Thumbnail preview available
- Click to play full video
Video Actions:
- Preview: Click thumbnail to play
- Download: Click download icon
- Favorite: Click star icon
- Delete: Click trash icon
Key Element Selectors
This section covers key element selectors for the google-flow skill.
Key operations include input validation, core processing, and output verification.
Refer to the skill overview for detailed usage instructions.
Critical Elements
| Element | Selector | Alternative |
|---|
| Prompt Textarea | #PINHOLE_TEXT_AREA_ELEMENT_ID | textarea[placeholder*="Generate a video"] |
| Create Button | button:has(i:contains("arrow_forward")) | Button with text "Create" |
| Settings Button | button:has(i:contains("tune")) | Button with "Settings" text |
| New Project Button | Button with text "New project" | - |
| Edit Project Button | button[aria-label="Edit project"] | Button with edit icon |
JavaScript Helper Functions
function clickByText(text) {
const buttons = Array.from(document.querySelectorAll('button'));
const button = buttons.find(b => b.innerText.includes(text));
if (button) button.click();
return button;
}
function clickByIcon(iconName) {
const elements = Array.from(document.querySelectorAll('i, span, button'));
const element = elements.find(el => el.innerText === iconName);
if (element) element.click();
return element;
}
function enterPrompt(promptText) {
const textarea = document.getElementById('PINHOLE_TEXT_AREA_ELEMENT_ID');
if (textarea) {
textarea.focus();
textarea.value = promptText;
;
}
;
}
() {
(promptText);
( (r, ));
();
;
}
Credit Management
This section covers credit management for the google-flow skill.
Key operations include input validation, core processing, and output verification.
Refer to the skill overview for detailed usage instructions.
Credit Costs (as of Feb 2026)
| Configuration | Credits per Generation |
|---|
| 1 output, Portrait 9:16 | 20 credits |
| 2 outputs, Portrait 9:16 | 40 credits |
| 3 outputs, Portrait 9:16 | 60 credits |
| 4 outputs, Portrait 9:16 | 80 credits |
Recommendation: Use 1 output for testing and iteration to save credits.
Check Credit Balance
View in Settings:
- Open Settings (tune icon)
- Credit cost shown at bottom
- Example: "20 credits" per generation
After Generation:
- Notification shows remaining credits
- Example: "30 credits left"
Credit Optimization Tips
- Start with 1 output: Test prompts with single output first
- Iterate prompts: Refine prompt before generating multiple outputs
- Use presets: Leverage style presets for consistency
- Delete failed attempts: Clean up to avoid confusion
Advanced Features
- Core operation execution with comprehensive error handling
- Input validation and output quality assurance
- Integration with existing workflows and toolchains
- Detailed logging for debugging and audit trails
Using Style Presets
Access Presets:
clickByIcon('pen_spark');
Available Presets:
- Cinematic Preset: Film-like quality with depth of field
- Film Noir Preset: Black and white, high contrast
- Action Figure Preset: Toy-like aesthetic
- Create New Expander: Custom style preset
Apply Preset:
- Click "Expand" button
- Select preset from list
- Preset applies to current and future prompts
Aspect Ratio Selection
Available Ratios:
- Portrait (9:16): Vertical video, ideal for mobile/social
- Landscape (16:9): Horizontal video, standard widescreen
- Square (1:1): Equal dimensions, social media friendly
Change Aspect Ratio:
Model Selection
Current Model: Veo 3.1 - Fast (default and only option)
Future Models: May include quality vs. speed tradeoffs
Downloading Videos for Local Use
This section covers downloading videos for local use for the google-flow skill.
Key operations include input validation, core processing, and output verification.
Refer to the skill overview for detailed usage instructions.
Overview
Download generated videos to use with other skills/agents (e.g., sending via Telegram, editing, uploading to social media).
Step 1: Locate Generated Video
In Asset Panel:
const videos = document.querySelectorAll('video, [role="img"]');
Video Card Elements:
- Thumbnail preview
- Download button (download icon)
- Video metadata (duration, timestamp)
Step 2: Download Video via UI
Click Download Button:
const downloadButtons = Array.from(document.querySelectorAll('button'))
.filter(b => {
const icon = b.querySelector('i');
return icon && (icon.innerText === 'download' || icon.innerText === 'file_download');
});
if (downloadButtons[0]) {
downloadButtons[0].click();
}
Expected Behavior:
- Browser download dialog appears
- Video downloads to default Downloads folder
- Filename format:
flow-video-{timestamp}.mp4
Step 3: Download Video Programmatically
Extract Video URL:
async function getVideoUrl() {
const videoElement = document.querySelector('video');
if (videoElement) {
return videoElement.src || videoElement.querySelector('source')?.src;
}
return null;
}
Download with Custom Filename:
async function downloadVideo(filename = 'google-flow-video.mp4') {
const videoUrl = await getVideoUrl();
if (!videoUrl) {
return 'No video found';
}
const response = await fetch(videoUrl);
const blob = await response.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
return `Downloaded: ${filename}`;
}
await downloadVideo('ocean-waves-sunset.mp4');
Step 4: Save to Specific Directory
Using Browser Automation:
async function downloadToPath(videoUrl, savePath) {
const response = await fetch(videoUrl);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
return `Saved to: ${savePath}`;
}
Recommended Save Location:
/Users/paijo/Downloads/google-flow-videos/
├── ocean-waves-2026-02-16.mp4
├── mountain-sunset-2026-02-16.mp4
└── coffee-steam-2026-02-16.mp4
Step 5: Integration with Other Skills
Example: Send via Telegram:
async function generateAndSendVideo(prompt, telegramChatId) {
await generateVideo(prompt);
await new Promise(r => setTimeout(r, 90000));
const videoPath = `/Users/paijo/Downloads/google-flow-videos/${Date.now()}.mp4`;
await downloadToPath(await getVideoUrl(), videoPath);
return videoPath;
}
Example: Batch Download Multiple Videos:
async function downloadAllVideos() {
const videos = document.querySelectorAll('video');
const downloads = [];
for (let i = 0; i < videos.length; i++) {
const videoUrl = videos[i].src;
const filename = `flow-video-${i + 1}-${Date.now()}.mp4`;
await downloadVideo(filename);
downloads.push(filename);
await new Promise(r => setTimeout(r, 1000));
}
return downloads;
}
Creating Longer Videos
This section covers creating longer videos for the google-flow skill.
Key operations include input validation, core processing, and output verification.
Refer to the skill overview for detailed usage instructions.
Overview
Google Flow generates short videos (~5-10 seconds). Create longer videos through:
- Video Stitching - Combine multiple clips sequentially
- Frame-to-Video - Extend duration using image sequences
Method 1: Video Stitching (Recommended)
Concept: Generate multiple related clips and stitch them together.
Step 1: Plan Video Sequence:
const scenes = [
"Opening shot: Aerial view of a coastal highway at sunrise",
"Medium shot: Red sports car driving along the coast",
"Close-up: Car wheels on wet pavement",
"Wide shot: Car approaching a cliff overlook",
"Final shot: Car parked at overlook, ocean in background"
];
Step 2: Generate Each Clip:
async function generateVideoSequence(scenes) {
const videoFiles = [];
for (let i = 0; i < scenes.length; i++) {
await generateVideo(scenes[i]);
await new Promise(r => setTimeout(r, 90000));
const filename = `scene-${i + 1}.mp4`;
await downloadVideo(filename);
videoFiles.push(filename);
await new Promise(r => setTimeout(r, 5000));
}
return videoFiles;
}
Step 3: Stitch Videos Using FFmpeg:
cat > filelist.txt << EOF
file 'scene-1.mp4'
file 'scene-2.mp4'
file 'scene-3.mp4'
file 'scene-4.mp4'
file 'scene-5.mp4'
EOF
ffmpeg -f concat -safe 0 -i filelist.txt -c copy final-video.mp4
Step 4: Automated Stitching Function:
async function createLongVideo(scenes, outputFilename) {
const clips = await generateVideoSequence(scenes);
const fileList = clips.map(f => `file '${f}'`).join('\n');
return {
clips: clips,
output: outputFilename,
totalClips: clips.length,
estimatedDuration: `${clips.length * 7}s (approx)`
};
}
await createLongVideo(scenes, 'coastal-drive-full.mp4');
Method 2: Frame-to-Video Extension
Concept: Use Google Flow's image-to-video mode to extend existing clips.
Step 1: Extract Key Frames:
ffmpeg -sseof -1 -i scene-1.mp4 -update 1 -q:v 1 last-frame.jpg
ffmpeg -i scene-1.mp4 -vframes 1 first-frame.jpg
Step 2: Generate Extension Clips:
async function generateFromFrame(frameImagePath, prompt) {
const imagesTab = Array.from(document.querySelectorAll('button'))
.find(b => b.innerText === 'Images');
if (imagesTab) imagesTab.click();
await enterPrompt(prompt);
clickByText('Create');
}
await generateFromFrame(
'last-frame.jpg',
'Continue the ocean wave motion, slow and peaceful'
);
Step 3: Stitch Original + Extension:
ffmpeg -f concat -safe 0 -i <(echo "file 'original.mp4'"; echo "file 'extension.mp4'") -c copy extended.mp4
Method 3: Looping for Duration
Create Seamless Loops:
const loopPrompt = "Seamless loop: Ocean waves gently rolling, perfect loop, continuous motion";
await generateVideo(loopPrompt);
Repeat Video N Times:
ffmpeg -stream_loop 4 -i ocean-loop.mp4 -c copy ocean-extended.mp4
Video Stitching Best Practices
-
Maintain Consistency:
- Use same aspect ratio for all clips
- Keep similar lighting/color grading
- Use same style preset
-
Smooth Transitions:
- Plan scene flow logically
- Use transition prompts: "fade to...", "cut to..."
- Consider overlap frames
-
Credit Efficiency:
- Generate all clips in one session
- Use 1 output per scene
- Total cost: 20 credits × number of scenes
-
Quality Control:
- Review each clip before stitching
- Re-generate poor quality clips
- Test stitched video for continuity
Example: 60-Second Video Production
async function create60SecondVideo(topic) {
const scenes = [
`Opening: ${topic} establishing shot, cinematic`,
`Scene 2: ${topic} detail shot, slow motion`,
`Scene 3: ${topic} wide angle, dramatic lighting`,
`Scene 4: ${topic} close-up, shallow depth of field`,
`Scene 5: ${topic} medium shot, natural movement`,
`Scene 6: ${topic} aerial view, sweeping motion`,
`Scene 7: ${topic} artistic angle, golden hour`,
`Closing: ${topic} final shot, fade to black`
];
console.log('Generating 8 scenes...');
const clips = await generateVideoSequence(scenes);
console.log('Stitching clips...');
await createLongVideo(clips, `${topic}-60s.mp4`);
return {
topic: topic,
scenes: 8,
totalCredits: 160,
outputFile: ,
:
};
}
();
Troubleshooting
| Symptom | Cause | Fix |
|---|
| Operation times out | Network or service issue | Check connectivity and retry |
| Permission denied | Missing credentials | Verify API keys and access tokens |
| Invalid output | Input format mismatch | Validate input against expected schema |
Common Issues
Issue: Create button is disabled
- Cause: Prompt textarea is empty
- Solution: Enter a text prompt first
Issue: "There doesn't seem to be a project here…"
- Cause: Project not saved
- Solution: Click "Edit project" → enter name → save
Issue: Settings dialog won't open
- Cause: Another dialog is already open
- Solution: Press Escape to close dialogs, then try again
Issue: Video generation stuck at low percentage
- Cause: Network issue or server load
- Solution: Wait 2-3 minutes, refresh page if needed
Issue: "Not enough credits"
- Cause: Credit balance too low
- Solution: Purchase more credits or reduce outputs per prompt
Issue: Video quality is poor
- Cause: Vague or unclear prompt
- Solution: Add more specific details about scene, lighting, camera movement
Complete Automation Example
# Basic usage
invoke <skill-name> with appropriate parameters
# Advanced usage with options
invoke <skill-name> --option value --verbose
Generate Video from Scratch
async function createVideoProject(projectName, videoPrompt) {
window.location.href = 'https://labs.google/fx/tools/flow/project/new';
await new Promise(r => setTimeout(r, 3000));
const editBtn = document.querySelector('button[aria-label="Edit project"]');
if (editBtn) {
editBtn.click();
await new Promise(r => setTimeout(r, 500));
}
const tuneBtn = Array.from(document.querySelectorAll('i, span, button'))
.find(el => el.innerText === 'tune');
if (tuneBtn) {
tuneBtn.click();
await new ( (r, ));
}
textarea = .();
(textarea) {
textarea.();
textarea. = videoPrompt;
}
createBtn = .(.())
.( b..());
(createBtn) {
createBtn.();
}
;
}
(
,
);
Best Practices
This section covers best practices for the google-flow skill.
Key operations include input validation, core processing, and output verification.
Refer to the skill overview for detailed usage instructions.
Prompt Engineering
- Start specific: "A red sports car" → "A red Ferrari 458 driving on a coastal highway"
- Add camera work: "slow pan left", "tracking shot", "aerial view"
- Describe lighting: "golden hour", "soft morning light", "dramatic sunset"
- Include motion: "waves crashing", "leaves falling", "clouds drifting"
- Specify style: "cinematic", "documentary", "animated", "photorealistic"
Project Organization
- Name projects clearly: "Client-Campaign-Date" format
- One project per concept: Keep related videos together
- Delete test projects: Clean up failed attempts
- Use favorites: Star best outputs for easy access
Credit Efficiency
- Test with 1 output: Iterate prompts before bulk generation
- Refine prompts: Get it right before generating multiple versions
- Use presets: Maintain consistency without re-prompting
- Monitor balance: Check credits before large batches
URL Patterns
Reference Screenshots
See assets/flow-screenshot-main.png for complete UI layout.
See assets/flow-screenshot-expanded.png for preset panel view.
Common Rationalizations
| Rationalization | Reality |
|---|
| "I'll do this later" | Explain why this excuse is wrong for this skill |
| "This is simple, skip steps" | Even simple tasks benefit from process |
Red Flags
- Automation creates duplicate entries across connected platforms
- Agent does not handle timezone differences correctly
- Watch for shortcuts and skipped steps
Verification
After completing this skill, confirm:
Related Skills
content/gemini-image-generator - For static image generation
marketing/content-creator - For video content strategy
productivity/google-canvas - For collaborative brainstorming
- Video Editing: Use FFmpeg for stitching downloaded clips
- Telegram Integration: Send generated videos via messaging apps
- Social Media: Upload to platforms using automation skills
Last Updated: 2026-02-16
Tested: ✅ Video generation successful (20 credits, 60s generation time)
Model: Veo 3.1 - Fast
Process
- Analyze the task requirements
- Apply domain expertise
- Verify output quality