If you have ever tried to pose a character, bend an object, or do any kind of puppet warp in GIMP, you probably know the frustration. GIMP does have an N-Point Deformation Tool, but it is buried in Edit > Preferences > Playground as an experimental feature , and many users report that it has not worked properly since around GIMP 2.10.14. Some people also mention it crashes when you try to commit the deformation. In practice, most GIMP users simply do not have a usable mesh deformation workflow.
So I built a Puppet Warp plugin that actually works as a proper tool, not a hidden playground experiment.
You place pins on your layer, drag them, and the image deforms naturally while preserving shape consistency, similar to how Puppet Warp works in Photoshop. The goal was to make the kind of rubber-like, point-based deformation that the N-Point Deformation Tool was supposed to provide, but in a stable and accessible way.
Demo:
https://reddit.com/link/1x3fm00/video/vp116o1tsvuh1/player
What it does:
- Click to add pins, drag to deform; Shift snaps a drag to an axis
- Rotate and scale around any pin (orange ring / Alt+wheel / Ctrl+wheel)
- Stiffness mesh derived from the layer's alpha: transparent areas stay soft, so pins on empty background barely move the artwork
- Pin Edge option keeps the mesh border at its rest position
- Live preview that includes the layers below (shown static, not warped)
- Undo / redo inside the dialog (Ctrl+Z, Ctrl+Shift+Z / Ctrl+Y)
- Non-destructive: parameters are saved with the layer in the
.xcf; reopen the tool to continue editing the pins
The plugin is written in Python, with a C solver and a GEGL operation, works with GIMP 3.2.X.
Source code and installation guide: https://github.com/hexsian/puppet-warp-gimp
Longer term, I’m looking at moving the solver into GEGL so it can back GIMP’s N-Point Deformation tool, which would allow real on-canvas interaction. No timeline yet.
It is still early, so I would really appreciate feedback. If you try it and run into any bugs, or if there are features you think are missing, please open an issue on GitHub or just leave a comment here.