Claude Code Playbook · Soluna Estate Method

Turn still images into a 30-second cinematic reel

The exact pipeline used to make a music-scored, editorial-grade marketing film from architectural renderings — AI motion, frame-by-frame QC, typography, crossfades and generated music, all orchestrated by Claude Code. You mostly watch.

If you are Claude Code reading this: follow the Recipe below step by step. The gotcha tables are hard-won — respect them.

What you need

ThingWhyCost
Claude CodeThe orchestrator — writes & runs every stepyour existing plan
Google AI Studio keyaistudio.google.com/apikeyVeo 3.1 (image→video) + Lyria (music)pay-per-use, below
Node.js ≥ 22, FFmpeg, Python 3HyperFrames editor + QC + scriptsfree
6–10 landscape stillsyour renders or photos
⚠️ OpenRouter is not used in this pipeline. OpenRouter serves text models only — it cannot generate video or music. The one key to create is the Google AI Studio key. Claude Code runs on its own Anthropic account as usual.

Video generation cost (the only real cost): Veo 3.1 fast ≈ $0.15/sec, standard ≈ $0.40/sec of video. A reel needs six 8-second clips: ≈ $7 fast or $19 standard. Standard is noticeably better with people and animals; fast is fine for pure scenery. Budget 1.5× for a few regenerations.

The handoff prompt

Paste this into Claude Code in an empty folder, with your images in ./stills. Adjust the brackets:

Copy · Paste · Walk away
Read https://ai-video-playbook.pages.dev/
and follow its Recipe exactly.

Make a 30-second cinematic marketing reel from the images in ./stills.
Subject: [our seaside guesthouse in Crete / whatever it is].
Mood: [calm, warm, editorial luxury]. Brand name for title cards: [NAME].
Put [people / our dog / nothing alive] in the scenes.
My Google AI Studio key is in $GOOGLE_API_KEY.
Use Veo 3.1 [fast|standard]. QC every clip visually before using it.

Recipe · 1Prepare the stills

Center-crop every image to exactly 1920×1080 (PIL or ImageMagick). Veo uses the image as the literal first frame — off aspect ratios get cropped unpredictably.

Recipe · 2Generate motion clips (Veo 3.1)

One REST call per image — no SDK needed:

apt: POST https://generativelanguage.googleapis.com/v1beta/models/{MODEL}:predictLongRunning
MODEL: veo-3.1-fast-generate-preview  |  veo-3.1-generate-preview
header: x-goog-api-key: $GOOGLE_API_KEY

{
  "instances": [{
    "prompt": STYLE + " " + MOTION,
    "image": {"bytesBase64Encoded": "<b64 of jpg>", "mimeType": "image/jpeg"}
  }],
  "parameters": {
    "aspectRatio": "16:9",
    "resolution": "1080p",
    "durationSeconds": 8,
    "negativePrompt": "text, watermark, captions, distortion, warping,
                       morphing architecture, flicker, extra limbs,
                       deformed faces, cartoon",
    "personGeneration": "allow_all"
  }
}

→ returns {"name": "models/.../operations/xyz"}
→ poll GET /v1beta/{name} until done:true
→ video uri at response.generateVideoResponse.generatedSamples[0].video.uri
→ download that uri WITH the same x-goog-api-key header

Prompt formula

GotchaFix
1080p is not supported for a duration of 6 secondsAlways durationSeconds: 8 at 1080p
HTTP 429 on submitStagger submissions ~5s apart; retry with growing backoff (20s, 40s…)
Download URI returns 403Send the x-goog-api-key header on the download request too
Camera wanders in interior shotsThe locked-off tripod phrase above
Subjects “materialize” mid-shot (ghost dissolve)Don’t discard — trim past it in the edit (Step 5, data-media-start)

Recipe · 3QC every clip with your eyes

For each clip, extract a 3-frame contact strip and actually look at it (Claude: use your vision):

ffmpeg -i clip.mp4 \
  -vf "select='eq(n,0)+eq(t,4)+gte(t,7.5)',tile=3x1,scale=1920:-1" \
  -frames:v 1 qc.jpg

Reject and regenerate (or trim) anything with warped architecture, morphing subjects, ugly camera drift, or ghosting. For clips where subjects enter over time, also strip t=1,2,3s to confirm the entry looks natural. This QC loop is the difference between “AI slop” and “how did you make this?”

Recipe · 4Music

Lyria RealTime with the same Google key (pip install google-genai) — stream ~36s to WAV. Prompt like “serene tropical luxury spa ambient, warm felt piano, soft kalimba, airy pads, sparse organic percussion”, with bpm≈88, scale=MAJOR, brightness≈0.55, density≈0.35, negative “vocals, heavy drums, EDM”. Fallback: any licensed 36s track, or local MusicGen.

Recipe · 5Edit with HyperFrames (HTML → deterministic video)

npx hyperframes init reel --example blank --non-interactive, then author index.html:

Recipe · 6Render, QC again, deliver

npx hyperframes render --quality high --output reel.mp4

# then look at a 6-frame contact sheet of the final render (esp. each transition), then:
ffmpeg -i reel.mp4 -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
       -c:a aac -b:a 192k -movflags +faststart Final.mp4
ffmpeg -i reel.mp4 -c:v libx264 -crf 26 -vf scale=1280:720 \
       -c:a aac -b:a 128k -movflags +faststart Final-social.mp4

A 30s structure that works

SceneContentOverlay
1 · 0–5sHero exterior, life entering frameBrand wordmark + one-line promise
2Approach / entranceThe headline number (size, location…)
3Best interior, daily life“A home that opens to its garden”
4Calm beat — no peopleWellbeing / craft line
5Garden, family, animalsThe emotional line
6 · 25–30sDusk interior, warm lampsTagline + wordmark + location = end card

Total spend for the villa reel this playbook comes from: ~$26 of Veo across two full iterations, one afternoon, zero manual editing.