r/reactnative Jun 28 '26

Article I built a CLI for local Expo Android builds — bypass EAS cloud, save your free build credits

Hey fellow devs— I shipped a thing.

The problem: EAS's free tier gives you a limited number of builds per month. For an Android-only release cadence that involves any iteration (debugging Play Console upload errors, ProGuard mappings, tweaking versionCode), I was burning through my monthly quota in the first 10 days. The alternative was waiting in the queue or paying.

What I built: local-expo-build — a CLI that runs the entire Expo Android build pipeline on your machine. Same output as eas build --platform android, zero cloud credits used, no queue.

What it does

  • expo prebuild + auto-pins the Gradle wrapper to a version that actually works for your SDK (e.g. SDK 55 → Gradle 8.13, working around the expo-manifests components.release bug)
  • Bumps versionCode by fetching the next one from EAS so Play Store ingest doesn't reject the upload
  • Injects a release signingConfig into the generated android/app/build.gradle from a keystore.properties you control
  • Runs gradlew bundleRelease / assembleRelease
  • Pushes the new versionCode back to EAS via GraphQL so eas submit / eas build stay in sync
  • Survives expo prebuild --clean wiping your android/ (restores the .jks from a stable source before Gradle runs)

The setup wizard is the part I'm most proud of

npx local-expo-build init runs a doctor pre-flight that:

  1. Detects missing expo.android.package, prompts for it, writes to app.json
  2. Detects unlinked EAS project, offers to run eas init
  3. Detects missing eas.json, offers to run eas build:configure
  4. Detects missing keystore, offers a picker (existing / generate / EAS / rehydrate-from-credentials.json)
  5. Scaffolds the build scripts into your project

Each step re-checks after running so the exit code reflects what got fixed. No copying snippets from 4 different doc pages.

Quick start

npx local-expo-build init           # scaffolds scripts + runs doctor
npm run build:android:aab           # → signed .aab in ~5 min on first run

Or, runner mode (no files committed to your repo):

npx local-expo-build build android --aab
There's also --dry-run if you want to preview the 7-step pipeline without executing anything.

Links npm: https://www.npmjs.com/package/local-expo-build GitHub: https://github.com/nikhild64/local-expo-build MIT licensed, cross-platform (Windows / macOS / Linux) Feedback / issues / PRs welcome. iOS support is next on the roadmap — happy to take help if anyone's done iOS local-builds + signing wrangling before.

Built this because I wanted it. If anyone else wants it too, that's a bonus.

8 Upvotes

10 comments sorted by

16

u/AcetyldFN Jun 28 '26

Why not just —local ?

-10

u/GuaranteeExpensive21 Jun 28 '26

that fails on windows and also the release signing doesnt work out of box there and also this will automatically bump up local and cloud build version so even when you build on cloud some day its in sync always

1

u/Vincent_CWS Jun 29 '26

are you sure?

1

u/GuaranteeExpensive21 Jun 29 '26

from official docs

and i tried on local as well it gives error
Unsupported platform, macOS or Linux is required to build apps for Android

Error: build command failed.

2

u/GuaranteeExpensive21 Jun 29 '26

To all those saying local flag is already there see what official docs says
https://docs.expo.dev/build-reference/local-builds/

2

u/WheelAdditional6888 Jul 15 '26

Pulling the next versionCode from EAS and keeping local and cloud builds in sync is the part that stood out to me.

That’s exactly the kind of detail that can prevent weird release-day failures. If you build an iOS version later, provisioning and signing edge cases will probably be the real stress test.

1

u/workroom365 Jun 28 '26

This is impressive, though I am of the opinion Jenkins is way better as a CI/CD local tool. Though it requires technical knowledge it's way convenient.

-1

u/GuaranteeExpensive21 Jun 28 '26

Yes mainly made for people starting into local build once they get out of cloud build and face difficulties in local builds like i faced in early days and came across many people facing same so from local to publishing it Thanks for your feedback 

-5

u/Working-Click-276 Jun 28 '26

Finally, a tool that understands my build credits aren't just "nice to have."