Xyvenra docs

Xyvenra Mobile

Try an Expo starter in the interactive phone preview, save account drafts, and download an EAS-ready project ZIP.

Available today

Open /app/mobile. The in-app preview and ZIP download work in the signed-in workspace. A platform key can create a starter draft, list it, store env vars, and export the Expo project ZIP. Creating or exporting a starter does not start a build.

Build in your own GitHub account

The project ZIP includes seventeen optional GitHub Actions workflows. Push the project to a repository you own and start them from the Actions tab. They never run on push. GitHub bills the Ubuntu or macOS runner in your account; Xyvenra does not run these builds, receive their artifacts, or pay for them.

  • xyvenra-android-apk.yml builds a test-signed Android APK for your own devices. It is debug-signed, so Google Play will not accept it.
  • xyvenra-android-aab.yml builds a release Android App Bundle signed with your own upload key, read from four repository secrets: ANDROID_KEYSTORE_BASE64, ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS, and ANDROID_KEY_PASSWORD. This is the file you upload to Google Play. You create and keep the key; Xyvenra never holds it.
  • xyvenra-android-play-upload.yml builds that same signed App Bundle, then uploads it as a draft on the internal testing track in your own Google Play Console, using a PLAY_SERVICE_ACCOUNT_JSON repository secret. Testers do not receive the build until you complete the release in Play Console. It does not roll out to production, and a draft upload does not by itself satisfy Play production or closed-test requirements. You keep the service-account JSON; Xyvenra never holds it.
  • xyvenra-ios-simulator.yml builds an unsigned iOS Simulator app. It cannot be installed on an iPhone.
  • xyvenra-eas-build.yml starts an EAS cloud build with your own EXPO_TOKEN repository secret. In your GitHub repo, run the EAS workflow with your own Expo token; Expo bills your Expo account. The job runs on Ubuntu. Expo compiles a store-signed iPhone IPA on Expo’s servers when you choose platform ios and the production profile, so this does not need a macOS GitHub runner. Download the IPA from the Expo build URL in the job log. The workflow does not submit to the stores, and Xyvenra does not receive the binary.
  • xyvenra-eas-submit-testflight.yml submits a finished store-signed iOS production IPA to TestFlight in your own App Store Connect account, using official eas submit --non-interactive on Ubuntu. Required repository secrets are EXPO_TOKEN, ASC_API_KEY_ID, ASC_API_KEY_ISSUER_ID, ASC_API_KEY_P8, and ASC_APP_ID. You create the first App Store Connect listing yourself. The job does not submit the app for App Store review; a TestFlight upload is not an App Store release. Building does not submit. The run stops if a secret is missing or invalid, the project is not linked, or there is no suitable production IPA. You keep the API key; Xyvenra never holds it and does not upload or pay for the submit.
  • xyvenra-eas-update.yml publishes a JavaScript and asset update to a channel in your own Expo account, using official eas update --non-interactive on Ubuntu. The required repository secret is EXPO_TOKEN. Choose channel (development, preview, or production); the input does not default to production. A required message describes the update. An OTA update cannot add native code or native dependencies. Publish only to a channel already installed by your users' builds. The job does not run eas update:configure, and it does not submit to the App Store or Google Play. Building or submitting does not publish an update. The run stops if the token is missing, the channel is missing or invalid, the message is empty, the project is not linked, or EAS Update is not already configured. Expo bills your Expo account; Xyvenra does not run, receive, or pay for the update.
  • xyvenra-eas-update-rollback.yml republishes a previous update by group ID, or rolls clients back to the update embedded in the build, using official eas update:republish --group --non-interactive or eas update:roll-back-to-embedded --non-interactive on Ubuntu. The required repository secret is EXPO_TOKEN. Choose action (republish or roll-back-to-embedded). Republish requires a group_id. Roll-back-to-embedded requires channel (development, preview, or production) and a runtime_version; the channel input does not default to production. The job does not run the interactive eas update:rollback guide or eas update:republish --branch without a group. It does not publish a new JavaScript bundle from the current commit, and it does not run eas update:configure or submit to the App Store or Google Play. Users who already downloaded a bad update keep running it until they can download the rollback. A rollback cannot add native code. The run stops if the token is missing, the action or a required input is missing or invalid, the project is not linked, or EAS Update is not already configured. Expo bills your Expo account; Xyvenra does not run, receive, or pay for the rollback.
  • xyvenra-eas-channel-pause.yml pauses or resumes an existing EAS Update channel in your own Expo account, using official eas channel:view --non-interactive to confirm the channel already exists, then official eas channel:pause --non-interactive or eas channel:resume --non-interactive on Ubuntu. The required repository secret is EXPO_TOKEN. Choose action (pause or resume) and channel (development, preview, or production); the channel input does not default to production. Pausing keeps clients on the update they already have and prevents new updates. Resuming starts serving updates again. This is not a rollback and does not publish a new JavaScript bundle from the current commit. The job does not run eas channel:create, eas update:configure, or the interactive channel picker, and it does not submit to the App Store or Google Play. The run stops if the token is missing, the action or channel is missing or invalid, the project is not linked, EAS Update is not already configured, or the named channel does not already exist. Expo bills your Expo account; Xyvenra does not run, receive, or pay for the pause or resume.
  • xyvenra-eas-update-rollout.yml starts, edits, or reverts a per-update EAS Update rollout in your own Expo account, using official eas update --channel --message --environment --rollout-percentage --non-interactive to start a JavaScript and asset update from the current commit for a required percentage of users, official eas update:edit --rollout-percentage --non-interactive to adjust or finish an existing rollout (100 finishes it), or official eas update:revert-update-rollout --group --non-interactive to restore the control update, on Ubuntu. The required repository secret is EXPO_TOKEN. Choose action (start, edit, or revert). Start requires channel (development, preview, or production), a required message, and a required rollout_percentage from 1 to 100; the channel input does not default to production. Edit requires a group_id and percentage. Revert requires a group_id. A rollout only affects JavaScript and assets already publishable by EAS Update; it cannot add native code. This workflow does not treat an empty percentage as a full 100% publish. The job does not run the interactive pickers, branch-based eas channel:rollout, eas update:configure, or eas channel:create, and it does not submit to the App Store or Google Play. Building, TestFlight submit, channel pause or resume, and the existing EAS Update publish or rollback workflows do not start a rollout. The run stops if the token is missing, the action or a required input is missing or invalid, the project is not linked, or EAS Update is not already configured. Expo bills your Expo account; Xyvenra does not run, receive, or pay for the rollout.
  • xyvenra-eas-release-preflight.yml checks that the project is ready to build or submit later in your own Expo account, without starting a paid build, submit, or publish. It uses official eas whoami, official eas project:info, official eas config --platform --profile --non-interactive, and pinned npx expo-doctor@1.21.8 on Ubuntu. The required repository secret is EXPO_TOKEN. Choose platform (android, ios, or all) and profile (development, preview, production, or ios-simulator). The platform input does not default to a production submit or a production publish, and the profile input does not default to production. Optionally turn on check_updates to also fail closed if EAS Update is not already configured; this job does not run eas update:configure. Official eas credentials has no --non-interactive flag, so this job does not invent a credentials probe and cannot finish Expo's interactive credentials wizard; add Apple credentials in your own Expo account before the first store-signed iOS cloud build. Building, TestFlight submit, EAS Update publish, rollback, channel pause or resume, and rollout do not start this preflight, and this preflight does not start those jobs. The run stops if the token, platform, or profile is missing or invalid, or the project is not linked. Expo bills your Expo account if you later start a build or update; Xyvenra does not run, receive, or pay for this preflight.
  • xyvenra-eas-build-status.yml lists, views, downloads a finished simulator or emulator artifact, or cancels an EAS cloud build in your own Expo account, without starting a new build. It uses official eas build:list --non-interactive, official eas build:view with optional official --json (official help does not list --non-interactive, so this job does not invent one), official eas build:download --build-id --non-interactive, and official eas build:cancel --non-interactive on Ubuntu. The required repository secret is EXPO_TOKEN. Choose action (list, view, download, or cancel). The action input defaults to list and does not default to cancel. View, download, and cancel require a build_id. Official eas build:download is for simulator or emulator builds only; store-signed iOS IPAs stay on Expo, and Play AABs use the existing Play draft-upload workflow. A successful download is attached as a GitHub Actions artifact in your repository. Cancel only cancels the named build in your Expo account and may stop an in-progress build you already started. Building, TestFlight submit, Play upload, EAS Update publish, rollback, channel pause or resume, rollout, and preflight do not start this job, and this job does not start those. The run stops if the token is missing, the action is missing or invalid, a required build ID is missing, or the project is not linked. Expo bills your Expo account; Xyvenra does not run, receive, or pay for this job.
  • xyvenra-eas-fingerprint.yml generates or compares EAS fingerprints in your own Expo account, without starting a paid EAS build. It uses official eas fingerprint:generate --non-interactive and official eas fingerprint:compare --non-interactive on Ubuntu. The required repository secret is EXPO_TOKEN. Choose action (generate or compare). The action input defaults to generate and does not default to an untargeted compare. Generate requires platform (android or ios); this job does not invent a platform or environment default, especially not production. Official --environment and --build-profile are mutually exclusive on generate. Compare requires a documented official target combination and never passes --open. Official --environment on compare is only for a comparison against the local project. A matching fingerprint may mean the native layer is unchanged, so you may be able to reuse an existing native build and publish a JavaScript update instead. This job does not decide that for you. Building, TestFlight submit, Play upload, EAS Update publish, rollback, channel pause or resume, rollout, preflight, and build status do not start this job, and this job does not start those. The run stops if the token is missing, the action is missing or invalid, a required generate platform is missing, compare has no documented targets, a combination is invalid, or the project is not linked. Expo bills your Expo account; Xyvenra does not run, receive, or pay for this job.
  • xyvenra-eas-update-status.yml lists, views, or inspects insights for published EAS Updates in your own Expo account, without publishing, rolling back, editing, or deleting an update. It uses official eas update:list --non-interactive, official eas update:view with optional official --insights, --days, --start, --end, and --json (official help does not list --non-interactive, so this job does not invent one), and official eas update:insights --non-interactive on Ubuntu. The required repository secret is EXPO_TOKEN. Choose action (list, view, or insights). The action input defaults to list and does not default to delete or to an untargeted view or insights. List requires official branch or official all, which are mutually exclusive. This job does not invent a default branch or channel, especially not production. View and insights require a group_id. Official --days defaults to 7 when used with insights and the flag is omitted, and is mutually exclusive with --start/--end. Official insights platform is ios or android only. Building, TestFlight submit, Play upload, EAS Update publish, rollback, channel pause or resume, rollout, preflight, build status, and fingerprint do not start this job, and this job does not start those. The run stops if the token is missing, the action is missing or invalid, list is missing a required branch or all flag, a required group ID is missing, an optional filter is invalid, or the project is not linked. Expo bills your Expo account; Xyvenra does not run, receive, or pay for this job.
  • xyvenra-eas-submit-status.yml lists, views, or cancels EAS submissions in your own Expo account, without starting or retrying a submit. It uses official eas submit:list --non-interactive, official eas submit:view with optional official --json (official help does not list --non-interactive, so this job does not invent one), and official eas submit:cancel --non-interactive on Ubuntu. The required repository secret is EXPO_TOKEN. Choose action (list, view, or cancel). The action input defaults to list and does not default to cancel or to an untargeted view. View and cancel require a submission_id. Official --platform on view or cancel is only for when a submission ID is omitted; this job requires a submission ID for those actions and does not pass --platform with one. This job does not invent a platform default. This job does not start eas submit or eas build:submit, and it does not run eas submit:retry or eas submit:status. Official eas submit:status --profile defaults to production and needs an App Store Connect API key from the submit profile. Cancel only cancels the named submission in your Expo account and may stop an in-progress submit you already started. Building, TestFlight submit, Play upload, EAS Update publish, rollback, channel pause or resume, rollout, preflight, build status, fingerprint, and Update status do not start this job, and this job does not start those. The run stops if the token is missing, the action is missing or invalid, a required submission ID is missing, an optional list filter is invalid, or the project is not linked. Expo bills your Expo account; Xyvenra does not run, receive, or pay for this job. This is not a hosted Xyvenra service.
  • xyvenra-eas-channel-status.yml lists, views, or inspects insights for EAS Update channels in your own Expo account, without creating, editing, pausing, resuming, protecting, rolling out, or deleting a channel. It uses official eas channel:list --non-interactive, official eas channel:view [NAME] --non-interactive with optional official --offset, --limit, and --json, and official eas channel:insights --channel --runtime-version --non-interactive with optional official --days, --start, --end, and --json on Ubuntu. Official help lists --non-interactive on view, so this job always passes it. The required repository secret is EXPO_TOKEN. Choose action (list, view, or insights). The action input defaults to list and does not default to an untargeted view or insights. View and insights require a channel name; this job does not invent a default channel, especially not production. Insights also requires a runtime_version. Official list --limit defaults to 10 and is capped at 25. Official view --limit defaults to 50 and is capped at 100. Official --days defaults to 7 when omitted and is mutually exclusive with --start/--end. Official help does not list --environment on eas channel:insights, so this job does not invent one. This job does not start eas channel:create, eas channel:delete, eas channel:edit, eas channel:protect, eas channel:unprotect, branch-based eas channel:rollout, or the already-shipped channel pause or resume workflow, and it does not start a build, submit, or publish an update. Building, TestFlight submit, Play upload, EAS Update publish, rollback, channel pause or resume, rollout, preflight, build status, fingerprint, Update status, and submit status do not start this job, and this job does not start those. The run stops if the token is missing, the action is missing or invalid, a required channel name is missing, a required runtime version is missing, official --days is set together with --start or --end, an optional filter is invalid, or the project is not linked. Expo bills your Expo account; Xyvenra does not run, receive, or pay for this job. This is not a hosted Xyvenra service.
  • xyvenra-eas-branch-status.yml lists or views EAS Update branches in your own Expo account, without creating, deleting, or renaming a branch. It uses official eas branch:list --non-interactive and official eas branch:view [NAME] --non-interactive with optional official --offset, --limit, and --json on Ubuntu. Official help lists --non-interactive on view, so this job always passes it. The required repository secret is EXPO_TOKEN. Choose action (list or view). The action input defaults to list and does not default to an untargeted view. View requires a branch name; this job does not invent a default branch, especially not production. Official list --limit defaults to 50 and is capped at 100. Official view --limit defaults to 25 and is capped at 50. Official --offset defaults to 0. This job does not start eas branch:create, eas branch:delete, or eas branch:rename, and it does not start a build, submit, or publish an update. Building, TestFlight submit, Play upload, EAS Update publish, rollback, channel pause or resume, rollout, preflight, build status, fingerprint, Update status, submit status, and channel status do not start this job, and this job does not start those. The run stops if the token is missing, the action is missing or invalid, a required branch name is missing, an optional filter is invalid, or the project is not linked. Expo bills your Expo account; Xyvenra does not run, receive, or pay for this job. This is not a hosted Xyvenra service.

The APK, App Bundle, Play upload, and Simulator workflows need no Expo account. The Play upload workflow needs your Play developer account, listing, and service-account secret. The EAS build, TestFlight, EAS Update, EAS Update rollback, EAS Update channel pause, EAS Update rollout, EAS release preflight, EAS build status, EAS fingerprint, EAS Update status, EAS channel status, and EAS branch status workflows need your Expo token and a linked Expo project. A store-signed iPhone IPA also needs Apple signing credentials in that Expo account. The TestFlight workflow also needs your App Store Connect API key secrets and listing. The EAS Update workflow also needs EAS Update already configured in the project; run npm run configure:updates locally first, then build and install new binaries for those channels. You can also build on Expo’s servers from the CLI, or run npx eas-cli@latest build --local on your own machine. Store releases need your own Apple Developer Program membership (US$99 a year) and Google Play developer account (one-time US$25), listings, and review. New personal Google Play accounts must run a closed test with at least 12 testers for 14 days in a row before production access. Xyvenra does not publish to the App Store or Google Play. See Build and release workflows.

Your Expo token

POST /api/platform/v1/eas and the signed-in form call Expo’s POST https://api.expo.dev/v2/workflows/dispatch with a token, project UUID, 40-character commit, and workflow file name you supply. The token is not stored. The starter ZIP is not uploaded. Xyvenra does not pay Expo. If the workflow starts a build, Expo bills the Expo account that owns the token. The commit and workflow must already exist on that Expo project.

Coming soon

Paid Mobile plans are not offered. Xyvenra does not dispatch builds on a Xyvenra Expo plan. Do not promise hosted Android or iOS builds paid by Xyvenra.

Copy-paste

curl -X POST https://xyvenra.com/api/platform/v1/projects \
  -H "Authorization: Bearer xyv_plat_..." \
  -H "Content-Type: application/json" \
  -d '{"product":"mobile","name":"Field notes"}'

curl -X POST https://xyvenra.com/api/platform/v1/export \
  -H "Authorization: Bearer xyv_plat_..." \
  -H "Content-Type: application/json" \
  -d '{"product":"mobile","projectId":"PROJECT_ID"}'