Skip to the content.

Other Printers and Brands

This guide started with a FreeX thermal label printer, but the failure has nothing to do with FreeX specifically. Any printer whose macOS driver ships an Intel-only CUPS filter fails the same way on Apple Silicon, with the same two error messages:

This page covers how to identify and fix it for any printer.


The general problem

macOS printing runs on CUPS. Each vendor driver installs:

  1. a PPD file describing the printer, in /Library/Printers/PPDs/Contents/Resources/, and
  2. a filter — a compiled program in /usr/libexec/cups/filter/ that converts page images into the printer’s own language.

If that filter was compiled for Intel only and never rebuilt for Apple Silicon, macOS cannot execute it, and every print job fails at the filter stage.

The vendor name on the box is irrelevant. What matters is one thing: was the driver rebuilt as a universal or arm64 binary? Many were not, particularly:

Low-cost thermal label printers are especially prone to this because many are rebadges of the same underlying hardware sold under dozens of brand names, with a driver each reseller maintains rarely or not at all.

Don’t guess from the brand. Check your actual installed files — it takes ten seconds.


Check any printer in 10 seconds

uname -m
file /usr/libexec/cups/filter/* 2>/dev/null | grep -i x86_64 | grep -vi arm64

Or run the full report, which does this for every filter and explains what it finds:

bash scripts/diagnose_freex_macos.sh --all

Despite the filename, the script is vendor-neutral — it scans every installed filter, not just FreeX’s.


Reading the output of file

What file prints Meaning
Mach-O 64-bit executable x86_64 Intel only. Needs Rosetta 2. This is the problem.
Mach-O 64-bit executable arm64 Native Apple Silicon. Fine.
Mach-O universal binary with 2 architectures ... x86_64 ... arm64 Universal. Fine.
Bourne-Again shell script / Perl script A script, not a compiled binary. Architecture doesn’t apply.

Only the first row is broken.


Finding your printer’s filter

If you don’t know which filter belongs to your printer, ask its PPD:

# List installed vendor PPDs
ls /Library/Printers/PPDs/Contents/Resources/

# See which filter a specific PPD calls for (.gz and plain both shown)
gunzip -c /Library/Printers/PPDs/Contents/Resources/YOUR_PRINTER.ppd.gz | grep -i cupsFilter
grep -i cupsFilter /Library/Printers/PPDs/Contents/Resources/YOUR_PRINTER.ppd

You’ll get a line like:

*cupsFilter: "application/vnd.cups-raster 0 rastertoSOMETHING"

The last word is the filter name. Then:

find /Library /usr/libexec -type f -name 'rastertoSOMETHING' 2>/dev/null \
  -exec ls -l {} \; -exec file {} \;

Some drivers also install filters under /Library/Printers/<Vendor>/, which the diagnostic script searches too.


The fix (same for every brand)

softwareupdate --install-rosetta

Then remove and re-add the printer in System Settings → Printers & Scanners, making sure Use → Select Software… picks the real vendor driver rather than a generic one.

Verify the filter can now launch (substitute your filter’s path):

arch -x86_64 /usr/libexec/cups/filter/rastertoSOMETHING

A usage message means success. Bad CPU type in executable means Rosetta didn’t install.

Most filters respond with something like:

ERROR: rastertoSOMETHING job-id user title copies options [file]

Some print nothing and exit — that’s also fine, as long as you don’t see Bad CPU type.


If there is no working driver at all

Rosetta 2 only helps while the vendor’s Intel driver exists and you’re on macOS 27 or earlier. If the vendor is gone, never shipped a Mac driver, or you’re on macOS 28+, consider these in order.

1. For FreeX printers: use the native filter in this repository

If your printer is a FreeX, this is solved. This repository ships a native replacement CUPS filter — a script, so it has no CPU architecture and can never fail with Bad CPU type in executable. No Rosetta, on any macOS version.

cd native-filter && sudo bash install.sh

Then add the printer choosing FreeX WiFi Thermal Printer (Native). It installs alongside the vendor driver without removing it. Verified printing full 4x6 USPS labels over USB and Wi-Fi.

For other brands, the same approach works but needs adapting: the filter converts CUPS raster to TSPL. If your printer speaks TSPL too (many rebadged thermal label printers do), it may work with little or no change — the page size and GAP values are the usual adjustments. If it speaks ZPL, EPL or ESC/POS, the raster-packing logic carries over but the command names differ. The source is short, commented, and MIT licensed. Reports of it working on other models are very welcome in Discussions.

2. Ask the vendor for a native arm64 driver

Worth doing even if you expect nothing. Vendor pressure is the only reliable way these get rebuilt, and the request is concrete: “Please provide a universal or arm64 build of your CUPS filter — the current one is x86_64 only and will stop working on macOS 28.”

3. Try a generic driver for the printer’s language

Many thermal printers speak a standard language. If yours does, a generic driver may work with no vendor software at all:

Language Common in Generic driver option
TSPL / TSPL2 TSC and TSC-compatible label printers (including many rebadges) A TSC-compatible driver, or raw port 9100
ZPL / ZPL II Zebra and Zebra-compatible label printers Zebra’s own macOS drivers, or generic ZPL
EPL Older Zebra/Eltron label printers Generic EPL
ESC/POS Receipt and POS printers Generic ESC/POS, or raw port 9100
PostScript / PCL Office laser printers macOS’s built-in Generic PostScript / PCL
IPP Everywhere / AirPrint Modern network printers No driver needed — macOS handles it natively

To find out which language yours speaks, check the manual, or look at the strings inside the vendor filter — see technical-notes.md for a worked example.

Generic PostScript and Generic PCL do not work for thermal label printers. They’re a common accidental choice in the Add Printer dialog and produce “Filter failed” or pages of garbage.

4. Print directly to port 9100

Most network thermal printers accept raw commands on TCP port 9100 with no driver involved. This is powerful but low-level — you become responsible for rasterizing and formatting.

For FreeX this is no longer necessary: the native filter does exactly this, but properly integrated with CUPS so ⌘P works normally. See technical-notes.md for how the protocol was worked out.

5. Check for AirPrint / IPP Everywhere

Some network printers support driverless printing even when the vendor also ships a driver. If macOS offers your printer with “Use: AirPrint” or “Secure AirPrint” in the Add Printer dialog, select that — it bypasses vendor filters entirely and will keep working after macOS 28.

6. Print from another machine

An Intel Mac, a Linux box, a Raspberry Pi, or a Windows PC can host the printer and share it on the network. CUPS on Linux often has community drivers for exactly these printers.


Planning for macOS 28

macOS 27 is the last release with full Rosetta 2. From macOS 28, Intel-only drivers stop working and Rosetta cannot rescue them.

Before upgrading, run the diagnostic script. If it still reports an Intel-only filter for a printer you depend on, that printer will stop working on upgrade.

For FreeX printers, install the native filter and the problem goes away permanently — it is a script, so no future macOS can reject it on architecture grounds.


Contributing a confirmed case

If you fixed a non-FreeX printer with this method, please open an issue or PR adding it. Helpful details:

Please redact private information first: no Wi-Fi network names or passwords, no local IP addresses, no serial numbers, no shipping labels, no customer or order data. Use placeholders such as YOUR_WIFI_NAME, 192.168.1.100, and YOUR_MAC_USERNAME.