Skip to main content
A document that validates is not a document that looks right. Look at frames after every meaningful change. Agents with the authoring skill do this on their own; these are the same tools.

Frame sheets

Six ticks spread evenly across the document, laid out as one labelled sheet. This is the default check: it costs about as much as a single frame, and it shows whether anything moves. --max-dimension bounds the longer side, and 320 is enough to judge composition and motion. One exact frame:
--tick is in ticks, not frames or seconds. At the conventional 240 ticks per second and 30 fps, one frame is 8 ticks. Both commands print JSON to stdout with the output path, the ticks rendered, the dimensions and a diagnostics count. A diagnostics count above zero is worth a look: a frame that renders is not a frame that rendered correctly.

The preview server

Serves one page: the document playing, scrubbable, with an export panel. Open the URL it prints. The preview is the fastest way to export anything with glass, refraction or a custom shader, because frames are rendered on your GPU instead of interpreted per pixel in Node. The rest of the pipeline is the same. See Exporting media. The server holds a port until it’s stopped, and prints its process id for exactly that:
It also stops itself after ten minutes with no browser attached. Pass --port to listen on a fixed port.

Loops

Renders the last displayed frame beside the first and reports their difference against an ordinary frame step, so the number means something. A seam you can see in the sheet, you can see in the loop.

The review packet

Writes a revision-bound packet: review.json, a contact-sheet.png, and a frames/ folder. Frames are sampled across the timeline and rendered on checker, light and dark backgrounds (--backgrounds changes the set), then checked for blank frames, clipping, contrast and motion. Heavier than a frame sheet; worth running before shipping rather than on every edit. In review.json, analysis.diagnostics is the list that matters. Per-frame renderer messages such as missing fonts live under frames[].rendererDiagnostics. The packet records the document revision it reviewed, so a review is a statement about one exact document.

Coverage for the WebGL player

If your site uses @clayzo/webgl-player, confirm it can draw what you authored. Mattes, nested clips and colour-space intrinsics in custom shaders need the CanvasKit player.
An unsupported construct is not an error at play time. The node is not drawn, and nobody finds out until a user does. Run this check in CI over everything you ship.