Skip to main content
Version: Next 🚧

Common mistakes

Importing assets as modules​

Node does not import .jpg, .png, font, audio, or model files as TypeScript modules. Pass a literal path to Veena's asset helper instead:

const earth = imageFile("./assets/textures/earthmap1k.jpg");
surface.texture(earth);

Using wall-clock time​

Date.now(), unseeded randomness, CSS animations, and requestAnimationFrame break deterministic export. Animate timeline state or derive custom state from sampled scene time.

Fill appears before a path is drawn​

Use a built-in shape, VectorShape, or a filled Path. These support transient geometry-aware fills during draw() and undraw().

Text jumps when a readout changes​

Use .reserveText() with the widest expected value and update state.text through an updater.

Content overlaps titles​

Prefer toEdge, nextTo, alignTo, Group, HStack, and VStack. Reserve explicit screen bands for titles and captions instead of tuning everything around one screenshot.

3D content ignores the camera​

DOM and React tattvas default to overlay behaviour. Use .depthMode("world") when they should participate in the 3D world.

Audio is silent in preview​

This is expected. Audio is mixed during video export. Missing audio files are intentionally ignored.

LaTeX fails during bundling​

Confirm a LaTeX distribution and dvisvgm are installed and visible on PATH. Use MathText or FormulaMorph if native LaTeX is not required.

Preview works but rendering fails​

Check the output path, available disk space, Playwright Chromium installation, and whether an unsupported option—such as transparent MP4, opaque WebM, or audio with PNG—was requested. Transparent video must use a .webm output with transparent: true.