en un clic
scrollclaw-assemble
// Assembly stage for UGC videos. Handles stitch mode, post mode, captions mode, or full-assemble mode when the user is explicitly working on finalizing an existing campaign video.
// Assembly stage for UGC videos. Handles stitch mode, post mode, captions mode, or full-assemble mode when the user is explicitly working on finalizing an existing campaign video.
One-time brand initialization. Given a brand name and URL, researches the brand and generates the three workspace/brand/ files that the rest of the pipeline reads. Run once per brand before any campaign work.
Router and orchestrator for AI UGC video production. Use for broad outcome requests like making a UGC video or running a campaign; it routes step-specific requests to the right sub-skill and can drive the full pipeline from persona research through virality-scored video.
ScrollClaw system — core doctrine, format selection, pipeline routing, and anti-patterns. Loaded into every UGC conversation.
Animate first frames into A-roll talking head clips. Uses Sora 2 via fal.ai (primary) with Kling 3 auto-fallback when Sora is unavailable or sunset.
Generate B-roll environment and product shots with Kling 3 via fal.ai. Environment matching, cut timing, and visual-only clips that play under continuous voice.
Generate the canonical first frame with Nano Banana 2. Composition, character, environment, and color — all locked before animation. The visual design gate.
| name | scrollclaw-assemble |
| description | Assembly stage for UGC videos. Handles stitch mode, post mode, captions mode, or full-assemble mode when the user is explicitly working on finalizing an existing campaign video. |
| metadata | {"openclaw":{"emoji":"🔧","user-invocable":true,"triggers":["assemble video","full assemble","stitch clips","post production","post produce video","add captions","burn captions","caption overlay","ugc captions","ugc audio","ugc post-production"]}} |
Three stages: stitch + audio → post-production → captions. Order matters.
This skill handles four intents. Choose the narrowest one that matches the user's request:
stitch — timeline assembly and voice orchestration onlypost — post-production realism pass onlycaptions — caption rendering and overlay onlyfull-assemble — do all three in order; this is the default when the user says "assemble", "finish the video", or otherwise asks for the final outputIf the user asks for one stage explicitly, do not force the full pipeline. If they ask for the final video, run full-assemble.
/animate/b-roll (if applicable)/personaRead references/audio-orchestration.md for the full process.
The critical ordering (tested):
Voice never cuts. B-roll swaps visuals only. The wrong approach (stitch all clips then add voice) breaks timing because B-roll adds visual duration that doesn't exist in the voice track.
For single-clip talking head: Sora's built-in audio may be sufficient. For podcast format: always use ElevenLabs S2S.
For longer UGC, either use fal.ai's 20s duration or stitch clips:
Last-frame stitching (tested, works well):
ffmpeg -sseof -0.1 -i clip1.mp4 -frames:v 1 last-frame.pngbash scripts/extend-clip.sh \
--input workspace/campaigns/<slug>/clips/a-roll-01.mp4 \
--prompt-file workspace/campaigns/<slug>/extension-prompt.txt \
--output workspace/campaigns/<slug>/clips/a-roll-01-extended.mp4 \
--log-file workspace/campaigns/<slug>/output-log.md \
--label a-roll-01-extended \
--seconds 10
Use scripts/stitch-video.sh for resolution normalization. Read references/voice-system.md for voice design guidance.
Raw AI output → post-production → final asset. Never skip.
Use scripts/post-production.sh for automated color grade, grain, and frame rate normalization.
Read references/post-production.md for the full realism stack: color grade, grain (the 4K upscale trick), skin texture, frame rate lock, audio realism, lighting consistency.
If mixing Sora + Kling clips, pay special attention to cross-engine color matching — see references/orchestrator.md (in b-roll/references/).
The phone test: watch the final video on a phone screen, in the app, scrolling past it like a user. If anything pings as AI, fix it.
Read references/green-zone.md for platform safe zones.
⚠️ Captions MUST be applied AFTER post-production, not before. Grain and color grade degrade clean caption text. This was the #1 process mistake in session 2.
Use assemble/scripts/caption-overlay.py for all text overlays. It generates transparent PNGs with TikTok-native styling, auto-detects video resolution, and downloads TikTok Sans from Google Fonts if not cached.
# Generate caption overlay (auto-detects resolution from video)
python3 assemble/scripts/caption-overlay.py \
--video workspace/campaigns/<slug>/clips/post-produced.mp4 \
--preset tiktok-wall \
--lines "things i didn't know,would bother me about,my boyfriend..." \
--output workspace/campaigns/<slug>/frames/caption.png
# Overlay onto post-produced video (with compatible encoding)
ffmpeg -i workspace/campaigns/<slug>/clips/post-produced.mp4 \
-i workspace/campaigns/<slug>/frames/caption.png \
-filter_complex "[0:v][1:v]overlay=0:0:enable='between(t,0.2,3.8)'" \
-c:v libx264 -profile:v main -pix_fmt yuv420p -crf 18 \
-movflags +faststart -c:a copy \
workspace/campaigns/<slug>/clips/final-01.mp4
| Preset | Use For | Font | Size | Color | Stroke |
|---|---|---|---|---|---|
tiktok-wall | Wall of Text format, dense overlays | TikTok Sans Regular | 38px | #F7F7F2 94% opacity | 2.5px pure black |
tiktok-hook | Hook captions, opening text | TikTok Sans Bold | 52px | #FFFFFF 100% | 3px pure black |
tiktok-scene | Scene-by-scene captions | TikTok Sans Regular | 32px | #F7F7F2 94% opacity | 2px pure black |
tiktok-dense | Dense multi-line overlays | TikTok Sans Regular | 28px | #F7F7F2 94% opacity | 2px pure black |
All presets use centered alignment and safe zone positioning (y=280 at 720x1280 base). Values scale automatically for other resolutions.
For per-scene caption configs, pass a JSON file:
python3 assemble/scripts/caption-overlay.py \
--config workspace/campaigns/<slug>/scripts/captions.json \
--output workspace/campaigns/<slug>/frames/caption-s1.png
The older scripts/generate-caption.py still supports pill-style (white rounded rect background) and wall-style captions using Inter font. Use assemble/scripts/caption-overlay.py for all new work — it has the correct TikTok-native styling.
--video flag to auto-detect.-profile:v main -pix_fmt yuv420p -movflags +faststartResolution note: Sora outputs 720x1280, Kling outputs 1076x1924. Always normalize to one resolution before stitching.
Requires ffmpeg and python3 with Pillow (auto-installed if missing).
| File | Purpose |
|---|---|
workspace/campaigns/<slug>/clips/*.mp4 | All A-roll and B-roll clips to assemble |
workspace/campaigns/<slug>/scripts/<format>-script.md | Timing, B-roll insertion points, caption text |
workspace/campaigns/<slug>/creators/creator-<name>.md | Voice reference for ElevenLabs S2S voice design |
workspace/creators/creator-<name>.md | Fallback if no campaign-specific profile exists |
| File | Notes |
|---|---|
workspace/campaigns/<slug>/clips/final-<version>.mp4 | Assembled video with voice, post-production, captions |
workspace/campaigns/<slug>/output-log.md | Assembly params, S2S voice used, ffmpeg settings (append-only) |
🔧 Assemble context loaded:
✓ Campaign: ridge-q1
✓ A-roll clips: 3 (workspace/campaigns/ridge-q1/clips/a-roll-*.mp4)
✓ B-roll clips: 2 (workspace/campaigns/ridge-q1/clips/b-roll-*.mp4)
✓ Script: talking-head (workspace/campaigns/ridge-q1/scripts/talking-head-script.md)
✓ Creator voice profile: Maya
/animate, /b-roll, /persona, and references/audio-orchestration.mdfinal-<version>.mp4 in workspace/campaigns/<slug>/clips/ plus append-only assembly logs/score/scorestitch: assembled timeline exists, cuts land on script beats, voice continuity holds across A-roll and B-rollpost: post-produced file exists, mixed-engine clips look visually coherent, phone test does not immediately ping as AIcaptions: caption overlay matches exact video resolution, readability is mobile-safe, and captions were applied after post-productionworkspace/campaigns/<slug>/clips/final-<version>.mp4workspace/campaigns/<slug>/workspace/campaigns/<slug>/output-log.mdAssembly complete → run /score to verify virality score before publishing.