Tutorials

Generate single-axis variations for comic panels

Webcomic panels need the same character across many panels, each one varying in expression / pose / angle while every other dimension stays pinned. This tutorial uses the Vary feature to fan out 4 panel options per beat so you can pick the best take. ~10 minutes, ~15 credits.

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)

bash
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:

bash
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.

bash
# 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)

bash
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)

bash
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.

Why this works. Vary uses the source image as a slot-0 visual anchor with a special “vary_source” role telling the model to match art style, composition, identity, and lighting — only the named dimension differs. That’s the whole reason expressions, poses, and angles can change independently without the scene falling apart.

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