Write talking-head scripts and produce Instagram reels and YouTube shorts
90
97%
Does it follow best practices?
Impact
64%
1.77xAverage score across 3 eval scenarios
Low
Low-risk findings worth noting
Run the preflight first, every session. It exits non-zero on a missing required
tool, and pipeline.py status blocks on the same check.
python3 scripts/check_deps.py --mode music-video # or --mode talking-head
python3 scripts/check_deps.py --json # for gating| Tool | Install | Without it |
|---|---|---|
| ffmpeg / ffprobe | brew install ffmpeg | nothing runs; every stage shells out to it |
.venv | python3 -m venv .venv | macOS refuses system pip (PEP 668) |
| librosa + soundfile | .venv/bin/pip install librosa soundfile | no beat detection (music-video only) |
An ffmpeg on PATH is not enough: builds differ in which filters and encoders
they carry (Homebrew bottles and CI runners drop libass, libzimg, libfreetype).
The preflight asks the build and reports each needed filter and encoder as
available, missing, or unknown when the listing could not be read — unknown is
never reported as either of the other two. The lists are FILTERS_REQUIRED,
FILTERS_OPTIONAL and ENCODERS_REQUIRED at the top of scripts/check_deps.py.
No recipe relies on drawtext; labels go through ImageMagick and captions
through subtitles (libass).
Never substitute silently. Name the loss and let the user choose.
| Missing | What is lost |
|---|---|
auto-editor | tighten_vo.py uses ffmpeg silencedetect. Measured equivalent (9.80s vs 9.87s from a 13s take) — still report which ran |
deepFilter | clean_audio.py uses afftdn. Audibly weaker on a noisy room; this is a real quality loss |
| Node 18+ | make_cards.py cannot run. Build cards as stills and let normalize_clips.py apply Ken Burns |
moviepy | no engine A/B; render_reel.py still renders normally |
yt-dlp | fetch_music.py cannot pull audio from a link |
mlx-whisper | no local transcription. Talking-head reels are watched muted, so captions are not optional there |
| Gemini API key | no hook-copy drafts, no stylized thumbnails |
| official D-Log LUT | the bundled LUT is DJI's whitepaper math, an approximation — not the exact per-model transform |
--bpm is not beat detection. It lays a fixed metronome grid and never
analyses the audio, so cuts land on clock ticks rather than on the track.
detect_beats.py warns, stamps "source": "fixed-grid" into beats.json, and
build_cut_plan.py repeats the warning. Never present such a plan as
beat-synced; if librosa is missing, install it rather than reaching for --bpm.
A camera-conversion LUT is not a grade. The bundled D-Log LUT applies only
to dlog-profile clips. On Rec.709 footage it crushes blacks and pushes colour
out of gamut.
Scripts record what actually ran, so a substitution cannot hide in the output:
beats.json → source: librosa | fixed-grid | absent (unrecorded)tighten_vo.py, clean_audio.py → engine, engine_requested, substitutedCheck these before reporting a result, and tell the user which engine produced the file they are about to approve.
.tessl-plugin
skills
reel-builder
assets
references
scripts
yap-writer