Scrollclaw first frame
Generate the canonical first frame with Nano Banana 2.
How to use it
Claude Code
- Run the line below. It pulls the whole folder into
~/.claude/skills/first-frame, including the files SKILL.md points to. - Describe your job in plain words. Claude Code follows the skill from there.
npx degit TheMattBerman/scrollclaw/first-frame#main ~/.claude/skills/first-frameFor one project only, change the path to .claude/skills/first-frame. This skill also uses -script.md, output-log.md — copying SKILL.md alone won't be enough. See the folder on GitHub.
Claude (web or desktop app)
- On this page open ⋯ → Download .md.
- Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
- Pick the file and Save. Claude shows the name and description and runs a security scan.
- Check the skill is switched on.
- Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
- ChatGPT: make a Project and paste it into Instructions.
- Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Source of Scrollclaw first frame
Show the full text128 lines
| name | description | metadata |
|---|---|---|
| scrollclaw-first-frame | Generate the canonical first frame with Nano Banana 2. Composition, character, environment, and color — all locked before animation. The visual design gate. | openclaw: emoji: "🖼️ user-invocable: true triggers: - "first frame - "generate frame - "nano banana - "ugc frame - "canonical face |
First Frame
The viewer's brain makes a stay-or-scroll decision in 3-5 seconds at the visual processing level — before conscious attention. By the time they've read the hook, the decision is already made.
Frame 1 is a visual design problem, not a copywriting problem. Read references/first-frame-psychology.md for emoji pattern interrupts, composition rules, and testing approach.
Prerequisites
- Script approved (from
/persona) - Creator profile exists in
workspace/campaigns/<slug>/creators/orworkspace/creators/ - Brand context loaded
Prompt Structure (Three Layers)
Read references/first-frame-prompting.md for the full system. This is what makes images look like phone photos instead of AI.
- Photorealism pre-prompt — "Raw iPhone 14 photo. Candid moment, unfiltered..." + realism rules + negative prompt (CGI, 3D render, perfect skin, cinematic color grading)
- Color reference JSON — extracted from a real reference photo, not described in text. See
_system/references/color-reference-system.md. - Scene description — creator identity + environment + expression + composition
Include "no text, no words, no letters, no writing" in negative prompt to prevent Sora from hallucinating text into the video.
Generation
python3 scripts/generate-first-frame.py \
--prompt-file workspace/campaigns/<slug>/frame1-prompt.txt \
--output-file workspace/campaigns/<slug>/frames/frame1.png \
--creator workspace/campaigns/<slug>/creators/creator-<name>.md \
--log-file workspace/campaigns/<slug>/output-log.md \
--aspect-ratio "9:16"
Multi-Frame Formats (Visual Reference Chaining)
For formats with multiple settings (podcast Dan, gym Dan, car Dan):
- Generate frame 1 FIRST (the canonical face)
- Review and approve frame 1
- ALL subsequent frames MUST use frame 1 as visual reference
- Do NOT generate frames in parallel from text descriptions alone — causes face drift
- For Visual Transformation (5-6 frames): generate sequentially, each referencing frame 1
Generate context-specific first frames — one per setting. But always chain from the canonical face. Don't feed a podcast frame into gym B-roll.
Iteration
Iterate on frame 1 more than anything else. Expect 2-4 attempts before it passes.
Quality checks:
- Does it look like a phone photo or an AI render?
- Is the creator believable (not model-pretty)?
- Is there real-world clutter in the environment?
- Does the color match the reference JSON?
- Is skin texture visible (pores, not porcelain)?
Once frame 1 is locked, the rest chain from it.
Brand Memory Integration
Reads
| File | Purpose |
|---|---|
workspace/campaigns/<slug>/creators/creator-<name>.md |
Creator identity — face, hair, build, wardrobe, energy |
workspace/creators/creator-<name>.md |
Global creator profile (fallback if no campaign override exists) |
workspace/campaigns/<slug>/scripts/<format>-script.md |
Which scene/setting the first frame needs to establish |
workspace/campaigns/<slug>/brief.md |
Brand context, color cues, environment direction |
Writes
| File | Notes |
|---|---|
workspace/campaigns/<slug>/frames/frame1.png |
Canonical face — referenced by all subsequent frames and animation |
workspace/campaigns/<slug>/frames/environment-frame.png |
Context-specific frames for multi-setting formats |
workspace/campaigns/<slug>/output-log.md |
Prompt params, model version, generation time (append-only) |
Context loading
🖼️ First Frame context loaded:
✓ Creator: Maya (workspace/campaigns/ridge-q1/creators/creator-maya.md)
✓ Script: talking-head (workspace/campaigns/ridge-q1/scripts/talking-head-script.md)
✓ Campaign: ridge-q1
Contract
Input
- Required: approved script plus a creator profile
- Optional: campaign brief, color reference inputs, global creator fallback profile
- Format: workspace markdown files plus prompt text
- Source:
/persona,workspace/campaigns/<slug>/brief.md, and_system/references/color-reference-system.md
Output
- Produces: one canonical face image and any context-specific environment frames needed for the format
- Format: PNG files in
workspace/campaigns/<slug>/frames/plus prompt log entries inoutput-log.md - Default behavior: generate
frame1.pngfirst, stop for review, then chain any additional frames from it - Downstream use:
/animateand/b-roll
Validation
- Pre-conditions: script is approved, creator profile exists, and the target setting is clear enough to visualize
- Post-conditions: frame looks like a phone photo, preserves creator identity, and is strong enough to chain into later generations
- Failure checks: reroll or revise if the image looks like an AI render, the identity drifts, or the scene lacks believable real-world clutter
Output
- Canonical first frame image (PNG) in
workspace/campaigns/<slug>/frames/ - Context-specific frames for multi-setting formats in
workspace/campaigns/<slug>/frames/ - Prompt params logged to
workspace/campaigns/<slug>/output-log.md
Next Step
Frame 1 approved → run /animate for A-roll or /b-roll for environment shots.
| 1 | |
| 2 | name scrollclaw-first-frame |
| 3 | description "Generate the canonical first frame with Nano Banana 2. Composition, character, environment, and color — all locked before animation. The visual design gate." |
| 4 | metadata |
| 5 | openclaw |
| 6 | emoji "🖼️" |
| 7 | user-invocable true |
| 8 | triggers |
| 9 | - "first frame" |
| 10 | - "generate frame" |
| 11 | - "nano banana" |
| 12 | - "ugc frame" |
| 13 | - "canonical face" |
| 14 | |
| 15 | |
| 16 | # First Frame |
| 17 | |
| 18 | The viewer's brain makes a stay-or-scroll decision in 3-5 seconds at the visual processing level — before conscious attention. By the time they've read the hook, the decision is already made. |
| 19 | |
| 20 | Frame 1 is a visual design problem, not a copywriting problem. Read `references/first-frame-psychology.md` for emoji pattern interrupts, composition rules, and testing approach. |
| 21 | |
| 22 | ## Prerequisites |
| 23 | |
| 24 | Script approved (from `/persona`) |
| 25 | Creator profile exists in `workspace/campaigns/<slug>/creators/` or `workspace/creators/` |
| 26 | Brand context loaded |
| 27 | |
| 28 | ## Prompt Structure (Three Layers) |
| 29 | |
| 30 | Read `references/first-frame-prompting.md` for the full system. This is what makes images look like phone photos instead of AI. |
| 31 | |
| 32 | **Photorealism pre-prompt** — "Raw iPhone 14 photo. Candid moment, unfiltered..." + realism rules + negative prompt (CGI, 3D render, perfect skin, cinematic color grading) |
| 33 | **Color reference JSON** — extracted from a real reference photo, not described in text. See `_system/references/color-reference-system.md`. |
| 34 | **Scene description** — creator identity + environment + expression + composition |
| 35 | |
| 36 | Include "no text, no words, no letters, no writing" in negative prompt to prevent Sora from hallucinating text into the video. |
| 37 | |
| 38 | ## Generation |
| 39 | |
| 40 | |
| 41 | python3 scripts/generate-first-frame.py \ |
| 42 | --prompt-file workspace/campaigns/<slug>/frame1-prompt.txt \ |
| 43 | --output-file workspace/campaigns/<slug>/frames/frame1.png \ |
| 44 | --creator workspace/campaigns/<slug>/creators/creator-<name>.md \ |
| 45 | --log-file workspace/campaigns/<slug>/output-log.md \ |
| 46 | --aspect-ratio "9:16" |
| 47 | |
| 48 | |
| 49 | ## Multi-Frame Formats (Visual Reference Chaining) |
| 50 | |
| 51 | For formats with multiple settings (podcast Dan, gym Dan, car Dan): |
| 52 | |
| 53 | Generate frame 1 FIRST (the canonical face) |
| 54 | Review and approve frame 1 |
| 55 | ALL subsequent frames MUST use frame 1 as visual reference |
| 56 | Do NOT generate frames in parallel from text descriptions alone — causes face drift |
| 57 | For Visual Transformation (5-6 frames): generate sequentially, each referencing frame 1 |
| 58 | |
| 59 | Generate **context-specific first frames** — one per setting. But always chain from the canonical face. Don't feed a podcast frame into gym B-roll. |
| 60 | |
| 61 | ## Iteration |
| 62 | |
| 63 | Iterate on frame 1 more than anything else. Expect 2-4 attempts before it passes. |
| 64 | |
| 65 | **Quality checks:** |
| 66 | Does it look like a phone photo or an AI render? |
| 67 | Is the creator believable (not model-pretty)? |
| 68 | Is there real-world clutter in the environment? |
| 69 | Does the color match the reference JSON? |
| 70 | Is skin texture visible (pores, not porcelain)? |
| 71 | |
| 72 | Once frame 1 is locked, the rest chain from it. |
| 73 | |
| 74 | ## Brand Memory Integration |
| 75 | |
| 76 | ### Reads |
| 77 | | File | Purpose | |
| 78 | |------|---------| |
| 79 | | `workspace/campaigns/<slug>/creators/creator-<name>.md` | Creator identity — face, hair, build, wardrobe, energy | |
| 80 | | `workspace/creators/creator-<name>.md` | Global creator profile (fallback if no campaign override exists) | |
| 81 | | `workspace/campaigns/<slug>/scripts/<format>-script.md` | Which scene/setting the first frame needs to establish | |
| 82 | | `workspace/campaigns/<slug>/brief.md` | Brand context, color cues, environment direction | |
| 83 | |
| 84 | ### Writes |
| 85 | | File | Notes | |
| 86 | |------|-------| |
| 87 | | `workspace/campaigns/<slug>/frames/frame1.png` | Canonical face — referenced by all subsequent frames and animation | |
| 88 | | `workspace/campaigns/<slug>/frames/environment-frame.png` | Context-specific frames for multi-setting formats | |
| 89 | | `workspace/campaigns/<slug>/output-log.md` | Prompt params, model version, generation time (append-only) | |
| 90 | |
| 91 | ### Context loading |
| 92 | |
| 93 | |
| 94 | 🖼️ First Frame context loaded: |
| 95 | ✓ Creator: Maya (workspace/campaigns/ridge-q1/creators/creator-maya.md) |
| 96 | ✓ Script: talking-head (workspace/campaigns/ridge-q1/scripts/talking-head-script.md) |
| 97 | ✓ Campaign: ridge-q1 |
| 98 | |
| 99 | |
| 100 | ## Contract |
| 101 | |
| 102 | ### Input |
| 103 | Required: approved script plus a creator profile |
| 104 | Optional: campaign brief, color reference inputs, global creator fallback profile |
| 105 | Format: workspace markdown files plus prompt text |
| 106 | Source: `/persona`, `workspace/campaigns/<slug>/brief.md`, and `_system/references/color-reference-system.md` |
| 107 | |
| 108 | ### Output |
| 109 | Produces: one canonical face image and any context-specific environment frames needed for the format |
| 110 | Format: PNG files in `workspace/campaigns/<slug>/frames/` plus prompt log entries in `output-log.md` |
| 111 | Default behavior: generate `frame1.png` first, stop for review, then chain any additional frames from it |
| 112 | Downstream use: `/animate` and `/b-roll` |
| 113 | |
| 114 | ### Validation |
| 115 | Pre-conditions: script is approved, creator profile exists, and the target setting is clear enough to visualize |
| 116 | Post-conditions: frame looks like a phone photo, preserves creator identity, and is strong enough to chain into later generations |
| 117 | Failure checks: reroll or revise if the image looks like an AI render, the identity drifts, or the scene lacks believable real-world clutter |
| 118 | |
| 119 | ## Output |
| 120 | |
| 121 | Canonical first frame image (PNG) in `workspace/campaigns/<slug>/frames/` |
| 122 | Context-specific frames for multi-setting formats in `workspace/campaigns/<slug>/frames/` |
| 123 | Prompt params logged to `workspace/campaigns/<slug>/output-log.md` |
| 124 | |
| 125 | ## Next Step |
| 126 | |
| 127 | Frame 1 approved → run `/animate` for A-roll or `/b-roll` for environment shots. |
| 128 |
Discussion
Browse more free Claude skills or everything in Content creator.