Project 01 of 06 / Hospitality software

CentralPass

I co-founded CentralPass, a hospitality software startup, and developed its direct ordering and venue operations software. The platform connects a branded customer website, payments, a live staff queue, owner tools and receipt printing. Built over several months, it is live at Caffe Primo Firle.

Role
Co-founder and developer
Build time
Several months, alongside a full time degree
Delivery
Isolated deployment per venue
Status
First venue live in production

The problem

Give venues a direct connection to their customers.

CentralPass gives a venue its own branded ordering channel and connected operational tools. Customers order through the venue’s website, payments go into its Stripe account, and staff manage the order through preparation. The shared platform underneath includes the API, owner portal, staff dashboard and printer bridge.

Customer journey
Website, menu, ordering, checkout and bookings
Operations
Live order queue, status flow and availability
Administration
Menus, hours, offers, customers and reporting
Venue boundary
Separate deployment, database and configuration

Live deployment

In use at Caffe Primo Firle.

These interfaces are from the CentralPass deployment built for Caffe Primo Firle. Customer and order identifying information was excluded from the images on purpose.

The Caffe Primo Firle customer ordering website, the first live venue deployment of CentralPass.
Venue-branded customer siteVenue branded menu discovery, pickup ordering, checkout and bookings.
The CentralPass staff dashboard item availability screen for Caffe Primo Firle.
Staff dashboardTablet-first live orders and availability controls for service.
The CentralPass owner portal menu management screen for Caffe Primo Firle.
Owner portalMenu, hours, offers, customer and operational controls.

My contribution

From customer checkout to the receipt printer.

I designed, implemented and deployed the application and its integrations over several months. My work spans the customer interface, backend data model, payments, staff tools and the local printer service.

  1. The storefront. A React and Vite site per venue, with menu browsing, modifiers, pickup ordering, checkout and bookings, built to the venue's brand rather than to a CentralPass look.
  2. The API and data model. Node and Express on PostgreSQL: menus, modifiers, orders, customers, offers, opening hours, venue settings and role based access, with schema migrations that run before every deploy.
  3. Payments. Stripe checkout with the payment confirmed server side by webhook before an order is allowed into the staff queue. The browser is never trusted to say that money arrived.
  4. The staff queue. A tablet first dashboard, packaged with Capacitor, that receives new orders over Socket.io, moves them through preparation and marks items sold out for every other screen in real time.
  5. The printer bridge. A small Node service that lives beside the thermal receipt printer at the counter, takes jobs from the hosted API and prints them, connecting the hosted order system to the venue’s printer. Outage recovery needs to be evaluated across the queue, network and printer together.
  6. The owner portal. Menus, hours, offers, customer records, reporting and time clock workflows, so the owner can run the venue without calling me.
  7. Per venue infrastructure. Each venue gets its own Railway project, database, R2 storage and configuration. Onboarding a new venue is a repeatable deployment, not a fork.

How the pieces connect.

How a CentralPass order travels from a customer to a printed docket A customer orders on the venue's own website, which is a separate React application per venue. The storefront sends the order to the CentralPass platform API, a Node and Express service, which writes it to that venue's PostgreSQL database. Payment goes to Stripe Checkout, and the order only enters the staff queue once Stripe confirms the payment server side. The API then pushes the order over Socket.io to the staff dashboard tablet and the owner portal. Inside the venue, a small print agent connects outbound over HTTPS to ask for print jobs, then sends them to the receipt printer over TCP port 9100, so nothing has to connect inward to the restaurant's network. CLOUD, ONE DEPLOYMENT PER VENUE Customerphone or laptop Venue storefrontReact + Vite, own repo Platform APINode + Express PostgreSQLone per venue Stripe Checkouthosted payment Staff dashboardtablet, Capacitor Owner portalmenu, hours, offers pays payment confirmed server side before the order is queued live updates Socket.io INSIDE THE VENUE Print agentNode, outbound only Receipt printerESC/POS, TCP 9100 asks for work over HTTPS, every few seconds Nothing connects inwardthe venue network has no open port

Scroll sideways to see the whole diagram

One order, end to endThe direction of the printer connection is the part that matters. The printer lives on the restaurant's own network, so instead of the cloud dialling in, the agent dials out and asks for work. No port forwarding, nothing exposed.

What broke

The printer was the hard part, and not for the reason I expected.

Everything else in the system is a web service talking to another web service. The receipt printer is a physical object sitting on a restaurant's own network, and it turned two assumptions into bugs before it printed a usable docket.

  1. The cloud cannot reach into a restaurant. The printer answers on a private address that only exists inside that building, and exposing it to the internet so the server could dial it would be the wrong fix. I reversed the direction instead: a small agent runs on a machine in the venue and connects outward to ask whether there is anything to print. Nothing inbound, no port forwarding, no static public address. It speaks Star's CloudPRNT protocol in software, which is what lets an ordinary receipt printer that has never heard of CloudPRNT be driven by it.
  2. The printer lied about its own width. Its self test page reported 40 columns. It wraps at 33. Every dollar amount landed on the line below the item it belonged to, and the venue name split in half. The fix was to stop trusting the self test: the app prints its own width ruler, and you read the real number off the paper before registering the printer.
  3. A power cut silently stops printing. A printer left on plain DHCP comes back with a different address, the agent keeps asking politely, and no error appears anywhere a staff member would look. It now needs a reserved address at setup, and that is written into the install steps rather than left as folklore.

Print jobs move through queued, offered, downloaded and completed, so a docket that was fetched but never confirmed is visible rather than lost.

Engineering decisions

Designing for restaurant service.

  1. Use real-time events where latency matters. Socket.io pushes new orders, status changes and sold-out updates across customer, staff and owner interfaces.
  2. Keep uploads off ephemeral compute. Menu images stream to Cloudflare R2 instead of living on a Railway container that can be replaced.
  3. Migrate before every deploy. The production start path fails fast if the PostgreSQL schema cannot be updated safely.
  4. Protect venue ownership. Each client retains its domain and Stripe account, while credentials remain outside public front ends and source control.

Current scope

CentralPass is built and operating at its first venue. It covers direct ordering and payments, live staff order management, owner controls, customer and offer workflows, straightforward bookings, basic time clock workflows and receipt printing. Its scope is direct ordering and connected venue operations. It does not provide a complete POS, payroll, advanced rostering, marketplace customer acquisition or delivery logistics system.

Stack and links

Web, cloud, data and hardware in one product.

Frontend
React, Vite, Zustand, Capacitor
Backend
Node.js, Express, Socket.io
Data and payments
PostgreSQL, Stripe
Infrastructure
Railway, Cloudflare R2

Public links

CentralPass
Product and venue-partnership website.

First live venue

Caffe Primo Firle
The first venue deployment of the CentralPass platform.

No credentials or internal administration links appear in this public case study.