Describe the bug
When rendering certain HTML compositions to transparent video (--format mov, alpha), the output contains ghost copies of page content duplicated vertically at an offset of exactly renderHeight / 4 (e.g. 286 px bands for a 1144 px-high render). Static, non-animated DOM elements are duplicated as well, so this is not an animation/timeline issue. The defect reproduces deterministically on the same composition and has survived a major engine upgrade.
Evidence highlights:
- Ghost copies sit at a vertical offset of exactly one band height (renderHeight/4); cross-correlation between the original band and the ghost band is ~99.6% — whole-band content displacement, not motion blur or timeline error.
- A frame-differencing metric over 959 frames scores 65.8% dirty frames on 0.6.101/Chrome 131 and 78.8% on 0.7.82/Chrome 152 (absolute numbers not directly comparable across engines because 0.7.82 also renders the composition's background grid differently, adding a new vertical-stripe component; the band-duplication signature itself is unchanged). A control band shows ~0.5%, so the signal is structural.
- Static
<div>/SVG rects with no animation are duplicated too. Trigger appears to be structural (which elements/paints the page contains), not load-related: sibling compositions with far more primitives render clean.
Link to reproduction
Self-contained single-HTML composition available on request (contains our channel content, so not published in a public repo; we can also run candidate builds on our side)
Steps to reproduce
- Single-page composition: one GSAP paused timeline registered on
window.__timelines, seek-driven frame capture (standard hyperframes particle pattern). One <template> root, no external assets.
- Render:
hyperframes render <projDir> -o out.mov --format mov --fps 60 --quality high --workers 8 --no-browser-gpu
- Inspect the alpha channel of the output frames (e.g. extract frame 300) — ghost copies of page content appear vertically offset by exactly renderHeight/4.
Expected behavior
Each piece of page content appears exactly once per frame; the alpha channel contains no duplicated bands.
Actual behavior
Ghost copies of page content appear in the alpha channel, duplicated vertically at exactly renderHeight/4 offsets. The same annotated text row appears twice, one band apart, in both frames below. Reproduces on both engine generations.
Alpha masks of frame 300 from both engines are attached below (order-independent identification): the frame WITHOUT wide vertical bars is 0.6.101/Chrome 131; the frame WITH the additional wide translucent vertical bars is 0.7.82/Chrome 152 — that stripe component is new in 0.7.82 (background grid lines rendered as wide bars), while the band-duplication signature itself is unchanged across both.
Environment
run A: hyperframes CLI/producer 0.6.101, chrome-headless-shell 131.0.6778.85 (linux)
run B: hyperframes CLI/producer 0.7.82, chrome-headless-shell 152.0.7928.2 (linux)
host: Linux x86_64, software GL (SwiftShader), no GPU flags
command: hyperframes render <projDir> -o out.mov --format mov --fps 60 --quality high --workers 8 --no-browser-gpu
Additional context
Things we already ruled out / tried:
- Injecting Chromium compositor flags (
--disable-partial-raster, large raster tiles, --disable-checker-imaging): no effect on the dirty-frame rate, so the naive "partial raster invalidation" hypothesis appears falsified — the defect seems to live in the capture path rather than in cc tile reuse. (Side note: buildChromeArgs is a hard-coded array with no extra-args injection point; we had to wrap the chrome binary to test this. An escape hatch like PRODUCER_EXTRA_CHROME_ARGS would help future debugging.)
- Merging the affected SVG
line primitives into a single path makes the ghosting disappear on that composition — we use this as a content-side authoring workaround, but it is guidance, not a fix.
Questions:
- Is the frame-capture path expected to reuse any per-band/tile buffers between
seek captures in screenshot mode?
- Any known invalidation issue where band N's content can be re-presented at band N±1?
- If you have a debug flag to force full-page re-raster per captured frame, we can A/B it immediately.
Describe the bug
When rendering certain HTML compositions to transparent video (
--format mov, alpha), the output contains ghost copies of page content duplicated vertically at an offset of exactlyrenderHeight / 4(e.g. 286 px bands for a 1144 px-high render). Static, non-animated DOM elements are duplicated as well, so this is not an animation/timeline issue. The defect reproduces deterministically on the same composition and has survived a major engine upgrade.Evidence highlights:
<div>/SVG rects with no animation are duplicated too. Trigger appears to be structural (which elements/paints the page contains), not load-related: sibling compositions with far more primitives render clean.Link to reproduction
Self-contained single-HTML composition available on request (contains our channel content, so not published in a public repo; we can also run candidate builds on our side)
Steps to reproduce
window.__timelines, seek-driven frame capture (standard hyperframes particle pattern). One<template>root, no external assets.hyperframes render <projDir> -o out.mov --format mov --fps 60 --quality high --workers 8 --no-browser-gpuExpected behavior
Each piece of page content appears exactly once per frame; the alpha channel contains no duplicated bands.
Actual behavior
Ghost copies of page content appear in the alpha channel, duplicated vertically at exactly renderHeight/4 offsets. The same annotated text row appears twice, one band apart, in both frames below. Reproduces on both engine generations.
Alpha masks of frame 300 from both engines are attached below (order-independent identification): the frame WITHOUT wide vertical bars is 0.6.101/Chrome 131; the frame WITH the additional wide translucent vertical bars is 0.7.82/Chrome 152 — that stripe component is new in 0.7.82 (background grid lines rendered as wide bars), while the band-duplication signature itself is unchanged across both.
Environment
Additional context
Things we already ruled out / tried:
--disable-partial-raster, large raster tiles,--disable-checker-imaging): no effect on the dirty-frame rate, so the naive "partial raster invalidation" hypothesis appears falsified — the defect seems to live in the capture path rather than in cc tile reuse. (Side note:buildChromeArgsis a hard-coded array with no extra-args injection point; we had to wrap the chrome binary to test this. An escape hatch likePRODUCER_EXTRA_CHROME_ARGSwould help future debugging.)lineprimitives into a singlepathmakes the ghosting disappear on that composition — we use this as a content-side authoring workaround, but it is guidance, not a fix.Questions:
seekcaptures in screenshot mode?