mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
Comprehensive audit of every documentation page against the actual source code, fixing incorrect APIs, wrong CLI flags, nonexistent templates, and missing public exports. Also documents the new agent-friendly CLI design. Key fixes: - Quickstart: `npx create-hyperframe` → `npx hyperframes init`, Node 20→22 - Templates: replaced nonexistent blank/title-card/video-edit with actual templates (blank, warm-grain, play-mode, swiss-grid, vignelli) - CLI: removed nonexistent short flags (-o/-f/-q/-w), added missing commands (browser, docs, telemetry, skills), documented agent-friendly non-interactive default and --human-friendly flag - Producer: replaced nonexistent `render()` API with actual `createRenderJob()`/`executeRenderJob()`, added server API docs - Engine: replaced nonexistent `createEngine()` with actual session-based API, added HfProtocol, encoding, streaming, parallel rendering docs - Core: fixed wrong type names (Composition/Clip→TimelineElement), wrong function names (parseHyperframeHtml→parseHtml), documented all 4 entry points (main, /lint, /compiler, /runtime) - Studio: added all missing exports (NLELayout, SourceEditor, PropertyPanel, FileTree, StudioApp, hooks, Tailwind preset) - All pages: --output not -o, Node 22+ not 20+ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
250 lines
8.4 KiB
Plaintext
250 lines
8.4 KiB
Plaintext
---
|
|
title: "@hyperframes/producer"
|
|
description: "Full HTML-to-video rendering pipeline with encoding, audio mixing, and Docker support."
|
|
---
|
|
|
|
The producer package combines the [engine's](/packages/engine) frame capture with FFmpeg encoding to deliver a complete HTML-to-MP4 rendering pipeline. It handles runtime injection, readiness gates, audio mixing, and optional Docker-based deterministic rendering.
|
|
|
|
```bash
|
|
npm install @hyperframes/producer
|
|
```
|
|
|
|
## When to Use
|
|
|
|
**Use `@hyperframes/producer` when you need to:**
|
|
- Render compositions to MP4 programmatically from Node.js (e.g., in a backend service or CI pipeline)
|
|
- Build a custom rendering service with fine-grained control over the pipeline
|
|
- Run visual regression tests against golden baselines
|
|
- Benchmark render performance across different configurations
|
|
|
|
**Use a different package if you want to:**
|
|
- Render from the command line without writing code — use the [CLI](/packages/cli) (`npx hyperframes render`)
|
|
- Preview compositions in the browser — use the [CLI](/packages/cli) or [studio](/packages/studio)
|
|
- Capture frames without encoding — use the [engine](/packages/engine)
|
|
- Lint or parse composition HTML — use [core](/packages/core)
|
|
|
|
<Tip>
|
|
If you are building a web application or script that just needs to render a video, the [CLI](/packages/cli) is the fastest path. The producer package is for when you need programmatic control inside Node.js.
|
|
</Tip>
|
|
|
|
## What It Does
|
|
|
|
The producer orchestrates the full render pipeline:
|
|
|
|
<Steps>
|
|
<Step title="Load the composition HTML">
|
|
Reads your `index.html` and any referenced sub-compositions.
|
|
</Step>
|
|
<Step title="Inject the Hyperframes runtime">
|
|
Adds the runtime script that manages timeline seeking, clip lifecycle, and media playback.
|
|
</Step>
|
|
<Step title="Wait for readiness gates">
|
|
Polls for `window.__playerReady` and `window.__renderReady` to ensure all assets (fonts, images, video) are loaded before capture begins.
|
|
</Step>
|
|
<Step title="Capture frames via the engine">
|
|
Uses the [engine's](/packages/engine) BeginFrame pipeline to capture each frame as a pixel buffer.
|
|
</Step>
|
|
<Step title="Encode to MP4 via FFmpeg">
|
|
Pipes frame buffers into FFmpeg with the selected quality preset and encoding settings.
|
|
</Step>
|
|
<Step title="Mix audio tracks">
|
|
Extracts audio from video clips and audio elements, applies `data-volume` and `data-media-start` offsets, and mixes them into the final MP4.
|
|
</Step>
|
|
</Steps>
|
|
|
|
## Programmatic Usage
|
|
|
|
The producer uses a two-step API: create a render job configuration, then execute it.
|
|
|
|
```typescript
|
|
import { createRenderJob, executeRenderJob } from '@hyperframes/producer';
|
|
|
|
const job = createRenderJob({
|
|
input: './my-video/index.html',
|
|
output: './output.mp4',
|
|
fps: 30,
|
|
quality: 'standard',
|
|
});
|
|
|
|
const result = await executeRenderJob(job);
|
|
```
|
|
|
|
### Render Configuration
|
|
|
|
```typescript
|
|
import type { RenderConfig } from '@hyperframes/producer';
|
|
|
|
const config: RenderConfig = {
|
|
fps: 30, // 24, 30, or 60
|
|
quality: 'standard', // 'draft', 'standard', or 'high'
|
|
workers: 4, // Parallel render workers (1-8)
|
|
useGpu: false, // GPU-accelerated encoding
|
|
debug: false, // Debug logging
|
|
};
|
|
```
|
|
|
|
### Progress Callbacks
|
|
|
|
```typescript
|
|
import type { ProgressCallback, RenderStatus } from '@hyperframes/producer';
|
|
|
|
const onProgress: ProgressCallback = (status: RenderStatus) => {
|
|
console.log(`Status: ${status}`);
|
|
// Statuses: "queued" | "preprocessing" | "rendering" | "encoding"
|
|
// | "assembling" | "complete" | "failed" | "cancelled"
|
|
};
|
|
```
|
|
|
|
### Cancellation
|
|
|
|
```typescript
|
|
import { RenderCancelledError } from '@hyperframes/producer';
|
|
|
|
try {
|
|
await executeRenderJob(job);
|
|
} catch (err) {
|
|
if (err instanceof RenderCancelledError) {
|
|
console.log(`Cancelled: ${err.reason}`);
|
|
// reason: "user_cancelled" | "timeout" | "aborted"
|
|
}
|
|
}
|
|
```
|
|
|
|
## HTTP Server
|
|
|
|
The producer includes a built-in HTTP server for running as a rendering service:
|
|
|
|
```typescript
|
|
import { startServer } from '@hyperframes/producer/server';
|
|
|
|
await startServer({ port: 8080 });
|
|
```
|
|
|
|
### Server Endpoints
|
|
|
|
| Method | Path | Description |
|
|
|--------|------|-------------|
|
|
| `POST` | `/render` | Blocking render — returns JSON result |
|
|
| `POST` | `/render/stream` | Streaming render with Server-Sent Events |
|
|
| `POST` | `/lint` | Lint a composition for issues |
|
|
| `GET` | `/health` | Health check |
|
|
| `GET` | `/outputs/:token` | Download a rendered MP4 |
|
|
|
|
For custom server integration, use the lower-level handlers:
|
|
|
|
```typescript
|
|
import { createRenderHandlers, createProducerApp } from '@hyperframes/producer/server';
|
|
|
|
// Get individual request handlers
|
|
const handlers = createRenderHandlers(options);
|
|
|
|
// Or get a full Hono app
|
|
const app = createProducerApp(options);
|
|
```
|
|
|
|
## Docker Rendering
|
|
|
|
For deterministic output, the producer can render inside a Docker container with a pinned Chrome version and font set. This guarantees identical output across machines — critical for CI pipelines and production services.
|
|
|
|
```bash
|
|
# Via the CLI (recommended)
|
|
npx hyperframes render --docker --output output.mp4
|
|
```
|
|
|
|
<Info>
|
|
Docker mode requires Docker to be installed and running. Run `npx hyperframes doctor` to verify your environment. See [Deterministic Rendering](/concepts/determinism) for details on what makes Docker mode deterministic.
|
|
</Info>
|
|
|
|
## Quality Presets
|
|
|
|
| Preset | Resolution | Encoding | Use Case |
|
|
|--------|-----------|----------|----------|
|
|
| `draft` | Original | Fast CRF | Quick iteration, previewing edits |
|
|
| `standard` | Original | Balanced CRF | Production renders, sharing |
|
|
| `high` | Original | High-quality CRF | Final delivery, archival |
|
|
|
|
## GPU Encoding
|
|
|
|
The producer supports hardware-accelerated encoding for faster renders:
|
|
|
|
| Platform | Encoder | Flag |
|
|
|----------|---------|------|
|
|
| NVIDIA | NVENC | Auto-detected |
|
|
| macOS | VideoToolbox | Auto-detected |
|
|
| Linux | VAAPI | Auto-detected |
|
|
|
|
GPU encoding is automatically used when available. To check your system's capabilities:
|
|
|
|
```bash
|
|
npx hyperframes doctor
|
|
```
|
|
|
|
## Additional Exports
|
|
|
|
The producer also re-exports key engine functionality for convenience:
|
|
|
|
| Export | Description |
|
|
|--------|-------------|
|
|
| `createCaptureSession()` | Create a frame capture session |
|
|
| `initializeSession()` | Initialize session with a composition |
|
|
| `captureFrame()` / `captureFrameToBuffer()` | Capture individual frames |
|
|
| `closeCaptureSession()` | Clean up a capture session |
|
|
| `getCompositionDuration()` | Get total composition duration |
|
|
| `getCapturePerfSummary()` | Get capture performance metrics |
|
|
| `createFileServer()` | Create an HTTP file server for serving assets |
|
|
| `createVideoFrameInjector()` | Create a video frame injector for page |
|
|
| `resolveConfig()` / `DEFAULT_CONFIG` | Producer configuration |
|
|
| `createConsoleLogger()` / `defaultLogger` | Logging utilities |
|
|
| `quantizeTimeToFrame()` | Convert time to frame boundary |
|
|
| `resolveRenderPaths()` | Resolve render directory paths |
|
|
| `prepareHyperframeLintBody()` / `runHyperframeLint()` | Linting utilities |
|
|
|
|
## Regression Testing
|
|
|
|
The producer includes a regression harness for comparing render output against golden baselines. This is useful for catching visual regressions when changing the runtime, engine, or rendering pipeline.
|
|
|
|
```bash
|
|
cd packages/producer
|
|
|
|
# Build the test Docker image
|
|
bun run docker:build:test
|
|
|
|
# Run regression tests (compares output against golden baselines)
|
|
bun run docker:test
|
|
|
|
# Regenerate golden baselines after intentional changes
|
|
bun run docker:test:update
|
|
```
|
|
|
|
## Benchmarking
|
|
|
|
Find optimal render settings for your hardware:
|
|
|
|
```bash
|
|
# Via the CLI
|
|
npx hyperframes benchmark
|
|
|
|
# Directly from the producer package
|
|
cd packages/producer
|
|
bun run benchmark
|
|
```
|
|
|
|
The benchmark runs several compositions with different quality and FPS settings and reports timing for each combination.
|
|
|
|
## Related Packages
|
|
|
|
<CardGroup cols={2}>
|
|
<Card title="CLI" icon="terminal" href="/packages/cli">
|
|
Command-line interface that wraps the producer for rendering, previewing, and more.
|
|
</Card>
|
|
<Card title="Engine" icon="gear" href="/packages/engine">
|
|
The low-level capture pipeline that the producer uses to grab frames.
|
|
</Card>
|
|
<Card title="Core" icon="cube" href="/packages/core">
|
|
Types, runtime, and linter that the producer depends on.
|
|
</Card>
|
|
<Card title="Studio" icon="palette" href="/packages/studio">
|
|
Visual editor for building compositions before rendering with the producer.
|
|
</Card>
|
|
</CardGroup>
|