Monorepo: Next.js (marketing site + web dashboard) and Expo (mobile).
apps/web— Next.js App Router (/marketing,/appdashboard stub)apps/mobile— Expo (TypeScript)
Each app has its own node_modules (no npm workspaces) to keep React Native installs predictable.
From the repo root:
| Command | Description |
|---|---|
npm run dev:web |
Next.js dev server (default: http://localhost:3000) |
npm run build:web |
Production build |
npm run dev:mobile |
Expo dev server |
npm run ios / npm run android |
Open simulator / device via Expo |
Or run inside each app: cd apps/web && npm run dev, cd apps/mobile && npm start.
Apply the SQL migration once (creates tables, RLS, signup trigger, storage bucket):
- See supabase/README.md and run
supabase/migrations/20260409180000_initial_schema.sqlin the SQL Editor.
- In the Supabase dashboard, open Project Settings → API and copy Project URL and anon public key.
- Web: create
apps/web/.env.localfromapps/web/.env.example. - Mobile: create
apps/mobile/.envfromapps/mobile/.env.example(Expo loadsEXPO_PUBLIC_*from here). - Auth → URL configuration: add Redirect URLs:
http://localhost:3000/auth/callback(local web)loadvault://auth/callback(mobile development build / standalone)- Expo Go: after
npm run dev:mobile, check the Metro console for a line like[Load Vault] Add this URL…— it will be anexp://…URL (machine-specific). Paste that exact URL here too. - your production web URL +
/auth/callbackwhen you deploy
- Ensure Email provider is enabled under Authentication → Providers.
Web: magic link at /app/login. Mobile: magic link on the home screen; deep link opens the app and completes sign-in (lib/auth/sessionFromUrl.ts). Custom URL scheme: loadvault (see apps/mobile/app.json).
- Tables + Storage buckets for loads/documents
- Stripe + plan limits
- Mobile: camera, offline queue, document tags
- Web: drag-drop PDFs, search, export