GratisGraph: Liberating the Gravograph M20 (and beyond)

GratisGraph: Liberating the Gravograph M20 (and beyond)

How it Started
This whole adventure had started before my visit to France in late April of 2026 — I just hadn't realized it yet. My casual search for older engraving machines had started near the end of 2025 and had been mostly fruitless; my intent was brain transplants (motor controller replacement).

During this time I had passively been using ChatGPT and Gemini as sounding board and a wall to throw ideas at, it was all very casual. My wife planned our trip to Paris with ChatGPT so we didn't really know what to expect. It was ten glorious child free days of coffee, amazing food, miles and miles of walking, and beautiful sight seeing.

On on of our days when we weren't visiting historic locations we decided to scour local second hand clothing shops, which are quite popular and generally have a curated selection of radical 90s clothing. I was passing through the Republique area when I saw a shop of designer jewelry with the sign "gravure" — engraving.

Two colleague girls greeted me which I responded in very lazy French. I explained my role in a local engraving shop back in the United States and after some short conversation they invited me to the private work area to show me their engraving machines.

They were adorable! Two little Gravograph "M20" machines. It's basically the size of a novelty 3D printer but predates the popularity of FDM. They explained that the machines were quite limited and I described the enormous machine I use. My interest was piqued.

The Unfurling
Unfortunately, I could no longer stay in France and my trip was over. But that intrigue for these little machines remained. I was not in the position to buy anything since I haven't been formally employed since 2024 but as luck would have it, I found an M20 in the US for a price which was too good to resist.

I received the machine in a sturdy transport case, which was essentially the best case scenario because even the sturdy case could not avoid the inevitable eBay shipping damage. Thankfully, the machine was essentially intact.

In the box I found a little Intel Atom notebook computer, the machine, and a variety of small accessories. I thought "Okay, I'll just download some modern software for this and get going". Alas, I was having trouble finding the software.

Worse yet, when I checked forums and Facebook groups, I learned this was an all too common problem. Even machines of this vintage were gated behind a "minimum" of $1000 software licensing. I called Gravotech sales and asked if there was a cheaper option for hobbyists.

A week later the US branch got back to me and quickly explained I would have to either pay up or go without (my words). Also my words, I asked them "Are you aware of any open source software for this machine?" The answer was "No" and my answer was "Not yet".

Challenge Accepted
Really, I was lucky that the machine had included the notebook computer. It was originally intended as some sort of portable novelty branding device for alcohol bottles (yes, you read that correctly). Inside was an rudimentary design software which sent jobs to the machine.

I had never worked with USB protocols. I have heard of people decoding them, so I set to work exploring Wireshark. I was disappointed to learn that my particular vintage of Windows XP on the notebook was NOT compatible. Even more annoying, the older options like Snoopy were quite difficult to get reliable extractions from.

And thus, I had befallen my first challenge - snooping the USB stream.


USB Middleman
I wasn't aware this was an option, but it's trivially simple to intercept USB traffic. You literally just tap into the D+/D- lines on the USB cord. I wouldn't have known any of this if it wasn't for a tidy little tool called USB Sniffer Lite, by Alex Taradov.

Explained simply, you program Alex's software onto a Raspberry Pi Pico RP2040 — an ultra-cheap MCU which can seemingly do no wrong. Just connect those USB lines to a few GPIs and presto magnifico, you have USB data. Sort of.

It's interpreted and there were some gotchas, but I was determined. I enlisted an AI more capable than ChatGPT to help me understand what I was capturing and how the code worked. Together, we quickly arrived at a set of Python tools to convert the USB data captures into meaningful data. The USB Sniffer acts as a serial terminal, dumping the interpreted data to a console.

It wasn't really working cleanly. Frankly, neither Gemini and least of all I could not understand the data stream. But then there was a party trick.

Printer Go Brrrr
The M20 is an engraving machine, but it likes to dress up as a printer. Not sure what I mean? When you plug the M20 as a USB device into Windows computers (officially, the only supported platform), the M20 declares itself a printer.

And likewise, Windows attaches it to the printer subsystem in the OS. In order to issue commands to the engraver, a printer driver "GT SmartstreamMon" is setup which streams HPGL data. Only, it's not really HPGL. It's binary and the printer spooler is just being used to dump the data in a convenient way to the engraver.

This opened a door I didn't realize I had — if the software is emitting print jobs then that meant it was going through Windows Spooler, and it it was going through the spooler then there would be SPOOLS! I submitted a job to the machine from the control software and immediately "paused" the printer in Windows.

This little maneuver orphaned the job spool in the spooler. The job spool is literally the print file which the Windows printer subsystem sends to printers. It contains all of the instructions. I was able to analyze the binary straight from the machine without intercepting!

That was my first big break. The LLM could identify command structure and field values. Finally, I was able to recognize commands with the Python tool over the USB Sniffer.

Automation
I was carefully timing my data captures to correlate with the job emission and it was getting quite cumbersome just to capture data. I decided it was worth my time to automate the capture, and from that I arrived at my modified version of Alex's tool, which I call Sniffer Lite MCP; a Model Control Protocol to automate USB stream capture and broadly improve the flow of data into LLM workspaces.

This was my first big "accomplishment" in this. I know there are a lot of folks who oppose AI and, as a former software engineer, I definitely understand. Did I mention I haven't been employed since 2024?

It wasn't that I felt I had any responsibility in accomplishing, it's more that I directed the development of a tool which will streamline reverse engineering for other enthusiasts. It was that I had created something novel with the augmentation of LLMs, in a way I never could have done alone.

Liberté, Égalité, Maternité
Throughout my time in Paris, I wandered the historic streets and embraced the revolution. Locking down this old hardware didn't feel very egalitarian. Did I mention Gravotech is based in France? I knew there must be a way to make the work available for other people.

I envisioned a tool which was based on legal reverse engineering. It needed to be transparent. It needed the absolute minimum technical investment to use while still gaining significant value from.

So I set to work. I had by this time unlocked the communication protocol between the host computer and the M20. I could decode DXF files, translate G Code files, and even handle SVGs through a Python control script. The machine went brrr!

GratisGraph
So, all of that being said, I would like to introduce you to GratisGraph: the open source light weight tool which allows you to use the M20 you paid for on any platform that supports Python. There are precompiled executables for modern Mac and Windows machines, and the code is entirely open source.

The orchestration lives in a slim web-based app, available at https://gratisgraph.com/. It's necessary to have a small executable installed locally so that the web app can transmit USB commands to the engraver. I will be sharing the GitHub source in the coming weeks — just need to tidy up some of the verbose AI commenting.

Happy Hacking!
Author
Stephen
Views
12
First release
Last update
Rating
0.00 star(s) 0 ratings

More resources from Stephen