Tutorials
Generate single-axis variations for comic panels
What you’ll build
A 3-beat scene starring an existing locked character (call them “Kai”). For each beat we generate one base scene and then spawn 4 single-axis variations — different expressions for beat 1, different poses for beat 2, different camera angles for beat 3. Final selection becomes your panel.
Prerequisite — a locked character
If you don’t have one yet, walk through the Quickstart or the Bedtime Story tutorial first. The Vary feature only works against character-anchored scenes.
Step 1 — Generate the beat-1 base panel (1 credit)
KAI_ID="<your character uuid>"
# Beat 1: Kai notices something off-screen
RES1=$(curl -s -X POST https://steadyshot.ai/api/generate \
-H "Authorization: Bearer ss_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d "{
\"character_id\": \"$KAI_ID\",
\"prompt\": \"Kai standing on a rain-soaked rooftop at night, neon city lights below, looking off to the right\"
}")
IMG1=$(echo "$RES1" | jq -r '.image_id')
echo "Beat 1 image_id: $IMG1"Step 2 — Vary the expression (4 credits)
Spawn 4 expression variants so we can pick the right emotional beat without re-generating the whole scene:
curl -s -X POST https://steadyshot.ai/api/scenes/$IMG1/vary \
-H "Authorization: Bearer ss_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"vary": "expression",
"target": "surprised, eyes wide, mouth slightly open",
"count": 4
}' | jq '.variants[] | {id: .image_id, url: .image_url, score: .consistency_score}'The 4 variants share Kai’s identity, the rooftop, the rain, the neon lighting, the framing — only the expression differs. Pick the best take, copy its image_id, that’s your beat-1 panel.
Step 3 — Generate beat 2 with chaining (1 credit)
Now we chain — beat 2 anchors against the chosen beat-1 image so outfit, lighting, and rendering register carry across.
# Pick the best variant from step 2 — say variant 2:
BEAT1_FINAL="<image_id of the chosen variant>"
RES2=$(curl -s -X POST https://steadyshot.ai/api/generate \
-H "Authorization: Bearer ss_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d "{
\"character_id\": \"$KAI_ID\",
\"previous_image_id\": \"$BEAT1_FINAL\",
\"prompt\": \"Kai turns sharply, hand reaching toward an off-screen sound\"
}")
IMG2=$(echo "$RES2" | jq -r '.image_id')Step 4 — Vary the pose for beat 2 (4 credits)
curl -s -X POST https://steadyshot.ai/api/scenes/$IMG2/vary \
-H "Authorization: Bearer ss_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"vary": "pose",
"target": "mid-stride, leaning forward, weight on the front foot",
"count": 4
}'Step 5 — Vary the camera angle for beat 3 (1 + 4 credits)
BEAT2_FINAL="<chosen pose variant id>"
RES3=$(curl -s -X POST https://steadyshot.ai/api/generate \
-H "Authorization: Bearer ss_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d "{
\"character_id\": \"$KAI_ID\",
\"previous_image_id\": \"$BEAT2_FINAL\",
\"prompt\": \"Close-up on Kai's face as the rain intensifies, neon reflected in their eyes\"
}")
IMG3=$(echo "$RES3" | jq -r '.image_id')
curl -s -X POST https://steadyshot.ai/api/scenes/$IMG3/vary \
-H "Authorization: Bearer ss_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"vary": "angle",
"target": "low-angle dramatic hero shot",
"count": 4
}'Step 6 — Assemble the panel layout
Drop the 3 chosen images into Photoshop / Figma / Procreate. Use the SteadyShot Photoshop plugin to land them as layers, or export from the web UI’s Download All button on the character page.
Cost breakdown
- 3 base scenes: 3 credits
- 12 variations (4 per beat × 3 beats): 12 credits
- Total: 15 credits for a 3-panel comic with 4 takes per beat to pick from