Describe the bug
Rendering a 1080×1920 portrait composition whose only visual track is a
canvas-sized background <video> results in the bottom of the canvas
not being covered by the video element for the first ~37 seconds of the
clip. The exposed strip shows through to whatever is layered behind the
video — the color depends on the host composition:
- In the minimal repro published with this issue (canvas background
#000), the bottom strip reads as black (RGB averages around
#030103).
- In the original composition where I first noticed the bug, the bottom
strip appears white at the same timestamps. That composition uses
the same #000 body / #main background as the repro, so the white
must be coming from something HyperFrames itself paints behind the
video clip — not from the host CSS.
At t≈37s the bar disappears and the rest of the clip renders correctly
(the video element fully covers the canvas).
The bug appears in hyperframes@0.6.11 and is still present in the current
hyperframes@0.6.31. Re-running the exact same composition with
hyperframes@0.6.10 produces a clean render — no bottom gap at any point.
I confirmed this by running the same index.html against both versions via:
npx --yes hyperframes@0.6.10 render --output out-good.mp4
npx --yes hyperframes@0.6.11 render --output out-bad.mp4
0.6.10 is clean. 0.6.11 shows the bar.
Composition
Resolution: 1080×1920 portrait, duration 50s, 30fps.
Source video: 1080×1920, H.264 CFR @ 30fps, 1-second GOP, +faststart.
(Originally an 886×1920 ReplayKit capture; normalized to canvas size with
the ffmpeg invocation noted above before being passed to HyperFrames.)
The composition also has a vignette overlay (#vignette), a caption
sub-composition, and audio tracks — none of those are positioned in a way
that would expose a strip at the bottom edge.
Link to reproduction
https://github.com/dannymarx/hyperframes-issue-repo
Steps to reproduce
- Create the composition above.
- Place a 1080×1920 H.264 video at
assets/video/source-1080x1920.mp4.
- Run
npx --yes hyperframes@0.6.11 render --output out.mp4.
- Open the result. From t=0 to t≈37s, a horizontal strip at the bottom of
the frame is not covered by the video (the video appears anchored
higher than the canvas floor). At t≈37s, the gap closes and the video
fully covers the canvas for the remainder of the clip.
For comparison: npx --yes hyperframes@0.6.10 render --output out-good.mp4
renders correctly with no gap at any timestamp.
Expected behavior
A 1080×1920 video element rendering a 1080×1920 source on a 1080×1920
canvas should cover the canvas completely for the entire duration. The
bottom edge of the video should always reach the bottom edge of the
canvas.
Actual behavior
For the first ~37 seconds, a horizontal strip (roughly 60–100px tall —
the same approximate height across the window in which it is visible)
at the bottom of the rendered frame is not covered by the video element.
Whatever the renderer paints behind the video shows through that gap:
black in the minimal repro, white in my original composition (despite
the original also using #000 for the body and #main background).
At t≈37s the gap closes and the video element covers the canvas
correctly for the rest of the clip.
The preview (hyperframes preview) does not show the gap — only the
rendered MP4 does. So the symptom appears to live in the render path, not
in the live DOM layout.
Environment
✓ Version 0.6.31 (latest)
✓ Node.js v22.20.0 (darwin arm64)
✓ CPU 10 cores · Apple M2 Pro @ 2400MHz
✓ Memory 16.0 GB total · 2.3 GB free
✓ Disk 50.7 GB free
✓ Environment Native terminal
✓ FFmpeg ffmpeg version 8.1.1 Copyright (c) 2000-2026 the FFmpeg developers
✓ FFprobe ffprobe version 8.1.1 Copyright (c) 2007-2026 the FFmpeg developers
✓ Chrome system: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
✗ Docker Not found
https://docs.docker.com/get-docker/
✗ Docker running Not running
Start Docker Desktop or run: sudo systemctl start docker
Additional context
No response
Describe the bug
Rendering a 1080×1920 portrait composition whose only visual track is a
canvas-sized background
<video>results in the bottom of the canvasnot being covered by the video element for the first ~37 seconds of the
clip. The exposed strip shows through to whatever is layered behind the
video — the color depends on the host composition:
#000), the bottom strip reads as black (RGB averages around#030103).strip appears white at the same timestamps. That composition uses
the same
#000body /#mainbackground as the repro, so the whitemust be coming from something HyperFrames itself paints behind the
video clip — not from the host CSS.
At t≈37s the bar disappears and the rest of the clip renders correctly
(the video element fully covers the canvas).
The bug appears in
hyperframes@0.6.11and is still present in the currenthyperframes@0.6.31. Re-running the exact same composition withhyperframes@0.6.10produces a clean render — no bottom gap at any point.I confirmed this by running the same
index.htmlagainst both versions via:0.6.10is clean.0.6.11shows the bar.Composition
Resolution: 1080×1920 portrait, duration 50s, 30fps.
Source video: 1080×1920, H.264 CFR @ 30fps, 1-second GOP,
+faststart.(Originally an 886×1920 ReplayKit capture; normalized to canvas size with
the ffmpeg invocation noted above before being passed to HyperFrames.)
The composition also has a vignette overlay (
#vignette), a captionsub-composition, and audio tracks — none of those are positioned in a way
that would expose a strip at the bottom edge.
Link to reproduction
https://github.com/dannymarx/hyperframes-issue-repo
Steps to reproduce
assets/video/source-1080x1920.mp4.npx --yes hyperframes@0.6.11 render --output out.mp4.the frame is not covered by the video (the video appears anchored
higher than the canvas floor). At t≈37s, the gap closes and the video
fully covers the canvas for the remainder of the clip.
For comparison:
npx --yes hyperframes@0.6.10 render --output out-good.mp4renders correctly with no gap at any timestamp.
Expected behavior
A 1080×1920 video element rendering a 1080×1920 source on a 1080×1920
canvas should cover the canvas completely for the entire duration. The
bottom edge of the video should always reach the bottom edge of the
canvas.
Actual behavior
For the first ~37 seconds, a horizontal strip (roughly 60–100px tall —
the same approximate height across the window in which it is visible)
at the bottom of the rendered frame is not covered by the video element.
Whatever the renderer paints behind the video shows through that gap:
black in the minimal repro, white in my original composition (despite
the original also using
#000for the body and#mainbackground).At t≈37s the gap closes and the video element covers the canvas
correctly for the rest of the clip.
The preview (
hyperframes preview) does not show the gap — only therendered MP4 does. So the symptom appears to live in the render path, not
in the live DOM layout.
Environment
✓ Version 0.6.31 (latest) ✓ Node.js v22.20.0 (darwin arm64) ✓ CPU 10 cores · Apple M2 Pro @ 2400MHz ✓ Memory 16.0 GB total · 2.3 GB free ✓ Disk 50.7 GB free ✓ Environment Native terminal ✓ FFmpeg ffmpeg version 8.1.1 Copyright (c) 2000-2026 the FFmpeg developers ✓ FFprobe ffprobe version 8.1.1 Copyright (c) 2007-2026 the FFmpeg developers ✓ Chrome system: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome ✗ Docker Not found https://docs.docker.com/get-docker/ ✗ Docker running Not running Start Docker Desktop or run: sudo systemctl start dockerAdditional context
No response