fae
All work

Fae · specimen №01

Bellhop

Printers and scales for web apps, with no one in the middle.

Local printing and USB scale reading for SaaS products: a desktop agent, server libraries, and a licensing backend that stays out of the data path. Labels print with no browser open and nobody logged in.

Role
Product design, engineering, protocol design
Platform
Web + macOS + Windows + Linux
Years
2026–present
Built with
Ruby on Rails · Swift & SwiftUI · WebSockets · Ed25519 · Node & Rails libraries
Status
Waitlist
The Bellhop menu-bar agent on macOS: online, connected to Slaydate, nothing printed yet.
Fig. 01: The agent at the desk, online. From the app.

The problem

A web application can't reach the label printer sitting at its customer's warehouse. The existing answers are all compromises: browser print dialogs need a person and an open tab, localhost bridges and extensions die with that tab, and cloud print relays work by receiving a copy of every label you print.

What a developer actually needs is plainer than any of those: print from the server with no browser open and nobody logged in, read the shipping scale on the desk, and never route customer data through somebody else's cloud.

The approach

Bellhop splits the problem in three. A menu-bar agent lives at the desk. A library in the developer's server, Node or Rails, holds the connection to that agent, so print jobs and scale readings travel directly between the two. The third piece, bellhop.dev, only handles licensing and pairing.

That structure makes the privacy claim verifiable instead of contractual. The registrar signs a credential the agent checks offline against public keys baked into its build, so bellhop.dev never sees a print job or a weight, and printing keeps working when bellhop.dev is down. The architecture is the proof, not the promise.

Decisions that mattered

4 entries

Out of the data path by architecture, not policy

Entitlements are enforced locally by the agent from a signed Ed25519 credential; nothing phones home. A privacy policy can change. A system that never receives the data can't.

Agents are counted, pages never are

Plans meter installed agents, not print volume. Per-page pricing makes customers anxious about succeeding: the busier their warehouse, the worse their bill. That anxiety is the competitor's business model, not Bellhop's.

No passwords, anywhere

Magic links and passkeys for the developer's dashboard; a pairing link for the person at the desk. The packer who clicks that link never chose Bellhop and shouldn't need credentials to live with it.

The protocol is a document, not an implementation detail

Flat JSON messages over a WebSocket or two plain HTTP routes, with normative docs, JSON Schemas, and a dependency-free reference server. Where the code and the docs disagree, the code is wrong.

What it does

For the developer

  • Node and Rails libraries covering pairing, both transports, redelivery, and renewal
  • ZPL, PDF, and raw formats with per-job printer targeting
  • Printer capability reporting: options a printer can't honor fail loudly, never silently
  • USB scale readings pushed to the server as they happen
  • Fleet dashboard for pairing, licensing, and agent status

At the desk

  • A macOS menu-bar agent: pairing is a link, not a setup wizard
  • One install pairs with several apps, each with its own connection and printers
  • Prints with no browser open and nobody logged in
  • Errors name the app they came from

Marginalia

Bellhop is the newest work here and hasn't launched: the agent, libraries, protocol, and registrar are built and working, and early access is moving through a waitlist. Windows and Linux agents are in progress.

The rest of the catalog

All work