| title | Contributing to the Catalog |
|---|---|
| description | How to add blocks and components to the HyperFrames registry. |
Your agent already knows how to build video components. It writes HTML. HyperFrames renders it. The registry is the collection of everything that's been built — 52 blocks and counting.
This guide shows you how to add to it.
**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.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:
npx hyperframes add instagram-followThe registry grows, HyperFrames gets more useful, and your work ships to everyone.
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
Open an issue on GitHub with a visual reference. Tag it component-request.
The bar for ideas is low. We'd rather have 100 and build the best 10.
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 /contribute-catalog skill scaffolds the structure, validates, renders a preview, publishes to hyperframes.dev, and prepares the PR.
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.
registry/blocks/my-block/
my-block.html ← the composition
registry-item.json ← metadata
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "my-block",
"type": "hyperframes:block",
"title": "My Block",
"description": "What this block does in one sentence",
"tags": ["category", "subcategory"],
"dimensions": { "width": 1920, "height": 1080 },
"duration": 5,
"files": [
{
"path": "my-block.html",
"target": "compositions/my-block.html",
"type": "hyperframes:composition"
}
]
}Most registry items only need the fields above. Add these optional fields when the installer needs extra context:
{
"minCliVersion": "0.6.96",
"registryDependencies": ["grain-overlay"],
"deprecated": "Use `my-block-v2` instead."
}minCliVersion— use this when the item depends on a HyperFrames CLI/runtime feature added in a recent release. The installer uses it to stop incompatible installs before writing files and guide users to upgrade.registryDependencies— list other registry item names that must be installed first. Dependencies are resolved transitively; keep the graph small, reference exact item names, and avoid cycles.deprecated— show a warning during install while keeping the item available for existing projects. Include a short migration note when there is a better replacement.
Five things that must be true for every registry item:
No `Math.random()`, no `Date.now()`. Use seeded PRNG only. `gsap.timeline({ paused: true })`. The player controls playback. `window.__timelines["id"]` must match `data-composition-id`. Use `tl.eventCallback("onUpdate", render)` for Three.js/WebGL scenes. `tl.set(el, { opacity: 0, visibility: "hidden" }, group.end)` — no lingering text. Break any of these and renders won't be reproducible. The renderer captures every frame by seeking the timeline — if your animation depends on real time or random state, it breaks.Not everything belongs in the registry. The bar is production quality.
| Type | Minimum standard |
|---|---|
| Captions | 96px+ font, text-stroke/shadow, overflow prevention |
| VFX | Solves a problem that takes 4+ hours from scratch |
| Transitions | Smoother than CSS — if opacity 0→1 works, it's not a transition |
| Blocks | Would a professional use this in a client project? |
- "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)
External contributors: attach the preview MP4 to your PR. A maintainer handles the catalog image.
HeyGen internal: run scripts/upload-docs-images.sh to push catalog PNGs.
These are gaps in the registry. If you're looking for something to build, start here.
| Category | Gap | Difficulty |
|---|---|---|
| Captions | Karaoke with clip-path sweep (CapCut style) | Medium |
| Captions | RTL language layouts (Arabic, Hebrew) | Medium |
| Lower thirds | 10 variations for podcasts/interviews | Easy |
| Lower thirds | News ticker / scrolling text bar | Easy |
| Maps | Animated route maps, region highlights, location pins | Medium |
| VFX | Product turntable with HDRI | Hard |
| VFX | Particle system with physics (collisions, gravity) | Hard |
| Transitions | Morphing shape transitions | Hard |
| Data viz | Sankey / flow diagrams | Medium |