GoWherer is an Expo React Native app for recording and reviewing journey timelines (travel/commute). It focuses on fast capture, clear recap, and shareable output.
- Journey start/end flow
- Timeline entries with text, location, photos, and videos
- Camera capture and media library import
- Entry edit/delete
- Journey history with type filter
- Reverse geocoding (lat/lng to place name)
- Journey/entry tags and recap keyword/tag filters
- Journey stats card:
- Distance
- Duration
- Average speed
- Location point count
- Route visualization (native map + web fallback)
- Android AMap SDK place picker (tap map/POI to select location)
- PDF export with route preview image and stats
- Manual light/dark mode toggle with local persistence
- Expo SDK 55
- React Native 0.83.2
- React 19.2.0
- Expo Router
- AsyncStorage
expo-image-picker,expo-location,expo-video,expo-print,expo-sharingreact-native-maps
- Node.js 18+
- npm
- Expo environment for Android/iOS/Web
npm installnpm run startOr run platform-specific commands:
npm run android
npm run ios
npm run webnpm run start- start Expo dev servernpm run android- run on Android targetnpm run ios- run on iOS targetnpm run web- run web targetnpm run lint- run lint checksnpm run reset-project- reset starter layout script
app/(tabs)/index.tsx- active journey creation/managementapp/(tabs)/explore.tsx- history, recap, and PDF exportlib/journey-storage.ts- local persistence logictypes/journey.ts- core data typescomponents/track-map.tsx- native route mapcomponents/track-map.web.tsx- web route map fallback.github/workflows/eas-build.yml- EAS CI workflowapp.config.ts- Expo app config
app.config.ts reads the following variables:
EAS_PROJECT_ID- Purpose: Injects
extra.eas.projectIdfor EAS project binding. - Required: Optional (workflow can fall back to
app.config.tsdefault projectId). - GitHub Actions: use
Repository Variable(vars.EAS_PROJECT_ID) orRepository Secret(secrets.EAS_PROJECT_ID).
- Purpose: Injects
APP_VERSION- Purpose: Sets app marketing version (
expo.version) at build time (for example1.2.3). - Required: No.
- Default:
1.0.0when not set. - GitHub Actions: set via manual dispatch input
app_version.
- Purpose: Sets app marketing version (
EXPO_PUBLIC_REVERSE_GEOCODE_PROVIDER- Purpose: Selects reverse geocoding provider (
amaporsystem). - Required: No.
- Default:
amapwhen not set. - GitHub Actions: optional
Repository Variable(vars.EXPO_PUBLIC_REVERSE_GEOCODE_PROVIDER).
- Purpose: Selects reverse geocoding provider (
EXPO_PUBLIC_AMAP_WEB_KEY- Purpose: AMap reverse geocoding Web API key (used when provider is
amap). - Required: Required only when provider is
amap. - GitHub Actions: configure as
Repository Secret(secrets.EXPO_PUBLIC_AMAP_WEB_KEY).
- Purpose: AMap reverse geocoding Web API key (used when provider is
AMAP_ANDROID_API_KEY- Purpose: AMap Android native SDK key (used by in-app AMap place picker).
- Required: Required for Android map place picker.
- Default: falls back to key configured in
app.config.tswhen env is not set.
Native module note: AMap SDK features require a custom Dev Client or EAS build. They are not available in Expo Go.
Security note: EXPO_PUBLIC_* values are bundled to the client. Treat them as non-sensitive publishable keys and apply provider-side restrictions (package/SHA1/domain) when supported.
When provider is amap, the app converts coordinates from WGS84 (from expo-location) to GCJ-02 before calling AMap reverse geocoding. This conversion is applied only for mainland China coordinates; outside China, original coordinates are used.
This project is configured for EAS builds with GitHub Actions manual dispatch (platform: android/ios/all, profile: preview/production).
Version behavior:
- App version (
expo.version) can be set by workflow inputapp_version(for example1.3.0). - CI writes
app_versioninto project.envasAPP_VERSIONbefore triggeringeas build, ensuring cloud build uses the same version value. - Build numbers (
android.versionCode/ios.buildNumber) auto-increment in bothpreviewandproductionprofiles via EAS remote versioning. - Build outputs are stored in EAS, uploaded as GitHub workflow artifacts, and also published to GitHub Releases.
- Release tag format:
eas-build-<profile>-<run_number>.
Required GitHub configuration:
EXPO_TOKEN- Variable or Secret:
EAS_PROJECT_ID(optional, recommended)
If Android keystore is not provisioned yet, non-interactive CI build may fail with:
Generating a new Keystore is not supported in --non-interactive mode
Run once locally (interactive) to provision credentials:
npx eas-cli@latest login
npx eas-cli@latest credentials -p androidThen rerun the GitHub Action.
- P1:
- Smart route analysis (stay points / segment summary)
- GPS track denoise/smoothing
- Timeline entry templates
- PDF template and cover customization
- Journey share card generation
- P2:
- Cloud sync
- Cross-device restore/browsing
- Collaboration mode
- Privacy controls for coordinate masking
- Geofence reminders and optional background auto logging
MIT License. See LICENSE.