Open-source project
sapireli/AirPrint_Bridge avatar
sapireli/AirPrint_Bridge

AirPrint Bridge advertises printers that macOS cannot print to from an iPhone

AirPrint Bridge: Enable AirPrint for Unsupported Printers on macOS

653 stars31 forksShellMIT

At a glance

What is it?
AirPrint Bridge is an MIT licensed shell script that re-advertises shared printers over Bonjour with AirPrint compatible services on macOS, so an iPhone or iPad can print to hardware that never supported AirPrint. It installs a launchd service, keeps working while the Mac sleeps through Bonjour Sleep Proxy, and it needs root to change the cups and firewall configuration on the way.
Who is it for?
AirPrint Bridge suits a Mac user with a shared printer that has no AirPrint support and no intention of buying a new one, and it is the wrong tool for anyone whose printer already speaks IPP Everywhere or AirPrint, or who wants printing to keep working with the Mac powered off entirely.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 29 days ago.
What is it written in?
Mainly Shell, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The gap between a shared printer and a printable one

AirPrint Bridge enables AirPrint functionality on macOS for printers that do not natively support it. The point is that an iOS or iPadOS device can print directly to a printer on the same network, even though that printer was never built to speak AirPrint.

The way to understand the project is as a translation layer at the discovery level. macOS can share a printer over the network, and a Mac can print to it through the normal print dialog, and CUPS handles the conversion to whatever the printer actually speaks. What is missing is the AirPrint service advertisement that an iPhone looks for. A printer that lacks AirPrint support is invisible to the iOS print sheet, and the usual answer is that you buy a different printer or give up.

Three properties of the implementation are worth knowing before you install it. It does not rely on any additional binaries that are not already built into macOS. It uses almost no resources. And it is entirely automated, which is a claim that only means something once you have seen what it changes, and the answer is that it writes a launchd service, a registration script and some cups and firewall configuration.

The audience is narrow and obvious. Someone with a shared office or home printer that works from the Mac, an iPhone or iPad in the house, and a reluctance to replace working hardware.

The project is written as a shell script, it is MIT licensed, the last push was on 2026-09-24, and the tags are 1.3.4 from 2026-09-24, 1.3.3 from 2026-05-29 and 1.3.2 from 2025-06-15.

How a hidden copy of the printer appears on the network

The mechanism is Bonjour advertisement, and the script that does it is generated at run time.

When the script runs, it detects local shared printers that lack AirPrint support, checks and fixes the firewall and cups configuration as required, and then generates a registration script named airprint_bridge_launcher.sh. That script registers the printers via dns-sd, which is the command line tool that publishes Bonjour services on the network.

In other words, the bridge does not change how the printer prints. It advertises a second identity for it, one that looks like an AirPrint printer to anything listening for AirPrint services.

The detail that makes this usable in practice is the Bonjour Sleep Proxy. The project states that it naturally supports Apple's Bonjour Sleep Proxy, so printers continue to work when the host computer is asleep or rebooted, even before login. Without that, the arrangement would fall apart every time the Mac went to sleep, and the alternative would be to keep the Mac awake and logged in, which is a poor trade for a printer that is supposed to serve a phone.

For permanent installation the script creates and loads a launchd plist so the printers are advertised at startup and after every reboot, and the generated registration script lives in /usr/local/bin.

The cost of the design is a host that must be running. The Mac is advertising on the network, and a phone printing to the printer is printing to the Mac as far as AirPrint is concerned.

Setting it up, starting with printer sharing

The installation has a first step that is not about the script at all, and skipping it is the most common way to end up with nothing advertised.

You have to enable printer sharing on the Mac. On macOS Ventura and newer that is System Settings, then General, then Sharing, where you tick Printer Sharing and select the printers you want. On older versions it is System Preferences and then Sharing. The documentation also mentions System Settings, then Printers and Scanners, where you select the printer and enable Share this printer on the network.

Then you get the script, either by cloning the repository:

bash
git clone https://github.com/sapireli/AirPrint_Bridge.git
cd AirPrint_Bridge

or by installing it through Homebrew, which the documentation marks as the recommended route:

bash
# Add the tap and install
brew tap sapireli/AirPrint_Bridge https://github.com/sapireli/AirPrint_Bridge.git
brew install airprint-bridge

The explicit HTTPS URL in the tap command is there for a reason, and the documentation says so: it ensures the tap works without requiring login credentials, which avoids the git authentication issues people hit with SSH remotes. After the Homebrew install you have an airprint-bridge command, and if you cloned the repository you need to make the script executable first:

bash
chmod +x airprint_bridge.sh

The requirements are stated up front: macOS 10.15 Catalina or later, with the note that it is not officially tested on earlier versions but is likely compatible, Bash, and, in the project's own words, a trusty old printer.

Test first, and expect the test run to hang

The test mode is the part of the flow to understand properly, because it behaves in a way that looks like a mistake.

Run it with the -t flag, and note that the script needs root because it changes system configuration:

bash
# If installed manually:
sudo ./airprint_bridge.sh -t

# If installed via Homebrew:
sudo airprint-bridge -t

What happens is that the script detects local shared printers that lack AirPrint support, checks and fixes firewall and cups config as required, generates the registration script, and then runs that registration script in the foreground so you can test printing from an iOS device.

That last part is the behaviour that surprises people. The script will now hang while advertising your printers, and the documentation says plainly that if you can see and use your printer from iOS you are ready to install, and to use CTRL-C to terminate.

So the hang is the test. The script is staying in the foreground because the Bonjour advertisement has to keep running for the phone to see it, and CTRL-C is how you stop it. A user who waits for a prompt that never arrives will assume something is broken.

Only when the test succeeds do you install the service:

bash
# If installed manually:
sudo ./airprint_bridge.sh -i

# If installed via Homebrew:
sudo airprint-bridge -i

That detects the printers again, generates or updates the registration script, and creates and loads the launchd plist so the printers are always advertised at startup and after a reboot. Verification is then a matter of opening any app on the iPhone with printing capabilities, Safari, Mail or Photos, tapping Print and choosing the newly advertised printer.

Logging, the custom script path and removing it again

Three options cover the cases that come up in practice.

Logging is off by default, so the script writes only to the terminal, on stderr. To also append messages to a file named airprint_bridge.log in the script's directory, you edit the script and set:

bash
LOGGING=1

The -f option sets a custom filename and location for the generated AirPrint registration script, with --script_file accepted as well. By default the launcher is named airprint_bridge_launcher.sh and created in the current working directory, then copied to /usr/local/bin during installation, so a custom path is useful when you want it somewhere specific:

bash
./airprint_bridge.sh -t -f /path/to/custom_launcher.sh

Two constraints are attached to that option. The parent directory for a custom path must already exist, and the -f option only overrides the generation of the registration script, not the main airprint_bridge.sh itself.

There is a fourth thing to know, and it is a maintenance trap. After upgrading with Homebrew, by which the documentation means brew update and brew upgrade airprint-bridge, you need to run sudo airprint-bridge -i again, so the launcher is regenerated and the advertisement restarts with the updated service name.

Removal is the same shape as installation:

bash
# If installed manually:
sudo ./airprint_bridge.sh -u

# If installed via Homebrew:
sudo airprint-bridge -u

That unloads and removes the launchd plist file, deletes the registration script from /usr/local/bin, and restores the cups config changes, which is the part that matters for anyone who wants their Mac back to how it was.

What the script leaves behind on the system

Because this is a shell script that runs with sudo, the artefacts it leaves are worth listing.

There is the launchd plist that makes the advertisement persistent across reboots. There is the generated registration script, by default at /usr/local/bin/airprint_bridge_launcher.sh, which does the dns-sd work. There are changes to the cups configuration, which the uninstall path explicitly restores. And there are firewall adjustments, which the documentation mentions as being checked and fixed as required.

The repository mirrors the distribution arrangements in its layout. Besides the main airprint_bridge.sh there is a Formula/ directory for the Homebrew formula, a homebrew-airprint-bridge/ directory, a setup_homebrew_tap.sh helper, a test_homebrew.sh script, a tests/ directory, and a HOMEBREW_SETUP.md document. The CHANGELOG.md at the root tracks the 1.3.x line.

The project is a primary language of Shell project, which is the honest description of a single script that configures a system, and it comes with the trade-offs that implies. There is no package manager isolation, no dependency lock and no type checking, so the behaviour you get is the behaviour of the script on the day you ran it. A Homebrew install gives you versioned releases and an upgrade path, and the manual install gives you the file and whatever you change in it.

The project documentation also carries a trademark attribution section and a disclaimer in its table of contents, alongside the acknowledgements, contributing and licence sections, which is the sort of thing a project that prints to other people's hardware tends to be careful about.

When the bridge is the wrong answer

There are two situations where this project is unnecessary, and one where it cannot help.

The first unnecessary case is a printer that already speaks AirPrint, and the second is one that supports IPP Everywhere. The second case is more common than people expect, and it matters because IPP Everywhere is the printing path iOS uses for printers that are not AirPrint printers, so a printer with it appears in the iOS print sheet already and needs no bridge at all. The project is for the printer that supports neither.

The case it cannot help is the Mac being off. The bridge works by having a Mac advertise the printer, so the arrangement depends on that machine running, or at least being reachable through the Bonjour Sleep Proxy. If you want a printer that serves a phone with no Mac in the picture, you need a printer that does the advertising itself, and no amount of scripting on the Mac changes that.

There is also the question of whether the sharing arrangement is worth the complexity. The script needs root, it modifies the cups configuration and the firewall, and it puts a persistent service on your machine. On a shared or managed Mac that may not be permitted at all, and on a personal Mac it is a reasonable trade for a printer that would otherwise be wasted.

The honest summary is that this is a good fit for exactly one situation, a working printer that macOS can print to but iOS cannot see, and a slightly awkward fit for everything else.

Editorial conclusion

AirPrint Bridge suits a Mac user with a shared printer that has no AirPrint support and no intention of buying a new one, and it is the wrong tool for anyone whose printer already speaks IPP Everywhere or AirPrint, or who wants printing to keep working with the Mac powered off entirely. Before running it, test with the -t flag, since that is what detects the printers, fixes the cups and firewall settings and shows you whether the advertisement works before a launchd service is installed.

Frequently asked questions

What does AirPrint Bridge do?

It enables AirPrint functionality on macOS for printers that do not natively support it, by generating a registration script that advertises those printers over Bonjour with dns-sd, so iOS and iPadOS devices can print to them directly.

What are the requirements for AirPrint Bridge?

macOS 10.15 Catalina or later, with the project noting it is not officially tested on earlier versions but is likely compatible, Bash, and a shared printer that macOS can already print to. The script also needs root, because it changes the cups and firewall configuration.

How do I install AirPrint Bridge?

First enable printer sharing in System Settings under General and Sharing. Then install with the Homebrew tap and brew install airprint-bridge, or clone the repository and make the script executable with chmod +x airprint_bridge.sh.

What does the test mode do, and why does it seem to hang?

Running it with -t detects shared printers lacking AirPrint support, fixes the firewall and cups configuration, generates the registration script and runs it in the foreground so you can print from an iOS device. It stays in the foreground because the advertisement has to keep running, and you terminate it with CTRL-C once the test print works.

How do I remove AirPrint Bridge?

Run the script with -u. That unloads and removes the launchd plist, deletes the registration script from /usr/local/bin and restores the cups configuration changes.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. sapireli/AirPrint_Bridge on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/sapireli-airprint-bridge.svg)](https://hysenlabs.com/projects/sapireli-airprint-bridge)

Was this useful?