HomeContent Pipeline
Content
Pipeline
A topic goes in, a finished video goes live — 5 AI services, one pipeline.
- 40+
- Videos produced
- 5
- AI services
- 3
- Avatar engines
- 06:00UTC
- Daily publish run
Five stages
How a video gets made
Click a stage to jump to it, or scroll through all five.Tap a stage to jump to it, or scroll through all five.
1/ 5
OpenClaw
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.
scenes: z.object({
hook: z.object({
lines: z.array(z.string()).min(1).max(4),
accentLineIndex: z.number(),
}),
body: z.object({
lines: z.array(z.string()).min(1).max(5),
}),
reveal: z.object({
headline: z.string(),
tagline: z.string(),
}),
}),2/ 5
ElevenLabs
Voice Synthesis
ElevenLabs turns each scene of a 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.
body: JSON.stringify({
text: scene.text,
model_id: "eleven_multilingual_v2",
voice_settings: {
stability: 0.5,
similarity_boost: 0.75,
style: 0.3,
},
}),3/ 5
Avatar Engine
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.
4/ 5
Remotion
Remotion Studio
Toggle layers to see how the composition builds up. Switch templates to see different video formats.
const WIDTH = 1080;
const HEIGHT = 1920;
const FPS = 30;
// …
<Composition
id="TechGold"
component={TechGold}
durationInFrames={TECHGOLD_TOTAL_FRAMES}
fps={FPS}
width={WIDTH}
height={HEIGHT}
schema={TechGoldSchema}
defaultProps={techGoldData}
/>5/ 5
YouTube API
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 video's entry in the content planner. View velocity, CTR, and watch-time come back through the Analytics API and feed the script agent for the next episode.
const metadata = JSON.stringify({
snippet: { title, description, tags, categoryId: "28" },
status: { privacyStatus: privacy, selfDeclaredMadeForKids: false },
});The pipeline end to end
- 1Script
- 2Voice
- 3Avatar
- 4Compose
- 5Publish
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.
Why the pieces are what they are
Compose
Remotion as the editor
The videos are React code, so I can version them and re-render the whole batch by changing a prop. The pipeline runs on its own, and the edit lives in the repository with it.
Avatar
Three avatar engines
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 finished clip is filed into the pipeline and goes out through the same upload step.
Script
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.
Publish
Upload through the API
The thumbnail, SEO metadata, and tags all come from the content planner entry, so the upload step has nothing left to fill in by hand.
Credits
- Script
- Claude
- Voice
- ElevenLabs
- Avatar
- SadTalkerLivePortraitHeyGen
- Compose
- RemotionReact
- Publish
- YouTube API
- Runtime
- Node.js