BluNote is a 100% offline-first hydration tracker built with Expo + React Native. All data stays on your device (SQLite). No accounts. No telemetry. No network requests.
- 100% device-local: SQLite for data, SecureStore/AsyncStorage for install ID
- No accounts, no analytics, no tracking, no network calls
- Notifications are local-only via expo-notifications
From the project root:
npm install
npx expo start
Useful scripts:
npm run lint
npm test
npm run typecheck # or: npx tsc --noEmit
- Settings → Backup & Restore lets you export a JSON backup and share it (AirDrop, Files, etc.).
- Imports validate schema and restore data transactionally; notifications are re-scheduled after restore.
- Last backup time is shown in Settings.
- Install ID (device-local identity) is visible in Settings → About with a copy button.
- SQLite WAL enabled; indexes on intake logs and daily totals.
- Daily totals cached in a daily_totals table for fast charts.
- Validation of water amounts, weight/goal, and wake/sleep windows.
- Notification schedules reconciled on startup/foreground with permission checks.
- app/ — screens (home, onboarding, settings, details, achievements, tips)
- database/ — schema, services, migrations
- utils/notifications.ts — local scheduling
- src/device/installId.ts — device-local ID
- src/notifications/reconcile.ts — schedule reconciliation
- src/backup/backup.ts — export/import helpers
- tests/ — Jest unit tests
- .env.example is provided.
- The app is offline-only and does not require API keys by default.
See CONTRIBUTING.md.
See SECURITY.md.
MIT (see LICENSE).