Install
openclaw skills install veezvg-episode-to-instagramClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
Full pipeline to turn a video podcast episode into Instagram content (carousel posts, quote cards, and Reels). Transcribes the episode, extracts key quotes with timestamps, pulls video frames, generates aesthetic carousel slides, and posts to Instagram via browser automation. Use when the user provides a full podcast/video episode or a YouTube/video webpage URL and wants Instagram-ready content generated and posted.
openclaw skills install veezvg-episode-to-instagramEnd-to-end pipeline: video episode or YouTube/video webpage URL → local media acquisition → transcript → content extraction → carousel/image generation → Instagram posting via browser automation.
ffmpeg (installed via Homebrew)openclaw browser for Instagram postingbrand-config.json, e.g. @yourhandle)If the user provides a YouTube URL or a webpage that embeds a podcast/video episode:
Expected outputs in the episode working directory:
source-url.txtsource-video.mp4 (or equivalent local video file)Script: scripts/transcribe.sh
This step is model-driven (not scripted). The agent should:
Script: scripts/extract-frames.sh
Before rendering any carousel slides, the agent must update the content plan so each slide that references a selected moment has a concrete framePath pointing at an extracted frame file. Do not render slides until this mapping is present and verified.
Validation before rendering:
framePath or be intentionally text-onlyframePath values are missing, stop and repair the plan before running the generatorScript: scripts/generate-carousel.js
For each carousel post (5-7 slides):
Carousel image specs:
For visual enhancement, optionally use Replicate models:
Before posting, the agent must:
Script: scripts/post-to-instagram.js
Uses openclaw browser to:
+ / Create entrypointPost or Reel based on the asset being uploaded (do not assume every + opens post creation; profile-page New may open Highlight instead)openclaw browser upload so the flow avoids the flaky browser upload bridgeSelect crop control before moving past the crop step; do not leave it on Instagram's default crop if that changes the intended compositionCrop rule:
Practical note:
New Highlight or any non-post flow, back out and retry from the main Create/sidebar + entrypoint, then select Post before uploading media.instagram when helpful (for example: ~/Desktop/instagram/), but before calling openclaw browser upload, copy the final asset(s) into /tmp/openclaw/uploads/... because the browser CLI only accepts uploads from that temp root.instagram folder if you want a visible local working copy, then stage that Desktop copy into /tmp/openclaw/uploads/... for browser upload..mp4 or .mov uploads, prefer the Reel flow unless the user explicitly wants a feed video post.To be configured per user. Store in brand-config.json:
{
"primaryColor": "#000000",
"secondaryColor": "#FFFFFF",
"accentColor": "#8B5CF6",
"fontStyle": "clean-modern",
"overlayOpacity": 0.6,
"format": "1080x1350",
"accountHandle": "",
"seriesName": "",
"hashtagSets": []
}
episode-to-instagram/
├── SKILL.md
├── brand-config.json
├── scripts/
│ ├── transcribe.sh # Audio extraction + Whisper API
│ ├── extract-frames.sh # ffmpeg frame extraction
│ ├── generate-carousel.js # Canvas-based slide generation
│ └── post-to-instagram.js # Browser automation for IG posting
└── output/ # Working directory for generated content
└── {episode-id}/
├── transcript.json
├── transcript.txt
├── content-plan.json
├── frames/
├── slides/
└── reels/
brand-config.json; customize it for your own account before generating slides.OPENAI_API_KEY should be provided by your shell, secret manager, or OpenClaw runtime before using scripts/transcribe.sh.