Commit Graph
503 Commits
Author SHA1 Message Date
Gabriel Donadel Dall'Agnol 9cfc51e589 [cli][menu-bar] Put the Hermes CLI behind ORBIT_HERMES_CLI (off by default)
Without the flag the app builds exactly as before: React Native's stock Hermes,
React Native's own JSI and the pkg-built CLI binaries (Release builds only),
so main's Podfile.lock, pkg config, entitlements, EAS and e2e workflows are
unchanged.

pod install with ORBIT_HERMES_CLI=1 (or "hermesCli": "true" in
Podfile.properties.json) opts into Hermes V1 from hermes-node's pin, its JSI,
and the orbit-cli launcher + orbit-cli.hbc in every configuration (yarn
archive:hermes / codesign:hermes). pod install records the choice in
Pods/.orbit-hermes-cli for the build phases, and without the flag puts React
Native's JSI back.

The app bundles the CLI as Contents/Resources/cli/ either way and runs
cli/orbit-cli when present, otherwise the pkg binary for the architecture.
2026-11-14 16:18:03 -08:00
Gabriel Donadel Dall'Agnol 5991835739 [menu-bar] Vendor Hermes's JSI at pod install instead of patching it in
React Native has to compile against the JSI its Hermes was built with, and
react-native-macos 0.83 ships an older one. Instead of carrying the newer JSI
as a 4.3k-line patch-package diff, pod install copies it from the pinned Hermes
(the prebuilt tarballs now include it; the source fallback reads it from the
Hermes checkout) with scripts/vendor-jsi.sh. A jsi/hermes.h forwarding header
covers React Native still including the old name, so ReactInstance.cpp needs
no edit and patches/react-native-macos+0.83.0.patch is back to main's.

The copy can't drift from Hermes, and a build phase on React-jsi fails with
"run pod install" if a later yarn install restored React Native's own JSI.

Prebuilt key 52d8a44a42ecab19 is published.
2026-11-14 11:35:10 -08:00
Gabriel Donadel Dall'Agnol bdb6262fa7 [menu-bar] Download prebuilt Hermes and hermes-node instead of compiling them
scripts/build-hermes-prebuilt.sh builds hermes-engine pod tarballs (Debug with
the debugger, Release; universal, hermesc + headers, using RN macOS's own
configure_apple_framework) and the hermes-node embed library, keyed by a hash
of everything they're built from (pinned hermes-node, react-native-macos and
our patch, the build script). They're published as hermes-prebuilt-<key>
releases of gabrieldonadel/hermes-node, by the new Hermes prebuilts workflow.

pod install downloads and verifies them (scripts/hermes-prebuilt.sh) and points
HERMES_ENGINE_TARBALL_PATH at the Debug tarball; the Select Hermes flavor build
phase swaps in the Release framework for Release builds; hermes-node.sh build
uses the prebuilt embed library. Without a published prebuilt for the key,
everything falls back to building from source as before.

Also bump hermes-node to f1a9210 (fixes the embed library growing on rebuilds).
2026-11-14 07:24:28 -08:00
Gabriel Donadel fc7d34f6a9 [menu-bar] Bump hermes-node to 7a09d28 (OpenSSL-backed crypto hashes) 2026-11-14 04:00:13 -08:00
Gabriel Donadel 3a4bae8d69 [cli] Drop the fetch polyfill; ship bindings with the certificate addon
hermes-node now provides fetch/Headers/Request/Response and AbortSignal
globals like Node, so the CLI runs the same code on both. The
macos-export-certificate-and-key addon ships in its normal layout with
bindings and file-uri-to-path instead of a patched loader. Bump hermes-node
to 5c1c723.
2026-11-14 02:32:29 -08:00
Gabriel Donadel c157314143 [cli] Make ipa-resign load on Hermes; bundle with the esbuild API
ipa-resign is obfuscated with a self-defending check that regex-tests
Function.prototype.toString() and spins forever on Hermes, which returns
"[bytecode]", and it builds a dynamic-import helper with
new Function('u', 'return import(u)'), which Hermes can't compile. A bundler
plugin prepends Hermes's 'show source' directive and a module-local Function
that turns that one shape into a require()-based import.

Also resolve ipa-resign's directory from its main entry (its exports hide
package.json) and pin esbuild as a devDependency.
2026-11-13 15:52:35 -08:00
Gabriel Donadel ff33b9653d [cli][menu-bar] Ship the CLI as a Hermes launcher instead of pkg
- macos/scripts/hermes-node.sh fetches and builds a pinned hermes-node; the
  Podfile builds Hermes from the facebook/hermes commit it pins
  (RCT_HERMES_V1_ENABLED, REACT_NATIVE_OVERRIDE_HERMES_DIR) and checks that the
  JSI vendored into react-native-macos matches
- Regenerate the react-native-macos patch without rename detection: the
  hermes.h -> hermes-interfaces.h rename made patch-package fail on a clean
  install
- apps/cli yarn archive builds dist/: universal orbit-cli launcher,
  orbit-cli.hbc, the macos-export-certificate-and-key addon built for ARCHS
  without bindings, and ipa-resign's helpers; codesign signs every Mach-O
  with a timestamp. Drop pkg and the V8-only JIT entitlements
- Xcode's Build CLI phase (all configurations) builds it against the app's
  hermesvm.framework; the app bundles it as Contents/Resources/cli and runs
  cli/orbit-cli
- orbit shell-command recognizes the launcher (was process.pkg)
- Install node-fetch as global fetch when the runtime has none
- EAS: the CLI is built by the Xcode archive; install cmake/ninja. E2E: cache
  hermes-node, run on CLI changes
- Remove the in-process spike
2026-11-13 15:19:49 -08:00
Gabriel Donadel 806af15e22 [cli] Ignore the built launcher 2026-11-13 14:53:05 -08:00
Gabriel Donadel 81792ac0e4 [cli] Spike: run the launcher from a sibling orbit-cli.hbc built from the bundled CLI 2026-11-13 14:53:05 -08:00
Gabriel Donadel f6cbe2dd16 [cli] Spike: native orbit-cli launcher on hermes-node + the app's hermesvm.framework 2026-11-13 14:29:45 -08:00
Gabriel Donadel 384d5dee98 [menu-bar] Spike: run hermes-node inside the menu bar's Hermes runtime
Attach HermesNodeEmbedder to RN's runtime on init, drive its libuv loop
through RN's RuntimeScheduler, and expose __nodeRequire. The menu bar's JS
uses fs/os/child_process/https and runs the CLI's listDevicesAsync
in-process. Links /tmp/hn-embed-out/lib/libhermes-node-embed.a built by
hermes-node's utils/build-apple-embed-lib.sh (spike-only paths).
2026-11-13 14:10:16 -08:00
Gabriel Donadel 8f5bf4b537 [menu-bar] Spike: vendor Hermes static_h JSI into RN macOS 0.83, run stock static_h Hermes with Node-API 2026-11-13 13:30:03 -08:00
Gabriel Donadel 82d395f7cd [menu-bar] Spike: Node-API smoke test on RN's Hermes V1 runtime 2026-11-13 13:02:40 -08:00
Brent Vatne 2f428209cc [cli] Start remote sessions without a maximum duration (#395)
* [cli] Start remote sessions without a maximum duration

Orbit set a maximum duration of 30 minutes on each Expo Simulators session.
With no value, the session gets the maximum duration of the account's plan,
as it does from EAS CLI and expo.dev. --max-run-time still sets a shorter one.

* [cli] Add changelog entry for the session duration
2026-11-13 18:48:19 +01:00
Gabriel Donadel 68c7d89ca1 [appcast] Bump version to 2.9.0 2026-11-12 11:40:20 +00:00
3c4005c195 [menu-bar] Disable iOS re-signing on macOS too (#394)
Co-authored-by: expo-tuft[bot] <288127324+expo-tuft[bot]@users.noreply.github.com>
Co-authored-by: gabrieldonadel <[email protected]>
expo-orbit-v2.9.0
2026-11-12 11:50:00 +01:00
Gabriel Donadel 45ed1f2d97 [gh] Pin Linux build to ubuntu-24.04 to fix RPM packaging 2026-11-12 08:55:17 +00:00
Gabriel Donadel 00b52ac74d [menu-bar] Bump version to 2.9.0 2026-11-12 08:43:16 +00:00
0be7e6d218 [menu-bar] Disable iOS re-signing on Electron behind a feature flag (#392)
Co-authored-by: expo-tuft[bot] <288127324+expo-tuft[bot]@users.noreply.github.com>
Co-authored-by: gabrieldonadel <[email protected]>
2026-11-12 09:41:10 +01:00
Brent Vatne 1227cf4fca [cli][menu-bar] Add Expo Simulators as remote devices (#389)
Adds Expo Simulators sessions to Orbit as remote devices, and reworks the popover around accounts, projects and device actions.

- CLI: boot-device and install-and-launch accept an eas: device ID. New commands list-remote-simulators, list-remote-simulator-options, stop-remote-simulator and stop-device.
- Popover: an account row, a row of project tiles that can launch the latest app, a default device for each platform, buttons on device rows, and a Remote devices section with running and ended sessions and a default controller.
- Windows: New simulator session starts a session. The Settings pane Menu sets the sections, the order of devices and the hidden devices.
- Quit and log out ask first when sessions still run.
- Includes the fixes from the Windows and Linux tests (#391).
2026-11-11 22:23:33 -07:00
Mohith Gajjela 536c7c4b55 [eas-shared] Show Android devices connected with adb connect as Wi-Fi (#386)
* [eas-shared] Show Android devices connected with adb connect as Wi-Fi

getRunningDevicesAsync marked a device as Network only when its adb devices line contained "tcp", which is true for mDNS serials (._adb-tls-connect._tcp) but not for an ipAddress:port serial. Orbit's own Wi-Fi pairing connects with adb connect <ipAddress:port>, so those devices were reported as USB and the menu bar showed the cable icon. Classify by the serial instead and add tests for USB, IPv4, IPv6 and mDNS serials.

* Add changelog entry
2026-11-10 15:49:05 +01:00
01960452b6 [menu-bar] Fix deep links being opened as files on Windows and Linux (#384)
* [menu-bar] Fix deep links being opened as files on Windows and Linux

Co-authored-by: gabrieldonadel <[email protected]>

* Add PR number to changelog

Co-authored-by: gabrieldonadel <[email protected]>

---------

Co-authored-by: expo-tuft[bot] <288127324+expo-tuft[bot]@users.noreply.github.com>
Co-authored-by: gabrieldonadel <[email protected]>
2026-10-20 21:23:25 +02:00
Gabriel Donadel Dall'AgnolandTomasz Sapeta 254a395b30 [cli][menu-bar] Add option to install the orbit command in PATH (#381)
* [cli][menu-bar] Add option to install the orbit command in PATH

* Apply batched suggestions from code review

Co-authored-by: Tomasz Sapeta <[email protected]>

* [cli][menu-bar] Address review feedback on the orbit shell command

* Bump ipa-resign to 0.0.20

---------

Co-authored-by: Tomasz Sapeta <[email protected]>
2026-10-14 23:44:25 +02:00
Gabriel Donadel Dall'Agnol 27cd3ba286 [cli][menu-bar] Auto-renew resigned apps every 7 days (#378)
* [cli][menu-bar] Auto-renew resigned apps every 7 days

Free Apple ID provisioning profiles expire after 7 days, so a resigned build
stops opening weekly. Track each resigned app and re-sign it automatically
before it expires; also add the App ID quota tooling repeated signing needs.

- Record store (ResignedApps): every resign is saved with its device, Apple
  ID, managed original/resigned ipa copies, and profile expiry. The CLI gains
  --managed-dir (keep a durable copy of the original ipa) and a
  cleanup-resigned-apps command.
- Renewal engine (useResignedAppRenewals, mounted in Core): re-signs records
  due within 48h on app start, a 6-hour tick, popover focus, and after
  sign-in; installs the renewed build when the device is connected, else on
  reconnect. A popover attention row prompts re-auth when the session expired.
- Settings "Resigned apps" section: expiry countdowns, per-app and global
  auto-renew toggles, Renew now / Remove; DebugMenu dev actions.
- App ID management: list-app-ids / delete-app-id CLI, the "Manage Apple App
  IDs" window, and the resign quota-recovery flow that opens it when the
  10-App-IDs-per-7-days limit is hit.

Stacked on the base re-signing PR.

* [cli][menu-bar][eas-shared] Add 'Keep me signed 'in and app icons for resigned apps

* [cli][menu-bar][eas-shared] Handle the free Apple ID three-app limit and show a placeholder icon

* Bump ipa-resign to 0.0.18

* [cli][menu-bar][eas-shared] Check the free Apple ID app limit before installing and show app names

* [cli][menu-bar] Address review feedback on resigned app renewals
2026-10-13 20:40:24 +02:00
Krystof WoldrichandClaude Opus 5.5 50036fa09d [eas-shared] Accept devicectl JSON version 5 (#380)
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-12 19:12:09 +02:00
Gabriel Donadel Dall'Agnol f670bc132a [cli][menu-bar] Add iOS re-signing with a free Apple ID (#377)
* [cli][menu-bar] Add iOS re-signing with a free Apple ID

Re-sign an installed build that fails code-signing so it runs on a personal
device, using a free Apple ID. When an install fails with
APPLE_APP_VERIFICATION_FAILED, Orbit offers to re-sign and install.

- CLI: `resign-ipa` and `apple-id-auth` (sign-in / verify-2fa with SMS
  fallback / sign-out) commands, driven by ipa-resign.
- Menu-bar: the resign offer + determinate progress in the popover, an Apple
  ID sign-in window (6-digit 2FA input, resend, SMS fallback), error-copy
  mapping, first-install "Untrusted Developer" trust instructions, and an
  Apple ID section in Settings (signed-in state + sign out).
- Session expiry is treated as an automatic logout: the stored Apple ID is
  forgotten and every "signed in as" surface updates, with one-tap re-auth.
- Electron/macOS wiring for the ipa-resign native anisette + zsign helpers,
  transient-env-var plumbing to pass the password to the CLI, and the
  APPLE_APP_VERIFICATION_FAILED mapping that triggers the offer.

[email protected].

* [menu-bar] Fix Electron CI: ensure extraResource dirs exist; drop useless return

- forge.config: create ./bin and ./anisette in the generateAssets hook so
  packaging (and Electron E2E, which runs 'yarn package' without
  'build:helpers') does not fail with ENOENT on the missing extraResource
  dirs. build:helpers still populates them for real builds.
- build-helpers: remove a no-useless-return that failed eslint --max-warnings 0.

* Bump ipa-resign to 0.0.13

* Fix CLI error handling

* Update AppleID auth UI

* Fix Apple ID persistance

* Fix Apple connection lost

* Fix opening settings menu

* Support paid developer accounts in resign copy and show the install step

* Detect builds that need resigning before attempting the install

* Add changelog entry
2026-10-08 20:29:13 +02:00
Gabriel Donadel Dall'Agnol 240c6259f7 [menu-bar] Update Settings design (#376)
* [menu-bar] Update Settings design

* Add changelog entry
2026-10-06 17:16:04 +02:00
Gabriel Donadel Dall'Agnol 0486b9634a [menu-bar][macOS] Use @expo/ui for checkboxes and progress bar (#374)
* [menu-bar][macOS] Use @expo/ui for the settings checkboxes and build progress bar

* [menu-bar][macOS] remove local modules

* [e2e] Skip renderer screenshot when the window is hidden

* Add changelog entry

* [e2e] Add main-process and chromedriver diagnostics for the Linux hang

* [e2e] Capture main-process stacks and Xvfb state on Linux failures
2026-10-05 16:17:27 +02:00
Gabriel Donadel Dall'Agnol ecd73bdf1e [eas-shared][macOS] Ignore simulators listed by devicectl (#375) 2026-10-03 11:35:30 -03:00
Gabriel Donadel Dall'Agnol 6277140813 [menu-bar] Upgrade React Native to 0.83.0 and Expo SDK 58 (#373)
* [menu-bar] Upgrade React Native to 0.83.0 and Expo SDK 58

* Address PR comments

* Fix ThemeProvider types

* Fix e2e
2026-10-02 20:54:27 +02:00
Gabriel Donadel Dall'Agnol 4882662739 [menu-bar] Add workflow to publish releases to WinGet (#370) 2026-08-21 19:24:41 +02:00
Gabriel Donadel Dall'Agnol dfb71f6dcf [gh] Sign Windows builds with Azure Trusted Signing (#368)
* [gh] Sign Windows builds with Azure Trusted Signing

* [gh] Rename deprecated trusted-signing-account-name input

* [electron] Set Windows version metadata to 650 Industries
2026-08-20 21:46:55 +02:00
Gabriel Donadel Dall'Agnol 2739d85015 [gh] Automate macOS build upload and attach artifacts to the draft release incrementally (#367) 2026-08-18 20:58:14 +02:00
Gabriel Donadel ab6b231efc [appcast] Bump version to 2.8.1 2026-08-17 19:15:33 -03:00
Gabriel Donadel da406db21a [menu-bar] Bump version to 2.8.1 expo-orbit-v2.8.1 2026-08-17 18:36:35 -03:00
Yuri ChukhlibandGabriel Donadel 2936fb1540 [eas-shared] Fix NO_RESOURCES retry counter and open-file slot leak in AFCClient (#366)
* [eas-shared] Fix NO_RESOURCES retry counter and open-file slot leak in AFCClient

The NO_RESOURCES retry in uploadDirectory recursed with `uploadFile(tries++)`,
which passes the pre-increment value, so `tries` stayed 0 on every recursion
and a persistent NO_RESOURCES retried the same file forever instead of giving
up after 10 attempts. Pass `tries + 1` instead.

The retry path also never released the upload's numOpenFiles slot before
re-entering, so every retry leaked one slot against the MAX_OPEN_FILES (240)
cap and permanently reduced upload concurrency. Release the slot before the
recursive call; the call re-acquires it, so the accounting stays neutral.

Exhausted retries still reject and abort the directory upload, as before.

* Add changelog entry

---------

Co-authored-by: Gabriel Donadel <[email protected]>
2026-08-17 22:01:16 +02:00
amir-rezaeiandferkans-amir 0e3f0c65d7 [docs] Fix heading capitalization and grammar in CONTRIBUTING.md (#360)
Co-authored-by: ferkans-amir <[email protected]>
2026-08-12 20:55:04 +02:00
Yuri ChukhlibandGabriel Donadel Dall'Agnol 6ba3b3486b [eas-shared] Fix ENAMETOOLONG when installing builds from long URLs (#365)
* [eas-shared] Fix ENAMETOOLONG crash when installing builds served via long signed URLs (#365)

* Fix import order

---------

Co-authored-by: Gabriel Donadel Dall'Agnol <[email protected]>
2026-08-12 20:50:55 +02:00
Yuri ChukhlibandGabriel Donadel Dall'Agnol 3d894099bf [eas-shared] Fix installing Android .apk builds distributed via signed URLs (#364) (#364)
Co-authored-by: Gabriel Donadel Dall'Agnol <[email protected]>
2026-08-12 18:49:30 +02:00
Yuri Chukhlib 11eec0f51f [eas-shared] Recognize the lowercase ~/Android/sdk Android SDK path on Linux (#362) (#362) 2026-08-12 18:44:44 +02:00
caacff536a [eas-shared] Fix formatBytes returning wrong values for sizes >= 102.4 GB (#363)
* [eas-shared] Fix formatBytes for sizes of at least 102.4 GB

The final GB fallback tier divided by a literal 1024 instead of by the
accumulated multiplier (1024**3), so the result was short by 1024**2.
formatBytes(200 * 1024**3) returned "209715200 GB" instead of "200 GB".
Divide by multiplier, mirroring the MB fallback one tier up. Adds a
table-driven jest regression test covering every tier.

Co-Authored-By: Claude <[email protected]>

* Update CHANGELOG.md

---------

Co-authored-by: Claude <[email protected]>
Co-authored-by: Gabriel Donadel Dall'Agnol <[email protected]>
2026-08-09 19:01:21 +02:00
Tomek Czajecki b470fedd8e [cli][menu-bar] Remove deprecated GraphQL field usage (#359)
* [cli][menu-bar] Remove deprecated GraphQL field usage

* Add CHANGELOG entry
2026-07-16 16:47:37 +02:00
Gabriel Donadel Dall'Agnol e19bb70e8d [menu-bar][electron] Fix Android code pairing input width (#357)
* [menu-bar][electron] Fix Android code pairing input width

* Add changelog entry
2026-06-28 21:42:50 +02:00
Gabriel Donadel 3b0dd6bea3 [appcast] Bump version to 2.8.0 2026-06-24 17:16:41 -03:00
Gabriel Donadel Dall'Agnol f5485b5424 [gh] Disable rpm binary stripping to fix Linux (#353) 2026-06-24 22:10:42 +02:00
Gabriel Donadel ab42bf3180 [gh] Pin Linux build to ubuntu-22.04 to fix rpm packaging 2026-06-24 15:18:48 -03:00
Gabriel Donadel 4d96b33e74 [menu-bar] Bump version to 2.8.0 expo-orbit-v2.8.0 2026-06-24 14:56:14 -03:00
Gabriel Donadel Dall'Agnol 729875e45f [eas-shared] Cross-platform iOS device install fixes (#352)
* [eas-shared] Cross-platform iOS device install fixes

- xcrun: detect iOS 17+ devicectl "device locked" wording (CoreDeviceError 10003)
- devicectl: skip xcrun probe on non-darwin
- download: windowsHide tar spawn to stop console flash on Windows

* [eas-shared] Cross-platform iOS device install fixes

- xcrun: detect iOS 17+ devicectl "device locked" wording (CoreDeviceError 10003)
- devicectl: skip xcrun probe on non-darwin
- download: windowsHide tar spawn to stop console flash on Windows

* Add changelog entry

* Always show android section

* Drop aapt requirement for Android

* update changelog
2026-06-24 19:55:25 +02:00
Gabriel Donadel Dall'AgnolandClaude 51a4b2d4bc [menu-bar][cli] Add Wi-Fi pairing support for Android devices (#350)
* [orbit] Add Wi-Fi pairing support for Android devices

Add the ability to pair and connect a physical Android device over Wi-Fi
using ADB wireless debugging pairing codes.

- eas-shared: add pairAndroidDeviceAsync / connectAndroidDeviceAsync ADB helpers
- common-types: add PairAndroidDeviceResult command type
- cli: add `pair-android-device` command (pairing address, code, optional connect address)
- menu-bar: add command wrapper and a "Pair Android Device" section in Settings

https://claude.ai/code/session_01QFVnqBsSN9GoNBed9rAzMV

* [orbit] Add QR code pairing for Android devices over Wi-Fi

Support Android's "Pair device with QR code" wireless debugging flow:
the app generates a QR code, the device scans it and advertises an mDNS
pairing service, which is discovered via `adb mdns services` to pair and
connect automatically.

- eas-shared: add getAdbMdnsServicesAsync / waitForAdbMdnsServiceAsync helpers
- cli: add `pair-android-device-qr` command that waits for the scan, pairs, and connects
- menu-bar: add QRCode component (qrcode-generator + react-native-svg) and a
  QR code mode in the Settings pairing form

https://claude.ai/code/session_01QFVnqBsSN9GoNBed9rAzMV

* [cli] improve paring with code

* [menu-bar] Move PairAndroidDevice to a sepate window

* Polish UI

* Add changelog entry

* Unify pair-android-device commands

---------

Co-authored-by: Claude <[email protected]>
2026-06-24 03:32:24 +02:00
Gabriel Donadel Dall'Agnol ac1b896ed3 [menu-bar] Upgrade to expo SDK 56 (#346)
* [menu-bar] Upgrade to expo SDK 56

* [menu-bar] Use outOfTreePlatforms experiment

* [menu-bar] Add expo-clipboard and expo-symbols

* [menu-bar] Replace SystemIconViewModule with expo-symbols

* [eas-shared] Bump TS to 6.0

* Fix release builds

* Set unstable_transformProfile to hermes-v0

* Add changelog entry
2026-06-23 19:55:00 +02:00