Proposed (STA-666). This is the product-app ADR that
0436 decision 3 requires. It
uses the
android target that
0344 gives every
app member and the evidence
0339
open detail 2 states for vendor SDKs. It does not decide any one vendor’s driver: under
0253 decision 3 each vendor’s SDK gets
its own ADR.Amended by
0478
(2026-10-28): decision 4’s
./native entry of @stackra/peripherals is replaced. Native drivers
live in one Expo module package per capability (@stackra/native-receipt-printer and the others),
behind the unchanged ports. The rest of this page stands.Context
The owner decided on 2026-10-26 that a native Android till ships in release 1 for Sunmi, PAX and iMin terminals. The commerce till today builds for web and desktop from one source tree, with kiosk and customer display as modes (0249). These terminals’ built-in printer, scanner, cash drawer and second screen have no Web API and no LAN path; only each vendor’s SDK reaches them (0339 open detail 2). The till’s offline rules (0338) and its server-driven screens must stay the same on every till kind. Under the app-shell model products build no apps of their own without an ADR, and the till is a commerce template that the editions (Mezzora, Jute, Organza) use.Decision
-
One till member, a fourth target. The commerce till template (
commerce/apps/till) adds theandroidtarget of 0344 through the Expo native driver. It stays one member with one source tree: web, desktop and Android share the till module, the offline queue, the rules (@figentra/commerce-rules), the recall check, the sync replicas and the server-driven screens, rendered through the native entries of@stackra/paneland@stackra/experience. No second till codebase exists. -
Commerce owns it; editions configure it. Commerce owns the template, its Android target and its release. An
edition declares the till in its root runway’s
surfacesandmobileblocks (0441) with its packages, assets and capabilities, and writes no till code. -
Device families are capabilities. Each vendor family (
device:sunmi,device:pax,device:imin) is a capability flag. A build includes only the families its runway entry lists, and the native modules and permission strings of the other families are removed at build time by config plugins, not hidden at run time, as 0439 decision 3 sets. One build per family set; the device model picks the driver at run time. -
Drivers behind the existing ports. Each family adds drivers for the ports of
@stackra/peripherals(ReceiptPrinter,LabelPrinter,CashDrawer,BarcodeScanner,Scale,CustomerDisplay,CardTerminal) in a new./nativeentry; the ports do not change. The second screen is aCustomerDisplaydriver over the Android Presentation API, as 0339 open detail 3 names. Each vendor SDK is its own ADR (0253 decision 3), written before that family’s first build; a family without its ADR is not built. - Certified models only. The till runs its hardware drivers only on models certified by the hardware certification module (STA-739) and registered as devices in OS devices (STA-725, 0235). On an uncertified model the till runs with the keyboard scanner and network printers only, and says so.
-
Card payments through the terminal port. An integrated card payment goes through
CardTerminaland the tenant’s payment Connection (OS payments, STA-664); it never completes offline (0339). Which acquirer SDKs run on which family is pack data and its own ADR per acquirer. - Offline first. The Android till keeps the last good bundle and the last good documents with a version pin and falls back to them, with an embedded fallback for over-the-air updates; Commerce owns this (0436 decision 8). The offline queue, sealed payloads and replicas behave as on the web till (0338).
-
Distribution. The Android till is not a store app for shoppers. Runway publishes it to the managed channels POS
fleets use: the vendor app stores (the Sunmi, PAX and iMin stores) and Google Play’s managed distribution for the
tenant’s devices, and an APK for a tenant’s own device management. Which channels are on per pack is pack data. The
app id follows
com.figentra.<product>.till(Commerce:com.figentra.commerce.till). -
Kiosk and customer display stay modes. Kiosk and customer display remain modes of the same build on Android
(
TillConfig.mode); a dual-screen terminal runs the till on the main screen and the customer display on the second.
Consequences
- One till for web, desktop and Android; a fix to the till module or its rules reaches every till kind.
- Release 1 needs three vendor-SDK ADRs and their drivers, the
./nativeentry of@stackra/peripherals(STA-904), device enrolment from OS devices (STA-725) and certified models from STA-739 before a family ships. - Runway gains vendor-store and managed-Play publishing for this app.
- The till’s Electron-only kiosk window gap stays a desktop matter; Android kiosk mode uses Android’s lock-task mode
through
@stackra/platform.
Enforcement
- planned — Runway refuses an Android till build whose device families lack their vendor ADR reference.
- planned — the template build fails when a family’s native module is linked without its capability flag.
- planned — the till refuses to start hardware drivers on a model the certification module has not certified.
Open questions for the owner
- Which models are certified first per family, and which acquirer runs on each? (Commerce owner questions on hardware certification cover part of this.)
- Vendor app stores, managed Google Play, or both for release 1?
- Is the Android till offered on every plan, or only on plans that include device limits for tills (entitlements)?
Supersedes and sources
Supersedes: none. Sources: owner decision D15 of 2026-10-26 (stackra-notes
handover/app-shells/app-shells-edge-and-extension.md section 14), Runway’s review of 2026-10-26 (points 3 and 9), the
commerce till SPEC (commerce/apps/till/SPEC.md, “native tablets”), and STA-698, STA-739, STA-725, STA-904.