Skip to the content
Georgi DimitrovdaTuzzo

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
Six AI-generated frames of one fictional Bulgarian infantry soldier, called Ivan The Defender in the tool, from six different shots of a Doiran documentary ad: crouched in a trench doorway in front of a fire, looking up in a dim bunker, lying wounded on his back, charging with a rifle, aiming at the camera with wet hair, and wearing a French style helmet in grey light. The lean face, pale eyes and mud stay the same in every frame.
One AI character in six scenes, all generated from the same character reference.

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.

AI-generated depiction of General Vazov, the Bulgarian commander at Doiran in 1918, in three scenes of the same documentary ad: a large close-up in a peaked cap with heavy brows and a thick grey moustache, a standing portrait in a wooden command hut wearing a greatcoat, and a portrait in a trench in a field tunic holding binoculars under a smoky sky. The face is an AI depiction of a historical figure, not a photograph.
General Vazov, an AI depiction, in three scenes with three outfits and three lightings.

How it works

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

Five AI-generated frames of one fictional man in a black t-shirt with red Cyrillic lettering, from a product ad: a large studio portrait against a grey backdrop, a seated portrait against red brick, a smiling frame in a timber-beamed room and two laughing frames beside a brick wall. The short fade haircut and trimmed beard stay the same.
The model of the t-shirt ad, kept on screen across five scenes.

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.