Skip to content

Device testing: link the app to an EAS project so CI produces installable builds (today every EAS run skips) #183

Open

Description

@hotlong

Context

Nothing that landed in 2.0 has run on a device yet:

The seat post #160 also records "Native rebuild owed": expo-camera, the cookie-manager module and modules/managed-config have never been compiled.

Measured on main at ddcf2d5:

  • CI builds nothing. Every EAS Build and EAS Update run on main finishes in 6–17 s, for example run 41569850272. Each step is gated on env.EXPO_TOKEN != '', so the runs are green but empty: the EXPO_TOKEN secret is not set.
  • The app is not linked to an EAS project. app.config.ts has no extra.eas.projectId, no owner, no updates.url and no runtimeVersion. So eas build would prompt to create a project, and eas update cannot publish. The slug is objectos-mobile (Rebrand the app to ObjectOS: app name, URL scheme objectos, bundle id / package ai.objectos.mobile #151).
  • The preview profile pre-fills a stale server. eas.json build.preview.env.EXPO_PUBLIC_DEFAULT_SERVER_URL is https://staging.objectstack.com.

Ask

Maintainer only (needs the Expo account; a seat cannot do it):

  1. In the Expo account or organization that should own the app, run eas init once in this repo. That creates the objectos-mobile project and prints its projectId.
  2. Add a GitHub Actions secret EXPO_TOKEN: an Expo robot or personal access token for that account.
  3. For iOS device builds: an Apple Developer team, and eas credentials (or let eas build manage them). For Android, EAS generates the keystore.

Code (seat, one PR after step 1):

  1. Write the printed projectId and owner into app.config.ts.
  2. Add updates.url (https://u.expo.dev/<projectId>) and runtimeVersion: { policy: "fingerprint" }. An OTA update must never reach a binary whose native modules differ; the fingerprint policy guarantees that.
  3. Change the preview profile's EXPO_PUBLIC_DEFAULT_SERVER_URL to "", or to the staging environment the maintainer names.
  4. Add a preview channel, plus development-device (a development client with ios.simulator: false), so a phone can install a dev build.
  5. Update docs/DEVICE-TESTING.md with the install paths:
    • Android: the APK link or QR from EAS;
    • iOS: register the device with eas device:create, then an internal-distribution build.

Then add a short smoke checklist per landed card, built from each card's manual check.

Acceptance

  • A push to main (or a manual workflow_dispatch with profile preview) produces an installable Android build and an iOS build on EAS. The run logs show the build steps executing, not skipped.
  • docs/DEVICE-TESTING.md lets someone with only a phone install the preview build and connect to a server.

Note: once EXPO_TOKEN is set, every merge to main starts real EAS builds and an OTA publish. That is the "publishes on merge" condition in the lane charter, and the seat's landing guard (#160) then hands merges back to the maintainer.

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    on Nov 3, 2026
  2. self-assigned this
    on Nov 3, 2026
  3. hotlong commented on Nov 3, 2026

    @hotlong
    ContributorAuthor

    The code part is in #185. This card stays open until EXPO_TOKEN is set and a real EAS build runs, as its acceptance asks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions