Skip to content

Setting up a till

The till screen must never be "a tab somewhere in Chrome." Two ways to give it its own dedicated, chromeless window with its own taskbar/dock icon:

On first launch a browser picks which station it is — the choice is remembered on that machine (changeable later from the sign-in screen's System menu):

The station picker

Launch Chrome in app mode pointed at the POS server. No tabs, no address bar, separate window and taskbar entry. Works over plain LAN HTTP — no certificates needed.

Windows — create a shortcut with this target (adjust the server address):

"C:\Program Files\Google\Chrome\Application\chrome.exe" --app=http://pos-server:5173 --start-maximized

For a locked-down fullscreen terminal (staff can't escape to the desktop or other sites), use kiosk mode instead:

"C:\Program Files\Google\Chrome\Application\chrome.exe" --kiosk http://pos-server:5173

Put the shortcut in the Startup folder (shell:startup) and the till boots straight into the POS.

macOS (for testing on the dev machine):

open -na "Google Chrome" --args --app=http://localhost:5173

For one-click access, a minimal .app bundle wraps that command (Tai's Desktop has one: "Roasterie POS.app" — it also auto-starts the dev server if it isn't running). The bundle is just Contents/Info.plist + Contents/MacOS/launcher (a shell script) + Contents/Resources/icon.icns built from apps/web/public/icons/.

2. Install as an app (PWA)

The app ships a web-app manifest, so Chrome can install it: menu ⋮ → Cast, save and share → Install page as app (or the install icon in the address bar). It gets its own icon and opens in a standalone window from then on.

Caveat: Chrome only offers installation on a secure contextlocalhost or HTTPS. On till machines reaching the server over plain LAN HTTP, use the app-mode shortcut above (same result, no ceremony). If we later serve the app over LAN HTTPS (e.g. a mkcert certificate on the server), install becomes available everywhere.

Mobile cart (future)

The cart travels with its own hotspot, which carries everything: the till (a laptop/tablet browser reaching the shop server over Tailscale) and the card reader (a Stripe smart reader — S710 with LTE, or WisePOS E on the hotspot). Same POS, same data, same payment code path as the shop counter; the hotspot is the cart's single piece of connectivity.

Silent printing (no dialog) — Chrome kiosk-printing

For receipts/reports that should fire straight to the printer without asking, launch the till with Chrome's kiosk-printing flag and set the target printer as the OS default:

chrome --app=http://pos-server:3001 --kiosk-printing

Every print the app triggers then goes immediately to the default printer, no dialog. (Works with any OS-installed printer — laser for full pages; thermal receipt printers with a driver work too, until the ESC/POS bridge lands.)

The customer display (second monitor)

The old "virtual pole display", reborn: open #display in its own window and drag it to the customer-facing monitor —

chrome --app=http://pos-server:3001/#display

It mirrors the till live (same machine, zero configuration): idle = logo + welcome note; during a sale = items, modifiers, discounts, running total; on completion = thank-you + change due. Styling follows the receipt settings (logo, bottom note).