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.ymlbuilds a test-signed Android APK for your own devices. It is debug-signed, so Google Play will not accept it.xyvenra-android-aab.ymlbuilds 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, andANDROID_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.ymlbuilds that same signed App Bundle, then uploads it as a draft on the internal testing track in your own Google Play Console, using aPLAY_SERVICE_ACCOUNT_JSONrepository 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.ymlbuilds an unsigned iOS Simulator app. It cannot be installed on an iPhone.xyvenra-eas-build.ymlstarts an EAS cloud build with your ownEXPO_TOKENrepository 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.ymlsubmits a finished store-signed iOS production IPA to TestFlight in your own App Store Connect account, using officialeas submit --non-interactiveon Ubuntu. Required repository secrets areEXPO_TOKEN,ASC_API_KEY_ID,ASC_API_KEY_ISSUER_ID,ASC_API_KEY_P8, andASC_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.ymlpublishes a JavaScript and asset update to a channel in your own Expo account, using officialeas update --non-interactiveon Ubuntu. The required repository secret isEXPO_TOKEN. Choosechannel(development,preview, orproduction); the input does not default to production. A requiredmessagedescribes 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 runeas 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.ymlrepublishes a previous update by group ID, or rolls clients back to the update embedded in the build, using officialeas update:republish --group --non-interactiveoreas update:roll-back-to-embedded --non-interactiveon Ubuntu. The required repository secret isEXPO_TOKEN. Chooseaction(republishorroll-back-to-embedded). Republish requires agroup_id. Roll-back-to-embedded requireschannel(development,preview, orproduction) and aruntime_version; the channel input does not default to production. The job does not run the interactiveeas update:rollbackguide oreas update:republish --branchwithout a group. It does not publish a new JavaScript bundle from the current commit, and it does not runeas update:configureor 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.ymlpauses or resumes an existing EAS Update channel in your own Expo account, using officialeas channel:view --non-interactiveto confirm the channel already exists, then officialeas channel:pause --non-interactiveoreas channel:resume --non-interactiveon Ubuntu. The required repository secret isEXPO_TOKEN. Chooseaction(pauseorresume) andchannel(development,preview, orproduction); 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 runeas 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.ymlstarts, edits, or reverts a per-update EAS Update rollout in your own Expo account, using officialeas update --channel --message --environment --rollout-percentage --non-interactiveto start a JavaScript and asset update from the current commit for a required percentage of users, officialeas update:edit --rollout-percentage --non-interactiveto adjust or finish an existing rollout (100 finishes it), or officialeas update:revert-update-rollout --group --non-interactiveto restore the control update, on Ubuntu. The required repository secret isEXPO_TOKEN. Chooseaction(start,edit, orrevert). Start requireschannel(development,preview, orproduction), a requiredmessage, and a requiredrollout_percentagefrom 1 to 100; the channel input does not default to production. Edit requires agroup_idand percentage. Revert requires agroup_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-basedeas channel:rollout,eas update:configure, oreas 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.ymlchecks 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 officialeas whoami, officialeas project:info, officialeas config --platform --profile --non-interactive, and pinnednpx expo-doctor@1.21.8on Ubuntu. The required repository secret isEXPO_TOKEN. Chooseplatform(android,ios, orall) andprofile(development,preview,production, orios-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 oncheck_updatesto also fail closed if EAS Update is not already configured; this job does not runeas update:configure. Officialeas credentialshas no--non-interactiveflag, 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.ymllists, 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 officialeas build:list --non-interactive, officialeas build:viewwith optional official--json(official help does not list--non-interactive, so this job does not invent one), officialeas build:download --build-id --non-interactive, and officialeas build:cancel --non-interactiveon Ubuntu. The required repository secret isEXPO_TOKEN. Chooseaction(list,view,download, orcancel). The action input defaults tolistand does not default to cancel. View, download, and cancel require abuild_id. Officialeas build:downloadis 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.ymlgenerates or compares EAS fingerprints in your own Expo account, without starting a paid EAS build. It uses officialeas fingerprint:generate --non-interactiveand officialeas fingerprint:compare --non-interactiveon Ubuntu. The required repository secret isEXPO_TOKEN. Chooseaction(generateorcompare). The action input defaults togenerateand does not default to an untargeted compare. Generate requiresplatform(androidorios); this job does not invent a platform or environment default, especially not production. Official--environmentand--build-profileare mutually exclusive on generate. Compare requires a documented official target combination and never passes--open. Official--environmenton 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.ymllists, views, or inspects insights for published EAS Updates in your own Expo account, without publishing, rolling back, editing, or deleting an update. It uses officialeas update:list --non-interactive, officialeas update:viewwith optional official--insights,--days,--start,--end, and--json(official help does not list--non-interactive, so this job does not invent one), and officialeas update:insights --non-interactiveon Ubuntu. The required repository secret isEXPO_TOKEN. Chooseaction(list,view, orinsights). The action input defaults tolistand does not default to delete or to an untargeted view or insights. List requires officialbranchor officialall, which are mutually exclusive. This job does not invent a default branch or channel, especially not production. View and insights require agroup_id. Official--daysdefaults to 7 when used with insights and the flag is omitted, and is mutually exclusive with--start/--end. Official insightsplatformisiosorandroidonly. 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.ymllists, views, or cancels EAS submissions in your own Expo account, without starting or retrying a submit. It uses officialeas submit:list --non-interactive, officialeas submit:viewwith optional official--json(official help does not list--non-interactive, so this job does not invent one), and officialeas submit:cancel --non-interactiveon Ubuntu. The required repository secret isEXPO_TOKEN. Chooseaction(list,view, orcancel). The action input defaults tolistand does not default to cancel or to an untargeted view. View and cancel require asubmission_id. Official--platformon 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--platformwith one. This job does not invent a platform default. This job does not starteas submitoreas build:submit, and it does not runeas submit:retryoreas submit:status. Officialeas submit:status --profiledefaults 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.ymllists, 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 officialeas channel:list --non-interactive, officialeas channel:view [NAME] --non-interactivewith optional official--offset,--limit, and--json, and officialeas channel:insights --channel --runtime-version --non-interactivewith optional official--days,--start,--end, and--jsonon Ubuntu. Official help lists--non-interactiveon view, so this job always passes it. The required repository secret isEXPO_TOKEN. Chooseaction(list,view, orinsights). The action input defaults tolistand does not default to an untargeted view or insights. View and insights require achannelname; this job does not invent a default channel, especially not production. Insights also requires aruntime_version. Official list--limitdefaults to 10 and is capped at 25. Official view--limitdefaults to 50 and is capped at 100. Official--daysdefaults to 7 when omitted and is mutually exclusive with--start/--end. Official help does not list--environmentoneas channel:insights, so this job does not invent one. This job does not starteas channel:create,eas channel:delete,eas channel:edit,eas channel:protect,eas channel:unprotect, branch-basedeas 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--daysis set together with--startor--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.ymllists or views EAS Update branches in your own Expo account, without creating, deleting, or renaming a branch. It uses officialeas branch:list --non-interactiveand officialeas branch:view [NAME] --non-interactivewith optional official--offset,--limit, and--jsonon Ubuntu. Official help lists--non-interactiveon view, so this job always passes it. The required repository secret isEXPO_TOKEN. Chooseaction(listorview). The action input defaults tolistand does not default to an untargeted view. View requires abranchname; this job does not invent a default branch, especially not production. Official list--limitdefaults to 50 and is capped at 100. Official view--limitdefaults to 25 and is capped at 50. Official--offsetdefaults to 0. This job does not starteas branch:create,eas branch:delete, oreas 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"}'