Quick version — Fork the repo. Write one HTML file with a paused GSAP timeline. Add
registry-item.json. Run hyperframes lint + validate. Publish with npx hyperframes publish. Open a PR.Why Contribute?
Every block in the registry exists because someone needed it and built it. When you add a block, every HyperFrames user gets it with one command:Two Paths
Ideas (No Code)
You spot visual trends before anyone. That’s the most valuable contribution.- Screen-record a caption style from TikTok/YouTube that doesn’t exist yet
- Sketch a lower-third in Figma with fonts, colors, and timing
- Install a component, preview it, report what feels off
component-request.
Build It
Every block is a single HTML file. No build step, no framework. If you use Claude Code with HyperFrames skills:“I want to contribute a new transition that looks like [description]”The
/hyperframes-registry skill scaffolds the structure, validates, renders a preview, publishes to hyperframes.dev, and prepares the PR.
What Goes in the Registry
Blocks (registry/blocks/) — full standalone compositions. Fixed dimensions, fixed duration. Caption styles, VFX effects, title cards, transitions.
Components (registry/components/) — reusable snippets. No fixed size. CSS effects, text treatments, overlays that adapt to any composition.
Structure
registry-item.json
The Rules
Five things that must be true for every registry item:1
Deterministic
No
Math.random(), no Date.now(). Use seeded PRNG only.2
Paused timeline
gsap.timeline({ paused: true }). The player controls playback.3
Register timeline
window.__timelines["id"] must match data-composition-id.4
No requestAnimationFrame
Use
tl.eventCallback("onUpdate", render) for Three.js/WebGL scenes.5
Hard kills on captions
tl.set(el, { opacity: 0, visibility: "hidden" }, group.end) — no lingering text.Quality Bar
Not everything belongs in the registry. The bar is production quality.Common rejection reasons
- “Looks like a demo” — a spinning cube is not a component
- “Text unreadable” — font too small, no contrast treatment
- “Non-deterministic” —
Math.random()orDate.now() - “Timeline not found” — ID mismatch between HTML and JS
- “Breaks as sub-composition” — element IDs collide (prefix everything)
Workflow
1
Fork and create
Fork heygen-com/hyperframes and create your block directory:
2
Write your block
Create the HTML composition and
registry-item.json. Use the templates above.3
Validate
4
Update registry
5
Render preview
6
Publish and PR
scripts/upload-docs-images.sh to push catalog PNGs.