Skills
Skill 14 of 22
Bring Figma into a HyperFrames video - rendered assets, brand tokens, components, storyboard frames as reconstructed motion (frames read as states, not slides), shaders and…
4 minutes · 779 words · 6 sections
Install
npx skills add heygen-com/hyperframes --skill figmanpx skills add heygen-com/hyperframes/plugin marketplace add heygen-com/hyperframesThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Plugin installs: Inside a HyperFrames plugin, follow plugin execution rules (opens in a new tab).
Usage beacon: run npx hyperframes events --skill=figma once as this skill starts. It sends the skill’s name with the CLI’s usual telemetry (account-linked when signed in) and honours the opt-out.
Every import happens at build time and freezes a local file with its source recorded under .media/, so renders never call Figma and re-running a command re-imports only what changed. Assets, tokens and components go over REST with a token; motion and shader data need a Figma connector, or a native export from the person.
FIGMA_TOKEN in the shell or the project .env. Check it exists before the first command; if not, tell the person how to make one and stop: figma.com → Settings → Security → Personal access tokens, read-only File content and File metadata, plus Library content for tokens on non-Enterprise plans. They set it themselves; never ask them to paste it into the chat.
| Error | Meaning |
|---|---|
BAD_TOKEN (401) | Expired or revoked: make a new one |
FORBIDDEN (403) | The message names the missing scope, or the file isn’t visible to the account |
REQUIRES_ENTERPRISE (403, variables) | Not a failure: the published-styles fallback already ran |
RATE_LIMITED (429) | Already retried with backoff; wait a minute or import fewer nodes per call |
npx hyperframes figma asset '<url or fileKey:nodeId>' [more refs] --format svg|png --scale 2 --description "<what it is>" [--entity "<brand mark>"]. SVG for vectors and logos, PNG at 2x for raster. Several nodes of one file in one call render in a single request; --entity lets /media-use find a brand mark later.npx hyperframes figma tokens <fileKey>. Run it before component and paste the printed entries into data-composition-variables. Without Enterprise it falls back to published styles. A connector can supply variables there instead: cache its raw response in .media/figma-cache/ and write the bindings to .media/figma-bindings.jsonl ({kind:"binding", figmaId, sourceFileKey, compositionVariableId:"figma:<name>", version}).npx hyperframes figma component '<url or fileKey:nodeId>', packaged under compositions/components/<name>/. A fill bound to an imported token comes out as var(--slug, #literal), so one variable re-brands every import; an unknown token stays a literal marked data-figma-unresolved: import that library’s tokens and re-import. Ask once which file a library is; never match by hex.figma asset <same node> --format png). Text drift is the usual cause; report drift you can’t fix instead of hand-tweaking the import.Usage beacon: these phases have no CLI touchpoint, so run npx hyperframes events --skill=figma-motion when you begin and npx hyperframes events --skill=figma-motion --event=skill_completed --outcome=success|error when done. Same for shaders (figma-shaders) and storyboards (figma-storyboard).
.media/figma-cache/.motionContextToDocs(raw, { selectorFor, repeat }) from @hyperframes/core/figma, never by transcribing keyframes. It reads the motion.dev snippets (the CSS snippets stretch durations), drops loop-wrap tail keyframes and keeps bezier eases. selectorFor returns the ids from the component import.motionToGsap(doc) → emitTimelineScript(spec), injected after the GSAP and CustomEase tags: paused, finite, a literal window.__timelines key. Named eases outside the mapped set fall back to linear; say so.node <SKILL_DIR>/scripts/verify-motion.mjs --reference <export.mp4> --render <render.mp4> --crop WxH+X+Y. It compares motion between samples, so static drift cancels out, and fails under 15 dB (faithful ≈ 20+, diverging ≈ 5). Measure --crop from the render’s card edges. A fail means fix the translation, not the threshold.<video class="clip">.Figma’s export path flattens shaders to their base colour, and shader source is only reachable for library-published styles. Ask the person for a native export of that frame (PNG or MP4) and place it as an asset or clip.
Two frames holding the same element describe that element’s state through time: animate the element between the states. Playing the frames back to back as stills is the failure mode.
absoluteBoundingBox.x./v1/images times out.Never leave a Figma URL in the composition.
Bring Figma into a HyperFrames video - rendered assets, brand tokens, components, storyboard frames as reconstructed motion (frames read as states, not slides), shaders and connector-assisted motion. Use when the person pastes a figma.com link or asks to use a Figma design, frame, logo or brand.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 8 November 2026.SKILL.md, not by matching a directory convention. 3 distinct layouts observed: .agents/skills/*/SKILL.md, registry/blocks/*/SKILL.md, skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by HeyGen, declaring 2 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./heygen-com/hyperframes.md, and each skill at its own .md URL.1 file · 5 KB
Everything this skill ships beside its prose. All of it is set here, as a subchapter of skill 14.
Executable code the skill can run.