Why does HyperFrames render my empty scaffold instead of my composition?
If check, snapshot and render all succeed but show a blank black video, you may have two entry files. HyperFrames opens the top-level index.html by default, and that may not be the one you wrote.
blank_root_with_standalone_composition
This one looked like a GSAP bug for a long time. A reporter saw black frames in check, snapshot, render and even the Studio preview, on Linux and on Windows and with several different Chrome binaries, with no error anywhere. The maintainers eventually found that the project contained two entry points:
- a top-level
index.html, the unchanged scaffold fromhyperframes init: ten seconds, a root calledmain, and no visible clips; compositions/index.html, the real five second animation the author had written.
Every default command correctly selected the top-level file, then reported success, because an empty scaffold is a perfectly valid composition.
What it means
Your authored composition is not the project's master. HyperFrames treats the top-level index.html as the master and everything under compositions/ as something that master has to mount.
How to tell
Run:
npx hyperframes compositions
If the duration or composition ID it reports is not the one you wrote (a 10 second main when you authored a 5 second card, for example), you are rendering the scaffold. Two other signs are a blank Studio canvas showing a main timeline, and a render exactly as long as the scaffold's default rather than your own.
Fix
Pick one:
- Make your composition the master. Move it into the top-level
index.html, or replace the scaffold's root with your own. - Mount it from the master. Keep it in
compositions/and add a host element inindex.html:
<div
data-composition-id="intro"
data-composition-src="compositions/intro.html"
data-start="0"
data-duration="5"
></div>
- Target it explicitly when you only want to render that file:
npx hyperframes render --composition compositions/index.html --output out.mp4
What changed in the tool
The linter now reports blank_root_with_standalone_composition when the default root has no renderable descendants and a timed standalone composition exists under compositions/. That finding blocks default render, snapshot and publish regardless of --strict or --yes, so you no longer get a blank video from this mistake on a current version. Authored masters and template-wrapped sub-compositions are excluded, and an explicit --composition render is unaffected.
Check it worked
npx hyperframes lint
npx hyperframes snapshot --at 0,2.5,4.5
The snapshot should show your content, not a dark stage. If it is still black, go back to the full list of black render causes.
A project that knows which file is the video

GenMotion scaffolds the HyperFrames project for you: index.html is the timeline, with one slot per scene, and each scene is its own file under scenes/. The studio previews and exports that same index.html, so you are never choosing a file to render and cannot render the wrong one by accident. How the HyperFrames engine works in GenMotion.
Related answers
Why is my HyperFrames render black?
A black HyperFrames video almost always has one of seven causes, from rendering the wrong entry file to a video clip with no timing of its own. Here is how to tell which one you have in a few minutes.
Why did HyperFrames check pass and render exit 0 when my video is wrong?
HyperFrames can produce a valid-looking MP4 from a composition that is structurally fine and visually wrong. Here is the class of bug, what has been fixed to fail loudly, and what to verify yourself.
Why does a HyperFrames render go black when I nest paused GSAP timelines?
Combining paused scene timelines with parent.add(child) makes the parent report a duration of 0 and leaves the children frozen at time zero. It is GSAP behaviour, not a regression, and lint and check do not catch it.
Sources
- hyperframes#3391: the original report
- hyperframes#3392: reject blank default composition entries
- HyperFrames weekly updates, week of August 17, 2026
This answer as plain Markdown, for agents: /answers/hyperframes-render-black-wrong-entry-file.md