Scanner app (entrywick.app)
The check-in PWA a volunteer opens on their own phone at a gate, a group pre-check or a zone (ADR-010, ADR-025).
Who opens it: check-in volunteers and staff, usually on their own phones, often with weak signal, often before dawn, trained for five minutes. An organizer hands them a pairing code; they never sign in to the admin.
What they came to do: scan a ticket and know instantly — big colour, icon and word — whether the person may go in; and keep doing that when the signal drops.
What must be true when they leave: every scan they made reached the server (or is waiting, visibly, to upload), and nothing they were shown contradicted what the server decided without the phone saying so.
Decided
-
Served from its own host (
entrywick.app; locallyscan.entrywick.test) and installed from there. A tenant's/scanopens it with the tenant prefilled; the pairing code decides the tenant. -
Its name: "EntryWick Scanner" until a device is paired; after that the header and the browser tab carry the organization's name — its product name on a white-label plan (week 20) — and error messages say "the server", not us.
-
Dark, always: Midnight shell on the Night gradient. Results use the §13.3 colours with an icon and a word each.
-
The shell works offline: the service worker precaches the app, never the API. The version shown in the footer is what the server compares with
min_sw_version. -
Pairing: the operator types the 6-character code; spaces, dashes and lower case are forgiven. Pairing needs a signal. After that the phone opens with no signal on what it stored: tenant, event, check-in point, day, device name.
-
Day: shown as "Pinned by an organizer" when pinned; otherwise a picker lists the days this check-in point scans, or the only one is taken without asking. The check-in point itself is never chosen on the phone.
-
When the pairing ends: moved to another check-in point, or the organizer who paired it lost access → the pairing screen with a one-line reason; revoked → "This device was turned off".
-
Status pill: Online/Offline and how long ago the manifest was last confirmed (it is re-checked every minute).
-
Roster: downloaded after pairing and kept on the phone — "N tickets". A satellite with a group holds only that group's people; every other check-in point holds the whole event. It stays current through small updates every minute; after 10 minutes without one, an amber "Roster N min old" appears and scanning carries on.
-
Scanning: tap "Start camera" and hold a ticket up (QR or barcode), or use a hardware scanner at any time. Where the check-in point allows it, type a code or find a person by name, last four digits of a phone, or code.
-
The result fills the screen: colour, a big icon and a word ("Accepted", "Already checked in", "Wrong day"…), what happened in a sentence, and each person when a ticket covers several. A replaced ticket names its replacement; a locked day says the change is made by an admin. Admissions clear themselves; refusals wait for "Scan next".
-
Shared tickets ask "Everyone here?" with everyone ticked; untick whoever is missing.
-
No signal: the phone decides from its roster, says "Recorded offline", and remembers the scan.
-
Uploading: "Waiting to upload: N" is always on screen. Scans go up by themselves as soon as there is a signal, oldest first; closing the app or restarting the phone loses nothing. A scan EntryWick refuses stays on the phone with the reason.
-
Corrections: when an offline scan turns out differently on the server (someone had already come in at another gate, say), it appears under "Corrections" with what the phone showed and what was recorded. Tell the help desk if someone needs finding; "Done" clears the badge.
-
Updates: new versions install by themselves when the phone has been quiet for a minute. If the event needs a newer version than the phone has, scanning pauses with "Update required — Tap to reload"; saved scans stay and upload afterwards.
-
When things go wrong: "Offline" and "Roster N min old" banners say what is happening while scanning carries on; a blocked camera says what still works at this check-in point. A revoked phone tries one last upload, then forgets the event's people and scans, locks, and says how many scans could not be uploaded.
-
At a kiosk (a device paired to a Kiosk check-in point,
kiosk_modeon) the app shows self check-in instead of this screen: see kiosk.md.
Open
- The iOS Safari standalone install check is an owner step at the end of Phase 2.
- A revoked phone's final upload is refused by the server today (see decisions-pending, week 9 step 6).
- Fonts load from Google Fonts and are not precached, so a first offline open uses the fallback faces.
- The iOS Safari standalone install check is an owner step at the end of Phase 2.