Unbake Turn an animation back into editable objects.

Drop a GIF here

Flat 2D motion graphics: shapes on a plain background.

Runs on your machine: Python and OpenCV compiled to WebAssembly. Nothing is uploaded.

Baked the pixels you dropped
Unbaked click an object, drag its path
0 / 0

How it works

  1. Palette. Find the background and the dominant colours; label every pixel, ignoring dithering and antialiasing blends.
  2. Gradients. Once dithering is blurred away, a gradient fill is a smooth region whose colour changes linearly with position. Such regions are grouped across frames by the colours they span, then fitted in the object's own frame, so the gradient moves and turns with it.
  3. Strokes. A line that draws itself only ever covers its own path: a thin region whose area changes. Its skeleton gives the centre line, its edges the width, each frame the visible interval.
  4. Objects. Connected regions per colour, linked across frames; each object's clearest view becomes a template fitted on every frame for position, rotation and scale, without counting pixels hidden by another object against it.
  5. Morphs. When no rigid pose of an object's outline explains the frames where it is seen whole, its outline is traced on each frame, matched point by point, and keyed only where it changes.
  6. Keyframes. Each channel is split at its extremes, then wherever one cubic-Bézier easing curve cannot follow it: a bouncing ball gets one key per bounce, eased like hand-made animation. That is what you edit and what the exports play.

On synthetic animations with known sources (3–5 overlapping shapes, dithered GIFs), objects keep their identity on 95–99 % of frames, within 0.15 px and 0.5° (median); animated strokes are recovered 97 % of the time. Linear gradient fills come back as one object with its gradient, and shapes that clearly morph come back with an animated outline. Radial gradients, subtle morphs and near-identical colours are still out of reach. Method and numbers.