hyperframes (heygen-com/hyperframes)
HyperFrames skill: same video quality as no skill, but 1.9x the tokens and a more editable project structure
19.9 / 30
Lift over no skill: -0.01
Situational: the total 19.9/30 is under 22 and the lift -0.01 is under +1.0. Recommended needs a total of 22/30, output quality of 3.5, and a lift of +1.0.
SOTA
PassTested with Codex.
Covers Codex, Claude Code
Codex CLI 0.166 (SOTA tier): 18 graded runs. A pass here also covers Claude Code under our tier rule; it says nothing about the second tier.
Scores
Each dimension is 0 to 5 and the six add up to the total out of 30. 5 is better on every dimension. Cost 5 means cheap and fast. Install 5 means easy.
- Trigger reliability
- 5.0
- Lift over no skill
- 2.0
- Output quality
- 4.9
- Token and time cost
- 2.0
- Install and portability
- 3.0
- Safety
- 3.0
Security review
CautionStatic scan: 27 CRITICAL / 26 HIGH / 88 MEDIUM. Manual review: safe to run (no-network sandbox). A clean scan does not prove a skill safe.
Install
npx skills@latest add heygen-com/hyperframes --skill hyperframes
Pinned commit: af0d68d612ebd9c419f27d9ebc8068512667bae4
Tested: 2026-11-02
What we tested
- 15 s product teaser — In this HyperFrames project (index.html root composition, GSAP timeline, rendered by npx hyperframes render) build a 15-second, 1920x1080, 30 fps product teaser for Tidepool, a monthly seaweed-snack subscription. Required on-screen text: the name 'Tidepool',…
- 20 s animated bar-chart explainer — In this HyperFrames project (index.html root composition, GSAP timeline, rendered by npx hyperframes render) build a 20-second, 1920x1080, 30 fps animated explainer: a bar chart of monthly revenue (Aug $42k, Sep $58k, Oct $71k). Title 'Revenue, last 3 months…
- 30 s vertical captioned short — In this HyperFrames project (index.html root composition, GSAP timeline, rendered by npx hyperframes render) build a 30-second vertical 1080x1920, 30 fps social short with burned-in captions. Captions, in order, each on screen for about 5 seconds starting at…
Pros
- The skill was picked up without being named: Skill file read in 6/6 treatment runs.
- High absolute quality with the skill: 4.89 out of 5.
Cons
- No measurable lift over no skill (-0.01, inside the noise).
- A one-sentence prompt scored 4.91, against 4.89 with the skill (-0.01).
- Uses 1.95x the tokens of no skill.
- The control already scores 4.9: a ceiling effect, so the test cannot show a lift.
- Test caveat: Scores the skill's guidance only: the hyperframes CLI loop (check, preview, render) was not available in the sandbox. The CLI is a separate npm package we did not audit or run, and it sends usage telemetry unless disabled. The sibling skills hyperframes-core and hyperframes-animation were tested at the older commit 207c8a4; this one at af0d68d.
- n=2 per task per arm; differences under about 1 point are noise.
Review
Codex CLI 0.166 (gpt-6-astra, low reasoning) on a Mac test machine, a fresh temporary project and temporary HOME/TMPDIR/caches per run, skill installed (treatment) or absent (control) or absent with the skill's core requirement squeezed into one sentence appended to the prompt (one-liner group), 2 runs per group per task, network off, /tmp writes blocked. The prompts never mention the skill (except the wording noted below). Environment: the project template (index.html with the GSAP script tag, composition metadata) is the same for all groups. The sandbox has no network and no HyperFrames CLI, so none of the groups could run check, snapshot or render; they wrote source only. We then rendered every project on a separate offline machine with the pinned HyperFrames 0.8.226 (draft quality). This tests the skill's text, not its CLI loop.
Three-arm comparison
| Arm | Mean score (0-5) | Tokens per run |
|---|---|---|
| Without the skill | 4.9 | 128k |
| One-sentence prompt | 4.91 | 150k |
| With the skill | 4.89 | 249k |
Measured with Codex CLI over 18 runs, scored by rule-based checks with no LLM judge. Total 19.9 / 30, verdict Situational.
Disclosure: Scores the skill's guidance only: the hyperframes CLI loop (check, preview, render) was not available in the sandbox. The CLI is a separate npm package we did not audit or run, and it sends usage telemetry unless disabled. The sibling skills hyperframes-core and hyperframes-animation were tested at the older commit 207c8a4; this one at af0d68d.
Verdict: Situational (19.9 / 30). Source: heygen-com/hyperframes, skills/hyperframes, pinned at commit af0d68d. Install: npx skills@latest add heygen-com/hyperframes --skill hyperframes. Licence: Apache-2.0.
What it is
The hyperframes skill from heygen-com/hyperframes (Apache-2.0): a 1,100-word SKILL.md plus ~25 reference files and a few helper scripts, for making videos as HTML that is rendered to MP4 by seeking a paused GSAP timeline frame by frame. It sets a 12-rule render contract (every timed element is class="clip" with data-start/data-duration, one paused timeline registered on window.__timelines, nothing non-deterministic), an editable structure (one scene per sub-composition) and a work loop built around the npx hyperframes CLI (check, snapshot, preview, render).
How we tested
Codex CLI 0.166 (gpt-6-astra, low reasoning) on a Mac test machine, a fresh temporary project and temporary HOME/TMPDIR/caches per run, skill installed (treatment) or absent (control) or absent with the skill's core requirement squeezed into one sentence appended to the prompt (one-liner group), 2 runs per group per task, network off, /tmp writes blocked. The prompts never mention the skill (except the wording noted below).
Environment: the project template (index.html with the GSAP script tag, composition metadata) is the same for all groups. The sandbox has no network and no HyperFrames CLI, so none of the groups could run check, snapshot or render; they wrote source only. We then rendered every project on a separate offline machine with the pinned HyperFrames 0.8.226 (draft quality). This tests the skill's text, not its CLI loop.
- 15 s product teaser — In this HyperFrames project (index.html root composition, GSAP timeline, rendered by
npx hyperframes render) build a 15-second, 1920x1080, 30 fps product teaser for Tidepool, a monthly seaweed-snack subscription. Required on-screen text: the name 'Tidepool',… - 20 s animated bar-chart explainer — In this HyperFrames project (index.html root composition, GSAP timeline, rendered by
npx hyperframes render) build a 20-second, 1920x1080, 30 fps animated explainer: a bar chart of monthly revenue (Aug $42k, Sep $58k, Oct $71k). Title 'Revenue, last 3 months… - 30 s vertical captioned short — In this HyperFrames project (index.html root composition, GSAP timeline, rendered by
npx hyperframes render) build a 30-second vertical 1080x1920, 30 fps social short with burned-in captions. Captions, in order, each on screen for about 5 seconds starting at…
Scoring is programmatic (hidden tests / planted-issue recall / constraint checks / render+OCR where relevant), 0–5 per run. No LLM judge decided any score.
Results
The one-liner given to the third group: "Build it as a HyperFrames HTML composition: a root with data-composition-id/data-width/data-height/data-duration, every timed element given class="clip" plus data-start and data-duration in seconds, one paused GSAP timeline registered as window.__timelines["<composition-id>"], and nothing non-deterministic (no Date.now(), unseeded Math.random(), timers, network or repeat:-1)."
| Task | Control score | One-liner | With skill | Control tokens | One-liner tokens | With-skill tokens | Skill read |
|---|---|---|---|---|---|---|---|
| t1-teaser | 5.0 | 5.0 | 4.97 | 140k | 173k | 364k | 2/2 |
| t2-chart | 4.71 | 4.72 | 4.71 | 125k | 116k | 184k | 2/2 |
| t3-vertical | 5.0 | 5.0 | 5.0 | 117k | 158k | 197k | 2/2 |
Mean score: 4.9 without vs 4.89 with the skill (delta -0.01). Tokens per run: 128k vs 249k (1.95x); time 154s vs 208s. One-liner group: 4.91 (the skill's gain over the one-liner: -0.01; one-liner's own gain over no skill: +0.0); one-liner tokens 150k per run, so the skill costs 1.67x the one-liner.
What happened
- Video quality was the same. All 18 projects rendered to the right size, length and frame rate on the first try, and the required text (name, tagline, $14 / box, closing line, captions) was found on screen by OCR in every run that should have had it. Mean score 4.90 without the skill, 4.91 with only the one-line version of its rules, 4.89 with the skill. The only points lost, in all three groups, come from the bar-chart explainer holding still for long stretches (frames with motion 15-23%).
- The one-line version did as well as the skill. Giving the control agent a single sentence of the contract (clip class, data-start/data-duration, one paused timeline, no non-deterministic code) produced the same scores and the same look: we viewed contact sheets of the teaser, chart and vertical short from all three groups and could not rank them by quality.
- The skill is read every time (6/6 treatment runs) but changes how the project is built rather than how it looks. All 6 skill runs split the film into sub-compositions (compositions/*.html, one per scene) as its 'keep it editable' section asks; 0 of 12 runs without the skill did. Marking timed elements as
clips varied by group, not by skill: the no-skill runs used 0-6 per project, the skill runs 1-9, and the one-liner runs 3-25. That is the part of the skill that matters if a person will open the project in HyperFrames Studio afterwards, and it is not scored here. - It costs a lot. 249k tokens per run against 128k without the skill (1.94x) and 150k with the one-liner (1.66x), 15 commands per run against 8, and about 35% more time. The agent reads SKILL.md and several reference files first, and in autonomous mode it still writes
SPEC.md,REVIEW.mdand a README that nobody asked for (4.7 files per run against 1). - Part of the skill could not run. SKILL.md's loop is check, snapshot, review, then render; with no CLI available the agents fell back to hand-written REVIEW.md files. A setup where the CLI works could show a different result, and might catch errors the first-pass projects here did not have.
Dimension scores
| Dimension | Score | Why |
|---|---|---|
| 1_output_quality | 4.89 | Mean score 4.89/5 with the skill (programmatic checks, see per-task table). |
| 2_lift_vs_no_skill | 1.99 | -0.01 points vs 4.90 without the skill (n=2 per task; under ~1 point is noise). |
| 3_trigger | 5.0 | Skill file read in 6/6 treatment runs. |
| 4_instructions_portability | 3 | Relies on the |
| 5_efficiency | 2 | 1.95x tokens (249k vs 128k per run) and 1.35x time (208s vs 154s). |
| 6_safety_hygiene | 3 | Text and scripts reviewed: only |
Limits of this test
- The CLI loop (check, snapshot, preview, render) was not available in the sandbox, so this scores the skill's guidance only; the skill's own premise is that the CLI closes the loop.
- Three tasks: a product teaser, a three-bar chart and a vertical captioned short, all drawn in code. Footage, audio, maps, registry blocks and the HeyGen-based media features were not tested.
- Draft-quality renders on a Linux machine; the check for motion is a crude frame-difference threshold and the same chart task loses points in every group.
- The structural counts (sub-compositions, clip elements) come from reading the source files and are not part of the 0-30 score.
- Licence is Apache-2.0, but the CLI the skill relies on is a separate npm package we did not audit or run on the test computer; it sends usage telemetry unless disabled.
- n = 2 per group per task: differences under about 1 point are noise.
- Rule-based scoring measures what the checks can see; it cannot judge taste or whether a result is the best possible.
Security
See security.md. Scan: 27 CRITICAL / 26 HIGH / 88 MEDIUM. Verdict: safe to run (no-network sandbox). A clean scan does not prove a skill safe.
Bottom line
For one-off code-drawn videos in this sandbox, the skill did not make the videos any better and cost about double the tokens; one sentence of its contract did the same job. Its value is in the project structure (scene per sub-composition, marked clips) for people who will keep editing in HyperFrames Studio, and in the CLI loop we could not exercise. Install it if you work in HyperFrames regularly; skip it for quick throwaway renders.
Transcript
Run log for hyperframes: Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run. Columns: task, arm-run, score (0-5), tokens, seconds, checks passed, skill files the agent opened. t1-teaser control-1: score 5.0, tokens 158742, secs 258.0, checks 5/5, opened nothing t1-teaser control-2: score 5.0, tokens 122491, secs 163.4, checks 5/5, opened nothing t1-teaser oneliner-1: score 5.0, tokens 194827, secs 274.5, checks 5/5, opened nothing t1-teaser oneliner-2: score 5.0, tokens 151350, secs 215.4, checks 5/5, opened nothing t1-teaser treatment-1: score 4.94, tokens 359882, secs 360.9, checks 5/5, opened hyperframes t1-teaser treatment-2: score 5.0, tokens 370088, secs 251.3, checks 5/5, opened hyperframes t2-chart control-1: score 4.73, tokens 159545, secs 126.0, checks 4/5, opened nothing t2-chart control-2: score 4.69, tokens 91764, secs 107.4, checks 4/5, opened nothing t2-chart oneliner-1: score 4.74, tokens 118117, secs 146.0, checks 4/5, opened nothing
18 runs, 21 artifacts
Sample output
SOTA · With the skill: compositions/arrival.html (t1-teaser, run 1, Codex)
<template> <style>*{box-sizing:border-box}#root{position:absolute;inset:0;font-family:Arial,Helvetica,sans-serif;color:#173E32}.stage,.artboard{position:absolute;inset:0;width:1920px;height:1080px;overflow:hidden}.artboard{background:#F5F0DF}h1,h2,p{margin:0}.eyebrow{font-size:24px;font-weight:700;letter-spacing:4px;text-transform:uppercase}.rule{height:2px;background:currentColor;opacity:.3}.pouch{position:absolute;width:470px;height:650px}.pouch svg{width:100%;height:100%}.wipe{position:absolute;z-index:20}.serial{position:absolute;left:192px;top:930px;font-size:22px;letter-spacing:3px}.wordmark{font-weight:900;letter-spacing:-8px}.chip{position:absolute;width:400px;height:472px}.chip svg{width:100%;height:100%} </style> <div id="root" data-composition-id="arrival" data-width="1920" data-height="1080" data-duration="5"> <div id="arrival-stage" class="clip stage" data-start="0" data-duration="5" data-track-index="0" data-track-kind="graphics"><div class="artboard"> <svg id="arrival-rings" width="1920" height="1080" style="position:absolute" aria-hidden="true"><g fill="none" stroke="#173E32" stroke-width="2" opacity=".16"><ellipse cx="1450" cy="530" rx="335" ry="335"/><ellipse cx="1450" cy="530" rx="445" ry="445"/><ellipse cx="1450" cy="530" rx="560" ry="560"/></g></svg> <div id="arrival-kicker" class="eyebrow" style="position:absolute;left:192px;top:202px">Meet your monthly ocean fix</div> <div style="position:absolute;left:192px;top:299px;overflow:hidden;width:1000px;height:220px"><h1 id="arrival-title" class="wordmark" data-var-text="brand" style="font-size:192px;line-height:1.1">Tidepool</h1></div> <p id="arrival-copy" data-var-text="tagline" style="position:absolute;left:194px;top:555px;width:820px;font-size:48px;line-height:1.25;letter-spacing:-1px">Crisp seaweed snacks, delivered monthly</p> <div id="arrival-rule" class="rule" style="position:absolute;left:194px;top:750px;width:710px"></div> <p id="arrival-note" style="position:absolute;left:194px;top:785px;font-size:24px;letter-spacing:2px">FROM THE SEA. TO YOUR SNACK DRAWER.</p> <div id="arrival-pouch" class="pouch" style="left:1190px;top:201px"><svg viewBox="0 0 470 650" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Illustrated Tidepool seaweed snack pouch"><defs><linearGradient id="a-foil" x1="0" x2="1"><stop stop-color="#BACA99"/><stop offset=".12" stop-color="#E3E8BC"/><stop offset=".7" stop-color="#D7DFAE"/><stop offset="1" stop-color="#AABA8C"/></linearGradient><pattern id="a-seal" width="8" height="8" patternUnits="userSpaceOnUse"><path d="M0 0V8" stroke="#173E32" opacity=".2" stroke-width="2"/></pattern></defs><path d="M40 15Q235 0 430 15L420 68Q436 350 445 605Q235 640 25 605L48 68Z" fill="url(#a-foil)" stroke="#173E32" stroke-width="3"/><path d="M40 15Q235 0 430 15L425 50H44Z" fill="url(#a-seal)"/><path d="M30 580Q235 600 441 580L445 605Q235 640 25 605Z" fill="url(#a-seal)"/><path d="M48 68H420" stroke="#173E32" stroke-width="3" opacity=".4"/><path d="M64 82L47 565M405 80L423 564" stroke="#FFFBE2" stroke-width="4" opacity=".6"/><text x="235" y="157" text-anchor="middle" fill="#173E32" font-family="Arial, sans-serif" font-size="71" font-weight="900" letter-spacin [... excerpt: first 3200 of 5490 characters]