Marcus Rehbock c48212bfff
All checks were successful
Build & Release APK / build (push) Successful in 2m5s
Fitbit Air: Health Connect sync + vitals dashboard
- react-native-health-connect (config plugin, minSdk 26, 11 read perms)
- sync-on-open + manual sync: incremental via server watermark, chunked
  POST to /api/health/v1/fitbit/sync (HR, resting HR, HRV, SpO2, resp
  rate, steps/distance/kcal/floors dailies, staged sleep sessions)
- Fitbit screen: steps/RHR/HRV/SpO2 tiles + daily charts + sleep list +
  per-stream record counts (answers the which-types-does-Google-Health-
  share question empirically)
- Sleep tab now merges Fitbit Air nights (wins over older sources)
- Today screen Fitbit card

Server side (deployed separately on VPS): hc_samples/hc_daily/hc_sleep
tables + sync/latest/summary endpoints in health-api; Caddy routes POST
/api/health/v1/fitbit/* behind the same basic_auth.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 22:25:07 -07:00
2026-08-07 16:32:22 -07:00
2026-08-07 16:32:22 -07:00
2026-08-07 16:32:22 -07:00
2026-08-07 16:32:22 -07:00
2026-08-07 16:32:22 -07:00
2026-08-07 16:32:22 -07:00
2026-08-07 17:47:32 -07:00
2026-08-07 16:32:22 -07:00

health-app

Cross-platform (iOS + Android) Expo app — native front end for the private health dashboard at https://health.rehbock.xyz.

The app is a pure client: all data lives on the server and is fetched live over HTTPS with HTTP Basic auth. Nothing is stored on the device except the auth token (in the platform keychain via expo-secure-store).

Screens

Screen Data source
Today overview cards + clinical priorities (health-meta.json)
Blood /api/health/v1/biomarkers + /draws — search, flags, sparklines
Sleep /api/health/v1/sleep + sleep-data.json — stacked stage chart
Train /api/health/v1/workouts — weekly volume chart, expandable sessions
Body dexa-scans.json — DXA summary with deltas, regions, indices
Mind /api/meditation/v1/stats + /sessions
DNA ancestry-traits.json — 99 AncestryDNA traits

Ported from the PWA at health.rehbock.xyz/app/ (repo marcus/health.rehbock.xyz, app/index.html); charts are react-native-svg, tap a bar for the night/week detail.

Development

npm install
npx expo start        # scan the QR with Expo Go (iOS or Android)

Log in with the same Basic-auth credentials as the website.

Android release APK

Signing expects (auto-skipped if absent, falling back to the debug key):

  • keystore ~/.android-keys/health-app-release.jks (alias health), or $HEALTH_KEYSTORE
  • password in ~/.android-keys/health-app-release.password, or $KEYSTORE_PASSWORD

The signing config is injected by plugins/with-release-signing.js at prebuild.

npx expo prebuild --platform android
cd android && ./gradlew assembleRelease
# → android/app/build/outputs/apk/release/app-release.apk

Install on GrapheneOS by copying the APK over, or via Obtainium.

CI (Gitea Actions)

Every push to main runs .gitea/workflows/release.yml: prebuild → signed arm64 APK → Gitea release tagged v1.0.<run_number>, APK attached. app.config.js stamps VERSION_CODE/VERSION_NAME from the run number so each release installs as an upgrade (Obtainium-friendly).

Repo secrets: KEYSTORE_B64 (base64 of the jks), KEYSTORE_PASSWORD.

iOS

No Mac is available in this setup, so there is no local iOS build. Options:

  • Expo Go (zero setup): npx expo start, scan the QR from the iPhone.
  • EAS Build (real install): npx eas build -p ios — needs an Apple Developer account; produces a TestFlight/ad-hoc build in the cloud.

The ios.bundleIdentifier is already set to xyz.rehbock.health.

Description
Cross-platform Expo app (iOS + Android) front end for health.rehbock.xyz
Readme MIT 1.8 MiB
v1.0.7 Latest
2026-08-08 17:04:44 +10:00
Languages
TypeScript 96.3%
JavaScript 3.7%