diff --git a/CLAUDE.md b/CLAUDE.md index 43c994c..54dd5a6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1 +1,93 @@ -@AGENTS.md +# bincio-rec + +GPS activity recorder for the bincio ecosystem. +Companion to **bincio-autarchive** (archive/sync app): rec makes the data, autarchive stores and syncs it. + +--- + +## Concept + +A focused, minimal recording app for cycling, running, hiking, and walking. +Records GPS track + BLE sensor data, saves to GPX, optionally uploads directly to a bincio-activity server. +Future: live navigation / turn-by-turn instructions. + +The app does one thing well: **record**. No browsing, no analysis — that's autarchive's job. + +--- + +## Ecosystem + +``` +bincio-rec → writes GPX files to shared 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 +``` + +bincio-rec can also upload directly to bincio-activity via `/api/upload/raw` (same endpoint autarchive uses), with instance URL + API token configured in settings. + +--- + +## Tech Stack + +**Expo Prebuild** (not managed Expo, not bare RN). + +- Managed Expo ruled out: BLE requires native modules +- Bare RN ruled out: Expo library ecosystem is valuable (location, notifications, file system) +- Prebuild gives full native access while keeping Expo tooling and EAS Build + +Key libraries: +- `expo-location` + `expo-task-manager` — background GPS recording +- `react-native-ble-plx` — BLE sensors (HR, power, cadence) +- `@maplibre/maplibre-react-native` — live track map, future navigation +- `expo-notifications` — km milestone alerts, future navigation cues +- `expo-keep-awake` — keep screen on during recording (user-toggleable) +- `expo-file-system` — write GPX/JSON to shared storage +- `expo-sqlite` — local DB for past recordings list + +Target: **Android first**, iOS second. + +--- + +## v1 Screens + +1. **Sensor pairing** — scan BLE, pair HR monitor / power meter / cadence sensor; persisted +2. **Recording** — start / pause / resume / stop + - Live stats: elapsed time, distance, current+avg speed, HR, power, cadence, elevation gain + - Map with track drawn in real time + - Keep-awake toggle +3. **Post-recording summary** — stats overview, title field, save / discard +4. **Saved recordings** — list of past sessions; tap to export GPX or upload to server +5. **Settings** — bincio instance URL + API token; km notification toggle; upload format + +--- + +## Output Format + +**GPX with Garmin trackpoint extensions** — one `` per second with: +- lat/lon/elevation from GPS +- `` — heart rate +- `` — power (watts) +- `` — cadence (rpm) + +bincio-activity already parses this format via `bincio.extract.parsers`. + +Files saved to a user-accessible location (iOS Files app / Android shared storage) so bincio-autarchive can import them manually. + +--- + +## Known Platform Concerns + +- **Android battery optimization**: aggressive OEMs (Xiaomi, Samsung, Huawei) kill background tasks. Prompt user to whitelist bincio-rec in battery settings on first launch. Every recording app has this problem — no framework-level fix. +- **iOS background location**: requires `location` background mode in `Info.plist` and "Always" location permission. Fine for sideloading/TestFlight; App Store submission requires clear justification. +- **iOS foreground notifications**: notification sounds are suppressed when app is in foreground — use `expo-av` audio cue instead for km alerts while screen is on. + +--- + +## Out of Scope (v1) + +- Navigation / turn-by-turn routing +- Auto-pause (stop lights, etc.) +- Structured workouts / intervals +- Offline maps +- Live tracking / sharing diff --git a/app.json b/app.json index 0b23c10..521923b 100644 --- a/app.json +++ b/app.json @@ -38,6 +38,7 @@ "web": { "favicon": "./assets/favicon.png" }, + "ignorePaths": ["CLAUDE.md"], "plugins": [ "expo-sqlite", [