Automated short-form video content pipeline for micro-SaaS distribution.
Generate TikTok/Reels/Shorts videos programmatically — script generation, text-to-speech, video composition, all automated. Ship a product, plug in a config, generate content at scale. Kill what doesn't work, keep what does.
Topic → Claude Code (script) → Edge TTS (voice) → Remotion (video) → MP4
The pipeline is the business. Products are experiments.
- Ship fast: 1-2 weekends per product MVP
- Kill fast: 30 days to prove or kill
- Content is distribution: 5-10 videos/day across multiple accounts
- $0 marginal cost: Claude Code Max + Edge TTS + Remotion = free per video
# Clone & install
git clone https://github.com/AirKyzzZ/content-engine.git
cd content-engine
npm install
# Create your first product
npm run new-product -- my-saas
# Edit the config
# → src/products/my-saas/config.ts
# Generate a video
npm run generate -- my-saas "your topic here"
# Batch generate from default topics
npm run batch -- my-saas
# Download gameplay backgrounds
npm run download -- my-saascontent-engine/
├── src/
│ ├── engine/ # Core engine (product-agnostic)
│ │ ├── scripts.ts # Claude Code CLI → structured scripts
│ │ ├── voice.ts # Edge TTS + ffmpeg post-processing
│ │ ├── gameplay.ts # YouTube download + 9:16 crop
│ │ └── render.ts # Remotion bundle + render
│ │
│ ├── compositions/ # Video templates (React components)
│ │ ├── ChatOverBroll # Tinder-style chat over gameplay
│ │ ├── TextOverBroll # Text callouts over gameplay
│ │ └── shared/ # Reusable: ChatBubble, PhoneChat, etc.
│ │
│ ├── products/ # Product configs (one folder each)
│ │ └── rizzia/config.ts # Example: AI dating coach
│ │
│ └── cli.ts # CLI entry point
│
├── public/ # Assets (gameplay, voice, music)
└── out/{product-id}/ # Rendered MP4s per product
Each product is a single config.ts file:
const config: ProductConfig = {
id: "my-saas",
brandName: "MySaaS",
handle: "@mysaas",
description: "What does this product do",
audience: "Who is the target (age, interests, pain points)",
formats: ["chat-over-broll"],
ctaPlacement: "mid", // mid-roll CTA at sec 8-12 (3-5x better than end)
promptInstructions: `Master prompt for script generation...`,
topics: [
"Default topic 1",
"Default topic 2",
],
gameplayClips: [
{ url: "https://youtube.com/watch?v=...", tag: "subway-surfer" },
],
voices: {
male: "fr-FR-HenriNeural",
female: "fr-FR-DeniseNeural",
narrator: "fr-FR-HenriNeural",
rate: "+15%",
},
};| Command | Description |
|---|---|
npm run generate -- <product> "topic" |
Generate one video |
npm run batch -- <product> [topics...] |
Batch generate (uses default topics if none provided) |
npm run download -- <product> |
Download gameplay clips from YouTube |
npm run new-product -- <id> |
Scaffold a new product config |
npm run studio |
Open Remotion Studio for visual preview |
| Component | Tool | Cost |
|---|---|---|
| Script generation | Claude Code CLI (claude -p) |
$0 (Max subscription) |
| Text-to-speech | Edge TTS (Microsoft) | $0 (free, no API key) |
| Audio processing | ffmpeg (EQ + compression + normalize) | $0 |
| Video composition | Remotion (React-based) | $0 (individuals) |
| Gameplay footage | yt-dlp (YouTube CC0 clips) | $0 |
| Posting | Postiz (self-hosted) | $0 |
Total cost per video: $0
- Phone-style chat UI (dark mode, avatar, status bar, message input)
- Male + female voices reading messages (synced to visual)
- Full-screen gameplay with subtle drift animation
- Screen shake on message impacts
- Configurable mid-roll or end-roll CTA
- Emoji reactions (displayed but not spoken by TTS)
- "@handle" watermark
- Audio post-processing (EQ, compression, -14 LUFS normalization)
- Node.js 20+
- ffmpeg + ffprobe
- yt-dlp (for gameplay downloads)
- edge-tts (Python CLI:
pipx install edge-tts) - Claude Code CLI (for script generation)
- ProfileScore composition (AI rates your profile)
- BeforeAfter composition (profile transformation)
- Carousel/slideshow composition (static tip cards)
- Background music layer
- Kokoro TTS integration (better French quality)
- Analytics collector (YouTube API + TikTok API)
- Feedback loop (LLM analyzes top/bottom performers)
- Multi-account posting via Postiz
MIT