stars Open sourceMIT0 dependencies

Hand-drawn motion,
from simple shapes.

Describe a few poses as circles, lines and paths. geomotion morphs between them and re-inks every frame by hand — wobbly strokes, boiling lines, riso-offset fills. Export an animated SVG, a Lottie file, or just share a link.

one spec · five poses · zero keyframes drawn by hand

How it works

Three steps. No timeline, no tweening by hand.

  1. 1

    Describe poses

    Each keyframe is a list of shapes. Give the same id to things that should transform into each other.

    { "keyframes": [
      { "shapes": [{ "id": "orb",
          "type": "circle", "r": 240,
          "cx": 600, "cy": 600,
          "fill": "sun" }] },
      { "shapes": [{ "id": "orb",
          "type": "crescent", "r": 240,
          "cx": 560, "cy": 620,
          "fill": "heather" }] }
    ] }
  2. 2

    geomotion draws it

    Shapes are matched, morphed and redrawn with a living, hand-inked line on every frame.

  3. 3

    Ship it anywhere

    One spec, every format — with or without a background.

    • Animated SVG
    • Lottie JSON
    • HTML page
    • Transparent
    • Share link
    • <iframe>
    • <geo-motion>
    • PNG frame

Why geomotion

Made to look drawn, built to be used.

Boiling ink

Lines are redrawn with a fresh wobble every few frames, tapered at the ends — like traced cel animation.

Smart morphing

Shapes are resampled and aligned automatically. Circles become stars, lines curl into loops, dots become hearts.

Riso fills

Soft fills sit slightly off the ink, like a two-colour print. A warm paper palette is built in.

Links, not uploads

The whole animation is compressed into the URL. Share it, embed it in an iframe, edit it in the studio.

Claude-ready

An MCP server and a skill let Claude design, render and share animations for you from a sentence.

Zero dependencies

Plain ES modules that run in the browser and in Node. Deterministic: same spec, same drawing.

Use it

Wherever you work.

Drop the web component on any page. It pauses itself when off-screen.

<script type="module" src="https://hacimertgokhan.github.io/geomotion/src/embed.js"></script>

<geo-motion preset="success" transparent style="width:160px"></geo-motion>
<geo-motion src="./my-animation.json"></geo-motion>
<geo-motion preset="bell" hover></geo-motion>   <!-- plays on hover -->

Or link to a player — play/#preset=sunrise, play/#preset=success&bg=0 (transparent).

Draw your first animation.

Pick a preset, nudge a few numbers, share the link.