From e58bff5756336c098cefbba0ac52ce441ae01ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Fri, 10 Apr 2026 01:34:30 +0200 Subject: [PATCH 01/30] docs: add client-side renderer design spec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design spec for @hyperframes/renderer — a new browser-only package that renders compositions to MP4 using WebCodecs + MediaBunny + OffscreenCanvas workers, with SnapDOM as interim frame source and html-in-canvas as the future pixel-perfect path. Replaces the need for Puppeteer + FFmpeg. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../2026-04-10-client-side-renderer-design.md | 872 ++++++++++++++++++ 1 file changed, 872 insertions(+) create mode 100644 docs/superpowers/specs/2026-04-10-client-side-renderer-design.md diff --git a/docs/superpowers/specs/2026-04-10-client-side-renderer-design.md b/docs/superpowers/specs/2026-04-10-client-side-renderer-design.md new file mode 100644 index 00000000..c0610b04 --- /dev/null +++ b/docs/superpowers/specs/2026-04-10-client-side-renderer-design.md @@ -0,0 +1,872 @@ +# Client-Side Video Renderer — Design Spec + +> **Date:** 2026-04-10 +> **Status:** Draft +> **Package:** `@hyperframes/renderer` +> **Goal:** Render HyperFrames compositions to MP4 entirely in the browser — no server, no Puppeteer, no FFmpeg. + +--- + +## 1. Motivation + +The current rendering pipeline (`@hyperframes/producer` + `@hyperframes/engine`) requires server-side infrastructure: + +- **Puppeteer** + **chrome-headless-shell** (~400MB) for frame capture via Chrome's `HeadlessExperimental.beginFrame` CDP API +- **FFmpeg** (~100MB) for encoding, audio mixing, and muxing +- A Node.js server to orchestrate the pipeline + +This means every render requires either a local dev machine with these binaries or a cloud server. The cost, complexity, and accessibility barriers limit where HyperFrames can be used. + +**Browser APIs have matured enough to replace this entire stack:** + +| Server-side dependency | Browser replacement | +|---|---| +| Puppeteer (frame capture) | SnapDOM / `drawElementImage` (html-in-canvas) | +| FFmpeg (video encoding) | WebCodecs `VideoEncoder` (hardware-accelerated) | +| FFmpeg (muxing) | MediaBunny (zero-dep TS, supports MP4/WebM/MOV) | +| FFmpeg (audio mixing) | `OfflineAudioContext` (Web Audio API) | +| Node.js server | Web Workers + `OffscreenCanvas` | + +### Success Criteria + +1. **Zero server dependencies** — Rendering works in a browser tab with no backend +2. **95%+ pixel fidelity** at launch vs. the BeginFrame reference renderer, with a clear path to 100% via `drawElementImage` +3. **Full feature parity** with the server-side producer: GSAP/CSS/Lottie/Three.js animations, embedded `