PRIVATE ALPHAWindows 11 · Expo SDK 57 / React Native 0.86 · tested on two apps, one PC.Request access →
Same upload key as a build Google Play accepted

Your Expo Android release. Built, signed and checked on Windows.

A signed Android App Bundle, checked before you upload it to Google Play, built on your own Windows PC without the four Windows failures that eat an afternoon.

  • Source folder only read
  • No password on disk
  • Checked before you upload
Project folderonly read Isolated copyshort-path workspace BuildGradle · JDK 17 Signyour EAS upload key Verifybefore you upload .aabexported + manifest Play Consoleyou upload it Project folderonly read Isolated copyshort-path workspace BuildGradle · JDK 17 Signyour EAS upload key Verifybefore you upload .aabexported + manifest Play Consoleyou upload it

What happens when you run it

From your project folder to a signed, checked .aab.

Your project is copied into a short-path workspace and built there, never modified. Gradle runs under JDK 17, the bundle is signed with your EAS upload key and verify checks it before you upload to Play Console yourself.

The Windows gap

Four failures we hit for real. Each one now has a guardrail.

Hit while building real apps with WinBuild.

MAX_PATH

ninja: path too long

A 139-character workspace broke the native build.

Workspace of at most 40 characters, Gradle under a short root.

Read the fix →
'

An apostrophe in your user name breaks AAPT2

A Gradle home inside a long profile path with an apostrophe made AAPT2 fail.

A dedicated Gradle home outside your user profile.

Read the fix →
JDK 17

React Native Gradle plugins need Java 17

Often not the Java your machine runs Gradle with.

A full JDK 17 is selected and passed to Gradle, auto-download off.

Read the fix →
OOM

OutOfMemoryError: Metaspace after 45 minutes

FoosArena's first release build died in lintVitalAnalyzeRelease.

Up to 4 GB of heap and 1 GB of Metaspace in the dedicated Gradle home.

Read the fix →

One release path

Check. Build. Verify. Ship.

Each step has a written contract and stops with a clear error outside what it supports.

One command

PS> winbuild release --project <app> --workspace <new folder> --output <folder> `
    --workflow cng --allow-config-code --profile <eas profile> `
    --credentials <credentials.json> --abi store

winbuild release runs ten phases in order: plan, prepare, install, prebuild, dependencies, pin-wrapper, native, bundle, verify, export. It prints one line per phase with its elapsed time. Add --device-test for an optional device check.

If a phase stops, it prints the error code, the report path and the command to continue. Run the same command with --resume and it restarts from the first phase not completed.

01

Check

Java, the Android SDK and your project are inspected and a plan is written. Nothing runs yet.

doctor · plan

02

Build

A verified copy in a short-path workspace, npm ci without install scripts, Expo prebuild, then Gradle with JDK 17, signed with your EAS key.

prepare · install · prebuild · bundle

03

Verify

Hash, manifest, JAR signature, upload certificate, target SDK, 16 KB pages and ABIs: localPlayChecksPassed tells a valid AAB from one that passes the local Play checks.

verify

04

Ship

Atomic export with a JSON manifest, never overwritten. Optionally install and launch on a device or emulator.

export · device-test

Or run the nine steps one by one
doctor
project, Java, Android SDK and declared versions; dynamic config files are never executed.
plan
inventories and hashes your sources, checks paths and the EAS profile.
prepare
verified copy into a fresh short-path workspace.
install
npm ci with install scripts disabled.
prebuild
Expo generates android/ inside the workspace.
bundle
Gradle release bundle with JDK 17, signed with credentials.json or a keystore; EXPO_PUBLIC_* from the EAS profile; --abi store for arm64-v8a and armeabi-v7a only.
verify
the checks above, with a JSON report.
export
atomic copy of the verified AAB plus manifest.
device-test
official bundletool, pinned by SHA-256: install, launch, crash check.
diagnose
when something goes wrong, a JSON report without personal data that you can send us.

Evidence before adjectives

A real app, rebuilt from Windows.

FoosArena is an Expo app whose build 17 Google Play accepted. WinBuild rebuilt it on 19–20 October 2026 from a copy of the project.

Same certificateUpload certificate identical to build 17, which Google Play accepted. Same manifest, dex files and entries.
1,428 sBundle with --abi store on an idle PC, against 2,244 s with four ABIs: −36%.
No crashInstalled on an Android 36 emulator, main activity in the foreground after 8 seconds.
PowerShell · winbuild release on the repository fixture, 20 Oct 2026

Where the 30+ minutes go →What verify checks →Signing without passwords on disk →

Expo 57.0.30, React Native 0.86.3, 6 config plugins, EAS profile with 3 EXPO_PUBLIC_* variables. Repository only read. The terminal above is a different, smaller Expo 57 fixture from the WinBuild repository (one run, 20 October 2026, output condensed), not FoosArena. One Windows 11 PC, single measurements: your numbers will differ.

Signing

Your EAS upload key. No password on disk.

The keystore comes from your EAS credentials.json; passwords reach Gradle and keytool only as environment variables of their own process, never in arguments, gradle.properties or reports. After every build, even after an error or Ctrl+C, the workspace and Gradle home are scanned for them. On FoosArena: 40,220 files, no occurrence.

Choose the trade-off

Local control, cloud convenience, or community tooling?

The full comparison also says when not to choose WinBuild.

DecisionWinBuild private alphalocal-expo-buildEAS Build
Runs natively on WindowsYesYesBuild runs in cloud
Source stays on your PCYesYesNo
Windows path/worker guardrailsCore product focusGeneral local builderNot applicable
Checks the AAB for Play before uploadYes (verify)——
Hosted zero-setup buildsNoNoYes

Public positioning as of October 2026; “—” means not assessed. Verify before choosing.

Deliberately narrow alpha

What it supports today.

Tested in the alpha

  • Windows 11 x64 with Node.js 24
  • Expo SDK 57, React Native 0.86, CNG workflow, package-lock.json
  • Signed AAB with EAS credentials.json or your own keystore
  • verify, export with manifest, device-test on an emulator
  • Two projects, one PC: FoosArena and a minimal Expo 57 app

Not yet

  • A physical phone and a second PC
  • Windows 10 and other Expo SDK versions
  • Yarn, pnpm, monorepos, dynamic app.config.js
  • iOS, desktop GUI, CI runners, automated Play upload
  • Public release, licences and checkout

Help prove the general case

Have an Expo app that refuses to ship cleanly from Windows?

Ask for alpha access. Testers receive the package directly and help validate other machines, projects, native modules and signing setups.

Join the WinBuild beta list

No checkout yet · questions: hello@winbuild.dev

Clear answers

Before you try it.

Can I buy WinBuild today?

Not yet. Testers receive the package directly. Licences and checkout come with the public release.

Will it work on my Expo project?

Expo SDK 57 / React Native 0.86 CNG projects with package-lock.json are inside what the alpha tested: two projects, one PC. doctor and plan stop early with a clear reason otherwise.

Does my code or keystore leave the computer?

No. WinBuild uploads nothing and never modifies your project folder. Gradle downloads what the build needs, as in Android Studio.

Is this the same as EAS Build?

No. EAS Build is a managed cloud service. WinBuild runs the release build on your own Windows machine with the same EAS credentials and profile, and needs JDK 17 and the Android SDK.

What if the build stops halfway?

Run the same command with --resume. It continues from the first phase not completed, without repeating plan or prepare. We tried it on 20 October: after a Ctrl+C during bundle, and after a transient AAPT2 error. If you press Ctrl+C during install the workspace cannot be resumed: start again with a new workspace folder.