WE OUTSIDE.
OUT HERE is an urban movement app built with React Native + Expo. It rewards real-world movement (steps/distance), supports social competition, and organizes Outside experiences across battles, events, drops, and news.
pnpm workspaces with Turborepo.
apps/web- the website at weouthere.appapps/app- the member app: clubs, battles, league, Club HQ, and the public club pages (/<club>,/join/<club>,/@<handle>)apps/admin- Outhere HQ, the staff appapps/mobile- Expo phone app (primary client). Run it withpnpm --filter @outhere/mobile start. Its package pins and patches live inpnpm-workspace.yaml, and it shares rules withpackages/core.supabase- the database: migrations, seed data, tests and Edge Functions (see supabase/README.md)packages/core- shared types, rules and data access (example data and Supabase)packages/ui- shared React components and the stylesheetbackend- API/backend servicesDocs- PRD, build plan, and task specsmarketing- website/marketing assets
corepack enable # once, so the pinned pnpm is used
pnpm install
pnpm dev:app # http://localhost:5173
pnpm dev:admin # http://localhost:5174
pnpm check # typecheck, test, lint and build everythingweouthere.app is the website. It serves its own files and passes every other path to the member app, so club links stay on weouthere.app. The member app keeps its built files under /_app/, and RESERVED_SLUGS in packages/core/src/rules.ts lists every top-level path either app uses, so no club can take one.
Bottom tabs:
HomeOutsideMoveCrewProfile
Outside is a nested section with persistent header + subpages:
ArenaEventsDropsNews
- Pedometer-based movement tracking
- Arena hub with rankings, challenges, and active 1v1 battles
- Battle detail screens with live countdown/progress states
- Events RSVP/check-in flows
- XP + OUT wallet/ledger surfaces
- Membership gating (Free / Pro / Black)
- Crew ownership + logo upload flow
- Rewards and drops surfaces
- React Native 0.88 (Expo SDK 58)
- Expo Router
- React Query
- Zustand + AsyncStorage
- Supabase + FastAPI integrations via app API layer
- Mapbox / maps integrations (mobile-specific)
- Node.js 20+
- npm
- Xcode (for iOS simulator) and/or Android Studio (for Android emulator)
corepack enable
pnpm install # from the repo rootpnpm --filter @outhere/mobile startUseful options:
npx expo start -c # clear Metro cache
npx expo-doctor # dependency/environment checks
npx tsc --noEmit # type checkThe phone app is on Expo SDK 58 (React Native 0.88, React 19.3, New Architecture only). Upgrade with npx expo install expo@^<sdk> and then npx expo install --fix from apps/mobile.
pnpm-workspace.yamlpins one React for the whole workspace, because React Native needs the exact version its SDK ships with.- Two small fixes to installed packages live in
apps/mobile/patchesand are applied by pnpm (patchedDependencies): the web pull-to-refresh and the toast position on web. - Jest runs on version 30, which
jest-expo58 is built on, soexpo.install.excludekeeps Expo's checks from asking for Jest 29. - After a Skia upgrade, copy
node_modules/canvaskit-wasm/bin/full/canvaskit.wasmintoapps/mobile/public/, or Skia on the web fails to load.
Mobile uses apps/mobile/.env for EXPO_PUBLIC_* values (API URLs, keys, app config).
Current baseline (after install):
npx expo-doctorpassesnpx tsc --noEmitpassesnpx expo startboots Metro successfully