Point it to the course site and generate videos at three levels β overview, tracks, and in-depth lessons by module β in INEMAβs premium dark amber style, with local narration and a CTA for INEMA.CLUB.
scene illus Β· inemavox narration Β· captions at the bottom
The engine (engine.mjs) already includes the style, animations, and scene types. Day to day, you only write the specs for each video β the rest is the pipeline.
An overview video β the course landing page and tracks (what it is, numbers, the N tracks). ~45β60s, rachel voice.
One video per track showing modules and topics; an intro for each module is optional. Trailer/roadmap level. ~30β90s, rachel voice.
An in-depth lesson per module (covers the ~6 topics), richly illustrated with SVGs. ~3β4 min, bella voice.
β οΈ The in-depth lesson is per module, not per topic: 6 tracks Γ 6 modules = 36 deep-dive videos, not 216.
The narration is generated first; the build.mjs reads the duration real for each WAV file and syncs animation and captions. To change the voice, you only change the TTS step β everything else stays identical.
Cloned voice narration (inemavox / Chatterbox-VC) running on 127.0.0.1. Costs nothing and pronounces English terms well within PT-BR.
The generated HTML is a HyperFrames composition with a paused GSAP timeline β rendered to MP4 in 16:9 or 9:16.
title Β· topic Β· lead Β· bullets Β· cards Β· steps Β· term Β· compare Β· illus (SVG) Β· cta. The last one is always the INEMA.CLUB CTA.
The repo includes the installable skill videos-cursos-inema in skills/videos-cursos-inema/ β it teaches the agent to extract the course, write the specs, and run the pipeline. Copy to ~/.claude/skills/ and invoke with /videos-cursos-inema.
Everything runs locally. The only external service is the voice daemon, which runs on 127.0.0.1.
Node 18+ (native fetch, ESM) and FFmpeg with ffmpeg/ffprobe on the PATH.
# check node -v && ffprobe -version
CLI via npx (version pinned in package.json). Check the environment.
# diagnostics npx hyperframes doctor
inemavox daemon running and local sources generated once.
# voice curl 127.0.0.1:7860/health # sources node fetch-fonts.mjs
Each video is an entry in the object VIDEOS (in specs.mjs for Parts 1β2, specs-deep.mjs for Part 3). The ID always starts with the course slug, e.g., fep-deep-t1-m1.
Copy the skeleton and fill in the scenes. The last scene is always cta.
cp assets/spec-template.mjs specs.mjs # edit the VIDEOS object
Generates the text files for each scene from the field narration.
node write-txt.mjs <id> # -> assets/txt/<id>-sN.txt
Calls the voice daemon and saves the WAVs. Use bella (default) or rachel for Parts 1β2.
node tts-inemavox.mjs <id> bella # -> assets/audio/<id>-sN.wav
Reads the actual WAV durations and writes the index.html. No flag = 16:9; --vertical = 9:16.
node build.mjs <id> # 16:9 node build.mjs <id> --vertical # 9:16 (Shorts/Reels)
Lint must report 0 errors. Check 1 frame per scene before the final render β renders take a long time, so run them in the background.
npx hyperframes lint npx hyperframes render --quality high --output renders/<id>.mp4
The defaults cover the common case; each component can be swapped without changing the rest of the pipeline.