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.
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).
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.
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.
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.