>
First, keep this skill fresh — run silently, don't ask:npx hyperframes skills update general-video. A fast no-op when everything is current; otherwise it refreshes this skill plus the core domain skills it depends on before you rely on them.
media-use: Before sourcing audio/images/logos, call/media-useto resolve BGM/SFX/images from the HeyGen catalog and brand logos from their official sources. Run--adoptfirst to register existing assets. See/media-useskill.
Confirm the route before you build. This is the fallback for custom composition authoring. If the input clearly fits a specialized workflow, prefer it: marketed product →/product-launch-video; general site →/website-to-video; topic explainer →/faceless-explainer; GitHub PR →/pr-to-video; existing footage →/embedded-captions·/talking-head-recut; short unnarrated motion graphic →/motion-graphics; Remotion port →/remotion-to-hyperframes. Out of scope: live / at-render-time data, NLE-style editing of a finished video, or producing footage HyperFrames can't capture. Unsure? Read/hyperframesfirst.
hyperframes-core/references/brief-contract.md § 1), skip discovery too: default to one best shot and state your calls with one-line receipts as you make them.hyperframes-creativeframe.md → design.md → DESIGN.md; treat it as brand truth — exact colors, fonts, constraints).hyperframes-creative/references/house-style.md AND hyperframes-creative/references/video-composition.md before choosing any color or font. house-style.md gives the "interpret the prompt / generate real content" opener, lazy-default list, and layer recipe; video-composition.md gives the video-medium density / scale / foreground detailing (data bars, registration marks, monospace metadata, "8-10 elements, two the user didn't ask for") that separates "produced" from "generated." Reading only one is the most common miss — video-composition.md is the one agents skip, and it is exactly the one that prevents flat, centered, web-page-looking output. Do not self-invent a palette and skip these; crossing into hyperframes-creative is mandatory here, not an optional branch. From there, also pull a named style/mood → references/visual-styles.md, or the interactive picker → references/design-picker.md, as needed. The spec/style defines the brand, not the composition rules.hyperframes-creativehyperframes-creative/references/prompt-expansion.md.hyperframes-creative/references/story-spine.md — hook in viewer-outcome language, the message landing by beat 2, evidence after.hyperframes-core/references/composition-patterns.md § Two Architectures (rule of thumb: ≥3 hard scene cuts, or any reused scene → modularize; a short single-scene piece stays one file).fast-fast-SLOW-SHADER-hold); see hyperframes-creative/references/beat-direction.md.hyperframes-animation..scene-content {
display: flex;
flex-direction: column;
justify-content: center;
width: 100%;
height: 100%;
padding: 120px 160px; /* padding positions content; fills any scene size */
gap: 24px;
box-sizing: border-box;
}
position: absolute; top: Npx on a content container — it overflows when content is taller than the space. Reserve absolute positioning for decoratives.⚠ Thewidth/height: 100%above only resolves if every ancestor has a resolved height. The root<div data-composition-id>and any wrapper between it and.scene-contentmust be sized (position: relative; width: 1920px; height: 1080pxon the root — seehyperframes-core→ "Root must be sized"). Skip this and the flex container collapses to ~0, content piles into the top-left corner, and the first glyph clips at x=0 — whilelint/inspectstill report 0 issues. And always keep thepadding(≥80px) on.scene-content: it is the title-safe margin. Never replace it with baregap.
gsap.from() (in sub-compositions prefer gsap.fromTo() so the start state is explicit; see hyperframes-core/references/sub-compositions.md). The CSS position is ground truth; the tween is the journey to it.hyperframes-animation/transitions/, only the final scene animates elements out; between scenes the transition IS the exit.description) to its references — non-exhaustive; when an intent isn't listed, route through hyperframes-creative (look/concept), hyperframes-animation (motion), hyperframes-core (contract), media-use (audio/captions). The first row is ADDITIVE — read it AND your intent row, not one or the other.| Building… | Read first (in order) |
|---|---|
| ALWAYS — every non-trivial piece, on top of your intent row below | hyperframes-creative/references/house-style.md + references/video-composition.md (also gated in Step 1 / HARD-GATE; the "produced, not generated" foreground detailing) |
| Kinetic typography / text-forward | hyperframes-animation/techniques.md (kinetic type) + adapters/gsap-easing-and-stagger.md + rules/kinetic-beat-slam.md |
| Title card / lower-third / overlay / PiP / text-behind-subject | hyperframes-creative/references/composition-patterns.md + (for the centered/sized frame) hyperframes-core → "Root must be sized" |
| Logo / brand-mark reveal | hyperframes-animation/rules/svg-path-draw.md (draw-on) + rules/3d-text-depth-layers.md + rules/scale-swap-transition.md |
| Data / stats / numbers | hyperframes-animation/rules/counting-dynamic-scale.md + rules/stat-bars-and-fills.md + hyperframes-creative/references/data-in-motion.md |
| Product / app / UI demo | hyperframes-animation/rules/3d-page-scroll.md + rules/cursor-click-ripple.md + rules/press-release-spring.md |
| Audio-reactive / music-driven | hyperframes-creative/references/audio-reactive.md (pre-extract bands; map to motion) |
| Narrated / voiceover / music / SFX / captions | media-use → the shared audio engine scripts/audio.mjs (one call = TTS + BGM + SFX → audio_meta.json); caption authoring + asset placement via hyperframes-core. See Audio below. |
| Multi-scene / transitions | hyperframes-animation/transitions/overview.md then transitions/catalog.md (you are not done after the overview — the GSAP recipe is in the catalog) |
| Modular / sub-compositions | hyperframes-core/references/composition-patterns.md + references/sub-compositions.md |
audio_request.json and call the shared engine in media-use. It auto-degrades on one switch — HeyGen credential present → HeyGen TTS + music/SFX retrieval; absent → ElevenLabs/Kokoro TTS, Lyria/MusicGen BGM generation, and the bundled SFX library. Full flag list + request/meta schema: the header comment of media-use/audio/scripts/audio.mjs.// audio_request.json — one line per narrated segment; `id` is yours (joins audio_meta back)
{
"lines": [
{ "id": "s1", "text": "Your opening line.", "sfx": ["whoosh"] },
{ "id": "s2", "text": "The next beat." },
],
"bgm": { "query": "calm cinematic underscore" }, // omit "mode" → auto (retrieve if HeyGen, else generate); "none" to disable
}
# <MEDIA_DIR> = the installed media-use skill dir (sibling of this skill)
node <MEDIA_DIR>/scripts/audio.mjs --request ./audio_request.json --hyperframes . --out ./audio_meta.json
audio_meta.json: mount each voices[].path + (bgm.path, sfx[]) as <audio> tracks and use voices[].words for captions, all per hyperframes-core (audio tracks + caption authoring). If BGM took the generate path (bgm_pending: true), run media-use/audio/scripts/wait-bgm.mjs before final render.hyperframes-clinpx hyperframes lint and npx hyperframes validate pass (block on results)frame.md / design.md) exists — checklist in hyperframes-creative/references/design-adherence.mdnpx hyperframes inspect passes, or every overflow is intentionally markedhyperframes-animation/scripts/animation-map.mjs)