arkennemasis HyperFrames Render (HTML project -> MP4)
HTML projects to MP4, and Node.js is the real dependency
- video
- paths
- report
This is the odd one out in the pack. It runs no model, calls no API, and needs no key. It takes one or more HTML projects - the kind with a index.html and an assets folder, animated with CSS or GSAP - and renders each to MP4 by stepping headless Chrome frame by frame and letting FFmpeg encode the result. "HyperFrames Render (HTML project -> MP4)" is the whole feature.
Why would you want that in ComfyUI? Because titles, lower-thirds, kinetic captions and the kind of motion graphics an ad is built out of are not diffusion's job. A deterministic renderer gets them right every time, and the same project always produces the same video - no seed lottery, no face drift, no re-roll because a glyph came out wrong. It's also edit-friendly: a person (or an agent) can open the project between composing and rendering, and neither side needs to know what the other did.
The inputs
jobs is the one that matters: a JSON list of {"project_dir": ..., "output_path": ...}, one entry per format. It's a wired input (forceInput), so it comes from the node that wrote the projects - you're not typing it by hand unless you're debugging:
[{"project_dir": "C:/out/spot_a", "output_path": "C:/out/spot_a/render/1080x1080.mp4"}]
fps is 12–60, default 25 - the tooltip says the reference ads are 25 fps, so that's the sane starting point. quality is a five-way choice - standard, draft, looks, high, delivery - and the tooltip is refreshingly plain about it: standard for delivery, draft renders faster for checking a cut. Use draft while you're still moving things around. workers is parallel Chrome capture workers, 0–32, with 0 meaning "let HyperFrames decide" - and each worker costs roughly 256 MB of RAM, which is the number to keep in mind on a 16 GB box.
Outputs: video, paths, report. Note the subtlety in the source: when you pass several jobs, all renders are reported in paths and written into report, but the video output is the first one. If you queued three aspect ratios, pull the others from paths.
How the first run actually goes
The render is a Node CLI - HyperFrames (github.com/heygen-com/hyperframes, Apache-2.0) - shipped as a pinned npm dependency inside the pack rather than as a sibling folder in custom_nodes, because ComfyUI would try to import a Node project as Python and log a failure. On the first render on a new machine the node runs npm ci against the committed lockfile, reproducing exactly the versions the pack was tested with.
Two things it expects to find on your machine, and both produce a clear error rather than a mystery if they're missing:
- Node.js 22 or newer on PATH. Older or absent, and the node tells you to install it from nodejs.org and restart ComfyUI.
- FFmpeg and FFprobe on PATH. Same deal - it names the missing tool.
Chrome is fetched by HyperFrames itself on first render (chrome-headless-shell, into your user's puppeteer cache), so the very first render is slow: npm install, then a browser download, and only then frames. Plan for it, and don't debug your project while the toolchain is still installing. Telemetry is switched off by the pack (HYPERFRAMES_NO_TELEMETRY=1), which is the right default for a render farm.
Install
The ComfyUI side is the same as the rest of the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install httpx
Manager → search arkennemasis also works. Then make sure the real dependencies are on PATH:
node --version # needs v22 or newer
ffmpeg -version
Restart ComfyUI after installing Node, or the node won't see it.
Traps
- Media must live inside the project. A clip referenced by absolute path or
file://is looked up relative to the project directory and fails asVIDEO_SOURCE_UNRENDERABLE. Copy or hard-link your footage into<project>/assetsfirst - that step is the single most common reason a render dies on someone else's machine. workersis RAM, not magic. Each one is a Chrome process at ~256 MB. Raising it on a 4K project is how you find out how much memory the rest of your graph is holding.- Everything renders serially, one job after another inside the node - and
draftis there for a reason while you iterate on timing. - The
videooutput is the first render only. Multiple formats means readingpaths.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| jobs | STRING | JSON list of {project_dir, output_path}, from the node that wrote the HyperFrames projects. | |
| fps | INT | 2512–60 | Output frame rate. The reference ads are 25 fps. |
| quality | COMBO | standard for delivery; draft renders faster for checking a cut. | |
| workers | INT | 00–32 | Parallel Chrome capture workers. 0 lets HyperFrames decide. Each costs ~256 MB of RAM. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| paths | STRING | — |
| report | STRING | — |