zplCloud Blog
Weblink vs. CLI Proxy vs. CloudToBrowserPrint: Which Connection Do You Actually Need?
Three transports, three different jobs. All outbound-only - the difference is who holds the connection and what it can convert.
Same principle, different mechanics
There are three ways to get a label from zplCloud onto a physical printer. They are routinely confused, and picking the wrong one costs a day of debugging.
All three share one property: the connection is always established from inside your network outwards. No inbound port, no port forwarding, no VPN, no printer exposed to the internet. What differs is which component holds that connection, and what it can do with a print job before it reaches the printer.
Cloud Connect / Weblink - the printer dials out
Weblink is Zebra's own mechanism, provisioned through zplCloud. A relay component in your network keeps an outbound WebSocket to the platform; the printer authenticates with mTLS using three certificate files that are pushed into its flash (WEBLINK2_CA.NRD, WEBLINK2_CERT.NRD, WEBLINK2_KEY.NRD).
irm "https://zplcloud.com/weblink-deploy.ps1?hostname=printer01&apikey=sk_zplcloud_XXXX" | iex
curl -fsSL "https://zplcloud.com/weblink-deploy.sh?hostname=printer01&apikey=sk_zplcloud_XXXX" | bash
The script downloads the printer's certificates, uploads them over TCP 9100 (~DY), sets the SGD variables for the Weblink URL and NTP, and resets the printer. Add &ip=10.0.0.5 when the hostname does not resolve on your network - the hostname still selects the certificate, the IP is only the TCP target.
Use it when: the printer is a permanent production device that must be reachable from everywhere in the platform - designer, Print Views, batch jobs, webhooks, the API. This is the default for a Link-OS printer that stays in one place.
Requires: a Link-OS printer. A GK420 or another pre-Link-OS device cannot do Weblink at all.
zplCloud Proxy - an agent you run
The proxy is part of the zplCloud CLI. It runs on any machine in the LAN - Windows, macOS, Linux, Raspberry Pi, or as a container - and registers printers into your workspace over one outbound SignalR connection.
curl -fsSL https://zplcloud.com/install-cli.sh | sh
zplcloud proxy --agent "Warehouse Berlin" --service-install --api-key sk_zplcloud_XXXX
It reaches printers over TCP 9100 or USB, which is the decisive difference: a USB-only desktop printer has no network stack to dial out with, so the agent is the only way to put it in the cloud. The agent also applies printer profiles (darkness, speed, media, SGD variables), sends raw ZPL, watches folders for .zpl/.prn files, and can carry SQL Server, MongoDB and Kafka connections for the data hub.
--service-install writes a systemd unit on Linux and the Pi (zplcloud-agent.service, Restart=always), a launchd job on macOS, or a scheduled task on Windows.
Use it when: you manage a fleet, have USB or older printers, need consistent profiles across sites, or want the same agent to carry your data sources.
CloudToBrowserPrint - a local service for web pages
CloudToBrowserPrint is a local HTTP service on the operator's machine:
http://127.0.0.1:9100 (https://127.0.0.1:9101 - needed for Safari and any https page)
A web page in the LAN talks to it directly, including over a SignalR hub at /hubs/print. It discovers printers (network printers from printers.json, USB, Bluetooth), converts formats, decodes barcodes, and sends raw jobs. The cloud is not in the path - a page can print without any zplCloud round trip.
irm https://zplcloud.com/install-cloudtobrowserprint-pshell | iex
Because the service binds to a well-known port, check for a conflict before rolling it out - 9100 is a popular port for other software, and the service will tell you if it is taken.
Use it when: your own web application needs to print to whatever printer is next to the user, or you want browser-driven printing with no cloud dependency for the print path itself.
Side by side
| Weblink | CLI Proxy | CloudToBrowserPrint | |
|---|---|---|---|
| Runs where | relay in your LAN + certs on the printer | agent on a LAN machine / container | local service on the user's machine |
| Reaches the printer via | Zebra Weblink (mTLS) | TCP 9100, USB | TCP 9100, USB, Bluetooth |
| Cloud required to print | yes | yes | no |
| Works with non-Link-OS printers | no | yes | yes |
| Formats | ZPL from the platform | raw ZPL | ZPL, PDF, Office, images, barcodes |
| Extras | certificate deploy, remote management | profiles, watch folders, data hub | discovery, conversion, barcode decode |
| Typical use | fixed production printers | managed fleets, USB, remote sites | web apps, ad-hoc desktop printing |
Choosing
- Link-OS printer that stays put and prints from the platform → Weblink.
- USB printer, old printer, or a fleet you manage → CLI proxy. (An old USB-only desktop printer plus a Raspberry Pi is a complete setup; there is a separate post on that.)
- Your own web app printing to the printer next to the user → CloudToBrowserPrint.
- A real site usually runs two of them: Weblink on the production printers, the agent for the fleet and the data sources.