// the find
qzind/tray
Browser plugin for sending documents and raw commands to a printer or attached device.
QZ Tray is a Java system-tray application that bridges web browsers to local printers and USB/serial devices via WebSocket. Your web page talks to the JS client library, which sends jobs to the local tray app, which handles the actual I/O. It exists because browsers cannot send raw ZPL/EPL/ESC-POS commands to label or receipt printers, and QZ Tray is the most complete solution to that specific gap.
Protocol coverage is genuinely impressive — ZPL (Zebra), EPL (Eltron), ESC/POS (Epson, Star), FGL, SBPL, USB HID, serial, and raw socket all work. The security model is certificate-based: a website must present a signed cert that the user approves before any print command is accepted, so a random page can't silently fire your label printer. The signing examples in assets/signing/ cover 20+ languages (Go, Ruby, PHP, Python, Rust, .NET, etc.) which shows they've actually shipped this in polyglot production environments. The JS library uses promises and is published to npm, so integration into a modern SPA is straightforward.
It requires installation on every end-user machine — inherent to the design but a real operational burden in multi-seat or kiosk environments, and the installer complexity (Ant + NSIS + Apple pkg + Linux shell) makes custom deployments fragile. All dependencies are vendor JARs checked into lib/ rather than Maven coordinates, so you cannot easily upgrade them, audit them, or swap versions — you get what they bundled. The README is nearly empty; all real documentation lives on qz.io, which is a commercial site with paid support tiers, creating a dependency on a third-party domain for basic setup information. The usb4java and libusb4java libraries are at 1.3.0 from several years ago and carry platform-specific native JARs for each OS/arch, which adds friction if you need to build a custom distribution or strip unused targets.