feat: scaffold Expo Prebuild project with all v1 screens and services
Sets up the full bincio-rec source tree: Zustand recording store with haversine stats, background GPS via expo-task-manager, BLE scan/subscribe for HR and power, GPX writer with Garmin extensions, SQLite recordings list, multipart upload to bincio-activity, React Navigation stack with bottom tabs, and build instructions in README.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,206 @@
|
||||
# bincio-rec
|
||||
|
||||
GPS activity recorder for cycling, running, hiking, and walking.
|
||||
Records GPS tracks + BLE sensor data (HR, power, cadence) and saves them as GPX files.
|
||||
Part of the [bincio ecosystem](#ecosystem).
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### All platforms
|
||||
|
||||
| Tool | Version | Notes |
|
||||
|---|---|---|
|
||||
| Node.js | 22+ | [nodejs.org](https://nodejs.org) |
|
||||
| npm | 10+ | Comes with Node |
|
||||
| Expo CLI | latest | `npm install -g expo-cli` (optional, `npx expo` works too) |
|
||||
|
||||
### Android
|
||||
|
||||
| Tool | Notes |
|
||||
|---|---|
|
||||
| Android Studio | [developer.android.com/studio](https://developer.android.com/studio) |
|
||||
| Android SDK | Install via Android Studio SDK Manager |
|
||||
| JDK 17 | Bundled with Android Studio, or install separately |
|
||||
| `ANDROID_HOME` env var | Set to your SDK path, e.g. `~/Library/Android/sdk` |
|
||||
|
||||
Minimum supported Android version: **API 26 (Android 8.0)**.
|
||||
|
||||
### iOS (macOS only)
|
||||
|
||||
| Tool | Notes |
|
||||
|---|---|
|
||||
| Xcode 16+ | Install from the Mac App Store |
|
||||
| Xcode Command Line Tools | `xcode-select --install` |
|
||||
| CocoaPods | `sudo gem install cocoapods` |
|
||||
| Apple Developer account | Free account works for device sideloading |
|
||||
|
||||
Minimum supported iOS version: **16.4**.
|
||||
|
||||
---
|
||||
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
# 1. Install JS dependencies
|
||||
npm install
|
||||
|
||||
# 2. Prebuild was already run — android/ and ios/ directories exist.
|
||||
# Re-run only when you add/remove native modules:
|
||||
npx expo prebuild --clean
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Running in development
|
||||
|
||||
### Android
|
||||
|
||||
```bash
|
||||
# Start Metro bundler + launch on a connected device or emulator
|
||||
npm run android
|
||||
|
||||
# Or target a specific device
|
||||
npx expo run:android --device
|
||||
```
|
||||
|
||||
**Android emulator setup:** In Android Studio → Device Manager, create an AVD with API 34+, x86_64 image. Start it before running the command above.
|
||||
|
||||
**Physical device:** Enable Developer Options → USB Debugging, then connect via USB.
|
||||
|
||||
> **Battery optimization:** On first launch, the app will prompt you to whitelist it in battery settings. This is required for background GPS recording to survive on Xiaomi / Samsung / Huawei devices.
|
||||
|
||||
### iOS
|
||||
|
||||
```bash
|
||||
# Install CocoaPods dependencies (first time and after native changes)
|
||||
cd ios && pod install && cd ..
|
||||
|
||||
# Start Metro bundler + launch on a connected device or simulator
|
||||
npm run ios
|
||||
|
||||
# Or target a specific simulator
|
||||
npx expo run:ios --simulator "iPhone 16"
|
||||
|
||||
# Or target a physical device (requires Apple Developer account)
|
||||
npx expo run:ios --device
|
||||
```
|
||||
|
||||
**Location permission:** iOS will prompt for location access. Choose **Always Allow** — background GPS recording requires it.
|
||||
|
||||
---
|
||||
|
||||
## Building release APK / IPA
|
||||
|
||||
### Android — local release APK
|
||||
|
||||
```bash
|
||||
cd android
|
||||
./gradlew assembleRelease
|
||||
# Output: android/app/build/outputs/apk/release/app-release.apk
|
||||
```
|
||||
|
||||
To build a release AAB (required for Play Store):
|
||||
|
||||
```bash
|
||||
./gradlew bundleRelease
|
||||
# Output: android/app/build/outputs/bundle/release/app-release.aab
|
||||
```
|
||||
|
||||
**Signing:** Create a keystore and configure `android/app/build.gradle` with your signing config before a production release. See [React Native signing docs](https://reactnative.dev/docs/signed-apk-android).
|
||||
|
||||
### iOS — local release archive
|
||||
|
||||
Open Xcode:
|
||||
|
||||
```bash
|
||||
open ios/binciorec.xcworkspace
|
||||
```
|
||||
|
||||
1. Select your device or **Any iOS Device (arm64)** as the target.
|
||||
2. Set your Team in **Signing & Capabilities**.
|
||||
3. **Product → Archive**.
|
||||
4. In the Organizer window, click **Distribute App**.
|
||||
|
||||
---
|
||||
|
||||
## Building with EAS Build (recommended for CI / TestFlight)
|
||||
|
||||
EAS Build runs in Expo's cloud so you don't need Android Studio or Xcode locally.
|
||||
|
||||
```bash
|
||||
# Install EAS CLI
|
||||
npm install -g eas-cli
|
||||
|
||||
# Log in to your Expo account
|
||||
eas login
|
||||
|
||||
# Configure the project (first time only — creates eas.json)
|
||||
eas build:configure
|
||||
|
||||
# Build Android APK for local testing
|
||||
eas build --platform android --profile preview
|
||||
|
||||
# Build Android AAB for Play Store
|
||||
eas build --platform android --profile production
|
||||
|
||||
# Build iOS IPA for TestFlight / App Store
|
||||
eas build --platform ios --profile production
|
||||
```
|
||||
|
||||
Builds appear at [expo.dev](https://expo.dev) and a download link is printed when done.
|
||||
|
||||
---
|
||||
|
||||
## Project structure
|
||||
|
||||
```
|
||||
bincio-rec/
|
||||
├── App.tsx # Entry point
|
||||
├── app.json # Expo config (permissions, plugins, bundle IDs)
|
||||
├── android/ # Generated Android project (do not edit manually)
|
||||
├── ios/ # Generated iOS project (do not edit manually)
|
||||
└── src/
|
||||
├── types/index.ts # Shared TypeScript types
|
||||
├── store/recording.ts # Zustand recording state + haversine stats
|
||||
├── services/
|
||||
│ ├── gps.ts # Background GPS via expo-location + expo-task-manager
|
||||
│ ├── ble.ts # BLE scan / connect / HR + power subscriptions
|
||||
│ ├── gpx.ts # GPX file builder (Garmin trackpoint extensions)
|
||||
│ ├── upload.ts # Upload GPX to bincio-activity /api/upload/raw
|
||||
│ └── db.ts # SQLite CRUD for saved recordings list
|
||||
├── screens/
|
||||
│ ├── RecordingScreen.tsx
|
||||
│ ├── PostRecordingScreen.tsx
|
||||
│ ├── SensorPairingScreen.tsx
|
||||
│ ├── SavedRecordingsScreen.tsx
|
||||
│ └── SettingsScreen.tsx
|
||||
└── navigation/
|
||||
└── AppNavigator.tsx # Root stack + bottom tabs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Ecosystem
|
||||
|
||||
```
|
||||
bincio-rec → writes GPX files to device storage
|
||||
bincio-autarchive → imports GPX, stores locally, syncs to server
|
||||
bincio-activity → server: parses GPX, stores activities, serves API
|
||||
bincio-auth → auth service: issues JWTs for all bincio apps
|
||||
```
|
||||
|
||||
Configure your bincio instance URL and API token in **Settings** to enable direct upload from the app.
|
||||
|
||||
---
|
||||
|
||||
## Adding native modules
|
||||
|
||||
Any new Expo or React Native library with native code requires a prebuild + reinstall cycle:
|
||||
|
||||
```bash
|
||||
npx expo install <package-name>
|
||||
npx expo prebuild --clean # regenerates android/ and ios/
|
||||
cd ios && pod install && cd ..
|
||||
```
|
||||
Reference in New Issue
Block a user