diff --git a/CLAUDE.md b/CLAUDE.md
index d2f2d4eef..841a8e01e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -6,11 +6,12 @@ This repo ships skills that are installed globally via `npx hyperframes skills`
### Skills
-| Skill | Invoke with | When to use |
-| ------------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **hyperframes** | `/hyperframes` | Creating or editing HTML compositions, captions/subtitles, TTS narration, audio-reactive animation, marker highlights. Composition authoring rules. |
-| **hyperframes-cli** | `/hyperframes-cli` | CLI commands: init, lint, preview, render, transcribe, tts, doctor. Use when scaffolding, validating, previewing, or rendering. |
-| **gsap** | `/gsap` | GSAP animations — tweens, timelines, easing, ScrollTrigger, plugins (Flip, Draggable, SplitText, etc.), React/Vue/Svelte, performance optimization. |
+| Skill | Invoke with | When to use |
+| ------------------------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **hyperframes** | `/hyperframes` | Creating or editing HTML compositions, captions/subtitles, TTS narration, audio-reactive animation, marker highlights. Composition authoring rules. |
+| **hyperframes-cli** | `/hyperframes-cli` | CLI commands: init, lint, preview, render, transcribe, tts, doctor. Use when scaffolding, validating, previewing, or rendering. |
+| **hyperframes-registry** | `/hyperframes-registry` | Installing and wiring registry blocks and components via `hyperframes add`. Install locations, block iframe wiring, component snippet merging, discovery. |
+| **gsap** | `/gsap` | GSAP animations — tweens, timelines, easing, ScrollTrigger, plugins (Flip, Draggable, SplitText, etc.), React/Vue/Svelte, performance optimization. |
### Why this matters
@@ -19,6 +20,7 @@ The skills encode HyperFrames-specific patterns (e.g., required `class="clip"` o
### Rules
- When creating or modifying HTML compositions, captions, TTS, audio-reactive, or marker highlights → invoke `/hyperframes` BEFORE writing any code
+- When installing or wiring registry blocks/components (`hyperframes add`, `hyperframes.json`, block iframes, component snippets) → invoke `/hyperframes-registry` BEFORE writing any code
- When writing GSAP animations (tweens, timelines, ScrollTrigger, plugins) → invoke `/gsap` BEFORE writing any code
- After creating or editing any `.html` composition → run `npx hyperframes lint` and `npx hyperframes validate` in parallel, fix all errors before opening the studio or considering the task complete. `lint` checks the HTML structure statically; `validate` loads the composition in headless Chrome and catches runtime JS errors, missing assets, and failed network requests. Always validate before `npx hyperframes preview`.
diff --git a/README.md b/README.md
index df58edf6e..1f5222534 100644
--- a/README.md
+++ b/README.md
@@ -101,10 +101,10 @@ npx skills add greensock/gsap-skills
### Installed Skills
-| Source | Skills | What they teach |
-| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
-| **HyperFrames** | `hyperframes-compose`, `hyperframes-captions` | HTML composition structure, `class="clip"` rules, `data-*` attributes, timeline registration, rendering constraints |
-| **[GSAP](https://github.com/greensock/gsap-skills)** | `gsap-core`, `gsap-timeline`, `gsap-performance`, `gsap-plugins`, `gsap-scrolltrigger`, `gsap-utils`, `gsap-react`, `gsap-frameworks` | Core API, timeline sequencing, ScrollTrigger, plugin usage, performance best practices |
+| Source | Skills | What they teach |
+| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **HyperFrames** | `hyperframes-compose`, `hyperframes-captions`, `hyperframes-registry` | HTML composition structure, `class="clip"` rules, `data-*` attributes, timeline registration, rendering constraints, registry block/component install and wiring |
+| **[GSAP](https://github.com/greensock/gsap-skills)** | `gsap-core`, `gsap-timeline`, `gsap-performance`, `gsap-plugins`, `gsap-scrolltrigger`, `gsap-utils`, `gsap-react`, `gsap-frameworks` | Core API, timeline sequencing, ScrollTrigger, plugin usage, performance best practices |
In Claude Code, invoke with `/hyperframes-compose`, `/hyperframes-captions`, `/gsap-core`, etc.
diff --git a/docs/catalog/blocks/data-chart.mdx b/docs/catalog/blocks/data-chart.mdx
new file mode 100644
index 000000000..c8281092d
--- /dev/null
+++ b/docs/catalog/blocks/data-chart.mdx
@@ -0,0 +1,44 @@
+---
+title: "Data Chart"
+description: "Animated bar + line chart with staggered reveal, NYT-style typography, and value labels"
+---
+
+# Data Chart
+
+Animated bar + line chart with staggered reveal, NYT-style typography, and value labels
+
+`data` `chart` `statistics`
+
+
+
+## Install
+
+
+
+```bash Terminal
+npx hyperframes add data-chart
+```
+
+
+
+## Details
+
+| Property | Value |
+| --- | --- |
+| Type | Block |
+| Dimensions | 1920×1080 |
+| Duration | 15s |
+
+## Files
+
+| File | Target | Type |
+| --- | --- | --- |
+| `data-chart.html` | `compositions/data-chart.html` | hyperframes:composition |
+
+## Usage
+
+After installing, add the block to your host composition:
+
+```html
+
+```
diff --git a/docs/catalog/blocks/flowchart.mdx b/docs/catalog/blocks/flowchart.mdx
new file mode 100644
index 000000000..c6564b051
--- /dev/null
+++ b/docs/catalog/blocks/flowchart.mdx
@@ -0,0 +1,44 @@
+---
+title: "Flowchart"
+description: "Animated decision tree with SVG connectors, sticky-note nodes, cursor interaction, and typing correction"
+---
+
+# Flowchart
+
+Animated decision tree with SVG connectors, sticky-note nodes, cursor interaction, and typing correction
+
+`diagram` `flowchart` `interactive`
+
+
+
+## Install
+
+
+
+```bash Terminal
+npx hyperframes add flowchart
+```
+
+
+
+## Details
+
+| Property | Value |
+| --- | --- |
+| Type | Block |
+| Dimensions | 1920×1080 |
+| Duration | 12s |
+
+## Files
+
+| File | Target | Type |
+| --- | --- | --- |
+| `flowchart.html` | `compositions/flowchart.html` | hyperframes:composition |
+
+## Usage
+
+After installing, add the block to your host composition:
+
+```html
+
+```
diff --git a/docs/catalog/blocks/logo-outro.mdx b/docs/catalog/blocks/logo-outro.mdx
new file mode 100644
index 000000000..10950c2dd
--- /dev/null
+++ b/docs/catalog/blocks/logo-outro.mdx
@@ -0,0 +1,44 @@
+---
+title: "Logo Outro"
+description: "Cinematic logo reveal with piece-by-piece assembly, glow bloom, tagline fade-in, and URL pill"
+---
+
+# Logo Outro
+
+Cinematic logo reveal with piece-by-piece assembly, glow bloom, tagline fade-in, and URL pill
+
+`branding` `outro` `logo`
+
+
+
+## Install
+
+
+
+```bash Terminal
+npx hyperframes add logo-outro
+```
+
+
+
+## Details
+
+| Property | Value |
+| --- | --- |
+| Type | Block |
+| Dimensions | 1920×1080 |
+| Duration | 6s |
+
+## Files
+
+| File | Target | Type |
+| --- | --- | --- |
+| `logo-outro.html` | `compositions/logo-outro.html` | hyperframes:composition |
+
+## Usage
+
+After installing, add the block to your host composition:
+
+```html
+
+```
diff --git a/docs/catalog/components/grain-overlay.mdx b/docs/catalog/components/grain-overlay.mdx
new file mode 100644
index 000000000..102508aef
--- /dev/null
+++ b/docs/catalog/components/grain-overlay.mdx
@@ -0,0 +1,38 @@
+---
+title: "Grain Overlay"
+description: "Animated film grain texture overlay using CSS keyframes — adds warmth and analog character to any composition"
+---
+
+# Grain Overlay
+
+Animated film grain texture overlay using CSS keyframes — adds warmth and analog character to any composition
+
+`texture` `grain` `overlay` `film`
+
+
+
+## Install
+
+
+
+```bash Terminal
+npx hyperframes add grain-overlay
+```
+
+
+
+## Details
+
+| Property | Value |
+| --- | --- |
+| Type | Component |
+
+## Files
+
+| File | Target | Type |
+| --- | --- | --- |
+| `grain-overlay.html` | `compositions/components/grain-overlay.html` | hyperframes:snippet |
+
+## Usage
+
+Open `compositions/components/grain-overlay.html` and paste its contents into your composition. See the comment header in the file for detailed instructions.
diff --git a/docs/catalog/components/grid-pixelate-wipe.mdx b/docs/catalog/components/grid-pixelate-wipe.mdx
new file mode 100644
index 000000000..fdeb1aa20
--- /dev/null
+++ b/docs/catalog/components/grid-pixelate-wipe.mdx
@@ -0,0 +1,38 @@
+---
+title: "Grid Pixelate Wipe"
+description: "Transition effect where the screen dissolves into a grid of squares that fade out with staggered timing — use between scenes"
+---
+
+# Grid Pixelate Wipe
+
+Transition effect where the screen dissolves into a grid of squares that fade out with staggered timing — use between scenes
+
+`transition` `wipe` `grid` `pixelate`
+
+
+
+## Install
+
+
+
+```bash Terminal
+npx hyperframes add grid-pixelate-wipe
+```
+
+
+
+## Details
+
+| Property | Value |
+| --- | --- |
+| Type | Component |
+
+## Files
+
+| File | Target | Type |
+| --- | --- | --- |
+| `grid-pixelate-wipe.html` | `compositions/components/grid-pixelate-wipe.html` | hyperframes:snippet |
+
+## Usage
+
+Open `compositions/components/grid-pixelate-wipe.html` and paste its contents into your composition. See the comment header in the file for detailed instructions.
diff --git a/docs/catalog/components/shimmer-sweep.mdx b/docs/catalog/components/shimmer-sweep.mdx
new file mode 100644
index 000000000..737a435c4
--- /dev/null
+++ b/docs/catalog/components/shimmer-sweep.mdx
@@ -0,0 +1,38 @@
+---
+title: "Shimmer Sweep"
+description: "Animated light sweep across text or elements using a CSS gradient mask — ideal for AI accents and premium reveals"
+---
+
+# Shimmer Sweep
+
+Animated light sweep across text or elements using a CSS gradient mask — ideal for AI accents and premium reveals
+
+`text` `shimmer` `highlight` `effect`
+
+
+
+## Install
+
+
+
+```bash Terminal
+npx hyperframes add shimmer-sweep
+```
+
+
+
+## Details
+
+| Property | Value |
+| --- | --- |
+| Type | Component |
+
+## Files
+
+| File | Target | Type |
+| --- | --- | --- |
+| `shimmer-sweep.html` | `compositions/components/shimmer-sweep.html` | hyperframes:snippet |
+
+## Usage
+
+Open `compositions/components/shimmer-sweep.html` and paste its contents into your composition. See the comment header in the file for detailed instructions.
diff --git a/docs/docs.json b/docs/docs.json
index 7be169e6d..0fb9f1c1c 100644
--- a/docs/docs.json
+++ b/docs/docs.json
@@ -51,7 +51,11 @@
"groups": [
{
"group": "Getting Started",
- "pages": ["introduction", "quickstart", "examples"]
+ "pages": [
+ "introduction",
+ "quickstart",
+ "examples"
+ ]
},
{
"group": "Concepts",
@@ -89,16 +93,42 @@
}
]
},
+ {
+ "tab": "Catalog",
+ "groups": [
+ {
+ "group": "Blocks",
+ "pages": [
+ "catalog/blocks/data-chart",
+ "catalog/blocks/flowchart",
+ "catalog/blocks/logo-outro"
+ ]
+ },
+ {
+ "group": "Components",
+ "pages": [
+ "catalog/components/grain-overlay",
+ "catalog/components/grid-pixelate-wipe",
+ "catalog/components/shimmer-sweep"
+ ]
+ }
+ ]
+ },
{
"tab": "Reference",
"groups": [
{
"group": "Reference",
- "pages": ["reference/html-schema"]
+ "pages": [
+ "reference/html-schema"
+ ]
},
{
"group": "Contributing",
- "pages": ["contributing", "contributing/testing-local-changes"]
+ "pages": [
+ "contributing",
+ "contributing/testing-local-changes"
+ ]
}
]
}
diff --git a/docs/images/catalog/blocks/data-chart.mp4 b/docs/images/catalog/blocks/data-chart.mp4
new file mode 100644
index 000000000..2556a7033
Binary files /dev/null and b/docs/images/catalog/blocks/data-chart.mp4 differ
diff --git a/docs/images/catalog/blocks/data-chart.png b/docs/images/catalog/blocks/data-chart.png
new file mode 100644
index 000000000..a5bbc5a14
Binary files /dev/null and b/docs/images/catalog/blocks/data-chart.png differ
diff --git a/docs/images/catalog/blocks/flowchart.mp4 b/docs/images/catalog/blocks/flowchart.mp4
new file mode 100644
index 000000000..883f0e468
Binary files /dev/null and b/docs/images/catalog/blocks/flowchart.mp4 differ
diff --git a/docs/images/catalog/blocks/flowchart.png b/docs/images/catalog/blocks/flowchart.png
new file mode 100644
index 000000000..a64a1403e
Binary files /dev/null and b/docs/images/catalog/blocks/flowchart.png differ
diff --git a/docs/images/catalog/blocks/logo-outro.mp4 b/docs/images/catalog/blocks/logo-outro.mp4
new file mode 100644
index 000000000..27bd497b3
Binary files /dev/null and b/docs/images/catalog/blocks/logo-outro.mp4 differ
diff --git a/docs/images/catalog/blocks/logo-outro.png b/docs/images/catalog/blocks/logo-outro.png
new file mode 100644
index 000000000..a0d3d3dca
Binary files /dev/null and b/docs/images/catalog/blocks/logo-outro.png differ
diff --git a/docs/images/catalog/components/grain-overlay.mp4 b/docs/images/catalog/components/grain-overlay.mp4
new file mode 100644
index 000000000..fbf7e729d
Binary files /dev/null and b/docs/images/catalog/components/grain-overlay.mp4 differ
diff --git a/docs/images/catalog/components/grain-overlay.png b/docs/images/catalog/components/grain-overlay.png
new file mode 100644
index 000000000..b4b062d0d
Binary files /dev/null and b/docs/images/catalog/components/grain-overlay.png differ
diff --git a/docs/images/catalog/components/grid-pixelate-wipe.mp4 b/docs/images/catalog/components/grid-pixelate-wipe.mp4
new file mode 100644
index 000000000..19c2ee403
Binary files /dev/null and b/docs/images/catalog/components/grid-pixelate-wipe.mp4 differ
diff --git a/docs/images/catalog/components/grid-pixelate-wipe.png b/docs/images/catalog/components/grid-pixelate-wipe.png
new file mode 100644
index 000000000..89f88e69f
Binary files /dev/null and b/docs/images/catalog/components/grid-pixelate-wipe.png differ
diff --git a/docs/images/catalog/components/shimmer-sweep.mp4 b/docs/images/catalog/components/shimmer-sweep.mp4
new file mode 100644
index 000000000..5cac4d73f
Binary files /dev/null and b/docs/images/catalog/components/shimmer-sweep.mp4 differ
diff --git a/docs/images/catalog/components/shimmer-sweep.png b/docs/images/catalog/components/shimmer-sweep.png
new file mode 100644
index 000000000..c655b9727
Binary files /dev/null and b/docs/images/catalog/components/shimmer-sweep.png differ
diff --git a/docs/packages/cli.mdx b/docs/packages/cli.mdx
index aa458dab2..6c9120b5d 100644
--- a/docs/packages/cli.mdx
+++ b/docs/packages/cli.mdx
@@ -538,7 +538,7 @@ This is suppressed in CI environments, non-TTY shells, and when `HYPERFRAMES_NO_
| `--codex` | Install to Codex CLI (`~/.codex/skills/`) |
| `--cursor` | Install to Cursor (`.cursor/skills/` in current project) |
- Skills are fetched from GitHub and include composition authoring, GSAP animation patterns, and other domain-specific knowledge. The `init` command also offers to install skills automatically after scaffolding a project.
+ Skills are fetched from GitHub and include composition authoring, GSAP animation patterns, registry block/component wiring, and other domain-specific knowledge. The `init` command also offers to install skills automatically after scaffolding a project.
diff --git a/docs/public/catalog-index.json b/docs/public/catalog-index.json
new file mode 100644
index 000000000..0dfdef035
--- /dev/null
+++ b/docs/public/catalog-index.json
@@ -0,0 +1,83 @@
+[
+ {
+ "name": "data-chart",
+ "type": "block",
+ "title": "Data Chart",
+ "description": "Animated bar + line chart with staggered reveal, NYT-style typography, and value labels",
+ "tags": [
+ "data",
+ "chart",
+ "statistics"
+ ],
+ "href": "/catalog/blocks/data-chart",
+ "preview": "/images/catalog/blocks/data-chart.png"
+ },
+ {
+ "name": "flowchart",
+ "type": "block",
+ "title": "Flowchart",
+ "description": "Animated decision tree with SVG connectors, sticky-note nodes, cursor interaction, and typing correction",
+ "tags": [
+ "diagram",
+ "flowchart",
+ "interactive"
+ ],
+ "href": "/catalog/blocks/flowchart",
+ "preview": "/images/catalog/blocks/flowchart.png"
+ },
+ {
+ "name": "grain-overlay",
+ "type": "component",
+ "title": "Grain Overlay",
+ "description": "Animated film grain texture overlay using CSS keyframes — adds warmth and analog character to any composition",
+ "tags": [
+ "texture",
+ "grain",
+ "overlay",
+ "film"
+ ],
+ "href": "/catalog/components/grain-overlay",
+ "preview": "/images/catalog/components/grain-overlay.png"
+ },
+ {
+ "name": "grid-pixelate-wipe",
+ "type": "component",
+ "title": "Grid Pixelate Wipe",
+ "description": "Transition effect where the screen dissolves into a grid of squares that fade out with staggered timing — use between scenes",
+ "tags": [
+ "transition",
+ "wipe",
+ "grid",
+ "pixelate"
+ ],
+ "href": "/catalog/components/grid-pixelate-wipe",
+ "preview": "/images/catalog/components/grid-pixelate-wipe.png"
+ },
+ {
+ "name": "logo-outro",
+ "type": "block",
+ "title": "Logo Outro",
+ "description": "Cinematic logo reveal with piece-by-piece assembly, glow bloom, tagline fade-in, and URL pill",
+ "tags": [
+ "branding",
+ "outro",
+ "logo"
+ ],
+ "href": "/catalog/blocks/logo-outro",
+ "preview": "/images/catalog/blocks/logo-outro.png"
+ },
+ {
+ "name": "shimmer-sweep",
+ "type": "component",
+ "title": "Shimmer Sweep",
+ "description": "Animated light sweep across text or elements using a CSS gradient mask — ideal for AI accents and premium reveals",
+ "tags": [
+ "text",
+ "shimmer",
+ "highlight",
+ "effect"
+ ],
+ "href": "/catalog/components/shimmer-sweep",
+ "preview": "/images/catalog/components/shimmer-sweep.png"
+ }
+]
diff --git a/packages/cli/src/commands/add.test.ts b/packages/cli/src/commands/add.test.ts
index 157e99c8d..87b82f525 100644
--- a/packages/cli/src/commands/add.test.ts
+++ b/packages/cli/src/commands/add.test.ts
@@ -139,9 +139,9 @@ describe("add command pure helpers", () => {
});
describe("buildSnippet", () => {
- it("wraps blocks in an iframe with start/duration", () => {
+ it("wraps blocks in a div with data-composition-src and duration", () => {
const snip = buildSnippet(BLOCK_ITEM, "src/scenes/my-block.html");
- expect(snip).toContain('src="src/scenes/my-block.html"');
+ expect(snip).toContain('data-composition-src="src/scenes/my-block.html"');
expect(snip).toContain('data-duration="6"');
});
diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts
index d04478241..8a5abe865 100644
--- a/packages/cli/src/commands/add.ts
+++ b/packages/cli/src/commands/add.ts
@@ -55,7 +55,11 @@ export function remapTarget(
export function buildSnippet(item: RegistryItem, relativeTarget: string): string {
if (item.type === "hyperframes:block") {
// data-start omitted — adjust to your timeline position after pasting.
- return ``;
+ const dims =
+ "dimensions" in item && item.dimensions
+ ? ` data-width="${item.dimensions.width}" data-height="${item.dimensions.height}"`
+ : "";
+ return ``;
}
if (item.type === "hyperframes:component") {
return ``;
diff --git a/registry/components/grain-overlay/demo.html b/registry/components/grain-overlay/demo.html
index 89c85f286..4a40c006c 100644
--- a/registry/components/grain-overlay/demo.html
+++ b/registry/components/grain-overlay/demo.html
@@ -29,19 +29,7 @@
data-duration="5"
>
-