---
title: "@hyperframes/producer"
description: "Render a HyperFrames project from Node.js."
---

`@hyperframes/producer` owns the complete render pipeline: compile the project,
capture its frames, encode the video, and mix its audio.

Use it when rendering is part of your own Node.js service or job runner. For a
local script or terminal workflow, use [`npx hyperframes render`](/developers/cli)
instead.

```bash
npm install @hyperframes/producer
```

## Render one project

`createRenderJob()` describes the render. `executeRenderJob()` receives that
job, the project directory, and the output path.

```ts
import {
  createRenderJob,
  executeRenderJob,
} from "@hyperframes/producer";

const job = createRenderJob({
  fps: 30,
  quality: "standard",
  format: "mp4",
});

await executeRenderJob(
  job,
  "./my-hyperframes-project",
  "./renders/video.mp4",
  (currentJob, message) => {
    console.log(
      `${Math.round(currentJob.progress)}% ${message}`,
    );
  },
);
```

The entry file defaults to `index.html`. Set `entryFile` when the project has a
different entry composition.

```ts
const job = createRenderJob({
  fps: { num: 30000, den: 1001 },
  quality: "high",
  entryFile: "compositions/launch.html",
});
```

## Choose an output

| Format | Best for | Audio |
| --- | --- | --- |
| `mp4` | Default delivery and web playback | AAC |
| `webm` | Transparent video for the web | Opus |
| `mov` | Transparent ProRes 4444 for an editor | AAC |
| `gif` | Small silent previews | None |
| `png-sequence` | Lossless frames for another pipeline | AAC sidecar when needed |

HDR output is available for MP4 through `hdrMode`. Transparent formats render
in SDR because HDR and alpha are not one supported output path.

```ts
const job = createRenderJob({
  fps: 30,
  quality: "high",
  format: "mp4",
  hdrMode: "auto",
});
```

See [HDR rendering](/guides/hdr) for the source and delivery constraints.

## Cancel a render

Pass an abort signal to the final argument:

```ts
const controller = new AbortController();

await executeRenderJob(
  job,
  "./my-hyperframes-project",
  "./renders/video.mp4",
  undefined,
  controller.signal,
);

// Call controller.abort() from your cancellation path.
```

An aborted render throws `RenderCancelledError`. Correctness warnings can also
block a render when `strictness: "strict"` is enabled.

## Build a render service

The package exports a Hono application and server helpers:

```ts
import { startServer } from "@hyperframes/producer";

await startServer({ port: 8080 });
```

For larger workloads, the `@hyperframes/producer/distributed` entry exposes the
three rendering activities—`plan`, `renderChunk`, and `assemble`. Your
orchestrator remains responsible for dispatch, retries, storage, and networking.

## Related topics

<CardGroup cols={2}>
  <Card title="Choose rendering infrastructure" icon="server" href="/deploy/overview">
    Decide between local, server, Temporal, AWS, or another adapter.
  </Card>
  <Card title="@hyperframes/engine" icon="gear" href="/packages/engine">
    Use the lower-level capture and encoding primitives.
  </Card>
</CardGroup>
