PTENES
Video engine Β· HTML β†’ MP4 Β· INEMA

An INEMA course becomes a video series narrated and animated.

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.

fep-deep-t1-m1.mp4 Β· 16:9 Β· ~3m
● MODULE 1 Β· TOPIC 3
What is a LLM

scene illus Β· inemavox narration Β· captions at the bottom

CONTINUED IN
INEMA.CLUB
What it is

Three video levels from the same course

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.

PART 1

🎯 Landing page

An overview video β€” the course landing page and tracks (what it is, numbers, the N tracks). ~45–60s, rachel voice.

PART 2

πŸ—ΊοΈ Learning paths

One video per track showing modules and topics; an intro for each module is optional. Trailer/roadmap level. ~30–90s, rachel voice.

PART 3

πŸ“š Full content

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.

How it works

Deterministic pipeline, with timing driven by the audio

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.

Extracts the course→ Writes specs→ write-txt→ tts (inemavox)→ build→ lint→ render → MP4

πŸŽ™οΈ Local voice

Cloned voice narration (inemavox / Chatterbox-VC) running on 127.0.0.1. Costs nothing and pronounces English terms well within PT-BR.

🎞️ HyperFrames

The generated HTML is a HyperFrames composition with a paused GSAP timeline β€” rendered to MP4 in 16:9 or 9:16.

🧱 Scene types

title Β· topic Β· lead Β· bullets Β· cards Β· steps Β· term Β· compare Β· illus (SVG) Β· cta. The last one is always the INEMA.CLUB CTA.

🧩 Skill-directed (Claude Code)

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.

Prerequisites

What needs to be ready

Everything runs locally. The only external service is the voice daemon, which runs on 127.0.0.1.

Node + FFmpeg

Node 18+ (native fetch, ESM) and FFmpeg with ffmpeg/ffprobe on the PATH.

# check
node -v && ffprobe -version

HyperFrames

CLI via npx (version pinned in package.json). Check the environment.

# diagnostics
npx hyperframes doctor

Voice + fonts

inemavox daemon running and local sources generated once.

# voice
curl 127.0.0.1:7860/health
# sources
node fetch-fonts.mjs
User guide Β· step by step

Generate a video, from spec to MP4

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.

1

Write the scene spec

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
2

Extract the narrations

Generates the text files for each scene from the field narration.

node write-txt.mjs <id>  # -> assets/txt/<id>-sN.txt
3

Generate the narration

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
4

Build the composition

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)
5

Validate and render

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
Voices & formats

Configurable per project

The defaults cover the common case; each component can be swapped without changing the rest of the pipeline.

Voice
inemavox (local, cloned) β€” defaultbella (default) and rachel. Alternatives: Kokoro (local, free: pf_dora/pm_alex) and ElevenLabs (cloud, requires a key β€” documented in references/vozes.md).
Format
16:9 (default) Β· 9:16 Β· bothbuild.mjs flag. For both, generate both and render them to separate files (<id>-16x9.mp4 / <id>-9x16.mp4).
Style
INEMA premium dark amberbg #0D1321, amber accent #FFC300, local Sora/Inter/JetBrains fonts. Glow, ghost text, grid, grain, and progress bar are already in engine.mjs.