The caregiver-facing mobile app for the ELDORA ecosystem β handling multi-home management, DoraBot pairing and Wi-Fi provisioning, real-time fall and safety alerts, scene automation, voice configuration, and elder analytics.
π ELDORA Ecosystem Β· π€ DoraBot Β· π‘οΈ DoraShield Β· βοΈ Backend
Eldora-Mobile is the caregiver's command center in the ELDORA eldercare ecosystem. Built with Expo and React Native, it lets family members and professional caregivers monitor elderly safety in real time, onboard and configure DoraBot devices, manage multi-home environments, set up scene automations, and receive instant push notifications β including critical fall alerts with vibration override.
Eldora-Mobile's role in the ELDORA ecosystem: "The caregiver's window β always connected, always informed, always one tap away from responding."
| Platform | Android (primary), iOS |
| Framework | Expo SDK 55 + React Native 0.83.4 |
| Language | TypeScript |
| Auth | Firebase Auth β email/password + Google Sign-In |
| Push Notifications | Firebase Cloud Messaging (FCM) + Expo Notifications |
| State Management | Zustand + AsyncStorage |
| Data Fetching | TanStack Query v5 |
| Styling | NativeWind v4 (Tailwind-style utility classes) |
Eldora-Mobile is the Recover layer of ELDORA's three-phase safety framework:
ELDORA Ecosystem
βββ π‘οΈ DoraShield β Fall detection wearable (ESP32)
βββ π€ DoraBot β AI voice companion (ESP32-S3)
βββ βοΈ ELDORA Backend β AI processing, device orchestration, API
βββ π± Eldora-Mobile β Caregiver dashboard (this repo)
- π Firebase Authentication β email/password login, Google Sign-In, and new account registration
- π Multi-Home Management β create and switch between multiple elder homes from a unified selector
- π€ DoraBot Local Discovery & Pairing β scans the local Wi-Fi network to find DoraBot, pairs it to a caregiver account, and manages pairing approval requests
- πΆ DoraBot Wi-Fi Provisioning β pushes home Wi-Fi credentials directly to an unpaired DoraBot over its local provisioning endpoint
- π Device Dashboard β lists all paired ELDORA devices (DoraBot + DoraShield) with online/offline status and room-based filtering
- π Real-Time Alerts & Notifications β receives fall, home, and device alerts via FCM; supports critical alert modals with continuous vibration until dismissed
- π¬ Scene Automation β build, manage, and run tap-to-run automation scenes grouped by device and room
- π Elder Analytics β time-series activity and emotion analytics with configurable periods (1 day, 7 days, 30 days, 90 days)
- ποΈ DoraBot Voice Configuration β select TTS voice, accent, and speech rate per device; play a test audio clip before saving
- π‘ Home Administration β manage home name, location, members, and join an existing home via invite
- π Notification Preferences β per-category notification settings, with FCM token registration and automatic token refresh
- π± Guided Onboarding β multi-screen onboarding flow for first-time caregiver setup
| Layer | Technology | Purpose |
|---|---|---|
| Framework | Expo SDK 55 + React Native 0.83.4 | Cross-platform mobile app |
| Language | TypeScript 5.9 | Type-safe development throughout |
| Navigation | Expo Router (file-based) | Screen routing with protected route guards |
| State Management | Zustand + AsyncStorage | Global auth and home state with persistence |
| Data Fetching | TanStack Query v5 | Server state, caching, and background refetch |
| Authentication | Firebase Auth + @react-native-firebase/auth |
Email/password and Google Sign-In |
| Push Notifications | Firebase Cloud Messaging + Expo Notifications | Real-time alerts, critical alert channels |
| HTTP Client | Axios | REST API communication with ELDORA backend |
| Forms & Validation | React Hook Form + Zod | Sign-in, sign-up, Wi-Fi config forms |
| Styling | NativeWind v4 + Tailwind CSS | Utility-class styling |
| Icons | Lucide React Native | Consistent icon set throughout the UI |
| Audio | expo-audio | TTS voice test playback in voice settings |
| Animations | React Native Reanimated | Smooth UI transitions |
| Networking (local) | expo-network | Wi-Fi state detection for DoraBot discovery |
Eldora-Mobile/
β
βββ π app/ # Expo Router screen files (file-based routing)
β βββ _layout.tsx # Root layout β auth guard, FCM setup, critical alert modal
β βββ index.tsx # Entry redirect (auth β home or onboarding)
β βββ onboarding.tsx / welcome.tsx / signin.tsx / signup.tsx
β βββ home.tsx # Device dashboard β DoraBot status, pairing, device list
β βββ alerts.tsx / alert-detail.tsx
β βββ scene.tsx / scene-builder.tsx / create-scene.tsx / scene-detail.tsx
β βββ analytics.tsx
β βββ settings.tsx / account.tsx / personal-information.tsx / account-security.tsx
β βββ notification-settings.tsx / voice-settings.tsx
β βββ home-management.tsx / home-settings.tsx / home-member.tsx / home-location.tsx / join-home.tsx
β βββ device-management.tsx / device-detail.tsx / device-setup.tsx / add-device.tsx
β βββ room-management.tsx
β
βββ π src/
β βββ π api/ # API query function modules (analyticsApi, devicesApi, β¦)
β βββ π components/ # Reusable UI components grouped by domain
β β βββ auth/ # AuthField
β β βββ cards/ # AlertCard, DiscoveredHubCard
β β βββ devices/ # AddDeviceMenu, WifiConfigModal, ScanningRadar, β¦
β β βββ home/ # HomeSelectorMenu, PairingRequestCard, DeviceStatusCard, β¦
β β βββ navigation/ # BottomNav, MainTabScreen, ScreenHeader
β β βββ scene/ # SceneListRow, SceneFilterPill, SceneEmptyState, β¦
β β βββ settings/ # MeMenuRow, SettingsRow, NotificationPreferenceRow, β¦
β β βββ ui/ # Button, Card, Input, LoadingSpinner
β βββ π constants/ # api.ts (endpoints), theme.ts, sceneTemplates.ts
β βββ π hooks/ # TanStack Query hooks per domain (useDeviceQueries, β¦)
β βββ π lib/ # queryClient.ts
β βββ π services/ # API service layer (authService, deviceService, β¦)
β βββ π stores/ # Zustand stores (authStore, homeStore, voiceSettingsStore)
β βββ π types/ # TypeScript type definitions per domain
β βββ π utils/ # Formatters, device/home/scene utility functions
β
βββ π app.json # Expo app configuration (bundle IDs, permissions, plugins)
βββ π .env.example # Required environment variables
βββ π eas.json # EAS Build configuration
βββ π .github/workflows/android-build.yml # CI: Android APK + AAB release build
What each layer does
| Layer | Role |
|---|---|
app/ |
Screens. Each file is a route. _layout.tsx wires up Firebase FCM, the critical alert modal, and Expo Router auth guards. |
src/api/ |
Query functions. Raw API call functions passed to TanStack Query hooks β one file per domain. |
src/hooks/ |
TanStack Query hooks. useDeviceQueries, useSceneQueries, etc. β each exports useXxxQuery and useXxxMutation hooks consumed by screens. |
src/services/ |
Service layer. Thin wrappers over apiClient (Axios) that handle request/response shaping per domain. authService also drives Firebase Auth calls. |
src/stores/ |
Global state. authStore holds the JWT token and hydration flag. homeStore tracks the selected home ID across sessions. |
src/components/ |
UI building blocks. Organized by domain so screens stay lean. |
In plain English:
App launches β checks auth token (Zustand + AsyncStorage)
β if unauthenticated: onboarding β sign in β Firebase + backend login
β if authenticated: home dashboard
loads homes list from backend
scans local network for DoraBot (LAN discovery)
if DoraBot found β pair it to the selected home
if DoraBot needs Wi-Fi β push credentials over local provisioning endpoint
β main loop:
FCM push β toast or critical alert modal (with vibration)
pull-to-refresh β reload devices, re-run LAN discovery
navigate to Alerts β full notification history
navigate to Scenes β automation management
navigate to Settings β voice config, account, home admin
Create a .env file in the project root (use .env.example as the template):
# ELDORA Backend
EXPO_PUBLIC_API_URL=https://your-backend-url.com
# Google OAuth (for Google Sign-In)
EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID=your-google-web-client-id
EXPO_PUBLIC_GOOGLE_ANDROID_CLIENT_ID=your-google-android-client-id
# Firebase (Authentication + FCM)
EXPO_PUBLIC_FIREBASE_API_KEY=your-firebase-api-key
EXPO_PUBLIC_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com
EXPO_PUBLIC_FIREBASE_PROJECT_ID=your-firebase-project-id
EXPO_PUBLIC_FIREBASE_APP_ID=your-firebase-app-id
EXPO_PUBLIC_FIREBASE_STORAGE_BUCKET=your-project.appspot.com
EXPO_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your-messaging-sender-id
β οΈ Never commit.envto version control. All variables prefixedEXPO_PUBLIC_are bundled into the app binary β treat them accordingly.
- Node.js 20+
- Expo CLI (
npm install -g expo-cli) - Android Studio (for Android emulator) or a physical Android/iOS device with Expo Go
# 1. Clone the repository
git clone https://github.com/Eldoraaa/eldora-mobile.git
cd eldora-mobile
# 2. Install dependencies
npm install
# 3. Copy and fill in environment variables
cp .env.example .env
# Edit .env with your backend URL and Firebase/Google credentials
# 4. Start the Expo dev server
npm run start
# 5. Scan the QR code with Expo Go (Android/iOS)
# or press 'a' to open on an Android emulator
# or press 'i' to open on an iOS simulatornpx tsc --noEmitnpm run android # Run directly on Android emulator / connected device
npm run ios # Run on iOS simulator (macOS only)
npm run web # Run in browser (limited functionality)Running on a physical Android device
- Enable Developer Options and USB Debugging on the device
- Connect via USB and confirm the ADB prompt on the device
- Run
npm run androidβ Expo will install the dev build automatically - For FCM push notifications to work, the app must be built with
expo-dev-client(not plain Expo Go)
The repository includes a GitHub Actions workflow (.github/workflows/android-build.yml) for producing signed release builds.
| Step | What it does |
|---|---|
| Trigger | Manual (workflow_dispatch) |
| Environment | Ubuntu latest, Node 20, Java 17 |
| Prebuild | expo prebuild --platform android generates the native Android project |
| Signing | Decodes a base64-encoded keystore from GitHub Secrets and injects signing config into build.gradle |
| Build | ./gradlew assembleRelease bundleRelease β produces both APK and AAB |
| Artifacts | APK and AAB uploaded as GitHub Actions artifacts |
| Release | Creates a versioned GitHub Release (v1.0.0-build.<run_number>) with both artifacts attached |
| Secret | Description |
|---|---|
EXPO_PUBLIC_API_URL |
Backend API URL |
EXPO_PUBLIC_GOOGLE_*_CLIENT_ID |
Google OAuth client IDs |
EXPO_PUBLIC_FIREBASE_* |
Firebase configuration values |
GOOGLE_SERVICES_JSON |
Base64-encoded google-services.json |
ANDROID_KEYSTORE_BASE64 |
Base64-encoded release keystore |
ANDROID_KEYSTORE_PASSWORD |
Keystore password |
ANDROID_KEY_ALIAS |
Key alias |
ANDROID_KEY_PASSWORD |
Key password |
ELDORA β BINUS BM Team Passage to ASEAN Hackathon 2026
| Name | Role |
|---|---|
| Stanley Nathanael Wijaya | Team Lead |
| Lutfi Alvaro Pratama | IoT Engineer |
| Andrian Pratama | Mobile Developer |
| Khalisa Amanda Sifa Ghaizani | Backend Developer |
| Devon Nicholas | AI Engineer |
Have questions, want to collaborate, or interested in ELDORA?
| Channel | Details |
|---|---|
| π§ Email | stanley.n.wijaya7@gmail.com |
| @xstynwx | |
| π¬ Discord | stynw7 |

