Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
e966311
feat(studio): make presets the primary path into the FX rack
vanceingalls Aug 14, 2026
adfdb69
fix(core,studio): silence hidden audio in preview, and call it mute
vanceingalls Aug 14, 2026
fa05d3a
feat(core): pitch shift — a granular shifter as the fifth FX worklet
vanceingalls Aug 14, 2026
ee6486c
feat(core,studio): the character presets pitch shift unlocks
vanceingalls Aug 14, 2026
e421855
feat(core): the audio group model — element, membership, helpers
vanceingalls Aug 14, 2026
dd3212d
feat(studio): group rows in the timeline, and a split disclosure
vanceingalls Aug 15, 2026
5dc93a2
feat(core): route grouped audio through a group bus in preview
vanceingalls Aug 15, 2026
351b219
feat(studio,lint): carve targets voiceover groups — always, when plural
vanceingalls Aug 15, 2026
8052f3e
feat(engine): render grouped audio through a summed, FX-processed bus
vanceingalls Aug 16, 2026
e1c9b50
feat(studio,core): a volume and a living meter on the group row
vanceingalls Aug 16, 2026
301cb8b
feat(studio,core): mute groups, and hear-only-this that cannot reach …
vanceingalls Aug 16, 2026
1d5405e
feat(studio,core): reach presets and the rack from the timeline
vanceingalls Aug 16, 2026
5850a0c
fix(studio,core): unify the audio id space, emit group elements, gate…
vanceingalls Aug 16, 2026
a8d2782
fix(studio): half-lit group solo compares bare DOM ids too
vanceingalls Aug 16, 2026
ce6426d
fix(studio): group rows survive a missing provider, a collapse, an ed…
vanceingalls Aug 16, 2026
2cd8b43
fix(core,engine): make a group's preview match what the render bakes
vanceingalls Aug 16, 2026
c1a9390
fix(core): stop the pitch shift delaying audio it is not shifting
vanceingalls Aug 16, 2026
29ed258
test(engine): read what ffmpeg actually writes for pcm_f32le
vanceingalls Aug 16, 2026
07203f5
fix(engine): keep a group's headroom through its FX chain, not just u…
vanceingalls Aug 16, 2026
7393095
fix(studio,core,engine): close the defects a max-effort review found …
vanceingalls Aug 16, 2026
ff49650
fix(studio): three defects a browser found that no amount of reading did
vanceingalls Aug 17, 2026
25d7af8
fix(studio,core): groups open by default, headers fit, and two contra…
vanceingalls Aug 18, 2026
6056ec7
fix(studio): close seven defects a review found in the previous two c…
vanceingalls Aug 18, 2026
6de75fd
fix(studio): make sub-composition audio groups actually work
vanceingalls Aug 18, 2026
86420cd
fix(studio): indent group member rows under their bus
vanceingalls Aug 18, 2026
a3ab011
fix(studio,core): make the group bus a place effects can actually be …
vanceingalls Aug 18, 2026
77dd736
fix(studio): audition a preset where the thing it applies to actually…
vanceingalls Aug 18, 2026
c224706
fix(studio): audition through a mute, and stop the audition leaking i…
vanceingalls Aug 18, 2026
92081f4
fix(core): stop the running audio before rescheduling it on a mute to…
vanceingalls Aug 18, 2026
e728108
revert(studio): pull the audition surface back to what B7 and C1 specify
vanceingalls Aug 18, 2026
fb00b4a
test(studio): keep mixing-desk words out of the group strip
vanceingalls Aug 18, 2026
6f0cbb0
feat(studio): open a group's rack from its row header, and let the ra…
vanceingalls Aug 18, 2026
926496f
fix(studio): restore the audition's seek, in the place both racks share
vanceingalls Aug 19, 2026
e9baba6
feat(studio): a group's own automation lanes, where its ∿ said they were
vanceingalls Aug 19, 2026
1f4bccd
feat(studio): the three pieces of §5 copy the routing shipped without
vanceingalls Aug 19, 2026
47030f5
test(studio): pin C1's own definition — a group preset writes the gro…
vanceingalls Aug 19, 2026
dd45bcf
fix(studio): close four gaps found against the rendered designs
vanceingalls Aug 19, 2026
19f1adc
refactor(studio): split the group name button out, and unbarrel the p…
vanceingalls Aug 19, 2026
f565cf8
fix(studio): match the rendered designs' remaining copy
vanceingalls Aug 19, 2026
f87ef04
fix(studio): drop the hide control from audio elements in the propert…
vanceingalls Aug 19, 2026
db24bb0
fix(studio): take the visibility control off audio track headers
vanceingalls Aug 19, 2026
26c467c
fix(studio): raise the timeline's popovers above the ruler
vanceingalls Aug 19, 2026
1524f4e
fix(studio): give the group header two lines — name, then controls
vanceingalls Aug 19, 2026
82cfb36
fix(studio): two-line track headers, and a real solo button
vanceingalls Aug 19, 2026
2199f55
feat(studio,core)!: remove mute and solo from tracks and groups
vanceingalls Aug 19, 2026
77308f4
fix(studio): stop HMR crashing the studio with a phantom missing prov…
vanceingalls Aug 19, 2026
1b16a4c
feat(studio,core)!: remove the group volume slider and level meter
vanceingalls Aug 19, 2026
e090b50
refactor(core): drop the transport's now-orphaned groupIds()
vanceingalls Aug 19, 2026
acfd425
fix(studio): keep the carve's own lanes out of the timeline
vanceingalls Aug 19, 2026
b4bf9d4
fix(studio): tint group member rows, and right-anchor every lane toggle
vanceingalls Aug 19, 2026
ff55adf
fix(studio): drop the group bus strip and give the row back its height
vanceingalls Aug 19, 2026
624166f
fix(studio): hide a group's lane toggle when it automates nothing
vanceingalls Aug 19, 2026
f26f48b
fix(studio): re-read a group's own automation after an edit lands on it
vanceingalls Aug 19, 2026
a387850
fix(core,studio): a voice track is never a carve bed, and never carve…
vanceingalls Aug 19, 2026
a05f16c
fix(studio): don't offer layout grouping for a selection of audio clips
vanceingalls Aug 19, 2026
5614b26
fix(studio): don't offer "Hide all" for audio, and let hidden audio b…
vanceingalls Aug 19, 2026
a014e00
feat(studio): draw automation lanes always, and drop the disclosure f…
vanceingalls Aug 20, 2026
dc7187b
Revert "feat(studio): draw automation lanes always, and drop the disc…
vanceingalls Aug 20, 2026
3895ba6
fix(studio): an audio track keeps its own header when it has automation
vanceingalls Aug 20, 2026
b91247d
fix(studio): put the group pointer on the control line, not a third h…
vanceingalls Aug 20, 2026
8eebed0
fix(studio): pin a track header's two lines to the top TRACK_H
vanceingalls Aug 20, 2026
fa0f12a
fix(studio): show a carve's own lanes, read-only, instead of hiding them
vanceingalls Aug 20, 2026
db1b813
feat(studio): one-line track header, controls right-aligned
vanceingalls Aug 20, 2026
6b4b91e
style(studio): match the group caret to the property panel's
vanceingalls Aug 20, 2026
c5c6c63
feat(studio): one-line group header, matching the track headers
vanceingalls Aug 20, 2026
b6bac05
feat(studio): show the full name on hover for truncated rack labels
vanceingalls Aug 20, 2026
cd5cc00
feat(studio): wrap gutter names instead of truncating them
vanceingalls Aug 20, 2026
9f5c91c
feat(studio): clicking an automation lane's label reveals it in the rack
vanceingalls Aug 20, 2026
0477aa1
docs(skills): teach /hyperframes-audio the submix bus
vanceingalls Aug 20, 2026
73d1c90
docs(plans): session handoff for the audio-groups / carve / gutter work
vanceingalls Aug 20, 2026
98a123e
fix(studio): host the dev server on bun so dev-mode renders resolve
vanceingalls Aug 20, 2026
3e84832
fix(studio): resolve the patch target before the optimistic live write
vanceingalls Aug 20, 2026
939efa3
refactor(studio): split the track header's label rows into their own …
vanceingalls Aug 20, 2026
b81f494
refactor(studio): decompose the preview-sync callbacks
vanceingalls Aug 20, 2026
04d12a1
refactor(studio): name the two branchy steps in the Audio FX panel
vanceingalls Aug 20, 2026
f2d9de7
refactor(engine): split the audio FX render's page transfer
vanceingalls Aug 20, 2026
edfa7a7
refactor(core): give the FX node codec named field readers
vanceingalls Aug 20, 2026
18709a4
refactor(studio): split the carve module into its four parts
vanceingalls Aug 20, 2026
2e31c80
refactor(studio): fold the branch's lane slot into main's split of th…
vanceingalls Aug 20, 2026
730f7d4
fix(core): route the media-element transport through the group bus
vanceingalls Aug 20, 2026
bbee47c
fix(studio): spell the dev server's bun invocation with vite's real path
vanceingalls Aug 20, 2026
fdf0cf3
test(core): cover the group-bus routing, and clear the last five over…
vanceingalls Aug 20, 2026
dfecece
chore: regenerate the skills manifest for the audio skill
vanceingalls Aug 20, 2026
113586a
docs(plans): mark the audio-groups handoff historical
vanceingalls Aug 20, 2026
d16d147
test(engine): give the real-ffmpeg audio suites a timeout Windows can…
vanceingalls Aug 20, 2026
c28300f
fix(core): clamp the native volume of an over-unity clip
vanceingalls Aug 20, 2026
5d0c982
fix(core): stop the runtime stamping timing onto an <hf-audio-group> bus
vanceingalls Aug 20, 2026
373884d
feat(studio): wrap FX parameter names instead of truncating them
vanceingalls Aug 20, 2026
4f89082
feat(lint): flag an audio group no clip joins, and timing attrs on a bus
vanceingalls Aug 20, 2026
ee91d3b
fix(lint): only judge audio-group membership in a file that declares …
vanceingalls Aug 20, 2026
1b94db7
fix(core): resolve an audio bus by tag, re-read it, and clamp it like…
vanceingalls Aug 20, 2026
0fcf592
fix(core): gate the hidden-audio reschedule on its own canary
vanceingalls Aug 20, 2026
608c3b5
fix(engine): give the group sub-mix the failure contract, and sanitiz…
vanceingalls Aug 20, 2026
730ea1e
fix(studio): stop the carve measuring the bed, reciprocating, and fir…
vanceingalls Aug 20, 2026
a4b3eb0
fix(studio): make the reveal actually fire, and give a hidden group a…
vanceingalls Aug 20, 2026
a44ebd7
fix(studio): compare the reveal request across the id-space boundary
vanceingalls Aug 20, 2026
0fe9759
fix(studio): unwind to the file's value, and mirror a group write to …
vanceingalls Aug 20, 2026
8c97113
fix(core,engine): give each audio bus instance its own identity in th…
vanceingalls Aug 20, 2026
8b42226
fix(studio): gate the label column, match keyboard expandability, sto…
vanceingalls Aug 20, 2026
94ecaa3
fix(studio): align group lane labels with their curves, and three sma…
vanceingalls Aug 20, 2026
a5f2e51
perf(core): dirty-gate the group mute sweep
vanceingalls Aug 20, 2026
ee28e62
docs(skills): teach the router that a chain can span several tracks
vanceingalls Aug 20, 2026
a9a08bb
chore: regenerate the skills manifest for the router rows
vanceingalls Aug 20, 2026
5112965
chore: re-trigger CI
vanceingalls Aug 20, 2026
952401d
feat(audio): ship the audio FX, group and mute features to everyone
vanceingalls Aug 21, 2026
5dc39a8
fix(studio,lint,skills): a bus is never a carve bed
vanceingalls Aug 23, 2026
df7ba16
fix(studio): a read-only lane stops pretending it is draggable
vanceingalls Aug 23, 2026
553ea25
fix(studio,core): audio has timing, not motion — and a bus has neither
vanceingalls Aug 23, 2026
0126db7
Merge origin/main into the audio stack
vanceingalls Aug 23, 2026
44c5ac5
fix(audio): harden group routing and audition
vanceingalls Aug 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Atomic capabilities the creation workflows compose against — pull one when you
- `/hyperframes-keyframes` — seek-safe keyframe authoring across runtimes: GSAP timelines, CSS keyframes, Anime.js, WAAPI, FLIP, paths, masks, SVG morph/draw, text trails, 3D depth; plus `hyperframes keyframes` diagnostics for surfacing and verifying rendered motion.
- `/hyperframes-creative` — non-animation creative direction: `frame.md` / `design.md` handling, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns.
- `/media-use` — the media OS: resolve any media need (BGM, SFX, image, icon, logo, voice, color grade, LUT) into a frozen local file or paste-ready block + ledger record; generate via TTS / music / image models when the catalog misses; transcribe, caption, remove backgrounds, and reuse assets across projects. One shared `scripts/audio.mjs` engine + manifest tracking; keeps search noise on disk.
- `/hyperframes-audio` — mix the audio already placed in a composition: voiceover carve (dip a music bed only in the bands the voice occupies, static or dynamic, level match included), the effect chain (EQ, compressor, limiter, gate, saturation, delay, reverb, chorus, phaser, bitcrush), and automation envelopes on volume or any effect parameter. Sourcing the audio is `/media-use`; this is what happens to it afterwards.
- `/hyperframes-audio` — mix the audio already placed in a composition: voiceover carve (dip a music bed only in the bands the voice occupies, static or dynamic, level match included), the effect chain (EQ, compressor, limiter, gate, saturation, delay, reverb, chorus, phaser, bitcrush), automation envelopes on volume or any effect parameter, and submix buses (`<hf-audio-group>`) that carry one chain, fader and automation clock for several tracks at once. Sourcing the audio is `/media-use`; this is what happens to it afterwards.
- `/hyperframes-cli` — CLI dev loop: `init`, `add`, `lint`, `check`, `snapshot`, `preview`, `render`, `publish`, `doctor`, `lambda` (AWS Lambda cloud rendering).
- `/hyperframes-registry` — install and wire registry blocks and components into compositions via `hyperframes add`. Covers authoring a new block or component to contribute upstream.
- `/figma` — import Figma assets, tokens, components, and storyboard sections → reconstructed motion (frames read as states, not slides) (REST/CLI) plus Motion animations (MCP) and shaders (MCP source / native export) into a composition.
Expand Down
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,17 @@ This writes `dist/hyperframes-plugin.zip` with a `hyperframes/` root folder and

Atomic capabilities the creation workflows compose against — pull one when you need that specific layer.

| Skill | Covers |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/hyperframes-core` | The composition contract — `data-*` timing attributes, `class="clip"`, tracks, sub-compositions, variables, framework-owned media playback, determinism rules. |
| `/hyperframes-animation` | All animation knowledge — atomic motion rules, scene blueprints, transitions, runtime adapters (GSAP / Lottie / Three.js / Anime.js / CSS / WAAPI / TypeGPU). |
| `/hyperframes-keyframes` | Seek-safe keyframe authoring across runtimes — GSAP timelines, CSS keyframes, Anime.js, WAAPI, FLIP, paths, masks, SVG morph/draw, 3D depth — plus `hyperframes keyframes` diagnostics for rendered motion. |
| `/hyperframes-creative` | Non-animation creative direction — `frame.md` / `design.md`, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns. |
| `/media-use` | The media OS — resolve any media need (BGM, SFX, image, icon, logo, voice, color grade, LUT) into a frozen local file or paste-ready block + ledger record, generate via TTS/music/image models when the catalog misses, transcribe, caption, remove backgrounds, and reuse assets across projects. One shared audio engine + manifest tracking. |
| `/hyperframes-cli` | CLI dev loop — `init`, `lint`, `check`, `snapshot`, `preview`, `render`, `publish`, `doctor`, plus HeyGen-hosted cloud rendering (`cloud render`) and AWS Lambda rendering (`lambda deploy / render / progress`). |
| `/hyperframes-audio` | Mix the audio already placed in a composition — voiceover carve (dip a music bed only in the bands the voice occupies, static or dynamic, level match included), the effect chain (EQ, compressor, limiter, gate, saturation, delay, reverb, chorus, phaser, bitcrush), and automation envelopes on volume or any effect parameter. Sourcing the audio is `/media-use`. |
| `/hyperframes-registry` | Install and wire registry blocks and components into compositions via `hyperframes add`. Authoring a new block or component to contribute upstream. |
| `/figma` | Import Figma assets, tokens, components, and storyboard sections → reconstructed motion (frames read as states, not slides) (REST/CLI) plus Motion animations (MCP) and shaders (MCP source / native export) into a composition. |
| Skill | Covers |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `/hyperframes-core` | The composition contract — `data-*` timing attributes, `class="clip"`, tracks, sub-compositions, variables, framework-owned media playback, determinism rules. |
| `/hyperframes-animation` | All animation knowledge — atomic motion rules, scene blueprints, transitions, runtime adapters (GSAP / Lottie / Three.js / Anime.js / CSS / WAAPI / TypeGPU). |
| `/hyperframes-keyframes` | Seek-safe keyframe authoring across runtimes — GSAP timelines, CSS keyframes, Anime.js, WAAPI, FLIP, paths, masks, SVG morph/draw, 3D depth — plus `hyperframes keyframes` diagnostics for rendered motion. |
| `/hyperframes-creative` | Non-animation creative direction — `frame.md` / `design.md`, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns. |
| `/media-use` | The media OS — resolve any media need (BGM, SFX, image, icon, logo, voice, color grade, LUT) into a frozen local file or paste-ready block + ledger record, generate via TTS/music/image models when the catalog misses, transcribe, caption, remove backgrounds, and reuse assets across projects. One shared audio engine + manifest tracking. |
| `/hyperframes-cli` | CLI dev loop — `init`, `lint`, `check`, `snapshot`, `preview`, `render`, `publish`, `doctor`, plus HeyGen-hosted cloud rendering (`cloud render`) and AWS Lambda rendering (`lambda deploy / render / progress`). |
| `/hyperframes-audio` | Mix the audio already placed in a composition — voiceover carve (dip a music bed only in the bands the voice occupies, static or dynamic, level match included), the effect chain (EQ, compressor, limiter, gate, saturation, delay, reverb, chorus, phaser, bitcrush), automation envelopes on volume or any effect parameter, and submix buses (`<hf-audio-group>`) carrying one chain, fader and automation clock for several tracks at once. Sourcing the audio is `/media-use`. |
| `/hyperframes-registry` | Install and wire registry blocks and components into compositions via `hyperframes add`. Authoring a new block or component to contribute upstream. |
| `/figma` | Import Figma assets, tokens, components, and storyboard sections → reconstructed motion (frames read as states, not slides) (REST/CLI) plus Motion animations (MCP) and shaders (MCP source / native export) into a composition. |

For visual design handoff workflows, see the [Claude Design guide](https://hyperframes.heygen.com/guides/claude-design) and [Open Design guide](https://hyperframes.heygen.com/guides/open-design).

Expand Down
17 changes: 14 additions & 3 deletions packages/cli/src/server/studioServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,20 @@ const REMOTE_GIF_IMG_SRC_RE =
/<img\b[^>]*?\bsrc\s*=\s*["'](https?:\/\/[^"']+\.gif(?:[?#][^"']*)?)["'][^>]*>/gi;

async function loadStudioProducer() {
return isDevMode()
? await import("../../../producer/src/index.js")
: await import("@hyperframes/producer");
if (!isDevMode()) return await import("@hyperframes/producer");
// The producer's SOURCE uses the TS convention of `.js` specifiers naming
// `.ts` files, which bun resolves and Node does not. Node 22 strips TS types
// natively, so a Node-hosted dev server boots fine and only dies here, as
// `Cannot find module .../renderOrchestrator.js` with no other context.
// Vite's own shebang is `#!/usr/bin/env node` and it hosts this API
// in-process, so `vite` without `bun --bun` lands exactly here.
if (!process.versions.bun) {
throw new Error(
"Studio dev-mode rendering requires bun (the producer is loaded from TypeScript source, " +
"which Node cannot resolve). Restart the studio with `bun run studio`.",
);
}
return await import("../../../producer/src/index.js");
}

// ── Path resolution ─────────────────────────────────────────────────────────
Expand Down
Loading
Loading