carousel-builder
Renders multi-slide carousels from HTML/CSS templates using Playwright. Handles slide content injection, brand styling, and PDF assembly.
Produces images and videos for social posts with human-in-the-loop approval at every creative stage.
$ npx -y skills add indranilbanerjee/socialforge --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Produces images and videos for social posts with human-in-the-loop approval at every creative stage.
name: image-compositor description: "Produces images and videos for social posts with human-in-the-loop approval at every creative stage." maxTurns: 30
Produce final composed images and videos for social media posts. Every creative decision goes through user approval. Nothing is auto-generated without consent.
**Claude handles all thinking** (strategy, ideas, prompts, decisions). External APIs handle only rendering:
Every post gets its own folder under `production/week-{N}/`:
{PostID}-{date}-{platforms}-{tier}-{type}/
versions/ <- all generated options (v1.png, v2.png for images; video-v1.mp4 for video)
final/ <- approved output, resized per platform
copy/ <- platform-specific copy
keyframes/ <- video: first-frame and last-frame options
metadata.json <- creative direction, provider used, timestampsThe post folder is created automatically by `status_manager.init_post_folder()`. Use it for ALL file operations. Never save to flat `production/images/` or `production/video/` directories.
To get the post folder path:
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/status_manager.py --action get-post-folder --brand "{brand}" --month "{month}" --post-id "{post_id}"---
Analyze the post context (from calendar-data.json + asset-matches.json + brand-config.json) and present **2-3 creative direction options** to the user.
For each option, present:
**WAIT for user response.** User can pick one, modify, combine, or provide own direction.
After user picks a direction, confirm all details:
**WAIT for approval.** Only proceed when user says yes.
Generate **2-3 image versions** with slight prompt variations:
1. Craft prompts based on approved direction + brand style + post context 2. Run generate_image.py for each version 3. **Read each generated image file using the Read tool** -- the image appears INLINE in the conversation 4. Present all versions with descriptions 5. **WAIT for user to pick one.** Alternatives saved to {post_folder}/versions/
After user picks: 1. Apply logo overlay (compose_image.py) 2. Resize for each platform (resize_image.py) 3. Verify brand colors (verify_brand_colors.py) 4. Read final image to show inline for confirmation 5. Save to {post_folder}/final/ 6. Update status-tracker.json 7. Log API cost
---
Present **2-3 video concept ideas** based on post context. For each show:
**WAIT for user to approve a concept.**
Generate **2 opening frame** images based on approved concept: 1. Craft first-frame prompt 2. Generate 2 versions via generate_image.py with --aspect-ratio 16:9 3. **Read each image** -- both appear INLINE in chat 4. **WAIT for user to pick one**
Same approach for closing frame: 1. Generate 2 options 2. Show inline 3. **WAIT for user to pick one**
Using approved first + last frames: 1. Upload frames to WaveSpeed 2. Generate 2 video versions with different motion prompts via generate_video.py 3. Show first + last frame thumbnails INLINE as preview 4. Generate HTML gallery with video tags for full playback via build_gallery.py 5. Open gallery in browser 6. **WAIT for user to pick final video**
After user picks the final video:
1. **Watermark:** Add brand logo overlay to the video
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/video_postprocess.py --input "raw-video.mp4" --output-dir "{post_folder}/final/" --brand "{brand}" --platforms "linkedin,instagram_reel"2. **Subtitles:** Ask the user: "Do you want subtitles burned into the video? (yes/no)"
3. **Background music:** Ask the user: "The video has no audio. Would you like to add background music? (yes/no)"
4. **Platform resize:** Video is automatically resized for each target platform (no stretching -- letterbox/pillarbox with black padding):
5. Save all platform versions to {post_folder}/final/ 6. Save alternatives to {post_folder}/versions/ 7. Save script.json + storyboard.json + subtitles.srt 8. Update status-tracker.json 9. Log API costs 10. Continue to copy adaptation
---
When generating all posts (28+), individual approval per post is impractica
Your client wants 30 days of social content across six platforms with brand-faithful imagery, AI-generated video, and provenance signed for EU markets. You have five days.
Renders multi-slide carousels from HTML/CSS templates using Playwright. Handles slide content injection, brand styling, and PDF assembly.
Enforces brand compliance rules — banned phrases, required disclaimers, image rules, data claim verification, and platform-specific restrictions.
Adapts social media copy per platform — character limits, hashtags, CTAs, tone shifts, and bilingual formatting. Handles cross-posting adaptation.
Reviews generated creative for brand consistency, visual quality, copy accuracy, and platform compliance before approval queue.