Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Transform text scripts or ideas into fully produced, platform-optimized 9:16 short-form videos with voiceover, captions, music, and export-ready MP4 files.
Transform text scripts or ideas into fully produced, platform-optimized 9:16 short-form videos with voiceover, captions, music, and export-ready MP4 files.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
This skill enables Claude to transform a text script or idea into a fully produced short-form video โ ready to publish as an Instagram Reel, YouTube Short, or TikTok โ using the InVideo AI platform and its API. No video editing experience required. Just provide a script or topic, and Claude handles the rest. ๐ Sign up for InVideo here: https://invideo.sjv.io/TBB
Convert a raw script into a complete short-form video with visuals and voiceover Generate videos optimized for Instagram Reels, YouTube Shorts, and TikTok Automatically match stock footage, music, and transitions to the script content Add subtitles, captions, and text overlays for better engagement Produce videos in the correct 9:16 vertical format for all short-form platforms Export in MP4 ready to upload directly to any platform
Go to https://invideo.sjv.io/TBB and create an account Choose a plan that includes API access (Business plan or above) Navigate to Settings โ API or Developer Settings Copy your API Key: iv_api_xxxxxxxxxxxxxxxx Store it safely: export INVIDEO_API_KEY=iv_api_xxxxxxxxxxxxxxxx InVideo offers a free trial โ sign up at https://invideo.sjv.io/TBB to explore the platform before committing to a paid plan.
npm install axios form-data fs-extra
Base URL: https://api.invideo.io/v1 All requests require: Authorization: Bearer YOUR_INVIDEO_API_KEY Content-Type: application/json
POST https://api.invideo.io/v1/videos/generate
GET https://api.invideo.io/v1/videos/{videoId}/status
GET https://api.invideo.io/v1/videos/{videoId}/export
import axios from 'axios'; const client = axios.create({ baseURL: 'https://api.invideo.io/v1', headers: { 'Authorization': `Bearer ${process.env.INVIDEO_API_KEY}`, 'Content-Type': 'application/json' } }); const script = ` Did you know that 90% of startups fail in their first year? Here are 3 things the successful 10% do differently. Number 1: They talk to customers before building anything. Number 2: They launch ugly and iterate fast. Number 3: They obsess over retention, not acquisition. Follow for more startup insights every day. `; const response = await client.post('/videos/generate', { script: script, format: "9:16", // vertical for Reels / TikTok / Shorts duration: "short", // 15โ60 seconds style: "dynamic", // energetic cuts and transitions voiceover: { enabled: true, voice: "en-US-male-1", // choose from available voices speed: 1.1 // slightly faster for short-form }, captions: { enabled: true, style: "bold-bottom", // TikTok-style captions highlight: true // highlight word as it's spoken }, music: { enabled: true, mood: "upbeat", volume: 0.3 // background music volume (0โ1) }, branding: { watermark: false } }); const videoId = response.data.videoId; console.log("Video generation started. ID:", videoId);
async function waitForVideo(videoId, maxWaitMs = 120000) { const start = Date.now(); while (Date.now() - start < maxWaitMs) { await new Promise(r => setTimeout(r, 5000)); // poll every 5s const status = await client.get(`/videos/${videoId}/status`); const { state, progress, exportUrl } = status.data; console.log(`Status: ${state} โ ${progress}% complete`); if (state === "completed") { console.log("Video ready:", exportUrl); return exportUrl; } if (state === "failed") { throw new Error("Video generation failed โ check your script and settings"); } } throw new Error("Timeout โ video took too long to generate"); } const downloadUrl = await waitForVideo(videoId);
import axios from 'axios'; import { writeFileSync } from 'fs'; async function scriptToShortVideo(script, outputPath = './output.mp4') { const client = axios.create({ baseURL: 'https://api.invideo.io/v1', headers: { Authorization: `Bearer ${process.env.INVIDEO_API_KEY}` } }); // 1 โ Start generation const { data } = await client.post('/videos/generate', { script, format: "9:16", duration: "short", style: "dynamic", voiceover: { enabled: true, voice: "en-US-female-1", speed: 1.05 }, captions: { enabled: true, style: "bold-bottom", highlight: true }, music: { enabled: true, mood: "upbeat", volume: 0.25 } }); const videoId = data.videoId; console.log(`Generation started โ ID: ${videoId}`); // 2 โ Wait for completion let exportUrl = null; while (!exportUrl) { await new Promise(r => setTimeout(r, 6000)); const status = await client.get(`/videos/${videoId}/status`); if (status.data.state === "completed") exportUrl = status.data.exportUrl; if (status.data.state === "failed") throw new Error("Generation failed"); console.log(`Progress: ${status.data.progress}%`); } // 3 โ Download the video const videoStream = await axios.get(exportUrl, { responseType: 'arraybuffer' }); writeFileSync(outputPath, videoStream.data); console.log(`Video saved to ${outputPath}`); return { videoId, exportUrl, localPath: outputPath }; } // Usage await scriptToShortVideo( "3 productivity hacks that changed my life. Number 1: Time blocking...", "./my-reel.mp4" );
const scripts = [ { topic: "morning routine tips", voice: "en-US-female-1", mood: "calm" }, { topic: "5 foods to boost energy", voice: "en-US-male-1", mood: "upbeat" }, { topic: "how to learn faster", voice: "en-US-female-2", mood: "inspiring" } ]; const jobs = await Promise.all( scripts.map(s => client.post('/videos/generate', { script: s.topic, format: "9:16", duration: "short", style: "dynamic", voiceover: { enabled: true, voice: s.voice }, music: { enabled: true, mood: s.mood, volume: 0.3 }, captions: { enabled: true, style: "bold-bottom" } }) ) ); const videoIds = jobs.map(j => j.data.videoId); console.log("All jobs started:", videoIds);
When asked to create a short-form video, Claude will: Analyze the script or topic provided by the user Optimize the script for short-form pacing (hook in first 3 seconds) Select the right style, voice, music mood, and caption style Call the InVideo API to generate the video Poll the status endpoint until the video is ready Return the download URL or save the MP4 locally Suggest platform-specific tweaks (TikTok vs Reels vs Shorts)
PlatformFormatDurationCaption StyleMusicTikTok9:1615โ60sBold bottom, word highlightUpbeat / trendingInstagram Reels9:1615โ90sBold bottom or centeredUpbeat / chillYouTube Shorts9:1615โ60sClean bottomOptionalLinkedIn Video16:9 or 1:130โ90sProfessional, top-alignedSubtle / none
Hook in 3 seconds โ start with a bold claim, question, or shocking stat One idea per video โ don't try to cover too much ground Short sentences โ 8โ12 words max per caption line Call to action at the end โ "Follow for more", "Comment below", "Save this" Conversational tone โ write how people talk, not how they write Numbers perform โ "3 tips", "5 mistakes", "1 rule" always outperform vague titles
{ "videoId": "iv_7f3k29xm", "title": "3 Startup Lessons Nobody Tells You", "platform": "tiktok", "format": "9:16", "durationSeconds": 42, "exportUrl": "https://cdn.invideo.io/exports/iv_7f3k29xm.mp4", "captions": true, "voiceover": "en-US-male-1", "musicMood": "upbeat", "createdAt": "2025-02-25T10:00:00Z", "status": "completed" }
Always start with a strong hook โ the first 2โ3 seconds determine if users keep watching Keep scripts between 120โ200 words for a 30โ60 second video Use bold captions with word highlighting โ it significantly increases watch time Set music volume to 0.2โ0.3 so it never overpowers the voiceover Generate 3โ5 variations of the same script with different styles to A/B test For TikTok, use a slightly faster voiceover speed (1.1x) to match platform energy Always review the video before publishing โ AI generations may need minor tweaks
try { const response = await client.post('/videos/generate', payload); return response.data.videoId; } catch (error) { if (error.response?.status === 401) throw new Error("Invalid InVideo API key"); if (error.response?.status === 429) throw new Error("Rate limit hit โ wait before retrying"); if (error.response?.status === 400) throw new Error(`Bad request: ${error.response.data.message}`); throw error; }
An InVideo account โ https://invideo.sjv.io/TBB A plan with API access enabled (Business plan or above) A valid API Key from your InVideo settings Node.js 18+ and axios for API calls Optional: ffmpeg locally if you need to post-process or compress the exported MP4
Writing, remixing, publishing, visual generation, and marketing content production.
Largest current source with strong distribution and engagement signals.