For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /docs/mobile/authentication.md (or send Accept: text/markdown).
Native authentication
Handle the browser return path and stored sessions on mobile.
Setup and configuration
Before any step, read Before you start and Terminal basics. These instructions assume you opened the full supastack monorepo in VS Code; its root package.json marks the repository root. In pnpm commands, a workspace package is an app or shared-code folder; in the product, a workspace is a team's data container and security boundary. corepack pnpm --filter ... selects one package from the monorepo while commands run from its root. If you opened only a synced mobile or desktop folder, it does not contain the Web backend, Docker setup, or root scripts: run the backend from this monorepo or a reachable hosted server, and use the platform folder's own scripts. An environment variable is a named setting stored in a local .env file or your hosting dashboard; restart the relevant app after changing it, and keep server secrets out of NEXT_PUBLIC_ and EXPO_PUBLIC_ values.
1. Open apps/mobile/src/auth/client.ts and apps/mobile/src/auth/mobile-auth-configuration.ts in VS Code to find the existing sign-in flow.
2. Put EXPO_PUBLIC_API_URL and EXPO_PUBLIC_APP_SCHEME in apps/mobile/.env.local, and make sure the Web server has its own settings in apps/web/.env.local.
3. From the root start Web with corepack pnpm --filter @supastack/web dev, then in another terminal start Expo with corepack pnpm --filter @supastack/mobile start. Expected: a test sign-in opens the browser and returns to the mobile app. On a physical phone, use the computer's reachable Wi-Fi/LAN address for the API; phone-localhost means the phone itself.
The mobile app uses the Better Auth Expo integration and native secure storage. API origin and app scheme must agree with the native configuration and the authentication server's allowed return flow.
EXPO_PUBLIC_API_URL=https://your-api.example
EXPO_PUBLIC_APP_SCHEME=supastackCommands to copy
Follow the comments to see which folder a command runs in. If two terminals are labeled, open two terminal windows and keep the first command running while you use the second.
# Terminal 1 — Web API (from the monorepo root):
corepack pnpm --filter @supastack/web dev
# Terminal 2 — Expo app (from the monorepo root):
corepack pnpm --filter @supastack/mobile startImplementation workflow
Follow the existing native authentication client instead of copying web cookie assumptions into mobile. Open provider authentication through the configured browser flow, handle its callback, then resolve the authenticated session before presenting protected actions.
Keep cancelled sign-in distinct from successful sign-in. Members can enable biometric app lock (Face ID, Touch ID, or fingerprint in apps/mobile/src/security/app-lock.ts under Settings → Security) to gate foreground resume. Clear the previous user's local presentation and workspace-scoped offline read cache (apps/mobile/src/offline/) on sign-out, and verify the server session can no longer perform protected work.
Verification and troubleshooting
If sign-in opens a browser but does not return to the app, check that EXPO_PUBLIC_APP_SCHEME matches the scheme in apps/mobile/app.config.ts. If the app cannot reach the server, replace localhost with the computer's LAN address, confirm both devices use the same network, then restart Expo after editing apps/mobile/.env.local. Expo Go is a UI preview; native purchase acceptance needs an EAS development build.
Exercise cold-start callbacks, returning to a running app, cancelled sign-in, and expired sessions on the intended build. If the browser returns but the app remains signed out, inspect scheme matching and API reachability before changing provider configuration.