Context
RegisteredDevice.kind named “a kind from the product’s catalogue”, but no catalogue existed. The customer display had
a channel driver for a second Electron or browser window and nothing for the Android and iPad tills.
Decision
externalcustomer display driver.ExternalCustomerDisplayDriverhands each view as JSON to the app’sStackraCustomerDisplayExpo module, which draws it natively: an AndroidPresentationon the connected display, an iPad window in the external-display scene. The Kotlin and Swift sources live inapps/mobile/src/native-sources/customer-display/(0345 decision 6); gen wires the module and the scene manifest around them. Without the module or a display the driver refuses with capabilitywindow.- The device catalogue is data. A
device_kindrow has a snake_casekey,unattended,customerFacingand theperipheralsit drives.@stackra/devicesshipsBASE_DEVICE_CATALOGUE(till, kiosk, lane, lane display, gate) as the base a product’s seed pack edits, anddeviceCatalogueOfchecks rows. No code compares a kind’s key: an unattended kind enters the kiosk lock and shows the kiosk surface (0428).
Open questions
- iPad scene (STA-475). Whether the current React Native line keeps the external-display scene beside the app’s own scene is unconfirmed; the driver refuses cleanly until it is.
@stackra/ui./turnstileentry (STA-803). Turnstile stays in./react(wave 10 owner decision 12, one symbol in one entry). A separate entry would keep the Cloudflare script out of apps that never show a challenge, at the cost of moving the symbol. Owner to decide.
Consequences
- A product adds a device kind by editing its seed pack, not code.
- The native display draws the basket natively, not the app’s React screen; a richer display needs a second React root.
Enforcement
planned —packages/runtime/devices/src/core/functions/__tests__/device-catalogue-of.function.test.ts and
packages/experience/peripherals/src/core/drivers/__tests__/external-customer-display.driver.test.ts; the native
sources compile only in an EAS build.
Supersedes and sources
Supersedes: none. Sources:notes/handover/stackra-package-needs.md; ADR 0339; ADR 0344; ADR 0345.