ValoxVSL
My AI video-ad studio and the multi-agent pipeline it was built on
- Role
- Founder; directed the agents that built the pipeline
- Status
- Live
- Source
- Private repository
- Stack
- Next.js 16React 19TypeScriptPrismaSQLiteFFmpegRemotionMCP SDKGeminiFAL (Kling, Seedance, Veo, Sora)ElevenLabsWhisperClerkDrizzleNeon Postgresnext-intlVercel

In numbers
83
MCP tools that let an agent run a job end to end
38
agent configurations in the pipeline
67scenes
in a 179-second ad that an agent produced end to end through the MCP
1,260
real human edit instructions indexed, so the agent can pre-empt defects operators already fixed
14
reference images per shot, so a face, a product label or a room stays fixed
The problem
A video sales letter is a long ad: a script, dozens of scenes, characters that have to look the same in each shot, and a voiceover in sync with the picture. Generative models make single clips cheap and do little to keep them consistent, so a face, a product label or a room layout drifts from shot to shot. I wanted a pipeline that holds those fixed, and a business that sells its output to Bulgarian companies.
The approach
I built the pipeline first by directing coding agents, and the business site on top of it. The pipeline is a chain of narrow agents with human gates between phases, a deterministic editor at the end and a cost table for each provider call. Later I added an MCP layer so Claude Code can run a whole job: the app's agents generate, and Claude judges each phase and decides what to redo. My brother works on the studio with me.

How it works
A Visual Bible before any pixels
The script is split into segments on // markers. A MasterJSON agent then writes the Visual Bible, a zod-validated document of characters (500 to 1,000+ words each), locations, environmental constants, 3 to 8 narrative blocks and 5 to 15 strict continuity rules. A person confirms it before anything is generated, and a second gate approves the reference images for characters, products and locations.
Narrow agents for each scene
Each scene passes through a Classifier, a Producer and a Prompt Engineer, run in parallel batches; the v3 engine batches the first two per narrative block to cut calls. The app holds 38 agent configurations, with variants for documentary, e-commerce, investigator and animation pipelines. Image generation takes up to 14 reference images per shot, so a face stays a face.
Submit everything, then poll
Video generation submits each scene to the hosted queue first and polls afterwards, behind multi-key rotation, a queue manager with a mutex per key pool, and resource locks. The video models sit behind one interface: Kling, Seedance, Veo 3.1 and Sora 2 all run through FAL, and a per-call cost table prices each request.
An editor that cuts on the voice
Editor v0 assembles the ad in FFmpeg. Trims re-encode for frame-accurate sync, word timestamps from ElevenLabs or Whisper map onto the script's segments, music is mixed under, karaoke subtitles are burned in, and the timeline exports as EDL or FCPXML for finishing in DaVinci Resolve. A Remotion-based v2 editor, with agents that watch the cut, exists in the repo and is on hold.
Claude as the producer
An MCP server exposes the pipeline as 83 tools, and a runbook skill makes Claude Code the producer. It reads each phase's output, looks at each reference image, has Gemini watch generated clips for motion, keeps a state file and works inside cost guardrails. A history tool indexes 1,260 edit instructions human operators gave the app, so the agent can pre-empt defects people already fixed. The first full run was an e-commerce ad that an agent drove end to end through it: 67 scenes, 179 seconds. It never judged motion, so a scene-aware video QA tool was added.
The storefront
valoxvsl.com is Bulgarian by default with English under /en, on Next.js 16 with Clerk, Drizzle on Neon and next-intl. Clients get a dashboard of companies, products, requests and notes, and a request moves from pending to accepted, in progress and completed after an admin approves it. The results page computes its totals from stored daily campaign rows; ValoxVSL reports EUR 500K+ in generated revenue and a 4.6x average ROAS for its clients there.

What I chose, and what lost
Chose
Keep the hand-built Node pipeline on main
Over
Cut over to V4, a Python rewrite on FastAPI, LangGraph, LiteLLM and Langfuse
The LangGraph rebuild never reached parity with the engine that ships, so it lives on a branch.
Chose
Design the successor pipeline before building it, as part of Valox Cinema
Over
Start a greenfield rewrite of the studio
One agent run produced a full set of blueprints, decision records and research files and no application code. Its most useful finding was a flaw in the current tool: the money guardrails live in skill markdown, and the spend counters block nothing. The successor specifies budgets as enforced code.
Chose
Individual quotes on the site
Over
Public package prices
The studio pitches in the Bulgarian and Dutch markets at once, and one public price list cannot serve both. Prices came off the site in one PR.
Outcome
The tool runs in production behind a sign-in at tool.valoxvsl.com, and valoxvsl.com is live. The studio delivered ads for the clients on its public case-study pages; I now describe the ad work as dormant. A bug hunt filed a batch of issues, and 11 agents on file-disjoint packages fixed all of them, deployed after a database backup. Open gaps: production still runs on SQLite with the Postgres migration only assessed, and the budget guardrails are still prose. The production server was once compromised through a framework vulnerability; that incident has its own page.
Gallery
Scene 12, the command hut.
Scene 16, the close-up.
Scene 33, the trench.
The Visual Bible step feeds the scene stills: character and location references go in, a grid of scenes with the same faces comes out.
Generated scene stills waiting for review in the tool.
The Jeisan character in the watch ad, on the street and behind the wheel.
Documentary style ad: harbour, ledger and teller scenes in one colour grade.
A folk legend as an ad: one armoured hero across several scenes.
Sports ad for the Aquaphor bottle range, each shot a separate AI scene.
Travel agency ad cut for landscape, six AI scenes in one pass.
UGC style ad with an AI generated presenter.