HyperFrames turns a web page into a video. You write HTML and CSS, add media and seekable animations, and it renders the result frame by frame into a deterministic MP4. A CLI scaffolds a project, previews it in the browser with live reload and renders locally or in the cloud; a desktop app does the same for macOS, Windows and Linux; and a registry of about 450 blocks covers transitions, kinetic captions, charts, maps, 3D and camera moves so a named effect is an install rather than a rebuild.
The reason it is on this list is the agent side. HyperFrames ships seven skills that teach Claude Code, Codex, Cursor or Gemini CLI its production loop: plan the video, write valid HTML, wire the animations, add media, lint, preview and render. Ask for a ten-second product intro with a fade-in title, background video and music and the agent builds it. A media-use skill finds or makes music, voiceover, avatars and footage with HeyGen or free local tools, and a remotion-to-hyperframes skill migrates existing Remotion projects.
It is built by HeyGen, Apache-2.0 licensed, and grew from a March 2026 start to about 77,000 stars by November with releases most days and 125 contributors. Think of it as the agent-first answer to Remotion, which is also on this list: plain HTML instead of React, and a licence with no company tier.
- Repository: github.com/heygen-com/hyperframes
- Licence: Apache-2.0 (Apache License 2.0)
- Language: TypeScript. Stars: 76.6K. Forks: 7,003. Last push: Nov 1, 2026.
- Scan: safe, Nov 1, 2026, commit a2c5a8a
Who it is for
Creators and marketers who would rather describe a video than keyframe it, developers building automated video pipelines from data or docs, and teams with Remotion projects they want an agent to maintain.
Getting started
1. Claude Code: add the plugin marketplace, inside Claude Code
claude plugin marketplace add heygen-com/hyperframes2. Then install the plugin and use /hyperframes
claude plugin install hyperframes@hyperframes3. Any other agent: install the core skills
npx hyperframes skills update4. Or work by hand: scaffold, preview and render (Node 22+ and FFmpeg)
npx hyperframes init my-video && cd my-video && npx hyperframes previewRendering drives a headless browser, so the first render pulls one down. The HeyGen-powered parts of the media skill need a HeyGen account; everything else runs on your machine.
Safety scan
We cloned heygen-com/hyperframes at commit a2c5a8a on Nov 1, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- Two secret hits in 9,555 files and 1.95 million lines: an AWS access key in examples/aws-lambda/scripts/check-sam-deploy.sh that is the AKIAFAKE placeholder the script checks against, and a private-key header inside a content extractor unit test. Neither is a credential.
- Four pattern hits. Two very long lines are generated inline bundles (position-edits-render-inline.ts and hf-early-stub-inline.ts). Two download-piped-to-shell hits are both curl bun.sh/install | bash: one in the Cloud Run Dockerfile, pinned to bun 1.4.4, and one in scripts/test-skills-fresh.sh that only prints the command as advice.
- The npm prepare hook installs lefthook git hooks, and only when a .git folder exists, so an npm install of the package does nothing. 28 committed binaries are .bin files: the registry's local vector index and the catalog fetch mirror, data rather than executables.
- Twenty workflows, none using pull_request_target, and all 54 third-party action uses pinned to commits. Security policy, CodeQL, Renovate, a contributing guide and a code of conduct are all present, which is the strongest hygiene on this list.
- Dependencies: the one lockfile the scanner reads is a registry block's package-lock.json, 32 packages with no advisories. The main workspace locks in bun.lock, which this scan does not parse, so the JavaScript packages you install were not checked. Network hosts are cdn.jsdelivr.net, Google Fonts, static.heygen.ai and example hosts in docs and tests.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | 2 candidates found and read; see the notes above. |
| Suspicious code | 4 pattern hits found and read; every one is listed under the raw findings. |
| Install-time code | 1 npm lifecycle script. 4 installer scripts |
| Committed binaries | 28 executable or compiled objects committed; listed under the raw findings. |
| CI workflows | 20 workflows. None use pull_request_target. 0 of 54 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often cdn.example.com, cdn.jsdelivr.net, cdn.example, fonts.googleapis.com. 16 URLs to a bare IP address, listed under the raw findings. |
| Known vulnerabilities | 0 advisories across 32 pinned packages: 0 critical, 0 high, 0 moderate, 0 low. registry/blocks/godrays/source/package-lock.json: 32 packages, 0 advisories. |
| Project hygiene | Has security policy, automated dependency updates, CodeQL, licence file, contributing guide. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Secret candidates (2, redacted)
| Where | Rule | Match |
|---|---|---|
| examples/aws-lambda/scripts/check-sam-deploy.sh:18 | aws-access-key | AKIAFA…AKE (20 chars) |
| packages/cli/src/capture/contentExtractor.test.ts:478 | private-key | -----B…--- (27 chars) |
Pattern hits (4)
| Where | Rule | Match |
|---|---|---|
| packages/core/src/generated/position-edits-render-inline.ts:3 | very-long-line | 3829 chars |
| packages/gcp-cloud-run/Dockerfile:103 | download-piped-to-shell | RUN curl -fsSL https://bun.sh/install | bash -s "bun-v1.4.4" |
| packages/producer/src/generated/hf-early-stub-inline.ts:3 | very-long-line | 3362 chars |
| scripts/test-skills-fresh.sh:109 | download-piped-to-shell | command -v bun >/dev/null 2>&1 || fail "bun not installed. Install: curl -fsSL https://bun.sh/install | bash" |
URLs to bare IP addresses (16)
| Where | Rule | Match |
|---|---|---|
| packages/cli/src/capture/assetDownloader.test.ts:47 | ip-literal-url | "http://100.64.0.1/", |
| packages/cli/src/capture/assetDownloader.test.ts:48 | ip-literal-url | "http://192.0.0.1/", |
| packages/cli/src/capture/assetDownloader.test.ts:49 | ip-literal-url | "http://198.18.0.1/", |
| packages/cli/src/capture/assetDownloader.test.ts:50 | ip-literal-url | "http://224.0.0.1/", |
| packages/cli/src/capture/assetDownloader.test.ts:51 | ip-literal-url | "http://240.0.0.1/", |
| packages/cli/src/capture/assetDownloader.test.ts:59 | ip-literal-url | expect(isPrivateUrl("http://0.1.2.3/")).toBe(true); |
| packages/cli/src/media-use/lib/freeze.test.mjs:52 | ip-literal-url | assert.equal(isDirectMediaUrl("https://172.40.0.1/a.mp4"), true, "172.40 is public"); |
| packages/cli/src/media-use/lib/media-fetch.test.mjs:41 | ip-literal-url | "https://8.8.8.8/a", |
| packages/engine/src/utils/urlDownloader.test.ts:221 | ip-literal-url | expect(() => assertPublicHttpsUrl("https://172.15.0.1/font.ttf")).not.toThrow(); |
| packages/engine/src/utils/urlDownloader.test.ts:222 | ip-literal-url | expect(() => assertPublicHttpsUrl("https://172.32.0.1/font.ttf")).not.toThrow(); |
| packages/engine/src/utils/urlDownloader.test.ts:251 | ip-literal-url | "https://100.64.0.1/secret", |
| packages/engine/src/utils/urlDownloader.test.ts:252 | ip-literal-url | "https://198.18.0.1/secret", |
| packages/engine/src/utils/urlDownloader.test.ts:253 | ip-literal-url | "https://192.0.2.1/secret", |
| packages/engine/src/utils/urlDownloader.test.ts:254 | ip-literal-url | "https://224.0.0.1/secret", |
| packages/engine/src/utils/urlDownloader.test.ts:255 | ip-literal-url | "https://240.0.0.1/secret", |
| packages/engine/src/utils/urlDownloader.test.ts:256 | ip-literal-url | "https://255.255.255.255/secret", |
npm lifecycle scripts (1)
package.jsonprepare:test -e .git && lefthook install || true
Installer scripts (4)
Committed binaries (28)
registry/catalog-artifact/local-vectors.bin: .bin, 688 KBscripts/catalog-fetch-mirror/6ea12fa77b5d9e7cef868d13.bin: .bin, 34 KBscripts/catalog-fetch-mirror/9fca1e9095ed294968aa18f7.bin: .bin, 33 KBscripts/catalog-fetch-mirror/68c23b7290680c2b6ef37032.bin: .bin, 33 KBscripts/catalog-fetch-mirror/d3b6c159f462183ba7796270.bin: .bin, 33 KBscripts/catalog-fetch-mirror/ae40a5f8f9f604f443e21213.bin: .bin, 33 KBscripts/catalog-fetch-mirror/2427868cae6e8cf32d2e8d8b.bin: .bin, 32 KBscripts/catalog-fetch-mirror/f664c5b9216de5d0d4ece5a0.bin: .bin, 32 KBscripts/catalog-fetch-mirror/b13fa08305318ea628453cec.bin: .bin, 32 KBscripts/catalog-fetch-mirror/c356c27cca02fa3bfd0c2bef.bin: .bin, 32 KBscripts/catalog-fetch-mirror/57dacd2ef96ca543d3e0e6a3.bin: .bin, 31 KBscripts/catalog-fetch-mirror/e3292e3f83690316b015865b.bin: .bin, 31 KBscripts/catalog-fetch-mirror/42e5ad0b3cee71d5f01953d8.bin: .bin, 31 KBscripts/catalog-fetch-mirror/8bfba0d6e85d9f059d9b5982.bin: .bin, 31 KBscripts/catalog-fetch-mirror/e59d60b150022666efbc6da6.bin: .bin, 31 KBscripts/catalog-fetch-mirror/47d5160342b9998840916131.bin: .bin, 31 KBscripts/catalog-fetch-mirror/5905d90fd449470dac1b291d.bin: .bin, 31 KBregistry/catalog-artifact/media-vectors.bin: .bin, 29 KBscripts/catalog-fetch-mirror/d446a78da686ab7e4cd84394.bin: .bin, 27 KBscripts/catalog-fetch-mirror/33e36a8542f94c359351e55c.bin: .bin, 26 KBscripts/catalog-fetch-mirror/728492d30bf60f21ae04abd1.bin: .bin, 26 KBscripts/catalog-fetch-mirror/fa10510792f83e658fd729ad.bin: .bin, 26 KBscripts/catalog-fetch-mirror/95061b23401efc9ba7409666.bin: .bin, 25 KBscripts/catalog-fetch-mirror/36535127950d69fb03da1a51.bin: .bin, 25 KB- and 4 more
By the numbers
| Stars | 76.6K |
|---|---|
| Forks | 7,003 |
| Contributors | 125 |
| Commits | 6,568 |
| Open issues | 74 |
| Open pull requests | 133 |
| Releases | 574 |
| Latest release | v0.8.225 |
| Licence | Apache-2.0 |
| Main language | TypeScript |
| Project age | 7 months |
| Last push | Nov 1, 2026 |
| Tracked files | 9,555 |
| Lines of code | 2M |
| Checkout size | 328 MB |
Lines by language: TypeScript 1.1M, HTML 321K, Markdown 306.3K, JavaScript 181.2K, JSON 58K, YAML 6,135.
Questions
Is HyperFrames free?
Yes. The framework, CLI, desktop app, skills and registry are Apache-2.0, free for commercial use. Cloud rendering and HeyGen's avatars, voices and generated video are paid services you can leave out.
HyperFrames or Remotion?
Remotion builds videos as React components under a licence that charges companies with more than three employees. HyperFrames uses plain HTML and CSS, is Apache-2.0 and was designed for agents from the start, with a skill that converts Remotion projects frame by frame.
Do I need to know how to code?
Not to get a video: with the plugin installed you describe it and the agent writes the HTML. Knowing a little HTML and CSS helps when you want to tweak the result by hand, and the desktop app lets you preview and scrub without touching a terminal.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
