Virtual Line
Turn existing POS hardware into a multi-station queue with printed stubs.
Final
Final POS
About this flow
Virtual Line replaces costly dedicated take-a-number hardware with an integrated queue system running across your existing devices. One station acts as an unattended self-service kiosk to issue physical printed stubs, while staff counters call, recall, or resolve tickets with a single tap. Paired customer-facing displays keep waiting patrons informed in real time.
What it can do
Physical Stub Dispenser
Unattended customer kiosk prints thermal numbered stubs with zero extra setup hardware required.
One-Tap Call Next
Staff counters show the exact next ticket and let team members advance the queue with a single press.
Synchronized Station Roles
Runs as an unattended ticket kiosk, active staff counter, or read-only lane sign across multiple devices.
Conflict-Free Claiming
Decentralized state engine allows multiple counters to pull tickets concurrently without colliding.
Split-Flap Lane Displays
Shows animated, high-legibility numbers on customer-facing screens to catch attention across the room.
Screenshots
Tags
Version history
- v1.4.0Current
Undo on Call next is now a real un-write rather than a deferred write, so the customer being closed is never loose in the queue for another counter to call. A failed table read keeps the rows it already had, so one flaky read can no longer restart the day's numbering at 01. The lane sign stops asserting things it cannot know: the held number expires on a timestamp rather than a transition, an empty station id can no longer bind a display to nothing, a silent bind is released, and "No display connected" counts only a display listening to this counter. The chime now rings on the first call after a Finish, no show or lull. The sign's staff gesture is a corner rather than the whole screen, its panel closes itself, and its exit to station home requires a credential challenge.
- v1.3.0
Knob migration from blueprint-audit: add servingLabel and takeButtonLabel (12 options at the cap) on Ticket + Sign; retoken raised panelDepth shadow to color-mix on --foreground; prove Archivo Variable is required for numeralWidth (plain Archivo delta 0). Theme knobs already reached screens. Independent verify Pass on touched surfaces (MOCK). Deploy is not publish — print, real /cfd identity, and cross-station remain open.
- v1.2.0
Audit fixes, round 1 and 2. Ten defects that stopped this working correctly across stations: - The /cfd lane sign ran a full write-capable controller and fought the counter it hangs off; it is now read-only, in the store as well as the markup. - A freshly booted or reloaded counter discarded every other counter's claim for a beat interval and could double-call a customer. Claim resolution now stands unless a station is provably dead. - No show followed by Call next dropped the customer just called; the terminal write is now guarded, not just the claim release. - The settings dedupe could delete the real settings row, restarting numbering mid-day. Settings rows are never auto-deleted. - A successful-but-empty read manufactured a settings row and printed #01 into a live queue. - A failed ticket insert reported success, printing paper for a number no counter would ever call. - A failed stations read was not counted as a read failure. - A failed getContext was cached forever, pinning the station to an invented outlet; a station with no host identity now says so. - Boot awaited the typed getContext unbounded; the handshake is bounded and its response narrowed before it is trusted. - The takeover window let two stations issue the same number. Every custom-table call now reads the success flag: a refused call resolves rather than throwing, so it was being read as an empty table or a successful write. Station and settings writes take a delta and re-base inside the store, so no caller can carry a stale cached row. Isolation on the unattended kiosk: the host owns navigation and the app cannot refuse it, so a screen a kiosk station should not show now bounces instead of blanking, and a kiosk station's Setup carries no destructive or line-wide control. One controller per tab, enforced by a provider rather than a comment. Not included: the usability tier (destructive-action confirms, contrast, counter routing, read paging, day boundary) and the counter's "Moved you to the next one" copy, which is still inaccurate.
- v1.1.0
Virtual Line v1.1.0 — the look and feel is now customisable, so this can be blueprinted. Corrects v1.0.0, which pinned border-radius 0 on every panel to work around the engine Card not reading the shape token. That fixed the appearance and broke the Corners knob. Panels now apply var(--shape-2xl) instead, so the knob works again; verified by switching Corners to Rounded and watching panels go 0px to 16px and back. Flow options go from 3 to 10 across Numbers, Appearance and Kiosk: number weight and width (driving the variable font axes), label style, panel depth, the flip animation, kiosk headline, closed message, printed footnote, show-how-many-ahead, and kiosk reset time. Also fixed: the width knob reached CSS as 88% and font-variation-settings needs a bare number, which killed the axis; customer-facing contrast was 4.27:1, now 6.7:1 via a color-mix from the real tokens; and the sign no longer shows the raw POS station name to customers. Still NOT device tested. The printed stub is unproven on real hardware.
- v1.0.0
Virtual Line v1.0.0 — a take-a-number queue that runs on two or more stations at once, printing paper tickets from the receipt printer a shop already owns. One build, two functions per station. A Ticket kiosk (exactly one live at a time, with human-confirmed takeover so a closed browser tab can never lock a shop out) prints a numbered stub. Any number of Counter stations call next, recall, mark a reversible no-show and finish, each opening and closing its own lane like a toll gate, and each able to drive its own now-serving sign on a second screen at /cfd. Numbers run 01-99 and wrap, exactly as the paper roll they replace does, with a configurable skip list. No calendar logic anywhere. Correctness without a server: monotone ticket status; liveness measured by an incrementing beat against the reader's own clock rather than by comparing timestamps across devices; counters claim into their own row so concurrent calls converge deterministically instead of clobbering; writes in flight beat stale reads; and number issuing is gated on a positive replica-loaded signal so an unhydrated read can never restart the queue at 01. NOT device tested. Printing is mocked entirely in preview, so the printed stub — the whole point — is unproven until it comes out of real hardware.
About the maker

Final
Final POS
