Canvas — 1:1, no scaling, no anti-aliasing

Frames

Tools

B pencil E erase L line R rect O ellipse G fill I pick
,. frame space play ⌘/Ctrl+Z undo · right-click erases

Palette — index 0 is off/black

Drawing is palette-indexed, so recolouring a whole animation is editing one swatch. This is also what makes the export tiny enough to sit in flash.

Panel

Changing this resizes the canvas without resampling — existing art is kept top-left and cropped or padded. Nothing is ever stretched.

Import

An animated GIF becomes one frame per GIF frame, decoded here rather than by the browser — <img> only ever hands over the first one. A horizontal strip whose width is a multiple of the canvas still becomes one frame per cell. Scaling is nearest-neighbour only: it never invents a colour, which is what lets the palette survive. .clp files load straight back in.
On the palette: a clip holds 16 colours and slot 0 is always black. A GIF with 15 colours or fewer is kept exactly. A richer one is reduced to its own 15 most-used colours — never remapped onto a preset.

Export

Preview puts this on the panel for a minute and then the collection comes back. Save files it in the sculpture's clip library without interrupting anything — add it to a collection from the studio afterwards.

      
The C++ header is palette-indexed RLE. Drop it in src/art/, #include it, and add a Clip row to Registry.h — it plays through the same IAnimation interface as every generative piece.