📱 Mobile
The LibrePhotos mobile app lives in apps/mobile/. It is an Expo (React Native, New Architecture) app for Android and iOS with an offline-first data model: a local SQLite mirror of the library, kept current by delta sync against the backend, plus camera-roll backup. The app README is the full developer guide, and the design documents are in plans/mobile-v2/.
🔨 Setup
You need Node.js 24, which is what CI uses.
The app is an npm workspace together with the shared API client in packages/api-client, so install once from the repository root. The root package-lock.json is the only lockfile:
npm ciat the repository rootcd apps/mobilenpx expo start --goand scan the QR code with Expo Go, or build a development build withnpx expo run:android/npx expo run:ios
The native android/ and ios/ folders are not committed. expo prebuild generates them from app.json.
✨ Code Standards
Every pull request that touches apps/mobile/, packages/ or the root package.json / package-lock.json runs typecheck, lint and the Jest suites in CI. Run the same checks locally before pushing:
npm run check --workspace apps/mobile
The shared API client has its own checks:
npm run test --workspace packages/api-client
🌐 Translations
English strings live in apps/mobile/src/i18n/locales/en.ts. Other languages fall back to English until translations are added.