Kitchen display system

Station-based ticket management for prep, expo, and timing control.

The KDS at /dashboard/platform/kds shows kitchen tickets by station. It tracks ticket age, has an all-day view, and lets cooks complete items one at a time. It refreshes every 10 seconds.

What the KDS does

  • station tabs for each active KitchenStation, plus "All Stations"
  • status filter: all, in progress, ready
  • lane filter: prep or expediter (stations whose name contains "expo" or "expediter")
  • urgent tickets highlighted and sorted first
  • warn and critical age thresholds
  • ticket view and all-day view
  • per-station cards with active, ready, and overdue counts and average age
  • mark individual items fulfilled
  • expo cannot bump a ticket to served while prep stations are still working

Timing thresholds

The UI uses fixed thresholds in KDSClient.tsx:

  • Warn at 12 minutes
  • Critical at 20 minutes

Age is measured from the ticket's fired time, or the order's creation time if it has none. These values are not configurable in settings.

How tickets get into the KDS

Orders are grouped by station

When an order is in sent_to_kitchen, in_progress, or ready, each item is grouped by its kitchen station snapshot (grill, fryer, salad, dessert, bar, or expo; expo if none). One KitchenTicket is created per station. If no matching station exists, one is created.

The queue is sorted

Urgent orders go first. Orders on hold go last. Then higher priority, then older tickets.

Cooks work at the item level

fulfillKitchenTicketItem marks single items done. Ticket status moves with updateKitchenTicketStatus: new to in_progress or ready; in_progress to ready; ready to served or back to in_progress (recall). Any open ticket can be cancelled.

Expo controls the handoff

Before an expediter ticket can be served, every prep ticket on the order must be done. Otherwise the server returns the names of the stations still working.

Every ticket change also writes a KitchenTicketEvent (dispatch, delta, status, item status, recall, cancel). Tickets cannot change while the order is on hold or after the order is served, dispatched, completed, or cancelled.

Views

Ticket view

The default queue, order by order.

All-day view

Rolls up active demand by item and station, with fulfilled counts.

Station metrics

Cards per station with active, ready, and overdue counts and average ticket age.

Implementation notes

Ticket sync lives in features/keystone/utils/kitchenTicketSync.ts and runs after order changes. The syncKitchenTickets mutation re-syncs all active orders and needs kitchen management permission. KDS mutations need canManageKitchen.

There is no device provisioning, printer fallback, or bump-bar support. The KDS is a web page that polls.

On this page