Geofenced audio guide for ordinary city transit rides. React Native (Expo bare) + TypeScript app targeting iOS and Android.
Portfolio demo. Spec-driven MVP showcasing monorepo architecture, a pure tour engine with property tests, Expo-module runtime wiring, and offline-first design. Licensed under Apache-2.0. See HANDOFF.md for engineering context.
The repository root is the Expo bare React Native app. Native projects (ios/,
android/) are not committed — they are generated by expo prebuild from
app.config.ts and the local config plugins under plugins/.
.
├── App.tsx Entry component
├── index.ts RN registerRootComponent
├── app.config.ts Expo config (Info.plist, AndroidManifest, ...)
├── eas.json EAS Build profiles (development / preview / production)
├── plugins/ Local Expo config plugins
│ └── withTramioForegroundService.ts
├── packages/ (Future) module boundaries — see task 1.3
└── .kiro/specs/urban-narrative-mvp/ Spec, design, tasks, requirements
- Node 20 or newer (the lockfile is built against the active Node).
- Expo SDK 57 (React Native 0.86, React 19.2). Run
npx expo install --fixafter pulling. - An Expo account (
npx expo login) for EAS Build. - Xcode 16 + CocoaPods for iOS; Android Studio with SDK Platform 37 (Android 17) + Build-Tools 37.x for Android.
npm install
npx expo prebuild # generate ios/ + android/ from app.config.ts
npm run ios # or `npm run android`Profiles are configured in eas.json:
development— internal distribution, simulator-friendly, dev client enabled.preview— internal QA builds, real-device only.production— store-bound, auto-incrementing build numbers.
npx eas-cli build --profile development --platform ios
npx eas-cli build --profile development --platform androidThe Tour_Engine needs to keep playing while the user locks their phone. The
following entries flow from app.config.ts into the generated manifests:
UIBackgroundModes:audio,location,fetch(Req 12.1, 12.2)NSLocationWhenInUseUsageDescriptionand the always variants (Req 11.x, 12.2)
- Permissions (Req 12.2, 12.4):
ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION,ACCESS_BACKGROUND_LOCATION,FOREGROUND_SERVICE,FOREGROUND_SERVICE_LOCATION,FOREGROUND_SERVICE_MEDIA_PLAYBACK,POST_NOTIFICATIONS,WAKE_LOCK,INTERNET,ACCESS_NETWORK_STATE. - Foreground service component
.TramioTourForegroundServicewithforegroundServiceType="location|mediaPlayback", registered via thewithTramioForegroundServiceconfig plugin (Req 12.1, 12.2).