OPENPRINTER / OPPA

A safe bridge between cloud applications and local printers.

The Open Printer Proxy Agent (OPPA) discovers printers and processes jobs on the local machine. OpenPrinter gives your server a versioned protocol and a small delivery SDK — without owning your queue, database, or business rules.

protocol tracejob_9247
  1. applicationjob.submit
    pending
  2. openprinterjob.deliver
    pending
  3. oppajob.received
    pending
  4. oppajob.acknowledged
    pending

Application retains the job while OPPA is offline. Receipt is acknowledged only after durable local persistence.

delivery
at-least-once
ack
local persistence
states
received / submitted / failed

Two products. One boundary that doesn't move.

OPPA is the desktop agent with local printer access. OpenPrinter is the protocol and server SDK an integrating application talks to. Restaurant, tenant, routing, and billing concepts stay entirely on your side of the line.

01Local desktop agent

OPPA

Discovers printers, persists jobs before acknowledgement, renders documents, submits locally, and reports received, submitted, or failed.

  • Tauri host around a shell-independent Rust agent
  • SQLite job recovery and idempotency
  • System, raw TCP, and virtual printer boundaries
  • Embedded product identity with runtime service endpoints
Learn more
02Protocol and server SDK

OpenPrinter

Framework-neutral protocol sessions over transports your application owns, with runtime validation, typed callbacks, and no hidden durable queue.

  • @openprinter/protocol for codecs and schemas
  • @openprinter/server for transport-neutral sessions
  • Shared Rust and TypeScript fixtures
  • At-least-once delivery semantics
Learn more

Bring your own queue, database, and auth policy.

Your application authenticates and routes each connection; the SDK runs the validated protocol session. You stay responsible for transport ownership, job durability, retry policy, and logical printer routing.

See the Node.js integration
server.ts
const openPrinter = createOpenPrinterServer({
  brand: { name: "Acme POS" },
  onJobReceived: ({ agent, message }) => {
    jobs.markReceived(agent.agentId, message.payload.jobId);
  },
});

const session = openPrinter.accept({
  identity: authenticatedAgent,
  transport: { send, close },
});
socket.on("message", (message) => session.receive(message));

await session.sendJob(job);

A deliberately narrow bridge.

Local printer access is privileged. OPPA accepts only documented messages and exposes no generic remote execution surface.

Local keys stay local
OPPA stores its Ed25519 private key in the operating-system credential store.
Credentials never touch SQLite
Only public identity metadata reaches SQLite; private key bytes never do.
Bounded everything
Message, document, image, and queue sizes are validated at fixed limits.
Explicit timeouts
Every printer and network call carries a deadline — nothing blocks forever.
Registry-checked printer IDs
A remote job can only target a printer already enabled in the local registry.
No shell, no proxy
No arbitrary commands, scripts, or generic network proxying — documented messages only.

Start with a virtual printer.

Run the example server, authorize a local agent, and exercise the complete delivery path before connecting physical hardware.

install.sh
pnpm install
pnpm --filter openprinter-node-example dev