Nodus
Mobile

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-id

Run locally

cd apps/mobile
npm start            # expo start
npm run android      # expo run:android
npm run ios          # expo run:ios

EAS profiles

eas.json defines three profiles:

ProfilePurpose
developmentDev client, internal distribution
previewInternal distribution, APK
productionStore build, auto-increment version
eas build --profile preview --platform android

Install 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; run expo prebuild --platform android after changing native config. Minimum SDK is 24, with Hermes and the new architecture enabled.
  • google-services.json is required for Firebase push and is injected from GOOGLE_SERVICES_JSON_FILE via app.config.js on EAS. The release workflow writes it from the GOOGLE_SERVICES_JSON repository secret.
  • Two config plugins matter: with-lan-cleartext (writes a network-security-config that permits cleartext only on loopback/private ranges) and with-rnscreens-fragment-factory (required by React Navigation).

On this page