Skip to content

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.

text
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 config

Stack: 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:

bash
cd apps/mobile
npm run android      # adb reverse + expo run:android
npm start            # Metro + Expo dev
npm run build:android # EAS build

Porting 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.

text
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 configuration

Run it:

bash
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.ts

Stack: 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.

Internal technical documentation — Cropto