Skip to content

Commit 09bc56a

Browse files
committed
Merge remote-tracking branch 'origin/main' into fix/studio-step-list-hold
# Conflicts: # packages/studio/src/hooks/gsapRuntimeKeyframes.ts
2 parents 8661f4f + f70dce7 commit 09bc56a

225 files changed

Lines changed: 6702 additions & 2592 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.claude-plugin/plugin.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "hyperframes",
33
"description": "HyperFrames by HeyGen. Write HTML, render video. Compositions, GSAP and runtime adapter animations, captions, voiceovers, audio-reactive visuals, and website capture for HyperFrames.",
4-
"version": "0.8.123",
4+
"version": "0.8.125",
55
"author": {
66
"name": "HeyGen",
77
"email": "hyperframes@heygen.com",

‎.codex-plugin/plugin.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "hyperframes",
33
"description": "Write HTML, render video. Compositions, Tailwind v4 styles, GSAP and runtime adapter animations, captions, voiceovers, audio-reactive visuals, and website capture for HyperFrames.",
4-
"version": "0.8.123",
4+
"version": "0.8.125",
55
"author": {
66
"name": "HeyGen",
77
"email": "hyperframes@heygen.com",

‎.cursor-plugin/plugin.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"name": "hyperframes",
44
"displayName": "HyperFrames by HeyGen",
55
"description": "Write HTML, render video. Compositions, Tailwind v4 styles, GSAP and runtime adapter animations, captions, voiceovers, audio-reactive visuals, and website capture for HyperFrames.",
6-
"version": "0.8.123",
6+
"version": "0.8.125",
77
"author": {
88
"name": "HeyGen",
99
"email": "hyperframes@heygen.com"

‎.github/workflows/ci.yml‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,11 @@ jobs:
987987
node packages/studio/tests/e2e/thumbnail-save.mjs || rc=1
988988
STUDIO_URL="http://localhost:5316/#project/timeline-trim-snap" \
989989
node packages/studio/tests/e2e/timeline-trim-snap.mjs || rc=1
990+
rm -rf packages/studio/data/projects/timeline-trim-snap
991+
cp -R packages/studio/tests/e2e/fixtures/timeline-trim-snap \
992+
packages/studio/data/projects/timeline-trim-snap
993+
STUDIO_URL="http://localhost:5316/#project/timeline-trim-snap" \
994+
node packages/studio/tests/e2e/timeline-snap-release.mjs || rc=1
990995
exit "$rc"
991996
- name: Measure the caret of a text edited in place
992997
if: success() || failure()

‎docs/changelog.mdx‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,53 @@ Recent HyperFrames releases, including user-facing features, fixes, and migratio
88

99
{/* New release entries are prepended by `bun run changelog:draft <version> --write`. */}
1010

11+
<Update
12+
label="HyperFrames v0.8.125"
13+
description="Released - 2026-10-04"
14+
tags={["Release", "Studio", "Core", "Skills"]}
15+
>
16+
A cropped layer's edge now stays exact while GSAP animates it, in preview and export, and undoing a resize, rotate or GSAP edit shows the change undone at once while it saves.
17+
18+
## Fixes
19+
20+
- **Studio:** Undo shows a resize, rotate or GSAP edit undone at once while it saves ([49333a882d34](https://github.com/heygen-com/hyperframes/commit/49333a882d343cef768f16739a84643296e9da5d), [#5022](https://github.com/heygen-com/hyperframes/pull/5022)).
21+
- **Core:** A cropped element's edge stays exact while GSAP tweens it ([99c389bce9fd](https://github.com/heygen-com/hyperframes/commit/99c389bce9fd893f3c0052c11f6e4844a5da33ab), [#5010](https://github.com/heygen-com/hyperframes/pull/5010)).
22+
23+
## Docs & Examples
24+
25+
- **Skills:** Fix wrong facts and broken paths from the doctrine audit ([0c3e244269aa](https://github.com/heygen-com/hyperframes/commit/0c3e244269aae698149214379280377a9f7a2f2b), [#5026](https://github.com/heygen-com/hyperframes/pull/5026)).
26+
- **Skills:** Resolve cross-skill contradictions from the doctrine audit ([173103dfdec5](https://github.com/heygen-com/hyperframes/commit/173103dfdec5738f85733e6796d56932ad2a7436), [#5028](https://github.com/heygen-com/hyperframes/pull/5028)).
27+
28+
[View the full commit range](https://github.com/heygen-com/hyperframes/compare/v0.8.124...v0.8.125).
29+
</Update>
30+
31+
<Update
32+
label="HyperFrames v0.8.124"
33+
description="Released - 2026-10-04"
34+
tags={["Release", "Studio Server", "Studio", "CLI"]}
35+
>
36+
Undo in Studio now takes added media back with the file, snapping no longer moves a clip to a place it would not save, and motion paths animate when GSAP loads deferred. Media-use can clone, list and delete HeyGen voices.
37+
38+
## Features
39+
40+
- **Studio:** Make edit with framey stand out in the header ([2b82e39cd6fd](https://github.com/heygen-com/hyperframes/commit/2b82e39cd6fde19a74ce4855d5bfc05ceb42b864), [#5019](https://github.com/heygen-com/hyperframes/pull/5019)).
41+
- **Media Use:** Clone, list and delete HeyGen voices, and accept a host OAuth token ([2497402b270a](https://github.com/heygen-com/hyperframes/commit/2497402b270a4f613cf57abc1c29cbc260fb8c07), [#4992](https://github.com/heygen-com/hyperframes/pull/4992)).
42+
- **Skills:** Open Studio before every final render ([69a2169bde0c](https://github.com/heygen-com/hyperframes/commit/69a2169bde0c134f42979e1911755084b1c29962), [#4952](https://github.com/heygen-com/hyperframes/pull/4952)).
43+
- **Cli,studio:** Hand off on macOS now, and open the app on Windows and Linux ([6a27a34f21ef](https://github.com/heygen-com/hyperframes/commit/6a27a34f21ef178d3c5189ab8a4a9f6709c528da), [#4999](https://github.com/heygen-com/hyperframes/pull/4999)).
44+
45+
## Fixes
46+
47+
- **Studio Server:** Undoing a change takes the media ledger back with the film ([a2f41608993e](https://github.com/heygen-com/hyperframes/commit/a2f41608993e3fa74b81b5845d3000a7a0be698e), [#5016](https://github.com/heygen-com/hyperframes/pull/5016)).
48+
- **CLI:** A project .env cannot set the feedback email in another letter case ([dcc721062b51](https://github.com/heygen-com/hyperframes/commit/dcc721062b51776049d9c8fb4a0bf7fade388888), [#5018](https://github.com/heygen-com/hyperframes/pull/5018)).
49+
- **Studio:** A video's sound reads on its clip like an audio row ([ed5c1000b1f1](https://github.com/heygen-com/hyperframes/commit/ed5c1000b1f17e9365e9600e9e8e3993ae7a74be), [#5015](https://github.com/heygen-com/hyperframes/pull/5015)).
50+
- **Studio:** A snap the saved clip would miss no longer moves it ([48bfe618030d](https://github.com/heygen-com/hyperframes/commit/48bfe618030deb3ecedce23a5254d71e7cbd5426), [#5006](https://github.com/heygen-com/hyperframes/pull/5006)).
51+
- **Studio Server:** Motion paths animate when gsap has a query string or loads deferred ([5cee25efcb8d](https://github.com/heygen-com/hyperframes/commit/5cee25efcb8d6d771e312908f9a54d7fe2a9b3ce), [#5007](https://github.com/heygen-com/hyperframes/pull/5007)).
52+
- **Studio:** An audio clip's name pill draws over its waveform ([4a5e38eed64b](https://github.com/heygen-com/hyperframes/commit/4a5e38eed64bb361b078eeba9fc5d756d93aa9a2), [#5013](https://github.com/heygen-com/hyperframes/pull/5013)).
53+
- **Studio:** A first animation in a full-document sub-composition plays ([399f49104e24](https://github.com/heygen-com/hyperframes/commit/399f49104e24ff716e2ca51f024dd8863d9df61a), [#5008](https://github.com/heygen-com/hyperframes/pull/5008)).
54+
55+
[View the full commit range](https://github.com/heygen-com/hyperframes/compare/v0.8.123...v0.8.124).
56+
</Update>
57+
1158
<Update
1259
label="HyperFrames v0.8.123"
1360
description="Released - 2026-10-04"

‎gemini-extension.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"name": "hyperframes",
3-
"version": "0.8.123",
3+
"version": "0.8.125",
44
"description": "HyperFrames by HeyGen. Write HTML, render video. Compositions, GSAP and runtime adapter animations, captions, voiceovers, audio-reactive visuals, and website capture for HyperFrames."
55
}

‎packages/aws-lambda/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hyperframes/aws-lambda",
3-
"version": "0.8.123",
3+
"version": "0.8.125",
44
"description": "AWS Lambda adapter for HyperFrames distributed rendering — handler, client-side SDK, and CDK construct.",
55
"repository": {
66
"type": "git",

‎packages/cli/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hyperframes/cli",
3-
"version": "0.8.123",
3+
"version": "0.8.125",
44
"description": "HyperFrames CLI — create, preview, and render HTML video compositions",
55
"license": "Apache-2.0",
66
"repository": {

‎packages/cli/src/capture/scaffolding.test.ts‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
22
import * as fs from "node:fs";
33
import { tmpdir } from "node:os";
44
import { join } from "node:path";
5-
import { generateProjectScaffold } from "./scaffolding.js";
5+
import { generateProjectScaffold, loadEnvFile } from "./scaffolding.js";
66
import type { DesignTokens } from "./types.js";
77

88
vi.mock("node:fs", async (importOriginal) => {
@@ -123,3 +123,26 @@ describe("generateProjectScaffold metadata", () => {
123123
},
124124
);
125125
});
126+
127+
describe("loadEnvFile", () => {
128+
const keys = ["hyperframes_feedback_email", "HyperFrames_Feedback_Email", "HF_SCAFFOLD_TEST_KEY"];
129+
let dir: string;
130+
131+
beforeEach(() => {
132+
dir = fs.mkdtempSync(join(tmpdir(), "hf-scaffold-env-"));
133+
});
134+
135+
afterEach(() => {
136+
for (const key of keys) delete process.env[key];
137+
fs.rmSync(dir, { recursive: true, force: true });
138+
});
139+
140+
it("never takes the feedback email from a project file, in any letter case", () => {
141+
fs.writeFileSync(
142+
join(dir, ".env"),
143+
'hyperframes_feedback_email=a@example.com\nHyperFrames_Feedback_Email=b@example.com\nHF_SCAFFOLD_TEST_KEY="kept"\n',
144+
);
145+
loadEnvFile(join(dir, "out"));
146+
expect(keys.map((key) => process.env[key])).toEqual([undefined, undefined, "kept"]);
147+
});
148+
});

‎packages/cli/src/capture/scaffolding.ts‎

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import { existsSync, readFileSync } from "node:fs";
99
import { join, resolve } from "node:path";
10+
import { applyDotEnv } from "../utils/dotEnv.js";
1011
import { writeNewFileSync } from "../utils/writeNewFile.js";
1112
import type { CatalogedAsset } from "./assetCataloger.js";
1213
import type { CaptureResult, DesignTokens } from "./types.js";
@@ -21,19 +22,7 @@ export function loadEnvFile(startDir: string): void {
2122
for (let i = 0; i < 5; i++) {
2223
const envPath = resolve(dir, ".env");
2324
try {
24-
const envContent = readFileSync(envPath, "utf-8");
25-
for (const line of envContent.split("\n")) {
26-
const trimmed = line.trim();
27-
if (!trimmed || trimmed.startsWith("#")) continue;
28-
const eq = trimmed.indexOf("=");
29-
if (eq === -1) continue;
30-
const key = trimmed.slice(0, eq).trim();
31-
const val = trimmed
32-
.slice(eq + 1)
33-
.trim()
34-
.replace(/^["']|["']$/g, "");
35-
if (!process.env[key]) process.env[key] = val;
36-
}
25+
applyDotEnv(readFileSync(envPath, "utf-8"), process.env);
3726
break;
3827
} catch {
3928
dir = resolve(dir, "..");

0 commit comments

Comments
 (0)