| name | parallax |
| description | Use when operating the Parallax CLI to produce AI-generated short-form videos. Covers project setup, brief authoring, the plan→produce loop, asset locking, model selection, and cost management. |
| version | 0.5.34 |
Parallax CLI — Operator Skill
Version: 0.5.34 — run parallax --version on load. If the installed version is higher, warn the user that the skill may be behind and suggest running parallax update to check the changelog.
Agentic creative production CLI. A brief.yaml goes in; a finished short-form video comes out — stills, voiceover, animated clips, captions, all routed through OpenRouter.
Install check:
parallax --version
parallax update
Required env var:
export OPENROUTER_API_KEY=sk-or-...
Core loop
Two artifacts drive every project:
brief.yaml — human spec. Author once; edit between iterations.
plan.yaml — engine spec. Generated by parallax plan; edit to lock assets.
brief.yaml → parallax plan → plan.yaml → parallax produce → output/vN/video.mp4
One-shot (plan + produce in one command):
parallax produce --folder ./my-project --brief ./my-project/brief.yaml
Two-step (inspect/edit the plan before spending):
parallax plan --folder ./my-project --brief ./my-project/brief.yaml
parallax produce --folder ./my-project --plan ./my-project/parallax/scratch/plan.yaml
Non-interactive (skip confirmation prompt — required for sub-agents):
parallax produce --folder ./my-project --brief ./my-project/brief.yaml -y
Resolution override (sets both output and animate resolution):
parallax produce --folder ./my-project --brief ./my-project/brief.yaml --resolution 480x854
parallax plan --folder ./my-project --brief ./my-project/brief.yaml --resolution 480x854
Validate without spending:
parallax validate --folder ./my-project --brief ./my-project/brief.yaml
Paths: Always use absolute paths for --folder. Never construct paths relative to $PWD inside a worktree — it resolves by accident and breaks. Use the repo-root sandbox: /Users/ianburke/Documents/GitHub/parallax-v0/sandbox/<project>. Paths with spaces must be quoted.
brief.yaml format
goal: "30-second direct-response ad"
aspect: "9:16"
voice: Fenrir
voice_speed: 1.1
animate_resolution: null
pronunciations:
Tongkat Ali: tongkat ali
success_criteria:
- "All scenes use consistent character"
script:
scenes:
- index: 0
shot_type: broll
vo_text: "[rapidly] Hook line here."
prompt: "Cinematic shot of..."
- index: 1
shot_type: character
vo_text: "[dramatically] Second beat."
prompt: "Close-up of..."
animate: true
motion_prompt: "Slow zoom in"
aspect: null
Per-scene reference images — pass one or more images as generation references for a specific scene:
script:
scenes:
- index: 0
shot_type: broll
vo_text: "..."
prompt: "..."
image_refs:
- brand/product.png
- brand/product_alt.png
Character consistency — set character_reference: true at the brief level so every shot_type: character scene automatically uses character_image as its reference during still generation:
character_reference: true
assets:
provided:
- path: brand/founder.png
kind: character_ref
Providing existing footage — add to assets.provided; reference in scenes via prompt:
assets:
provided:
- path: brand/product.mp4
kind: product_ref
description: "Existing product footage"
clip_path and still_path are plan.yaml fields (asset locks set after the first run), not brief fields.
plan.yaml — production settings
Model, caption, and transition settings live in plan.yaml (not brief.yaml). Set them before running parallax produce:
voice_model: tts-mini
image_model: grok-image
video_model: mid
caption_style: bangers
fontsize: 55
words_per_chunk: smart
caption_shift_s: 0.0
default_transition: null
default_transition_duration_s: 0.5
stills_only: false
trim_pauses: true
style: null
style_hint: null
resolution: null
animate_resolution: null
headline: null
headline_fontsize: null
headline_bg: null
headline_color: null
captions: null
caption_animation: null
titles: null
avatar: null
voice_postprocess: null
plan.yaml — asset locking
After a run, output/vN/plan.yaml is a read-only snapshot. The working plan is parallax/plan.yaml (or wherever you pointed --plan). Lock approved assets so only changed scenes regenerate:
- index: 0
still_path: parallax/output/v1/stills/openrouter_mid_1234567_n1080x1920.png
vo_text: "..."
- index: 1
audio_path: parallax/output/v1/audio/voiceover.wav
words_path: parallax/output/v1/audio/vo_words.json
vo_text: "..."
- index: 2
clip_path: parallax/output/v1/video/openrouter_kling_1234567.mp4
vo_text: "..."
- index: 3
reference: true
reference_images:
- brand/hero.png
vo_text: "..."
Re-run to regenerate only unlocked scenes:
parallax produce --folder ./my-project --plan ./my-project/parallax/plan.yaml
Models
parallax models list
parallax models show mid --kind image
parallax models show tts-gemini
Image:
| Alias | Cost | Notes |
|---|
grok-image | ~$0.05/img | Recommended. xAI Grok Imagine. Strong ref fidelity, all aspects |
draft | $0.039/img | Gemini 2.5 Flash. Sometimes ignores non-square aspect ratios — prefer mid or grok-image for 9:16/16:9 |
mid | $0.039/img | Gemini 3.1 Flash. Honors aspect natively |
premium | $0.080/img | Gemini 3 Pro. Best Gemini fidelity |
nano-banana | $0.039/img | Gemini 2.5 Flash. Multi-ref compositing |
gemini-3-flash | $0.039/img | Gemini 3.1 Flash. Same as mid |
gemini-3-pro | $0.080/img | Gemini 3 Pro. Same as premium |
Video:
| Alias | Cost | Notes |
|---|
mid / grok-video | ~$0.05/s | Recommended. xAI Grok Imagine Video. 480p/720p. Strong prompt adherence |
draft | $0.054/s | Seedance 2.0 Fast. $0.054/s at 480p, $0.121/s at 720p, $0.272/s at 1080p |
premium | $0.400/s | Veo 3.1. $0.40/s 1080p w/ audio, $0.20/s w/o, $0.60/s 4K |
wan | $0.100/s | Wan 2.7. Open-weights baseline. Flat $0.10/s |
sora | $0.500/s | OpenAI Sora 2 Pro. Text-to-video only. $0.30/s 720p, $0.50/s 1080p |
TTS:
| Alias | Notes |
|---|
tts-mini | Default. OpenAI gpt-audio-mini. Strips [emotional] tags |
tts-gemini | Expressive. Supports inline [emotional] tags: [dramatically], [rapidly], [excitedly], [softly], [whispering] |
Voices (tts-gemini):
- Dramatic:
Fenrir (excitable), Kore (firm), Charon (informative), Puck (upbeat)
- Warm:
Aoede (breezy), Sulafat (warm), Achird (friendly), Sadaltager (knowledgeable)
- Soft:
Achernar (soft), Enceladus (breathy), Vindemiatrix (gentle)
Default voice: nova
Standalone commands
parallax image generate "prompt" --aspect 9:16 --model grok-image
parallax image generate "prompt" --ref ./face.png
parallax image generate "prompt" --size 480x854
parallax image analyze ./frame.png "color palette?"
parallax audio voiceover --text "Hello world" --out /tmp/vo.mp3 --voice Fenrir --voice-model tts-gemini
parallax audio voiceover --text "Hello world" --out /tmp/vo.mp3 --speed 1.2
parallax video animate --prompt "Slow zoom in" --start ./frame.png --model mid --out ./clip.mp4
parallax video animate --prompt "Motion" --ref ./ref.png --duration 5
parallax audio transcribe ./clip.mp4
parallax audio detect-silences ./clip.mp4
parallax audio trim ./clip.mp4 --start 1.5 --end 8.0
parallax audio cap-pauses
parallax audio pad-onsets
parallax audio speed ./clip.mp3 --rate 1.2
parallax video frame ./clip.mp4 --at 2.5
parallax video color ./clip.mp4
parallax ingest ./clips/
parallax ingest video.mov --estimate
parallax credits
parallax usage
parallax log latest
parallax log list
parallax validate --folder ./project --brief ./project/brief.yaml
parallax validate --folder ./project --plan ./project/parallax/plan.yaml
parallax schema
parallax schema brief
parallax schema plan
parallax verify run
parallax verify scaffold <case-name>
Dry run (no spend)
PARALLAX_TEST_MODE=1 parallax produce --folder ./my-project --brief ./my-project/brief.yaml
Full pipeline runs end-to-end with stub assets. Use to validate brief structure before spending.
Output layout
my-project/
brief.yaml
parallax/
plan.yaml ← working plan (edit between iterations)
scratch/
plan.yaml ← landing zone for `parallax plan` output
output/
v1/
project-v1-<hash>.mp4
plan.yaml ← snapshot — do not edit
manifest.yaml
cost.json
run.log
stills/
audio/
video/
v2/
...
Rules