Import screen:
- Add "Scan for new rides" button (green) when auto_import_path is set;
shows the configured path, lets user trigger manually in addition to
the automatic scan on app open.
- Detect ActivityNotFoundException from DocumentPicker (Karoo and other
stripped Android devices have no DocumentsUI app) and show a friendly
message directing users to set a Watch directory instead.
- "No new rides found" feedback when manual scan finds nothing.
Docs (docs/mobile-app.md):
- Phase 1 marked complete with implementation notes (wheel delivery,
timeseries workaround, source_path dedup).
- Phase 2 updated to reflect what is actually implemented (on-open scan,
not background task) vs what remains (true background polling).
- Batch import moved from Phase 5 todo to done.
- Data model updated with source_path column.
- Known gaps section revised to remove fixed stubs.
- New Karoo sideloading section with debuggableVariants and armeabi-v7a
troubleshooting notes.
Android release builds block cleartext HTTP by default (debug builds override
this via the debug manifest overlay). Add usesCleartextTraffic=true to app.json
so expo prebuild includes it in the generated manifest — required to reach local
Bincio instances over HTTP.
In bincio dev (Astro dev server), /activity/<id>/ routes 404 because
getStaticPaths() returns [] and there is no nginx try_files fallback. Add a Vite
middleware plugin to astro.config.mjs that rewrites /activity/<id>/ to /activity/
in dev, matching what nginx does in production.
- Mark Phase 1 as the critical unbuilt feature; note its prerequisite chain
(SHA-256 dedup, re-extract button, Phase 2 auto-import all depend on it)
- Flag Phase 2 auto_import_path as stubbed in UI but unimplemented in background
- Add "Known gaps and technical debt" section covering:
- source_hash stub (id+length, not SHA-256)
- FIT/GPX/TCX import placeholder alert
- auto_import_path field with no backend task
- feed pagination (getAllSync with no LIMIT)
- individual activity deletion (missing from plan)
- feed search and filter (missing from plan)
- token expiry / inline reconnect flow (missing from plan)
- app icon and splash screen (Expo defaults)
- upload skip behaviour for origin=remote rows
- Add Phase 5 items not previously in the plan: app icon, feed search/filter,
individual deletion, token reconnect prompt
- Add /api/activity/{id}/geojson and /api/activity/{id}/timeseries endpoints
(bearer-token-gated, falls back from _merged to raw activities dir)
- Rewrite activity detail screen with MapLibreGL v11 API (Map, Camera,
GeoJSONSource, Layer) and react-native-svg area chart with gradient fill
- On-demand fetch for remote activities that have no local geojson/timeseries
- Add react-native-svg dependency; requires dev build (npx expo run:android)
- Add GET /api/wheel/download to serve/server.py and edit/server.py:
serves dist/bincio-*.whl via FileResponse; in production nginx takes
the request before FastAPI, so this is a no-op there but works locally
- wheel_version response now includes api_url: "/api/wheel/download"
alongside the nginx-served url field
- Bundle mobile/assets/bincio.whl (built from dist/) as an offline
fallback for Pyodide testing before the first instance sync
- docs/mobile-app.md: document dev setup — bundled asset, local server
endpoint, and how to refresh the bundle with uv build + cp