A bilingual (Arabic RTL / English LTR) AAC — augmentative and alternative communication — app. It gives a non-verbal or bed-bound person a grid of large, colorful phrase buttons ("I want to eat", "I'm in pain", "Call the nurse") that speak out loud when tapped, and gives caregivers a Manage tab to organize categories, phrases, and voices.
- Speak tab — category chips + a grid of large phrase buttons. Each phrase plays a bundled preset voice, a caregiver recording, or device text-to-speech.
- Manage tab — create/edit categories (icon, color, bilingual names) and phrases (bilingual labels, per-language voice), toggle any of them on/off, and reset presets back to their original content.
- Fully bilingual — every string, layout, and text field adapts to Arabic (RTL) and English (LTR). Switching language restarts the app to flip the native layout direction.
- Offline-first — all content and recordings live on the device (zustand + AsyncStorage). No account, no network needed.
Expo SDK 57 · React Native 0.86 · React 19.2 · TypeScript (strict) · expo-router · zustand · i18next · jest-expo · Maestro (e2e)
Requirements: Node 22+, Xcode 26.4+ (iOS), Android SDK 36 / JDK 17 (Android).
npm install
npm run ios # build + launch on the iOS simulator
npm run android # build + launch on an Android device/emulator
npm start # Metro only (attach an installed dev build)Run before every commit:
npm run guardmeThat chains guardme:clean-code (ESLint + tsc --noEmit), the jest suite
(npm test, tests in src/__tests__/), and guardme:docs
(scripts/verify_docs.py).
End-to-end flows (require a booted iOS simulator or connected Android device with the app installed and Metro running):
maestro test e2e/galta-smoke.yaml # bilingual smoke: EN → AR → EN
maestro test e2e/galta-design-check.yaml # design/RTL visual checkpointssrc/
app/ expo-router routes (index = Speak, manage = Manage)
audio/ playback, recording, preset-audio manifest
components/ UI (ui/app-button, themed-text, speak/, manage/)
constants/ theme tokens (colors, radii, shadows) + fonts/typography
hooks/ use-rtl, use-typography, use-language-font, use-theme
i18n/ en.ts / ar.ts string catalogs + language switching
lib/ rtl statics, app reload
store/ zustand store, types, preset seed data
assets/audio/ bundled preset voices (ar/en), generated by
scripts/generate-preset-audio.sh
e2e/ Maestro flows
Design-system rules and agent conventions live in AGENTS.md.
Android tester APK (debug-signed, standalone JS bundle):
cd android && ./gradlew assembleRelease
# → android/app/build/outputs/apk/release/app-release.apkEAS build profiles for store distribution are configured in eas.json.