Subframe is a subtitle renderer that renders Subforge SubtitleDocument directly and targets libass visual parity for ASS/SSA on web and Bun. The core is CPU-rendered and deterministic; GPU backends only composite bitmaps.
- Early but working. Visual parity is focused on the documented scope in
docs/GOALS.md. - WebGL and WebGPU backends are available; the CPU path remains the source of truth.
- Deterministic, fixed-point (1/64 px) core rendering.
- libass-style raster + post filters (outline/blur/shadow).
- WebGL/WebGPU compositors with atlas-less uploads per layer (easy to extend later).
- Trace tooling for debug and parity analysis.
bun playground/index.html
Default backend selection order: WebGPU → WebGL → CPU.
bun run build
Outputs ESM bundle to dist/.
- Build libass (submodule):
tools/ref/build_libass.sh - Build the render helper (see
tools/ref/README.md) - Run the smoke parity test:
bun run test:golden:smoke -- --trace-on-fail
src/ # Renderer core + backends
playground/ # Local demo UI
docs/ # Goals, architecture, perf notes
tools/ # Parity and diff tooling
test/ # Fixtures and golden data
refs/ # Reference submodules (libass, subforge, text-shaper)
This repo uses reference submodules for implementation parity research:
git submodule update --init --recursive
See refs/README.md for details.
MIT. See LICENSE.