Mobile & Marketing
apps/mobile — Android app (Phase 2)
An Expo / React Native app that reuses the shared packages so most of the trading logic comes for free.
apps/mobile/
├── app/ expo-router file-based routes
│ ├── (auth)/ Pre-auth screens (OTP, complete profile)
│ ├── (app)/ Authenticated tabs + stacks (farms, products, …)
│ ├── _layout.tsx Root layout
│ └── index.tsx Entry redirect
├── scripts/adb-reverse-api.js Maps device localhost:3000 → dev machine
└── app.json Expo configStack: Expo 52, React Native 0.76, NativeWind 4 (Tailwind classes → RN StyleSheet), expo-router, expo-secure-store (JWT storage), expo-camera + expo-image-picker (photos through the same Sharp → R2 pipeline), expo-location (GeoJSON farm boundaries), zustand. It imports @cropto/api-client and @cropto/hooks directly from the monorepo.
Run it:
cd apps/mobile
npm run android # adb reverse + expo run:android
npm start # Metro + Expo dev
npm run build:android # EAS buildPorting model: the web app is deliberately built with a NativeWind-safe Tailwind subset, so components port with minimal changes. Components that need RN-specific rewrites: MapPicker (Leaflet → react-native-maps), BottomNav, BottomSheet (→ @gorhom/bottom-sheet), ImageUpload (→ expo-image-picker), Sidebar (replaced by a tab bar).
Prebuild clobbers native config
expo prebuild regenerates the android/ folder and wipes signing config, the Gradle wrapper, and targetSdk. After a prebuild, re-apply the release configuration (there is a checklist + keystore backup noted in the team's internal memory).
apps/marketing — public SEO site
A Next.js 15 (App Router) + Payload CMS 3 site, fully isolated from the trading app with its own content database. It exists to convert visitors, demonstrate the product, and rank for Makhana trading keywords.
apps/marketing/src/
├── app/ Next.js App Router pages
├── collections/ Payload collections — Articles, Pages, Experts, Companies, Banners,
│ Taxonomy, Translations, Media, Redirects, ContactSubmissions, ActivityLog, Users
├── blocks/ CMS block components
├── globals/ Payload globals
├── fields/ Reusable Payload fields
├── components/ React components
├── illustrations/ SVG illustrations
├── lib/ Helpers
├── seed/ Content + glossary + Hindi seed scripts
└── payload.config.ts Payload configurationRun it:
npm run dev --workspace=apps/marketing # Next.js on :3002
npm --workspace=apps/marketing run seed # seed CMS content
npm --workspace=apps/marketing run generate:types # Payload → payload-types.tsStack: Next.js 15, React 19, Payload CMS 3 (@payloadcms/db-postgres, richtext-lexical, storage-s3, live-preview-react), graphql. It requires Node ≥ 20.9 and runs a dedupe-react postinstall step because Payload (React 19) and the rest of the monorepo (React 18) coexist.
Because it is isolated, the marketing site can be deployed, scaled, and content-managed independently of the trading platform.
