Store Builder — Discovery Prototype (wiring hub)

Iteration goal: a distributor builds his FoodBridge store in about 10 minutes — on a computer or a phone — without typing his customers, and sends it to FoodBridge's customer success team in one click.

Screens

Every step screen follows the screen it is opened on, as the prototype does: 1000 px and wider, the desktop layout; narrower, the phone layout at the same step. On a phone, Shop opens the welcome first.

▶ Start the flow →

Transition map — screens (→ SSOT-5 workflow)

FromEventTo
ShopNEXTContacts
ContactsCONTACTS_ARRIVED (phone QR · iCloud vCard · Tally/Excel list · paste)Contacts (green “N contacts added”), then Who is who?
ContactsNEXT with no contactsDaily work
Who is who?MARK (customer / supplier / staff) · REMOVE · UNDOWho is who?
Who is who?NEXTDaily work
Daily workNEXTFiles
FilesFILE_ADDED (drop · choose · phone photo) · VOICE_NOTE · REMOVEFiles
FilesNEXTSend
SendBUILDThank-you; the build is queued and delivered file by file (→ What reached FoodBridge)
any stepJUMP (steps column) · BACKthat step
Contacts / FilesSCAN (QR on the phone)Phone page → sends to the computer under a one-time code
Phone pagePICK (contacts) · SNAP (photo)they land on the open Contacts / Files screen; each read takes them (once)

Transition map — the store build (→ SSOT-1 state machine)

StateEventTo
draftingEDIT (any answer, contact, file) · SAMPLE_FILL · START_AGAINdrafting
draftingBUILDqueued (a snapshot: Excel + setup.json + every file)
queuedFILE_DELIVERED (one at a time; big files in pieces)queued
queuedALL_DELIVEREDdelivered — the team can open it
queuedOFFLINE / server down (5xx, network)queued — retried on the next chance
queuedREFUSED (4xx for one file)that file dropped and named as missing; the rest go on
deliveredEDIT then BUILD againa new build (builds are snapshots, never edited after sending)

Decisions this iteration carries (owner, 2026-09-26 … 10-01)

StepsShop · Contacts · Daily work · Files · Send. Products and Warehouse stock are hidden, not deleted (model.js HIDDEN_STEPS).
ContactsOne marking step (Customer / Supplier / Staff). Delivery days, areas, terms and staff jobs are hidden questions (HIDDEN_ASKS).
FilesEvery file reaches the team as it came (raw/); over 2.5 MB it travels in pieces.
iPhoneSafari's one-time Contact Picker setting first; iCloud on the computer second.
WordsTitles only, no sub-text; one action per screen; Hindi and English.

How it runs with no server

The prototype files under screens/prototype/ are byte-for-byte foodbridge-mock-platform v7/store-builder @ 3c840e6. Where it would call the bridge (/api/stores, /api/handoff), a service worker — discovery-bridge.js — answers instead and keeps everything in this browser, applying the bridge's own rules (a refused file is dropped and named as missing). No request leaves the browser. Serve over HTTP (a service worker does not run from file://).

Two discovery aids, nothing else: the FoodBridge online / down switch in each screen's top bar (down: builds wait with “Send now”, the QR says it can't reach FoodBridge); and, where the browser has no contact picker and is not an iPhone (a computer), a stand-in that picks six invented contacts. An iPhone, real or previewed, shows Safari's one-time setting, as the prototype does.

Owner-side data: seed-data/seed.json (the prototype's own sample answers; in the prototype: “Try it with sample data”). The team's side is the customer-success module's own discovery.