zplCloud.com CloudToBrowserPrint

A local print service for Windows, macOS, Linux and Raspberry Pi - prints directly from the cloud with the label designer to Zebra printers in the LAN, as an alternative to CLI/Proxy and Cloud Connect: automated, in batch and without desktop software.

What is zplCloud.com CloudToBrowserPrint?

zplCloud2BrowserPrint is a small, local HTTP service (127.0.0.1:9100, HTTPS 9101) that web pages can call via JavaScript - a CloudToBrowserPrint/JSPM-compatible replacement. The app runs on the machine the printer is attached to and offers:

  • Device discovery - installed printers (Windows spooler), CUPS printers (Linux/macOS), network printers (TCP 9100) and Bluetooth (SPP).
  • Printing - raw ZPL, files from URLs and blobs from the browser (multipart).
  • Conversion - PDF, Office (DOC/DOCX/XLS/XLSX via LibreOffice), images (TIF/JPG/PNG/…) and TXT → ZPL (^GF), optionally print directly.
  • Barcode decoding - images → {type, data} (ZBar; macOS: Apple Vision).
  • Bidi communication - TCP, Serial (COM/TTY), Bluetooth, parallel port and IPP - session-based like JSPM.
  • Print Server Mode - the full functionality additionally runs over a SignalR WebSocket (/hubs/print), without a backend.
  • Job trace - every operation with status queued → printing → ok | failed, live via SignalR.

Demo: https://zplcloud.com/cloudtobrowserprint (test page in the /beta design with connection-type selection, hub status, job trace, loader and network printer management).

Installation

The installer detects the operating system and architecture automatically and downloads the matching binary from https://zplcloud.com/downloads/.

macOS / Linux / Raspberry Pi (one line)

curl -fsSL https://zplcloud.com/install-cloudtobrowserprint.sh | sh
# or:  wget -qO- https://zplcloud.com/install-cloudtobrowserprint.sh | sh
zplcloud2print --version

Supported platforms: osx-x64, osx-arm64 (Apple Silicon), linux-x64, linux-arm64 (64-bit Pi OS), linux-arm (32-bit Raspberry Pi). The installer creates a default printers.json and installs the HTTPS certificate automatically (macOS login keychain, Linux NSS DB for Chrome/Chromium/Firefox - no sudo needed); skip with ZPLCLOUD_NO_CERT=1.

Windows (PowerShell, no admin)

irm https://zplcloud.com/install-cloudtobrowserprint-pshell | iex
zplcloud2print --version

Installs to %LOCALAPPDATA%\zplcloud2print\zplcloud2print.exe and adds the directory to the user PATH (new terminals). Supports win-x64, win-x86 and win-arm64.

Starting

# Default: http://127.0.0.1:9100 + https://127.0.0.1:9101
zplcloud2print

# Other ports (port conflict?)
zplcloud2print 19200 19201

# Install the HTTPS certificate into the trust store (Safari on https pages)
zplcloud2print --install-cert

# Debug output / log file
zplcloud2print --debug
zplcloud2print --log           # logs/debug.log next to the binary
zplcloud2print --log=C:\path\debug.log

At startup the banner shows version + build date and the debug/log status. If a port is in use, the app names the holding process (Windows: GetExtendedTcpTable, Linux: ss -ltnp, macOS: lsof -nP).

As a service (restart on reboot)

So the print service survives reboots and re-registers on 127.0.0.1:9100 automatically after every start, it can be installed as a system service with a single parameter:

# Linux / Raspberry Pi / macOS (install as a service)
zplcloud2print --service-install
# Windows:
zplcloud2print --service-install

# Uninstall
zplcloud2print --service-uninstall

Depending on the operating system, the matching mechanism is used automatically:

SystemMechanismStart
Linux / Raspberry Pisystemd unit zplcloud2print.service (Restart=always, RestartSec=5)at boot (needs sudo, detected automatically)
macOSlaunchd LaunchAgent ~/Library/LaunchAgents/com.zplcloud.cloudtobrowserprint.plist (KeepAlive=true)at login, no admin needed
Windowsscheduled task zplcloud2print (schtasks ONLOGON, /RL LIMITED)at login, no admin needed

Check status / logs:

# Status
Linux/Pi : systemctl status zplcloud2print   |  journalctl -u zplcloud2print -f
macOS    : launchctl list | grep cloudtobrowserprint     |  Log: /tmp/zplcloud2print.log
Windows  : schtasks /Query /TN zplcloud2print   |  Log: %LOCALAPPDATA%\zplcloud2print\logs\debug.log

Features for all platforms

FeatureWindowsmacOSRaspberry Pi (arm)Linux x64
PDF → ZPL (^GF)✅ PDFium✅ PDFium✅ PDFium✅ PDFium
Images (TIF/JPG/PNG/GIF/…) → ZPL✅ FreeImage✅ FreeImage✅ FreeImage✅ FreeImage
Office (DOC/DOCX/XLS/XLSX) → PDF → ZPL✅ LibreOffice✅ LibreOffice✅ LibreOffice✅ LibreOffice
Barcode decoding✅ ZBar✅ Apple Vision✅ ZBar✅ ZBar
Print: installed printers (spooler)✅ winspool
Print: CUPSlp -d … -o raw
Print: network (raw TCP 9100)
Print: Bluetooth (SPP)
Bidi: Serial (COM/TTY)
Bidi: Parallel port (LPT)
IPP (RFC 2911)
HTTPS certificate (trust store)✅ Store✅ Keychain✅ NSS✅ NSS
As a service (restart)✅ schtasks✅ launchd✅ systemd✅ systemd

All platforms are verified with real hardware (Windows, macOS arm64, Raspberry Pi armhf, Linux x64).

HTTP API (local)

EndpointMethodDescription
/available?types=…GETDevice list; type filter network,usb,driver,cups,bluetooth (BT scan only on request).
/writePOSTSend: {device, data} | {device, url} | multipart json+blob.
/readPOSTRead from the printer (network/BT with return channel).
/convertPOSTFile → ZPL; with device + action:"print" = convert + print.
/printPOSTMultiple jobs in one request: {jobs:[{device, data|url}]}.
/decodePOSTImage → {barcodes:[{type,data}]}.
/comm/tcp · /comm/serial/… · /comm/bt/… · /comm/parallelPOSTBidi communication (session-based, like JSPM).
/ippPOSTIPP print job (RFC 2911).
/jobs · /jobs/{id}GETJob trace (status, bytes, errors, timings).
/config/printersGETConfigured network printers (printers.json).
/config/printersPOSTAdd network printer: {host, port?, name?}{ok, message, printers}.
/config/printers/removePOSTRemove network printer (host or name): {hostOrName}{ok, message, printers}.
/hubs/printSignalRPrint Server Mode: full functionality over WebSocket, live job trace.

Web client (zplcloud2print.min.js)

One JS file (minified, SignalR embedded) with a promise API. Include and go:

<script src="https://zplcloud.com/cloudtobrowserprint/zplcloud2print.min.js"></script>
<script>
  var bp = window.zplcloud2BrowserPrint;

  // Load devices (connection types filterable)
  bp.getDevices(['network','driver']).then(function (devices) {
    var d = devices[0];
    // Print (ZPL / URL / Blob)
    return d.send('^XA^FO50,50^A0N,40^FDHello^FS^XZ');
    // d.sendUrl(url);  d.sendFile(blob);  d.convert(blob, {dpi:203});
  });

  // Manage network printers in printers.json (live reload)
  bp.addNetworkPrinter('192.168.1.50', 9100, 'ZD421').then(console.log);  // → {ok, message, printers}
  bp.getNetworkPrinters().then(console.log);                              // → [{host, port, name}…]
  bp.removeNetworkPrinter('192.168.1.50');                               // host or name

  // Print Server Mode (SignalR WebSocket directly to the app)
  bp.hub.connect({ port: 9100 }).then(function () {
    bp.hub.onJobResult = function (id, ok, error) { console.log(id, ok, error); };
    return bp.hub.getDevices(['network']);
  });
</script>

Port override on port conflicts: ?zbpPort=19200 in the page URL. onPendingChange(cb) delivers loader status for running operations.

Configuration (printers.json)

The installer creates a default printers.json on install (live reload, every change is picked up immediately): network printers, allowedOrigins (sites manager, 403 otherwise; localhost/file:///curl always allowed), proxy settings and optional watchers. Network printers can be managed conveniently via the demo (section 6), the JS API (addNetworkPrinter/removeNetworkPrinter) or the console (--add-printer/--remove-printer).

  • Windows: %LOCALAPPDATA%\zplcloud2print\printers.json (next to the binary)
  • macOS: ~/Library/Application Support/zplcloud2print/printers.json
  • Linux / Raspberry Pi: ~/.config/zplcloud2print/printers.json (or $XDG_CONFIG_HOME)

The app first reads a printers.json next to the binary, otherwise the user folder. At startup the banner shows the effective path.

{
  "networkPrinters": [{ "host": "192.168.1.50", "port": 9100, "name": "ZD421" }],
  "allowedOrigins": ["https://zplcloud.com"],
  "printJobsWatcher": { "enabled": false, "command": "… {printer} {document} {id}", "pollIntervalMs": 2000 },
  "printersWatcher": { "enabled": false, "pollIntervalMs": 3000 }
}