Commit Graph
1623 Commits
Author SHA1 Message Date
Miguel Angel Simon Sierra 60c4bfbff8 test(core): restore the per-clip start-wait case and format the buffering test 2026-11-02 02:44:20 -05:00
Miguel Angel Simon Sierra 351687cef9 test(core): the WebKit data-ahead case starves a clip mid-film, after the start wait 2026-11-02 02:16:28 -05:00
Miguel Angel Simon Sierra 492d60b2ad fix(core): a clip catching up does not hold the film when its sync seek lands 2026-11-02 02:11:21 -05:00
Miguel Angel Simon Sierra 2546ed040a fix(core): only the clips the start wait gave up on run on without data 2026-11-02 02:11:19 -05:00
Miguel Angel Simon Sierra 4e0740ee16 fix(core): play waits 0.3 s for a clip with no data, then runs on and lets it catch up 2026-11-02 02:11:05 -05:00
James RussoandClaude Opus 5.5 f1391156e0 chore: release v0.9.0 (#6980)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-02 05:14:22 +00:00
Miguel Ángel 6bbda219bb fix(core): a smaller preview copy nobody wants any more no longer swaps in (#6973)
* fix(core): a smaller preview copy nobody wants any more no longer swaps in

* refactor(core): name the dropped copy instead of commenting it
2026-11-02 04:41:07 +00:00
Miguel Ángel 8519f28363 fix(core): a preview video short of data holds the film instead of looping snippets (#6974)
* fix(core): a preview video short of data holds the film instead of looping snippets

* fix(core): keep the comment share of the runtime files where it was
2026-11-02 04:14:40 +00:00
Miguel Ángel f0b2dd0cdb chore: release v0.8.231 (#6971) 2026-11-02 03:34:08 +00:00
Miguel Ángel fb2c28e8aa chore: release v0.8.230 (#6962) 2026-11-01 23:52:11 +00:00
Miguel Ángel de6ec3811e fix: cache paths follow HYPERFRAMES_CACHE_DIR (#6716)
* fix: cache paths follow HYPERFRAMES_CACHE_DIR

Every place HyperFrames keeps downloaded or built files now takes its
folder from one helper, hyperframesCacheDir() in @hyperframes/core. The
default stays ~/.cache/hyperframes; HYPERFRAMES_CACHE_DIR moves it.

* fix: register the cache-dir subpath for bun and node, and build inspector from core source

* test: the cache-dir override test uses a folder that is absolute on every platform

* fix: the opencv cache follows HYPERFRAMES_CACHE_DIR

* fix(cli): npm installs run in their staging dir, so no cache path reaches a command line

* fix(cli): whisper.cpp is cloned inside its build dir, so no cache path is a git argument

* test(cli): the whisper clone test finds no system whisper on Windows either
2026-11-01 22:44:11 +00:00
Miguel Ángel 9284e69fff fix(core): accept 65-point .cube LUTs, the size grading apps export (#6921)
* fix(core): accept 65-point .cube LUTs, the size grading apps export

* fix(core): shrink LUTs wider than the GPU texture limit instead of rendering black
2026-11-01 20:46:08 +00:00
Vance Ingalls 5540f49121 chore: release v0.8.229 (#6951) 2026-11-01 12:42:11 -08:00
Miguel Ángel 3179348d9a chore: release v0.8.228 (#6943)
* chore: release v0.8.228

* docs(release): the v0.8.228 notes say what limiting a mix far over the ceiling costs
2026-11-01 18:14:51 +00:00
Miguel Ángel 89a5953161 fix(core): music keeps playing while a preview video swaps to a new copy (#6937)
* fix(core): music keeps playing while a preview video swaps to a new copy

* refactor(core): drop a comment the constant's name already says
2026-11-01 16:55:53 +00:00
Miguel Ángel 7aa3a447e2 chore: release v0.8.227 (#6936) 2026-11-01 16:16:13 +00:00
Miguel Ángel 6b3e7a7a95 fix(cli): check and snapshot free video clips the playhead left, halving memory on cut films (#6929)
* fix(cli): check and snapshot free video clips the playhead left, halving memory on cut films

* fix(core): drop the releaseMedia doc comment that raised the file's comment share
2026-11-01 14:50:41 +00:00
Miguel Ángel af0d68d612 fix(core): a resized preview video keeps its picture while its new copy loads (#6922)
* fix(core): a resized preview video keeps its picture while its new copy loads

Swapping a video to a copy made for its new size emptied it until the copy
decoded, so the preview showed black for a moment. The swap now shows a still
of the frame it had, as the video's poster, until the new copy can draw.

* fix(core): a held preview still is let go when no file loads back

* chore(core): raise the packed size budget for the held preview still
2026-11-01 12:00:26 +00:00
Miguel Ángel f08f07ab64 chore: release v0.8.226 (#6917) 2026-11-01 06:04:20 +00:00
Miguel Ángel e181d34edc feat(core): WebKit plays bare audio from a decoded buffer on the audio clock (#6912)
* feat(core): WebKit plays bare audio from a decoded buffer on the audio clock

* fix(core): a handed-over WebKit track goes back to its element when the speed changes
2026-11-01 03:53:30 +00:00
Miguel Ángel 2c1a10f3ad fix(core): Safari keeps playing edits' audio without seeks or rate changes (#6888)
* test(player): play the WebKit audio edits in real Safari on a macOS runner

* fix(core): Safari keeps playing edits' audio without seeks or rate changes

* fix(core): keep the 0.1 s audio sync bound outside WebKit

* fix(core): restore main's audio steering outside WebKit

* fix(core): tell WebKit from the test DOM's user agent

* fix(core): name WebKit's audio start lag instead of commenting it

* fix(core): count embedded WKWebViews as WebKit for audio sync
2026-11-01 03:08:27 +00:00
Miguel Ángel bba3676a37 feat(core): the playback health reading says which clock the film followed (#6906)
* feat(core): the playback health reading says which clock the film followed

* style(core): format the clock's new reading

* refactor(core): let the clock's names say what the comments said
2026-10-31 23:29:33 +00:00
Miguel Ángel 88f9ae8468 fix(core): a page saved as UTF-16 bundles as its text, not NUL bytes (#6580)
* fix(core): a page saved as UTF-16 bundles as its text, not NUL bytes

* fix(core): render, lint and the asset reader decode UTF-16 pages too
2026-10-31 21:02:41 +00:00
Miguel Ángel b687d06235 chore: release v0.8.225 (#6898) 2026-10-31 20:58:04 +00:00
Miguel Ángel 2239771efd chore: release v0.8.224 (#6885) 2026-10-31 15:13:39 -04:00
Miguel Ángel 1e5413f34c fix(core): a stuck seek in check or snapshot fails named before the protocol timeout (#6596)
* fix(core): a seek that never settles ends after 30 s and names what it waits on

* fix(core): keep the seek-wait comments within the comment limits

* fix(core): only a caller's limit ends a seek wait; check and snapshot end it before their timeout
2026-10-31 16:48:36 +00:00
Miguel Ángel 5c92fb0776 fix(core): style a sub-composition root written as #root[data-composition-id] (#6843)
* fix(core): style a sub-composition root written as #root[data-composition-id]

* fix(core): keep an anonymous host's root styled when #root[data-composition-id] is scoped

* fix(core): scope a compounded authored root as a selector list so pseudo-elements stay valid
2026-10-31 16:46:25 +00:00
Miguel Ángel 0c16afd949 fix(core): Safari stops chopping audio by seeking it over and over during playback (#6854)
* fix(core): Safari stops chopping audio by seeking it over and over during playback

* test(player): the WebKit playbench also counts audio seeks and frozen audio

* fix(core): audio still catching up is seeked once its lag passes hard sync
2026-10-31 16:12:24 +00:00
Miguel Ángel 2bd8cd95cb refactor(core): split the frozen-picture judgement so it stays under the complexity limit (#6870) 2026-10-31 02:13:23 +00:00
Miguel Ángel 2439b62acd chore: release v0.8.223 (#6869) 2026-10-30 19:11:14 -07:00
Vance IngallsandClaude Opus 5.5 5e4f5aefb5 fix(core): motion blur preview no longer slows down later in the timeline (#6865)
* fix(core): motion blur preview no longer slows down later in the timeline

With data-motion-blur-events="on", which Studio's Subtle and Strong write,
both blur tiers ran timeline callbacks at every per-frame pose read. Each
frame's reads step back from half a shutter ahead to the frame, so a
callback that keeps state and replays from zero on a backward seek (a
ripple simulation, for example) redid its whole history most frames, and
the cost grew with the playhead.

The mover scan still runs callbacks, so motion set from a render(t)
callback is still found. With events on, it also scans once without them,
and the per-frame reads run callbacks only when the two scans disagree.
The eventful scan runs first, so tweens take their start values after the
callbacks before them and a one-off call fires as often as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(core): keep the motion blur comments to the invariant

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(core): motion blur reads run callbacks when a callback moves any box

Comparing which elements each scan finds missed a callback that pans a
mover's ancestor while a tween also changes that ancestor: both scans
found the same movers and the same changing elements, so the reads left
the pan out. The scans now compare every changing element's box at each
step, and the reads run callbacks when any step differs.

Raises @hyperframes/core's unpacked size budget to the measured size plus
the usual 5%: main already sat 0.98% over the old budget, and this change
adds 1,232 bytes, which tipped it past the 1% tolerance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(core): silent motion blur reads land back on the frame as its own seek left it

After silent pose reads, the restore seek back to the frame left GSAP in a
different state than the frame's own eventful seek did:

- A step exactly on the frame (a .call() or set) was re-armed, so the next
  frame fired it again. Calls fired 2-5 times per crossing, and a toggle
  could end inverted.
- In renders, which keep no GSAP structure, landing back on the frame from
  later skipped same-time steps' authored order, so the frame showed the
  first of two sets instead of the last.

Events-off blur always read silently and had both. This PR moves events-on
roots without callback-driven motion (the Studio default) onto that path,
so both are fixed here.

The host's new holdFrame snapshots every landing mark on the root and scene
timelines before the reads, and its restore seeks back silently, redraws in
authored order where there is no structure, and puts the marks back. Each
call now fires once per frame crossing, as without blur, and same-time sets
land as authored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(core): a held render frame draws its scenes first, so the root lands last

holdFrame redrew the root and then the scenes, the reverse of the frame's
own seek. When a scene and the root tween one property, the frame landed
on the scene's value instead of the root's.

The hold and landing move into the GSAP adapter as holdFrameMarks, which
takes the scenes and the root separately, so the order lives in one place
a real-GSAP test can pin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 18:21:27 -07:00
Miguel Ángel 443ded4261 fix(player): preview voice no longer goes silent while other tracks play (#6859)
* fix(core): audio that decodes short plays from its element in preview

* fix(core): keep the decoded copy when the element's duration is unknown

* fix(player): preview pauses with Buffering until every track due can play

* fix(core): keep the transport awake while it buffers

* fix(core): wait only for tracks the clock would also treat as playable

* test(core): buffering fixture pauses like a browser, with a pause event

* fix(core): hold for a clip only after media sync has asked it to play

* test(core): hold lands on the frame a slow tick skips into a clip with no data

* fix(core): a held clip counts as ready once it has data buffered ahead
2026-10-30 21:25:28 +00:00
Miguel Ángel 359b6c8a38 feat(core): playback health reports how long a video on screen showed no moving picture (#6856)
* feat(core): playback health reports how long a video on screen showed no moving picture

* fix(core): a frozen picture is judged by the clip's own timing, not the film's

* style(core): shorten a test comment under the line limit

* fix(core): the frozen-picture check reads a video from any realm

* refactor(core): cut the frozen-picture comments the comment ratchet counts
2026-10-30 18:48:25 +00:00
Miguel Ángel aafbd96b77 fix(core): same-time sets at 0 land in authored order on the first frame (#6851) 2026-10-30 18:29:40 +00:00
Miguel Ángel e28dbe4ce4 chore: release v0.8.222 (#6846) 2026-10-30 18:04:36 +00:00
Muzzy5150 64d190e34f fix(core): prevent Figma motion property key collisions (#6800) 2026-10-30 16:04:03 +00:00
Akshar Patel fc3d0a5fce fix(core): load responsive images from their scene (#6399) 2026-10-30 16:03:37 +00:00
Miguel Ángel 07c714ce9b fix(core): the first cut after Play starts on time instead of running ahead (#6794)
* fix(core): the first cut after Play starts on time instead of running ahead

* fix(core): learn half the start delay from Play so the first cut keeps its last frame
2026-10-30 08:24:36 +00:00
Miguel Ángel d83f276743 perf(studio): films with thousands of timed clips stop re-reading every clip each frame (#6805)
* perf(studio): films with thousands of timed clips stop re-reading every clip each frame

* perf(studio): drop the added comment lines the ratchet counts
2026-10-30 07:27:26 +00:00
Miguel Ángel f4bbbe1074 chore: release v0.8.221 (#6802) 2026-10-30 06:41:36 +00:00
Miguel Ángel 9fd90d23c4 fix(core): long cut-list edits play every cut without dropped or late frames (#6785)
* fix(core): a video plays to the last frame before its out-point instead of stopping a frame early

* fix(core): a dropped frame before an out-point no longer lets the out-point's frame show

* perf(core): a video edit with no animation timeline stops rewriting every clip each frame

* refactor(core): drop the comments the comment ratchet counts

* fix(core): a clip that has fully downloaded stays loaded and plays on time

* refactor(core): drop the comments the comment ratchet counts
2026-10-30 05:01:56 +00:00
Miguel Ángel 360ca9cf61 chore: release v0.8.220 (#6781) 2026-10-30 03:37:22 +00:00
Miguel Ángel 471d60a8ac fix(core): the playhead keeps moving at a cut while the incoming take has not started (#6768)
* fix(core): the playhead keeps moving at a cut while the incoming take has not started

* fix(core): shorten a comment in the clock

* fix(player): keep the WebKit stops script out of the type check

* fix(core): cut two comments from the clock
2026-10-30 02:25:26 +00:00
Miguel Ángel a30a520970 chore: release v0.8.219 (#6775) 2026-10-30 02:07:39 +00:00
Miguel Ángel c5a52037c9 fix(core): a still sub-composition's data-no-timeline on its template root skips the timeline wait (#6762)
* fix(core): a still sub-composition's data-no-timeline on its template root skips the timeline wait

* chore(core): drop a comment the copy already says
2026-10-30 01:48:17 +00:00
James Russo f7db6ba40c chore: release v0.8.218 (#6758) 2026-10-29 23:31:55 +00:00
Miguel Ángel 4e2a1c215a chore: release v0.8.217 (#6751) 2026-10-29 15:13:36 +00:00
Miguel Ángel 93f3d3dcbb fix(core): the preview's scene window settles when a scene can't unmount instead of hanging the page (#6740)
* fix(core): the preview's scene window settles when a scene can't unmount instead of hanging the page

* refactor(core): name the scene window's stuck step instead of commenting it
2026-10-29 12:04:12 +00:00
Miguel Ángel 71f716a91b fix(core): telemetry redaction covers folders with spaces in any script (#6734)
* fix(core): telemetry redaction covers folders with spaces in any script

* style(core): shorten the redaction folder note

* fix(core): spaced folders without a root redact only before a file name

* style(core): drop the redaction note that described the leak as intended

* style(core): two fewer comment lines in the redactor

* fix(core): bound the spaced-folder match so long lines stay linear
2026-10-29 10:19:12 +00:00
Miguel Ángel 6df754fbf3 chore: release v0.8.216 (#6735) 2026-10-29 10:01:01 +00:00