App shell & gates
Mobile app: every screen, state and flow in App shell & gates.
8 screens and overlays, 28 states, 3 flows. Frames show a real screenshot where one was captured and a wireframe card where the state needs data or conditions a device run cannot produce.
Flows
Cold start as guest
Splash and startup
Splash while initialising
Session still pending and app not ready; native splash is held.
Not reachable on a device: Needs a network fault, crash, race or code change to show
App root redirect
Not reachable on a device: Pure redirect with no UI to photograph
Branches and edge cases
Splash and startup
Session slow, continue as guest
Session pending for 10 s (offline or stalled); app proceeds as a guest.
Not reachable on a device: Needs a network fault, crash, race or code change to show
Splash and startup
Deep link replayed after Home
A link that arrived before Home existed is replayed once Home is built.
Not reachable on a device: Cold-start timing race
Deep link screening
Android link held until Home exists
Warm link before Home is parked and replayed; links older than 60 s are dropped.
Not reachable on a device: Android cold-start timing race
App Error
App Error
Uncaught render error. Body: Something went wrong, but we can try to recover.
Not reachable on a device: Needs an uncaught render error
App Error
Restart signs the user out
Restart App and automatic critical recovery sign out, then reload the app.
Not reachable on a device: Needs an uncaught render error
Flow diagram
Cold start as signed-in user
Splash and startup
Splash cover over first screen
Overlay stays until Home reports content ready, with a 12 s backstop.
Not reachable on a device: Needs a network fault, crash, race or code change to show
Account gate
Blocking splash on cold start
Signed-in cold start while the account stage loads; later token refreshes never block.
Not reachable on a device: Needs a network fault, crash, race or code change to show
Branches and edge cases
Account gate
Can't load your account
Profile wait gives up after 5 s or the 15 s backstop fires. Buttons: Try again, Continue browsing.
Not reachable on a device: Needs a network fault, crash, race or code change to show
Account gate
Servers unreachable copy
Body says servers could not be reached; Try again shows a spinner while retrying.
Not reachable on a device: Needs a network fault, crash, race or code change to show
Home
Offline skeletons persist
No offline state or timeout; skeletons stay indefinitely
Not reachable on a device: Needs a network fault, crash, race or code change to show
Flow diagram
App update prompt
Update available
Update available
Installed version is below the minimum supported (1.7.0) and not dismissed.
Needs data: Capture audit 2026-10-30. ios: Release build required; __DEV__ disables update prompt. android: Release build required; __DEV__ disables update prompt.
Branches and edge cases
Update available
New version on Play Store
Android sideloaded install with prompt enabled; wins over the version update.
Needs data: Capture audit 2026-10-30. ios: Release build required; __DEV__ disables update prompt. android: Release build required; __DEV__ disables update prompt.
Update available
Not a forced update
Both kinds can be dismissed for 7 days; there is no maintenance mode.
Needs data: Capture audit 2026-10-30. ios: Release build required; __DEV__ disables update prompt. android: Release build required; __DEV__ disables update prompt.
Flow diagram
Screens and states
Splash and startup
Splash and startup
Not reachable on a device: Splash is a transient native overlay
app/_layoutSplash and startup
Holds the splash until session and first content are ready, then shows the app.
src/app/_layout.tsxEntry
- Cold start
Exits
- Ready → Home
- Session stalls 10 s → Home as guest
- Uncaught crash → App Error screen
States · 4
src/app/_layout.tsx:402src/app/_layout.tsx:336src/app/_layout.tsx:365src/app/_layout.tsx:167Account gate
Account gate
Not reachable on a device: Account gate is a transient blocking splash on cold start
app/(app)/_layoutAccount gate
Blocks cold start on the account stage and offers retry when the account cannot load.
src/app/(app)/_layout.tsxEntry
- Every route inside the app stack
Exits
- Try again → re-check account
- Continue browsing → Home, degraded
- Needs details → account details sheet
- Closed account → silent sign-out
States · 9
src/features/auth/hooks/use-post-auth-redirect.ts:71src/app/(app)/_layout.tsx:102src/app/(app)/_layout.tsx:155src/app/(app)/_layout.tsx:134src/app/(app)/_layout.tsx:183src/features/auth/hooks/use-post-auth-redirect.ts:114src/app/(app)/_layout.tsx:274src/app/(app)/_layout.tsx:287src/app/(app)/_layout.tsx:283App root redirect
App root redirect
Not reachable on a device: Pure redirect with no UI to photograph
app/(app)/indexApp root redirect
Sends the bare app path to the Home tab.
src/app/(app)/index.tsxEntry
- Cold start
- Sign-in sheet closed with nothing below it
Exits
- Redirect → Home tab
Deep link screening
Deep link screening
Not reachable on a device: Pure link screening with no UI to photograph
app/+native-intentDeep link screening
Screens incoming links so rejected ones land on Home and valid ones open their target.
src/app/+native-intent.tsEntry
- Any OS link, cold or warm
Exits
- Cold start rejected link → Home
- Warm rejected link → stay on current screen
- Auth callback → handled by sign-in
- Valid link → target screen
States · 3
src/app/+native-intent.ts:107src/app/+native-intent.ts:113src/app/+native-intent.ts:54Oops!
app/+not-foundOops!
404 fallback with a link back to Home.
src/app/+not-found.tsxEntry
- In-app push to a bad path
Exits
- Go to home screen! → Home
States · 1
src/app/+not-found.tsx:9Update available
Update available
Needs data: Needs a backend min-version policy above the installed build
AppUpdateModalUpdate available
Dismissible prompt to update the app or install from the Play Store.
src/shared/components/update/app-update-modal.tsxEntry
- Automatic, over any screen
Exits
- Update Now → store listing
- Later → hidden for 7 days
- Swipe or backdrop → same as Later
States · 4
src/shared/hooks/use-app-update-gate.ts:64src/shared/hooks/use-app-update-gate.ts:83src/shared/hooks/use-app-update-gate.ts:74src/shared/hooks/use-app-update-gate.ts:18App Error
App Error
Not reachable on a device: Needs a render crash; code change or fault injection
AppErrorBoundaryApp Error
Last-resort crash screen with retry and restart.
src/shared/components/error/app-error-boundary.tsxEntry
- Any uncaught render error
Exits
- Try Again → clears the error
- Retry Connection → clears the error
- Restart App → sign out and reload
States · 4
src/shared/components/error/app-error-boundary.tsx:156src/shared/components/error/app-error-boundary.tsx:70src/shared/components/error/app-error-boundary.tsx:32src/shared/components/error/app-error-boundary.tsx:248Tab bar
(app)/(tabs)/_layoutTab bar
Five tabs for guests and members, with bag and unread badges.
src/app/(app)/(tabs)/_layout.tsxEntry
- Default landing
- Tab deep links
Exits
- Home tab
- Shop tab
- My Bag tab
- Loyalty tab
- Profile tab
States · 3
src/app/(app)/(tabs)/_layout.tsx:139src/app/(app)/(tabs)/_layout.tsx:180src/app/(app)/_layout.tsx:302

















