Concepts
The bridge model
Presto is a single native daemon, prestod, that runs on the same machine as the browser. It
serves the WebSocket API, a REST mirror, and the admin UI all on one loopback origin
(127.0.0.1:31075).
your web app ── presto.js ──wss──▶ prestod (127.0.0.1:31075) ──▶ printer
A web page loads the JS client, which opens a secure WebSocket to the daemon, authenticates, and submits print jobs. The daemon serializes each job onto the printer's transport and pushes per-label results back as events.
Printers & aliases
Printers are registered as aliases — each gets a stable id that web apps reference. The alias
survives OS-level renames, and web origins only ever see aliases, never the raw OS print queues.
Transports
| Transport | How | Feedback |
|---|---|---|
TCP (9100) | Raw JetDirect over TCP. Bidirectional — status and RFID read-back on the same socket. | Full |
USB (usblp) | Linux /dev/usb/lp*, bidirectional. | Full |
| Spooler | Windows print spooler (RAW). Write-only. | spooler only |
| Serial | RS-232 (device:baud). | Varies |
TCP is the primary transport — it's bidirectional, which is what makes real status and RFID read-back possible.
Jobs
A job is submitted either as print.raw (raw printer-language bytes) or print.template (a
stored template plus per-label parameters for a batch). Presto passes the bytes through
8-bit-transparent — it never re-encodes your payload.
Every job carries a verification level that bounds what Presto will claim:
spooler— the spooler accepted the bytes.printer— the printer confirmed it (bidirectional transport).rfid— per-label tag encoding was verified.
Job states
Queued → Sending → Sent → Done | Failed | Cancelled
A completed job reports one of done(verified), done(voided, n), or done(unverified) depending
on the verification the transport supported.
RFID feedback
For RFID jobs, Presto arms verification, sends, then reads back each label's result and
automatically reprints only the voided labels — not the whole batch, which would waste tags. A
per-label result is { index, printed, encoded?, voided?, fault?, epc? }. See
ZPL & RFID.
Languages
ZPL II is the deeply-supported language (transforms, status, RFID, calibration). EPL2, TSPL2, SBPL, CPCL, and ESC/POS are recognized and passed through; anything else is passed through tagged. Jobs can declare their language explicitly, which always wins over auto-detection.