Content
Pipeline
A topic goes in, a finished video goes live — 5 AI services, one pipeline
How a video gets made
Click a stage to jump to it, or scroll through all five.
Script Generation
A Claude-based OpenClaw agent runs around the clock, reading RSS feeds and building context in the background. By the time a video is due it already knows the topic, so it writes a structured script with timing markers instead of starting cold.
// OpenClaw agent — 24/7 autonomous runtime
const script = await openClaw.agent.generate({
task: "write-video-script",
context: accumulatedKnowledge,
params: {
topic,
tone: "professional, direct",
structure: "hook → problem → solution → CTA",
duration: "60s",
},
});
// The agent has been collecting context for weeks:
// - Industry trends from RSS feeds
// - Competitor content analysis
// - Performance data from previous videos
// Output: structured script with timing markersVoice Synthesis
ElevenLabs turns each script into an MP3 with the same speaker and tone across every video, in multiple languages from one setup. Voice config, pacing, and output format are pinned, so the channel sounds like one person on every episode.
Avatar Generation
One photo is enough: the model reads the facial structure and drives the mouth from whatever the engine takes — an audio track, a driving video, or a script — to produce a talking-head video. Which engine runs depends on the job — open-source models for local batch work, cloud APIs when the output needs production quality.
Remotion Studio
Toggle layers to see how the composition builds up. Switch templates to see different video formats.
Distribution
When the render finishes, the pipeline hands the file to the YouTube Data API with a thumbnail, SEO metadata, and a scheduled publish time — all pulled from the Phase 1 script context. View velocity, CTR, and watch-time come back through the Analytics API and feed the script agent for the next episode.
Videos Produced
AI Services
Avatar Engines
Manual Steps
The pipeline end to end
Five AI services chained into one pipeline: Claude writes the script, ElevenLabs voices it, an avatar engine lip-syncs the video, Remotion composites it as React components, and the YouTube API uploads it. 40+ videos in, the lesson is that video production is mostly a pipeline problem — once each stage is a composable step, more videos is config, not hours.
// Remotion composition — video as React components
export const VideoComposition: React.FC<VideoProps> = ({
script, voiceTrack, avatarVideo, template
}) => {
return (
<Composition
id={template.id}
component={VideoTemplate}
durationInFrames={template.frames}
fps={30}
width={1920}
height={1080}
defaultProps={{
script,
voiceTrack,
avatarVideo,
layers: template.layers,
}}
/>
);
};Why the pieces are what they are
- →Remotion instead of a timeline editor
The videos are React code, so I can version them and re-render the whole batch by changing a prop — no timeline to drag for a pipeline that runs on its own.
- →Three avatar engines, not one
SadTalker handles batch jobs, LivePortrait is fast enough for iterating, and HeyGen is what I reach for when the output has to look clean. The pipeline picks based on the job.
- →A standing agent for the scripts
OpenClaw runs all the time and keeps a memory of trends and how past videos performed, so a script is written against weeks of context instead of a cold one-shot prompt.
- →Upload through the API, not by hand
The thumbnail, SEO metadata, and tags all come from the script context, so the upload step has nothing left to fill in by hand — the one place a human could sneak back in.