zplCloud.com CloudToBrowserPrint
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)
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)
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
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:
Depending on the operating system, the matching mechanism is used automatically:
| System | Mechanism | Start |
|---|---|---|
| Linux / Raspberry Pi | systemd unit zplcloud2print.service (Restart=always, RestartSec=5) | at boot (needs sudo, detected automatically) |
| macOS | launchd LaunchAgent ~/Library/LaunchAgents/com.zplcloud.cloudtobrowserprint.plist (KeepAlive=true) | at login, no admin needed |
| Windows | scheduled task zplcloud2print (schtasks ONLOGON, /RL LIMITED) | at login, no admin needed |
Check status / logs:
Features for all platforms
| Feature | Windows | macOS | Raspberry 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: CUPS | – | ✅ lp -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)
| Endpoint | Method | Description |
|---|---|---|
| /available?types=… | GET | Device list; type filter network,usb,driver,cups,bluetooth (BT scan only on request). |
| /write | POST | Send: {device, data} | {device, url} | multipart json+blob. |
| /read | POST | Read from the printer (network/BT with return channel). |
| /convert | POST | File → ZPL; with device + action:"print" = convert + print. |
| POST | Multiple jobs in one request: {jobs:[{device, data|url}]}. | |
| /decode | POST | Image → {barcodes:[{type,data}]}. |
| /comm/tcp · /comm/serial/… · /comm/bt/… · /comm/parallel | POST | Bidi communication (session-based, like JSPM). |
| /ipp | POST | IPP print job (RFC 2911). |
| /jobs · /jobs/{id} | GET | Job trace (status, bytes, errors, timings). |
| /config/printers | GET | Configured network printers (printers.json). |
| /config/printers | POST | Add network printer: {host, port?, name?} → {ok, message, printers}. |
| /config/printers/remove | POST | Remove network printer (host or name): {hostOrName} → {ok, message, printers}. |
| /hubs/print | SignalR | Print 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:
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.