Install
$ agentstack add skill-curtishowie12-claude-skill-image-to-veo-claude-skill-image-to-veo ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Image → Veo 3.1 video
Animate a still image into an 8-second 9:16 MP4 using Google Veo 3.1. You (Claude) are the creative director: you look at the image yourself and write the cinematic prompt directly, instead of routing through a separate vision model.
When to invoke
The user gives an image (URL, local path, or attached) and asks to animate it, "bring it to life", make a paid-ad clip, or make a short video from it. Default vibe: paid-ad-grade — slow cinematic camera, premium feel, no voiceover, ambient sound only.
Setup the user must do once
- Set
GEMINI_API_KEYin their shell — a Google AI Studio key with Veo 3.1 access enabled. - Veo 3.1 generations cost roughly $0.75/second (~$6 per 8-second clip). Confirm spend with the user on the first run of a session unless they've authorized blanket spend.
Recipe
0. Check the key is set BEFORE downloading anything
Run echo "${GEMINI_API_KEY:-MISSING}". If it returns MISSING, stop and tell the user: > "I need a GEMINI_API_KEY with Veo 3.1 access. Grab one at https://aistudio.google.com/apikey, then add export GEMINI_API_KEY="your-key" to your ~/.zshrc (or ~/.bashrc), restart your terminal, and re-run."
Don't proceed past this check until the key resolves.
1. Get the image into a temp dir
- Make
/tmp/veo-skill/and clear any priorinput.*. - If the URL is
dropbox.comand containsdl=0, replace withdl=1before downloading. - HTTPS URL:
curl -sL -o /tmp/veo-skill/input. "" - Local path: copy to
/tmp/veo-skill/input.. - Verify with
filethat it's a real image. Note the file stem for output naming.
2. Look at the image (Read tool)
You write the Veo prompt yourself. Rules:
- Camera: one slow cinematic move grounded in this exact frame — push-in, parallax pan, pedestal reveal, gentle dolly. Treat the image like a 3D window. No scene changes, no montage.
- Text/logo legibility: if a logo or headline is in the frame, keep it on-screen and legible for ≥3 seconds. Don't let the camera push it out fast.
- Audio: ambient only, matching what's actually visible (water → gentle stream, fire → crackle, product on coconut → soft rustle + airy hum, outdoor scene → wind + distant birds). Never voiceover, never music with lyrics.
- Format: one paragraph, no headers, no bullet points. This goes straight into Veo's
promptfield.
3. Show the prompt to the user before spending
Print the prompt in chat and ask whether to send it. Common edits to anticipate:
- "Slower / faster camera"
- "Hold on the logo longer"
- "Less / different ambient audio"
- "More focus on [specific element]"
Iterate in chat until they approve. Don't burn Veo credits on the first draft.
4. Generate
Run:
python3 ~/.claude/skills/image-to-veo/scripts/run.py \
/tmp/veo-skill/input. \
"" \
~/Downloads/.mp4
The script base64-encodes the image, calls Veo predictLongRunning (9:16, hardcoded), polls every 15s up to 10 minutes, and downloads the MP4. If ~/Downloads/.mp4 already exists, it suffixes -2, -3, etc. — never overwrites.
5. Report the path
Tell the user where the file landed. On a Mac, open ~/Downloads/.mp4 plays it.
If the user is in a remote sandbox (no local Downloads), upload the MP4 to https://tmpfiles.org via curl -sS -F "file=@" https://tmpfiles.org/api/v1/upload and share the dl// link, noting the 60-minute expiry.
Aspect ratio
Locked to 9:16 (vertical, paid-ad format). If the user explicitly asks for 16:9 or 1:1, pass --aspect to run.py.
Troubleshooting
done: truebuterrorin response: Veo refused the prompt (often a person/brand/safety issue). Surface the error message verbatim and ask the user how to adjust.- Polling hits the 10-minute cap: Veo is occasionally backed up. Re-run; the prompt is unchanged so cost is the same.
401from Veo: key is missing Veo access. Send the user to AI Studio to confirm the model is enabled on their key.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: CurtisHowie12
- Source: CurtisHowie12/claude-skill-image-to-veo
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.