Why is my first HyperFrames video a still image?
A composition script that throws leaves the timeline unbuilt, and older HyperFrames versions waited 45 seconds, wrote the MP4 anyway and exited 0. Here is why that happens and how current versions fail instead.
sub_timeline_readiness_timeout
Someone follows the quickstart, starts from a shipped example, runs check and render, and gets a ten second MP4 that is a still image. This was reported against the shipped decision-tree example in version 0.8.2, and it is worth understanding even though that issue was closed on August 28, 2026, because the same failure shape can come from any composition you write.
What happened
The example's script read tl.labels["hold5"]. At render time tl.labels was undefined, so the script threw before the timeline was ever built. Two things then failed to fail:
checkexited 0 and printed "Check passed". Linting and the static checks looked at the HTML and found it valid.renderlogged the error, waited, wrote the MP4 and exited 0. The wait was 45 seconds: the producer polls for the composition's timeline, and when it never appears, it gives up after the readiness timeout and logssub_timeline_readiness_timeout.
The result was a ten second video containing two unique frames. In the reporter's words: a green check, a green render, and a still image. Anyone starting from the example hit it on the first render.
Why it matters beyond that example
An uncaught exception in a composition script is the most common way to end up here. Anything that runs at timeline-construction time and can throw will do it: reading a property off something that does not exist at render time, a typo in a selector helper, a library that did not load.
The fingerprint
- the render takes noticeably longer than it should, with a pause near 45 seconds;
- the log contains a JavaScript error followed by
sub_timeline_readiness_timeout; - the video is mostly or entirely static.
Fix
- Upgrade first. In the week of August 24, 2026, HyperFrames made a sub-composition script failure fail the render, and made a video extraction failure fail by default. On a current version, the error should stop the render and tell you.
- Read the render log from the top, not just the final line. The first JavaScript error is the cause; everything after it is fallout.
- Do not read from the timeline object at build time in ways that depend on render-time state.
tl.labelswas the one in the example. Compute positions as plain numbers in your own script instead. - Make construction synchronous. No
async,awaitorfetch()while the GSAP timeline is being built.
Check it worked
mkdir -p /tmp/frames
ffmpeg -v error -i renders/out.mp4 -vf fps=1 /tmp/frames/f%03d.png
md5 -q /tmp/frames/*.png | sort -u | wc -l
On Linux use md5sum instead of md5 -q. For a ten second animated video you expect close to ten distinct hashes. Two means it never moved.
You can also run npx hyperframes snapshot --at 0,5,9 before rendering and compare the three images by eye.
Press play before you export

A composition whose script threw is obvious the moment you press play in GenMotion's preview: nothing moves. The studio compiles the HyperFrames project on every change, the agent validates what it writes, and you scrub the real frames in the editor before any export, so a still image never has to be a surprise at the end.
Related answers
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 is my HyperFrames animation static?
If the render shows your elements frozen in their start state, HyperFrames almost certainly cannot find or seek your timeline. The timeline has to be paused and registered under the exact composition ID.
Why does every HyperFrames render take 45 seconds longer than it should?
A composition that never registers a GSAP timeline still makes the renderer wait for one, and gives up after a fixed 45 seconds. The cost is flat on every render. One attribute removes it.
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.
What does 'Composition HTML is empty or could not be parsed' mean in HyperFrames?
A data-composition-src that points at an empty, partial or missing file was the most common HyperFrames render failure in the project's own telemetry. Here is what the error means, what older versions did, and the fix.