Context
Vertical video is eating attention. Every retail-investor brokerage, dev-tooling brand, and B2B SaaS is publishing 30-second clips three times a week. The cost of NOT being on YouTube Shorts and TikTok is increasingly measurable; the cost of getting on them at studio-quality is a video editor on retainer.
ContentForge is the answer to “what if a one-person studio shipped a faceless channel without ever opening a camera app.” It picks topics, writes scripts, generates voiceovers, sources stock footage, renders vertical videos, gates them through a Telegram review, and publishes to YouTube, all without human intervention beyond the daily approve/reject prompt.
Brief
- Daily clip cadence on a single niche, on a single channel, for under €5/month in API costs.
- Operator interaction limited to a Telegram approve/reject every morning.
- Pluggable provider strategy, swap Claude for Perplexity, ElevenLabs for Coqui, no rewrite.
- Source available, clients should be able to fork the pipeline for their own niche.
- Test coverage on every pipeline stage (~80%+) so future swaps don’t quietly break.
Architecture
A 7-stage BullMQ pipeline running on Node + TypeScript:
- Topic Scout, Claude Code CLI (subscription-bound, $0/article) or Perplexity for fresh-news niches.
- Script Writer, Claude Sonnet with niche-specific tone-of-voice prompts.
- Asset Generator, Pexels + Unsplash API for stock footage and stills.
- Video Composer, Remotion 4 vertical templates (9:16 listicle layout, brand intro/outro).
- Review Gateway, Telegram bot (lxc-notify) sends a preview, waits for approve/reject.
- Publisher, YouTube Data API v3 with scheduled-publish flag.
- Analytics, light scrape of view-count + retention back into the topic-scout’s signal.
Each stage is its own BullMQ worker. Redis is the queue + state store. Cron triggers the Topic Scout daily at 06:00; the rest cascades. 6 workers run in parallel under a single Node process; orchestration is BullMQ flows.
The provider-agnostic shape (TOPIC_PROVIDER=claude|perplexity, SCRIPT_PROVIDER=claude|gemini, etc.) is the hardest-won design decision. It made stage swaps a 5-minute config edit instead of a rewrite.
Outcomes
- 7 pipeline stages, all async, all unit-tested.
- 81 unit + integration tests across 15 test files.
- 21 commits from empty repo to live MVP.
- Per-clip API cost sits between €0.10 and €0.50 depending on script length and stock-image count.
- Telegram review turns a 90-second daily check-in into the only operator overhead.
- Pluggable providers mean adding a new niche is a config change, not a fork.
Screens
[FILL: replace with anonymized screenshots of the BullMQ dashboard, the Telegram review prompt with a thumbnail, and the Remotion template preview. Avoid screenshots that show the actual published channel, keep the niche off the case study so the same pipeline can serve future client engagements.]
What’s next
Three items on the next-iteration list:
- Browser-automation provider for asset generation, Nano Banana for stills, Google Flow or Runway for short B-roll. Stock libraries hit a wall for niche queries; generative assets are the next move.
- Multi-platform publisher, current YouTube-only flow extends naturally to TikTok, Instagram Reels, LinkedIn Video. The Publisher stage is one switch statement away.
- Per-clip analytics dashboard, current Analytics stage feeds back to Topic Scout but isn’t visible to the operator. A small Vite app reading the Redis state would close the loop.