vox-director
Turn ONE topic into a finished Vox-style paper-collage explainer / ad video, end to end on the Atlas Cloud API + local ffmpeg — script, collage keyframes…
Skill by Alisa0808
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/alisa0808-vox-director
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, backend, marketing, research, audio-video, image-generation
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/vox-director
What's inside
- Skill name
vox-director- Description
- Turn ONE topic into a finished Vox-style paper-collage explainer / ad video, end to end on the Atlas Cloud API + local ffmpeg — script, collage keyframes, motion, voice-over, music, captions, all automated. Use this whenever the user wants a "Vox style" video, a paper/torn-paper collage animation, a "motion collage", a narrated explainer or short ad built from AI-generated collage posters, a scrapbook-style tribute, or wants to turn a topic / product / person into a punchy narrated collage video — even if they don't say the word "Vox". Also use when reproducing Stav Zilber / rom1trs / Higgsfield-style collage ad workflows. Three input modalities: a topic (B-roll), a talking-head video (A-roll mode), or a single photo of a person/product anchored into the collage (C-roll mode). Triggers: "vox video", "collage video", "motion collage", "paper collage explainer", "make a collage ad", "turn this topic into a collage video", "turn my photo/this product shot into a collage video".
- License
- MIT
- Instructions
- 315 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
- Instructions call the network
Files (52)
- .gitignore
- AGENTS.md
- LICENSE
- README.md
- README.zh.md
- SKILL.md
- SKILL.zh.md
- showcase-football.mp4 · assets/
- showcase-money.mp4 · assets/
- showcase-silicon-valley.mp4 · assets/
- showcase-tang.mp4 · assets/
- football.jpg · assets/thumbs/
- mexican.jpg · assets/thumbs/
- money.jpg · assets/thumbs/
- silicon-valley.jpg · assets/thumbs/
- tang.jpg · assets/thumbs/
- cr7-act.elements_spec.json · examples/
- money-15s.beats.json · examples/
- money-60s-9x16-english.beats.json · examples/
- ronaldo-9x16-kling.beats.json · examples/
- tang-30s.beats.json · examples/
- llms.txt
- package.json
- beat-layer.md · references/
- host-mode.md · references/
- local-engine.md · references/
- models-and-gotchas.md · references/
- prompt-guide.md · references/
- voices.md · references/
- aroll_assemble.py · scripts/
- aroll_clips.py · scripts/
- asr_beats.py · scripts/
- assemble.py · scripts/
- atlas_cloud.py · scripts/
- audio.py · scripts/
- clips.py · scripts/
- confetti.py · scripts/
- croll_keyframes.py · scripts/
- extract_elements.py · scripts/
- host.py · scripts/
- host_clips.py · scripts/
- host_plates.py · scripts/
- kenburns.py · scripts/
- keyframes.py · scripts/
- lipsync_score.py · scripts/
- mg_scrapbook.py · scripts/
- motion.py · scripts/
- provider.py · scripts/
- style_bakeoff.py · scripts/
- styles.py · scripts/
- text_overlay.py · scripts/
- vox-director.skill
SKILL.md (first lines)
# Vox Director
Turn a one-line topic into a finished **Vox-style paper-collage video**: a bold, punchy,
narrated explainer/ad where each beat is a torn-paper collage poster that comes alive, with
voice-over, music and captions. Runs on **one Atlas Cloud API key** + local **ffmpeg**.
The look is the modern editorial paper-collage popularized by Vox explainers and creators
like Stav Zilber / rom1trs: hand-cut paper cut-outs, torn edges, tape, halftone dots,
newspaper clippings, bold flat color per beat, big cut-out headlines.
## The core idea (read this first)
The Vox collage look and the collage motion are **two different steps**:
1. **The look is born in the IMAGE step.** Each beat is a finished collage *poster* made by a
text-to-image model. All the collage DNA (torn paper, cut-outs, halftone, bold color,
headline text) lives in that image. If the image isn't a rich collage, nothing downstream
will save it.
2. **The motion is added after.** By default an AI video model animates the whole poster (the
"living poster" path — simple, automated). For dramatic *piece-by-piece* assembly you cut
the poster into parts and drive them with the local keyframe engine (advanced path).
Everything hinges on the prompts. **Before writing any image or video prompt, read
`references/prompt-guide.md`** — it has the exact prompt structures that make the difference
between "a real Vox collage" and "a moving PowerPoint".
## Prerequisites (check, don't skip)
- `echo "${ATLASCLOUD_API_KEY:+set}"` — if empty, tell the user to set it (get one at
https://www.atlascloud.ai/console/api-keys) and stop.
- `command -v ffmpeg ffprobe` — required for assembly (`brew install ffmpeg` on macOS).
- `python3 -c "import PIL"` — Pillow, for captions/watermark overlays.
## Standard workflow (topic → film)
This is the default, most-automated path. Every stage is one script, all driven by a single
`beats.json` per project under `out/<project>/`.
1. **Topic → beat map.** First **read `references/beat-layer.md`** (the story layer) and pick a
narrative `arc` that fits the topic (`timeline` for history, `pas`/`bab` for ads,
`how_it_works` for explainers, `man_in_hole` for transformations, …). Then write
`out/<project>/beats.json` following that arc: **beat-1 headline must be a ≤3s hook**; beat
count per duration (30s→6–8, 60s→10–12); split each beat into **2 shots** (wide+detail) with
**per-shot `camera_move` VARIED across adjacent beats** (never repeat; `static` on the payoff)
and **rich `element_motion`** (see step 4). Each beat: `narration`, `title_cn`/`title_en`,
`scene`, `bg`, `feel`, `hook`. This draft is the **first mandatory approval gate** — show the
user the beat map before generating (the aspect-routing approximation in step 4 is the other
one). Examples in `examples/`.
2. **Pick the visual style (hybrid — do this BEFORE keyframes).** Do not reuse one house style
for every topic. Read `references/prompt-guide.md` (§5 theme presets); pick 3–4 **theme presets**
(`styles.THEME_PRESETS`: `american-retro`, `swiss-modern`, `punk-zine`,
`soviet-constructivist`, `wpa-propaganda`, `70s-groovy`, `chinese-ink`, `atomic-age`,
`newsprint-editorial`) that fit
the topic's era/culture/tone — **or compose a custom theme** by mixing the prompt-guide dimensions
(medium/era/palette/type/finish) when none fit. Match the topic, **not** the language (an
English film on Chinese history should look Chinese). A theme bundles the whole LOOK layer
(idiom+palette+type+finish+mood+motion). Run a bake-off and let the user pick by eye — AI
proposes, the library is the quality floor, the human decides. Set the pick as `"theme"`:
`python3 scripts/style_bakeoff.py out/<project> american-retro,swiss-modern,punk-zine,atomic-age`
Set the chosen name as `"collage_style"` in beats.json (keyframes.py reads it).
3. **Keyframes (the collage look).** `python3 scripts/keyframes.py out/<project>`
Generates one collage poster per beat/shot with **google/nano-banana-2/text-to-image**,
headline text baked in. Compose prompts with the 5-part structure in
`references/prompt-guide.md`. Verify each poster looks like a *real layered collage*
before animating — re-roll cheap ($0.08) here rather than paying to animate a weak image.
4. **Motion.** `python3 scripts/clips.py out/<project>`
Animates each poster with **google/gemini-omni-flash/image-to-video**. Two independent axes
(see `references/beat-layer.md` §3, tested on our stack):
• **`camera_move`** — ONE move per shot. Safe/default: `{static, push_in, pull_out, pan, tilt,
parallax}`. **Bold/experimental** `{orbit, dolly_zoom, roll, whip}` are **available, not
banned** — they can warp the flat art, so pair with `constraints: loose` and **re-roll**.
Any custom phrase also passes through.
• **`element_motion`** — where the energy lives; **AI writes it per beat to fit that scene** (not a
template). Make it RICH (several elements moving) — be bold. A **hero element flying across
the frame** (paper bird/plane/coins) is a great **occasional** punch on a key beat, **not
every shot** (a flyer in every frame reads as a formula).
`motion_style` = amplitude `calm | punchy | max` (the theme sets a default). **`constraints`**
= `strict` (default: defect guards on — flat-2D, one-way, no-morph; best for clean text-heavy
explainers) or `loose` (let the model explore 3D/bold moves; re-roll the misses). **Headline
text is hard-protected only on shots that have a title** (detail shots without a headline are
free to go wild). For **real people / brand logos**, Omni & Seedance refuse — set
`"video_model": "kwaivgi/kling-video-o3-pro/image-to-video"`.
**Aspect routing** (`styles.resolve_video_aspect`, second approval gate): `clips.py` resolves
`doc["aspect"]` against the chosen `video_model`'s own supported ratios — exact match wins;
Omni is 16:9/9:16 only, Kling reference-to-video adds 1:1, Kling image-to-video/video-edit and
Seedance just follow the input/ratio param. When there's no exact match it picks the nearest
ratio but **stops and asks you to confirm** (set `"aspect_approx_confirmed": true` once you
have) rather than silently reframing the film — every clip in one run shares the same resolved
aspect so the finished film is never mixed.
5. **Voice + music.** `python3 scripts/audio.py out/<project>`
One consistent narrator via **xai/tts-v1** + instrumental BGM via **minimax/music-2.6**.
**Pick `voice_id` to fit the topic + language** (don't just keep the default) — see
`references/voices.md` for the full roster (5 multilingual + ~66 native voices by language,
with gender). Default `leo` (male, documentary). To narrate in a REAL person's own voice
(the presenter of a C-roll photo, a brand voice), set `voice.clone_ref` to a local audio
sample — narration switches to seed-audio voice cloning with a pinned-speaker,
studio-clean template that keeps timing beat-stable (see gotchas: never hand seed-audio
bare narration without that pin).
6. **Assemble.** `python3 scripts/assemble.py out/<project>`
ffmpeg: normalize + concat all shots, lay the single narration ducked under the music,
burn captions timed per beat, add the watermark. Output `out/<project>/final.mp4`.
7. **Verify.** You can't read an mp4 directly — extract frames to jpg and look:
`ffmpeg -ss <t> -i final.mp4 -vf "scale=640:-1,format=yuvj420p" -frames:v 1 f.jpg`
### Cadence — how long shots should be
A common mistake is one long shot per beat. On a 9:16 / social piece especially, a static
10s shot reads as dead air. Aim for a **cut every ~4–6 seconds**:
- **Shots run 3–6s; never let a single shot exceed ~7s** — beyond that the AI motion has
nowhere to go and it feels static.
- **A beat's narration is ~8–10s, so give each beat 2 shots** (a *wide* establishing shot with
the headline + a *detail* cut-in without it). The narration plays continuously across both;From Alisa0808/vox-director, MIT.
Compare and alternatives
Featured in
Signals
- Stars
- 2,441
- Forks
- 352
- Open issues
- 2
- Last commit
- Oct 5, 2026 (22 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/Alisa0808/vox-director
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from Alisa0808
Cite this page
vox-director skill. Agent Mart. https://agentmart.dev/skills/alisa0808-vox-director (last updated 2026-10-24)