Plotter

I got into pen plotting after realizing my 3D printer already has most of what you need — precise XY movement, a controller that speaks G-code, and a big flat bed. All that was missing was a pen holder and some software to drive it. This was a collaboration with Mike Hill, built with Claude AI as a coding assistant.

Turn a Marlin-based 3D printer into a pen plotter with a web UI, serial control, and SVG import.

Plotter is a Python web server that talks to a 3D printer over serial and turns it into a pen plotter. It serves a browser-based control panel where you can load SVG files, preview and scale them to fit the bed, and send the paths to the printer in real-time. The pen is raised and lowered by moving the Z axis.

The focus was on making something that works well with complex SVGs — files with 100K+ paths that would freeze a browser if loaded naively. The server preprocesses SVGs before sending them to the client, and uses spatial-grid path optimization to minimize pen travel. Commands are batched and flow-controlled using Marlin's ok-based protocol.

The web UI with serial console, SVG preview, and plotting controls.

Hardware

The setup is a Creality CR-10S Pro with the hotend removed and a 3D-printed pen holder in its place. The holder is spring-loaded so the pen pressure stays consistent across the bed, and it accepts standard pens, markers, or pencils.

It took a few iterations to get the holder right — the spring tension, pen angle, and quick-release mechanism all needed tweaking.

Pen holder prototypes. The final version uses a compression spring and a thumb screw.

Features

Artwork Tools

The repo includes standalone generators for creating plotter-ready SVGs:

Example Outputs

Detail of a leaf-circle plot showing the fill pattern at close range.

Plotter thumbnail