readme.sh

a dev blog of sorts

Wonders and Woes of CUPS and a No-Name Label Printer

2025-06-14 - makors - misc


The Start of the Saga

In late 2022, I decided to purchase a Polono PL60 label printer for my growing e-commerce business. It's a cheap (rebranded) label printer that doesn't support wireless printing.

The Polono PL60
The Polono PL60

On a peaceful Friday, I decided to make my label printer wireless with CUPS, a print server, so that I could print labels from anywhere. Easy, right?

After uneventfully setting up CUPS on a Raspberry Pi, I hooked up my Polono PL60 and started a test print through the dashboard. As you can probably tell, it didn't work. I checked the CUPS logs and found this error:

Unable to start filter "raster-tspl" - No such file or directory

Drivers... or Lack Thereof

After a little bit of searching, I was able to figure out that this was a driver issue. Luckily, the Polono PL60 has drivers for Linux (see below).

Why are the Linux drivers so out of date?
Why are the Linux drivers so out of date?

After installing the drivers, I rebooted and started to daydream about the thought of my new wireless label printer. Those dreams came crashing down when I checked the logs again and saw the exact same error.

The new drivers weren't registering at all, as they are meant for x86_64 devices, while my CUPS server was on ARM. This would be an easy fix if Polono provided driver for ARM, but they don't.

A Solution?

While searching for a solution, I came across this blog post which linked to this GitHub repository describing my exact issue and providing a JavaScript-based driver solution.

I won't bore you with the details, but the GitHub repository just converts an image into TSPL, a format that the printer can actually understand. The code roughly looks like this:

const label = Buffer.concat([
    Buffer.alloc(512), // 512 NUL bytes to start a new label
    Buffer.from("\r\nSIZE 99.8 mm, 149.9 mm"),
    Buffer.from("\r\nSET TEAR ON"),
    Buffer.from("\r\nSET CUTTER OFF"),
    Buffer.from("\r\nSET PEEL OFF"),
    Buffer.from("\r\nCLS"),
    Buffer.from("\r\nBITMAP 0,0,100,1198,1,"),
    img, // converted earlier in the code
    Buffer.from("\r\nPRINT 1,1"),
    Buffer.from("\r\n"),
]);

I want to reiterate that this "driver" is JavaScript-based, while CUPS is in C. I was able to get the printer to print out an image, but it won't work like an actual printer and would require a custom tool to easily use.

There was still some hope though.

Cryptic Instructions

I was able to find this article on Hackaday.io detailing the process of setting up a Polono PL60 with CUPS. At the time though, these instructions seemed quite confusing, and I ended up wrecking my Debian installation on the CUPS server.

Shortly after I took a roughly 20 minute break to rethink everything, I decided to take another look at the [GitHub repository](https://github.com/proski/cups] in the Hackaday post which supports my Polono PL60. There was one caveat: no instructions were provided, so I was still helpless.

Thanks proski!
Thanks proski!

A Resolution, at Last

By sheer luck, I was able to find this GitHub repository by thorrak which links to proski's repo and the Hackaday post from earlier. Instructions and some basic information were provided, but aren't very clear to the average person.

I decided to check the GitHub issues and finally found a solution from f-o-n. I carefully followed the instructions, restarted the Raspberry Pi, and plugged in the printer. This was the moment I've spent hours upon hours working towards.

The Solution
The Solution

When I hit print, a couple of seconds passed and nothing happened. A few seconds later, the printer started making noise and successfully completed a test print. Of course, I decided to profusely thank f-o-n on the issue.

Conclusion

This journey offered more depth into the world of CUPS and ARM than was initially anticipated. Even though it may not seem like it at times, the solution may actually be closer than it looks.

Check out my GitHub or email me at makors@readme.sh.