About
Tana merchant app — Expo; dashboard.tana.gg plus iOS and Android from one tree

Tags
No tags available

Languages
TypeScript 99%, JavaScript 1%

Tana Merchant mobile app

An Expo / React Native port of the archived Tana mobile app, reshaped for merchant commerce. The current repository is intentionally a polished mock: every product, order, customer, metric, payout and action is fixture data. It does not call today's unversioned dashboard routes.

What was retained

  • Expo Router root and tab-shell architecture
  • Theme, toast and notification context patterns
  • SecureStore-backed session storage pattern
  • Base-URL-configurable API client with timeout/abort behavior
  • Dynamic route pattern for orders/[id] and products/[sku]
  • QR camera and approval interaction, with wallet/key signing removed

The source baseline is tana/mobile-archive@95df3770154fbb071dd20ce515cbb182749b3e3d. Crypto screens, blockchain APIs, key management and signing dependencies were deliberately not ported; Tana remains the identity provider.

Run locally

bun install
bun run typecheck
bun run start

For a web bundle smoke test:

bun run export:web

EXPO_PUBLIC_TANA_API_URL may override the future API base URL. It is public configuration, never a credential. The default is https://store.tana.gg/api/v1, but no screen calls it yet.

Mobile-only capability priorities

  1. New-order push notifications. This is likely the highest-value reason for a merchant to install the app. The notification context is retained, but registration/delivery is deliberately inert because no push backend contract exists today.
  2. Fast fulfil/refund/notify actions from an order alert, with idempotency and clear confirmation.
  3. Camera-based product media capture/upload after a native-safe upload contract exists.
  4. Biometric unlock for locally stored session tokens.
  5. QR-assisted sign-in when a merchant already has a trusted Tana screen open.

Auth and API blockers

Live wiring waits for the proposal on tana/mobileapp#1 to be accepted and implemented:

  • inbound Bearer JWT support through the existing requireAuth() verification/revocation path;
  • a public mobileapp OAuth client using authorization-code + PKCE S256;
  • rotating opaque refresh tokens with family reuse detection;
  • stable /api/v1 response shapes, errors, cursor pagination and active-shop session switching;
  • push registration and delivery endpoints;
  • a native-compatible product upload contract.

No client secret or Tana credential belongs in this bundle. System-browser PKCE is the recommended default login. QR remains an optional first-class flow on the same IdP transaction; it is not a second auth system.