Install and build
Development builds, EAS profiles, and native configuration.
You need a custom development build to run the mobile client. Expo Go cannot
load the native modules for mDNS (react-native-zeroconf) and WebRTC
(react-native-webrtc).
Prerequisites
- Node.js and pnpm (workspace install from the repo root).
- Android Studio / Xcode for local native builds, or an Expo account for EAS.
Environment
The Relay URL is not a build-time setting. The app asks for it on first launch,
stores it securely on the device, and exposes it under Settings → Server.
Remote URLs must use https://; cleartext is allowed only for localhost,
127.0.0.1, ::1, and the Android emulator alias 10.0.2.2.
The only optional environment variable is EXPO_PUBLIC_EAS_PROJECT_ID:
EXPO_PUBLIC_EAS_PROJECT_ID=your-eas-project-idRun locally
cd apps/mobile
npm start # expo start
npm run android # expo run:android
npm run ios # expo run:iosEAS profiles
eas.json defines three profiles:
| Profile | Purpose |
|---|---|
development | Dev client, internal distribution |
preview | Internal distribution, APK |
production | Store build, auto-increment version |
eas build --profile preview --platform androidInstall a release APK
Each mobile-vX.Y.Z tag runs the release-mobile workflow, which builds a
universal Android APK and attaches it to a GitHub Release. Download
nodus-mobile-vX.Y.Z.apk from
GitHub Releases, verify the
.sha256, enable Install unknown apps for your browser or file manager, and
open the APK.
The tag must match version in apps/mobile/app.json; the workflow rejects a
mismatch instead of producing an APK with the wrong version.
Release APKs are signed with the development keystore and are intended for sideloading. Store distribution needs a dedicated upload key and Play Console setup.
Native configuration
- The
android/project is generated by Expo CNG and gitignored; runexpo prebuild --platform androidafter changing native config. Minimum SDK is 24, with Hermes and the new architecture enabled. google-services.jsonis required for Firebase push and is injected fromGOOGLE_SERVICES_JSON_FILEviaapp.config.json EAS. The release workflow writes it from theGOOGLE_SERVICES_JSONrepository secret.- Two config plugins matter:
with-lan-cleartext(writes a network-security-config that permits cleartext only on loopback/private ranges) andwith-rnscreens-fragment-factory(required by React Navigation).