mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 12:54:29 +00:00
## Problem Users who want Tailwind utilities in a plain HyperFrames composition currently have to know which Tailwind browser script to add and where to place it. The first pass added `--tailwind`, but review caught three production-facing gaps: the CDN version was major-only, the insertion helper could silently no-op on compact HTML, and the render pipeline did not explicitly wait for Tailwind's async browser compilation before capturing frame 0. There is also a version-specific agent risk: HyperFrames `init --tailwind` uses Tailwind v4.2 through `@tailwindcss/browser@4.2.4`, while `packages/studio` still uses Tailwind v3. Without a dedicated skill, agents can easily mix v3 `tailwind.config.js` / `@tailwind` patterns into v4 browser-runtime composition HTML. ## What this fixes - Adds `hyperframes init --tailwind`. - Pins the Tailwind browser runtime to `@tailwindcss/browser@4.2.4/dist/index.global.js` with SRI and `crossorigin="anonymous"`. - Injects a `window.__tailwindReady` promise next to the browser runtime. - Makes frame capture wait for `window.__tailwindReady` in both screenshot and BeginFrame capture modes before capturing frame 0. - Inserts Tailwind support before `</head>` case-insensitively, including single-line/minified heads, and falls back to prepending when there is no head tag. - Skips recursive Tailwind injection under `.git`, `dist`, and `node_modules`. - Tracks whether init used Tailwind in the existing `init_template` telemetry event. - Adds a first-party `/tailwind` skill for Tailwind v4.2 browser-runtime HyperFrames composition work. - Updates README, docs, generated project agent files, CLI skill guidance, and plugin metadata so the Tailwind skill is discoverable. - Documents the browser-runtime tradeoff and production/offline guidance. ## Root cause `scaffoldProject()` copied the selected example and patched media placeholders, then immediately wrote project metadata and `package.json`. There was no optional post-copy step for framework-specific HTML support. The initial Tailwind post-copy step also treated the browser runtime like a static script, but Tailwind compiles utilities asynchronously after scanning the DOM, so the capture engine needed an explicit readiness contract. On the agent side, the repo exposed HyperFrames, CLI, GSAP, registry, and runtime adapter skills, but had no Tailwind-specific instruction to separate the v4 browser-runtime composition path from Studio's v3 internal setup. ## Verification ### Local checks - `bunx vitest run packages/cli/src/commands/init.test.ts` - `bun run --filter @hyperframes/cli test src/commands/init.test.ts` - `bun run --filter @hyperframes/cli typecheck` - `bun run --filter @hyperframes/engine typecheck` - `bun run lint:skills` - `bun run lint` - `npx skills add . --list` showed 12 local skills, including `tailwind`. - `bunx oxfmt --check packages/cli/src/commands/init.ts packages/cli/src/commands/init.test.ts packages/cli/src/telemetry/events.ts packages/engine/src/services/frameCapture.ts docs/packages/cli.mdx` - `bunx oxfmt --check README.md docs/quickstart.mdx docs/packages/cli.mdx CLAUDE.md packages/cli/src/templates/_shared/CLAUDE.md packages/cli/src/templates/_shared/AGENTS.md skills/hyperframes-cli/SKILL.md skills/tailwind/SKILL.md .codex-plugin/plugin.json .cursor-plugin/plugin.json` - `bunx oxlint packages/cli/src/commands/init.ts packages/cli/src/commands/init.test.ts packages/cli/src/telemetry/events.ts packages/engine/src/services/frameCapture.ts` - `git diff --check` - Lefthook pre-commit: lint/format/typecheck for code commit; format for docs/skill commit - Lefthook commit-msg: commitlint Generated-project render proof at `/tmp/hf-tailwind-render-proof`: - `bun packages/cli/src/cli.ts init /tmp/hf-tailwind-render-proof --example blank --tailwind --non-interactive --skip-skills` - Added a temporary Tailwind-only card using `flex`, `h-full`, `w-full`, `items-center`, `justify-center`, `bg-slate-950`, `rounded-3xl`, `bg-white`, `px-20`, `py-12`, `text-8xl`, `font-black`, `text-black`, and `shadow-2xl`. - `bun packages/cli/src/cli.ts lint /tmp/hf-tailwind-render-proof` → 0 errors, 0 warnings. - `bun packages/cli/src/cli.ts validate /tmp/hf-tailwind-render-proof` → 0 errors, 0 regular warnings; the temp proof still reports validator contrast warnings even though the rendered/browser pixels show black text on white background. - `bun packages/cli/src/cli.ts render /tmp/hf-tailwind-render-proof --workers 1 --fps 24 --quality draft --output /tmp/hf-tailwind-render-proof-artifacts/output.mp4` - Render compiler inlined both GSAP and `https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4/dist/index.global.js`. - `ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height,r_frame_rate,duration -of default=noprint_wrappers=1 /tmp/hf-tailwind-render-proof-artifacts/output.mp4` → H.264, 1920x1080, 24fps, 10s. - Extracted frame-0 proof: `/tmp/hf-tailwind-render-proof-artifacts/frame-000.png`. ### Browser verification - Started Studio preview for `/tmp/hf-tailwind-render-proof`. - Used `agent-browser` to open `http://localhost:5194`. - Verified the Tailwind-styled composition rendered in Studio preview. - Captured screenshot: `/tmp/hf-tailwind-render-proof-artifacts/browser/tailwind-preview.png`. - Captured agent-browser-driven recording: `/tmp/hf-tailwind-render-proof-artifacts/browser/tailwind-preview.webm`. - Served the PR worktree locally and used `agent-browser` to open the new Tailwind skill proof page. - Verified the browser-visible skill content includes `@tailwindcss/browser@4.2.4`. - Captured screenshot: `/Users/miguel07code/.codex/worktrees/pr-577-tailwind-comments/tmp/agent-browser-proof/tailwind-skill.png`. - Captured agent-browser-driven recording: `/Users/miguel07code/.codex/worktrees/pr-577-tailwind-comments/tmp/agent-browser-proof/tailwind-skill.webm`. ## Notes - This still intentionally uses Tailwind's browser runtime rather than adding a generated Tailwind build pipeline. That keeps `hyperframes init --tailwind` small and compatible with the current no-install generated project workflow. - The `/tailwind` skill cites official Tailwind v4 docs plus community skill references, but its instructions are HyperFrames-specific and tuned for the pinned v4.2 browser runtime. - Browser proof artifacts are local-only under `/tmp/hf-tailwind-render-proof-artifacts/` and `tmp/agent-browser-proof/` and intentionally not committed.
243 lines
8.7 KiB
Plaintext
243 lines
8.7 KiB
Plaintext
---
|
|
title: Quickstart
|
|
description: "Create, preview, and render your first Hyperframes video in under two minutes."
|
|
---
|
|
|
|
Go from zero to a rendered MP4 — either by prompting your AI agent or by starting a project manually.
|
|
|
|
## Option 1: With an AI coding agent (recommended)
|
|
|
|
Install the HyperFrames skills, then describe the video you want:
|
|
|
|
```bash
|
|
npx skills add heygen-com/hyperframes
|
|
```
|
|
|
|
This teaches your agent (Claude Code, Cursor, Gemini CLI, Codex) how to write correct compositions, GSAP timelines, Tailwind v4 browser-runtime styles, and first-party adapter animations. In Claude Code the skills register as slash commands — `/hyperframes` for composition authoring, `/hyperframes-cli` for CLI commands, `/tailwind` for `init --tailwind` projects, `/gsap` for timeline animation help, and `/animejs`, `/css-animations`, `/lottie`, `/three`, or `/waapi` when a composition uses those runtimes. Invoking the slash command loads the skill context explicitly, which produces correct output the first time.
|
|
|
|
<Note>
|
|
Claude Design uses a different entry path. Open [`docs/guides/claude-design-hyperframes.md`](https://github.com/heygen-com/hyperframes/blob/main/docs/guides/claude-design-hyperframes.md) on GitHub, click the download button (↓) to save it, then attach to your Claude Design chat. It produces a valid first draft you can refine in any AI coding agent. See the [Claude Design guide](/guides/claude-design).
|
|
</Note>
|
|
|
|
### Try it: example prompts
|
|
|
|
Copy any of these into your agent to get started.
|
|
|
|
<CardGroup cols={1}>
|
|
<Card title="Cold start — describe what you want">
|
|
> Using `/hyperframes`, create a 10-second product intro with a fade-in title over a dark background and subtle background music.
|
|
</Card>
|
|
<Card title="Warm start — turn existing context into a video">
|
|
> Take a look at this GitHub repo https://github.com/heygen-com/hyperframes and explain its uses and architecture to me using `/hyperframes`.
|
|
|
|
> Summarize the attached PDF into a 45-second pitch video using `/hyperframes`.
|
|
|
|
> Turn this CSV into an animated bar chart race using `/hyperframes`.
|
|
</Card>
|
|
<Card title="Format-specific">
|
|
> Make a 9:16 TikTok-style hook video about [topic] using `/hyperframes`, with bouncy captions synced to a TTS narration.
|
|
</Card>
|
|
<Card title="Iterate — talk to the agent like a video editor">
|
|
> Make the title 2x bigger, swap to dark mode, and add a fade-out at the end.
|
|
|
|
> Add a lower third at 0:03 with my name and title.
|
|
</Card>
|
|
</CardGroup>
|
|
|
|
The agent handles scaffolding, animation, and rendering. See the [prompting guide](/guides/prompting) for more patterns.
|
|
|
|
<Tip>
|
|
Skills encode HyperFrames-specific patterns — like required `class="clip"` on timed elements, GSAP timeline registration, adapter registries such as `window.__hfLottie`, and `data-*` attribute semantics — that are not in generic web docs. Using skills produces correct compositions from the start.
|
|
</Tip>
|
|
|
|
## Option 2: Start a project manually
|
|
|
|
### Prerequisites
|
|
|
|
- **Node.js 22+** — runtime for the CLI and dev server
|
|
- **FFmpeg** — video encoding for local renders
|
|
|
|
<Accordion title="Install instructions">
|
|
<Steps>
|
|
<Step title="Install Node.js 22+">
|
|
Hyperframes requires Node.js 22 or later. Check your version:
|
|
|
|
```bash
|
|
node --version
|
|
```
|
|
|
|
```bash Expected output
|
|
v22.0.0 # or any version >= 22
|
|
```
|
|
</Step>
|
|
|
|
<Step title="Install FFmpeg">
|
|
FFmpeg is required for local video rendering (encoding captured frames into MP4).
|
|
|
|
<CodeGroup>
|
|
```bash macOS
|
|
brew install ffmpeg
|
|
```
|
|
```bash Ubuntu / Debian
|
|
sudo apt install ffmpeg
|
|
```
|
|
```bash Windows
|
|
# Download from https://ffmpeg.org/download.html
|
|
# or install via winget:
|
|
winget install ffmpeg
|
|
```
|
|
</CodeGroup>
|
|
|
|
Verify the installation:
|
|
|
|
```bash
|
|
ffmpeg -version
|
|
```
|
|
|
|
```bash Expected output
|
|
ffmpeg version 7.x ...
|
|
```
|
|
</Step>
|
|
</Steps>
|
|
</Accordion>
|
|
|
|
### Create your first video
|
|
|
|
<Steps>
|
|
<Step title="Scaffold the project">
|
|
```bash
|
|
npx hyperframes init my-video
|
|
cd my-video
|
|
```
|
|
|
|
This starts an interactive wizard that walks you through example selection and media import. To skip prompts (e.g. in CI or from an agent), use `--non-interactive`:
|
|
|
|
```bash
|
|
npx hyperframes init my-video --non-interactive --example blank
|
|
```
|
|
|
|
See [Examples](/examples) for all available examples.
|
|
|
|
This generates a project structure like:
|
|
|
|
<Tree>
|
|
<Tree.Folder name="my-video" defaultOpen>
|
|
<Tree.File name="meta.json" />
|
|
<Tree.File name="index.html" />
|
|
<Tree.Folder name="compositions" defaultOpen>
|
|
<Tree.File name="intro.html" />
|
|
<Tree.File name="captions.html" />
|
|
</Tree.Folder>
|
|
<Tree.Folder name="assets" defaultOpen>
|
|
<Tree.File name="video.mp4" />
|
|
</Tree.Folder>
|
|
</Tree.Folder>
|
|
</Tree>
|
|
|
|
| Path | Purpose |
|
|
|------|---------|
|
|
| `meta.json` | Project metadata (name, ID, creation date) |
|
|
| `index.html` | Root composition — your video's entry point |
|
|
| `compositions/` | Sub-compositions loaded via `data-composition-src` |
|
|
| `assets/` | Media files (video, audio, images) |
|
|
|
|
If you have a source video, pass it with `--video` for automatic transcription and captions:
|
|
|
|
```bash
|
|
npx hyperframes init my-video --example warm-grain --video ./intro.mp4
|
|
```
|
|
|
|
`hyperframes init` installs AI agent skills automatically, so you can hand off to your AI agent at any point.
|
|
</Step>
|
|
|
|
<Step title="Preview in the browser">
|
|
```bash
|
|
npx hyperframes preview
|
|
```
|
|
|
|
This starts the Hyperframes Studio and opens your composition in the browser. Edits to `index.html` reload automatically.
|
|
|
|
<Tip>
|
|
The dev server supports hot reload — save your HTML file and the preview updates instantly, no manual refresh needed.
|
|
</Tip>
|
|
</Step>
|
|
|
|
<Step title="Edit the composition">
|
|
Open the project with your AI coding agent (Claude Code, Cursor, etc.) — skills are installed automatically and your agent knows how to create and edit compositions.
|
|
|
|
Or edit `index.html` directly — here's a minimal composition:
|
|
|
|
```html index.html
|
|
<div id="root" data-composition-id="my-video"
|
|
data-start="0" data-width="1920" data-height="1080">
|
|
|
|
<!-- 1. Define a timed text clip on track 0 -->
|
|
<h1 id="title" class="clip"
|
|
data-start="0" data-duration="5" data-track-index="0"
|
|
style="font-size: 72px; color: white; text-align: center;
|
|
position: absolute; top: 50%; left: 50%;
|
|
transform: translate(-50%, -50%);">
|
|
Hello, Hyperframes!
|
|
</h1>
|
|
|
|
<!-- 2. Load GSAP for animation -->
|
|
<script src="https://cdn.jsdelivr.net/npm/gsap@3/dist/gsap.min.js"></script>
|
|
|
|
<!-- 3. Create a paused timeline and register it -->
|
|
<script>
|
|
const tl = gsap.timeline({ paused: true });
|
|
tl.from("#title", { opacity: 0, y: -50, duration: 1 }, 0);
|
|
window.__timelines = window.__timelines || {};
|
|
window.__timelines["my-video"] = tl;
|
|
</script>
|
|
</div>
|
|
```
|
|
|
|
Three rules to remember:
|
|
|
|
- **Root element** must have `data-composition-id`, `data-width`, and `data-height`
|
|
- **Timed elements** need `data-start`, `data-duration`, `data-track-index`, and `class="clip"`
|
|
- **GSAP timeline** must be created with `{ paused: true }` and registered on `window.__timelines`
|
|
</Step>
|
|
|
|
<Step title="Render to MP4">
|
|
```bash
|
|
npx hyperframes render --output output.mp4
|
|
```
|
|
|
|
```bash Expected output
|
|
✔ Capturing frames... 150/150
|
|
✔ Encoding MP4...
|
|
✔ output.mp4 (1920x1080, 5.0s, 30fps)
|
|
```
|
|
|
|
Your video is now at `output.mp4`. Open it with any media player.
|
|
</Step>
|
|
</Steps>
|
|
|
|
## Requirements summary
|
|
|
|
| Dependency | Required | Notes |
|
|
|-----------|----------|-------|
|
|
| **Node.js** 22+ | Yes | Runtime for CLI and dev server |
|
|
| **npm** or bun | Yes | Package manager |
|
|
| **FFmpeg** | Yes | Video encoding for local renders |
|
|
| **Docker** | No | Optional — for deterministic, reproducible renders |
|
|
|
|
## Next steps
|
|
|
|
<CardGroup cols={2}>
|
|
<Card title="Browse the Catalog" icon="grid-2" href="/catalog/blocks/data-chart">
|
|
50+ ready-to-use blocks — transitions, overlays, data visualizations, and effects
|
|
</Card>
|
|
<Card title="GSAP Animation" icon="wand-magic-sparkles" href="/guides/gsap-animation">
|
|
Add fade, slide, scale, and custom animations to your videos
|
|
</Card>
|
|
<Card title="Examples" icon="rocket" href="/examples">
|
|
Start from built-in examples like Warm Grain and Swiss Grid
|
|
</Card>
|
|
<Card title="Rendering" icon="film" href="/guides/rendering">
|
|
Explore render options: quality presets, Docker mode, and GPU acceleration
|
|
</Card>
|
|
</CardGroup>
|