Turn a list of shots into a finished film, without wasting money on bad takes
Describe each shot in JSON. vs makes the AI clips, then cuts them into one video.
Setup, costs, commands, and a sample film you can run.
You need Node 24+ and ffmpeg (brew install ffmpeg).
git clone https://github.com/mblode/video-studio.git
cd video-studio
npm install
npm linkCopy .env.example to .env, add your AI_GATEWAY_API_KEY from Vercel AI Gateway (default Seedance 2.5) or ARK_API_KEY from the BytePlus console (Seedance 2.0 / lighthouse), then run vs doctor.
Try the sample film in films/lighthouse/:
vs cast sync films/lighthouse/shots.json
vs generate films/lighthouse/shots.json --dry-run
vs stills films/lighthouse/stills.json
vs animatic films/lighthouse/shots.json
vs generate films/lighthouse/shots.json --max-cost 18
vs stitch films/lighthouse/shots.json --xfade 0.4Start your own with vs init films/my-film.
Describe each character once in characters.json, list them in a shot's
cast, and vs cast sync writes the rest: a multi-view character sheet into
stills.json, the reference into the shot, and the binding sentence that tells
the model which @Image is whose face. It counts the ordinals for you, which
is the part that is easy to get wrong and expensive to discover.
Sync writes literal text into shots.json and stills.json — nothing at
generate time reads characters.json — so you review the diff before you spend,
and vs cast sync --check fails a build that has drifted.
- Preview for free: see the whole edit from stills before you pay for video.
- Set a budget:
--max-coststops a run that would go over. - Never pay twice: finished or in-progress shots are not sent again.
- Keep every take: old versions stay on disk;
vs usepicks which one to use.
npx skills add mblode/video-studio -g --agent codex claude-code -yWorks with Claude Code, Codex, Cursor, and other skills.sh agents. From a clone, they are already available.
MIT
Crafted by Matthew Blode