896b528a4c
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>
207 lines
5.9 KiB
Markdown
207 lines
5.9 KiB
Markdown
# 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 ..
|
|
```
|