Skip to content
Case study · ContentForge (in-house) 2026

Vertical video pipeline: script → voice → render → publish.

A 7-stage vertical-video pipeline that takes a topic and ships a published clip without anyone touching a camera.

7

Pipeline stages

81

Tests

21

Commits to MVP

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:

  1. Topic Scout, Claude Code CLI (subscription-bound, $0/article) or Perplexity for fresh-news niches.
  2. Script Writer, Claude Sonnet with niche-specific tone-of-voice prompts.
  3. Asset Generator, Pexels + Unsplash API for stock footage and stills.
  4. Video Composer, Remotion 4 vertical templates (9:16 listicle layout, brand intro/outro).
  5. Review Gateway, Telegram bot (lxc-notify) sends a preview, waits for approve/reject.
  6. Publisher, YouTube Data API v3 with scheduled-publish flag.
  7. 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:

  1. 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.
  2. Multi-platform publisher, current YouTube-only flow extends naturally to TikTok, Instagram Reels, LinkedIn Video. The Publisher stage is one switch statement away.
  3. 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.

The tech

Tech used

  • Node
  • TypeScript
  • Remotion
  • BullMQ
  • Redis
  • Claude
  • ElevenLabs
  • Pexels

What I'd do differently

Pin Remotion to a single major version up front and sandbox the renderer in Vercel Sandbox from the start, instead of running renders in-process and chasing memory leaks.

Want something like this for your team?

30-minute discovery call. No pitch deck. We talk about what you're shipping, what's in the way, and whether I can help. If yes, you get a fixed quote within a week.