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 →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.
What happens when you run it
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
Hit while building real apps with WinBuild.
A 139-character workspace broke the native build.
Workspace of at most 40 characters, Gradle under a short root.
Read the fix →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 →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 →OutOfMemoryError: Metaspace after 45 minutesFoosArena'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
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.
Java, the Android SDK and your project are inspected and a plan is written. Nothing runs yet.
doctor · plan
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
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
Atomic export with a JSON manifest, never overwritten. Optionally install and launch on a device or emulator.
export · device-test
npm ci with install scripts disabled.android/ inside the workspace.credentials.json or a keystore; EXPO_PUBLIC_* from the EAS profile; --abi store for arm64-v8a and armeabi-v7a only.Evidence before adjectives
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.
--abi store on an idle PC, against 2,244 s with four ABIs: −36%.PS> winbuild release --project .\fixture --workspace C:\wbg\rf1 --output C:\wbg\out --workflow cng --allow-config-code --abi store …
✓ [ 1/10] plan 0:00 · [ 2/10] prepare 0:00
✓ [ 3/10] install 1:57 · [ 4/10] prebuild 0:05
✓ [ 5/10] dependencies 0:00 · [ 6/10] pin-wrapper 0:01 · [ 7/10] native 0:00
✓ [ 8/10] bundle 10:26 · signed with the fixture test keystore
✓ [ 9/10] verify 0:02 · localPlayChecksPassed: true
✓ [10/10] export 0:00
Release completed in 12:31 · acceptance is decided by Play Console
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
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
The full comparison also says when not to choose WinBuild.
| Decision | WinBuild private alpha | local-expo-build | EAS Build |
|---|---|---|---|
| Runs natively on Windows | Yes | Yes | Build runs in cloud |
| Source stays on your PC | Yes | Yes | No |
| Windows path/worker guardrails | Core product focus | General local builder | Not applicable |
| Checks the AAB for Play before upload | Yes (verify) | — | — |
| Hosted zero-setup builds | No | No | Yes |
Public positioning as of October 2026; “—” means not assessed. Verify before choosing.
Deliberately narrow alpha
package-lock.jsoncredentials.json or your own keystoreapp.config.jsHelp prove the general case
Ask for alpha access. Testers receive the package directly and help validate other machines, projects, native modules and signing setups.
Clear answers
Not yet. Testers receive the package directly. Licences and checkout come with the public release.
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.
No. WinBuild uploads nothing and never modifies your project folder. Gradle downloads what the build needs, as in Android Studio.
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.
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.