VibeView builds iOS, Apple TV, Android and Android TV apps in the cloud, with no Mac. It sends them to TestFlight, Google Play and the Amazon Appstore, and opens the simulator builds of the same project on live cloud devices.
This page is for teams whose codemagic.yaml ends in a publishing section with app_store_connect or google_play, and who want to move that step. For the platform-level comparison, see Codemagic alternative.
Who this is for
- Your workflow publishes to App Store Connect with
beta_groupsandsubmit_to_testflight[1], or to Google Play withtrackandrollout_fraction[4]. - You want to see where a TestFlight build is after the workflow ends. Codemagic adds groups and submits for review in a post-processing step after the main workflow. Its docs say it sends no status updates on that step: you check the build log or your email[2]. VibeView sends you a notification when the build is with your testers, and an email when it fails or Apple needs something from you, with matching Slack and webhook events.
vibeview submit --wait-distributionalso keeps the command running until the build is with your testers, in Beta App Review, or needs you, with an exit code for each. - You also ship to the Amazon Appstore, or a Fire TV or Android TV build of the same app.
Option mapping
vibeview.json below means the submit block of a platform in vibeview.json (platforms.ios.submit, platforms.android.submit). Flags are vibeview submit flags and win over vibeview.json.
App Store Connect
Codemagic names are from its App Store Connect publishing docs[1][2] and its release notes docs[6].
| codemagic.yaml | VibeView | Notes |
|---|---|---|
auth: integration with a named key | --asc-key <name> or ascKey | VibeView also stores App Store Connect API keys by name: Builds → Stores, or vibeview credentials asc-key add. With one key, there’s nothing to pass. |
api_key, key_id, issuer_id | vibeview credentials asc-key add | Stored once; nothing goes in vibeview.json or CI variables. |
beta_groups | --group "QA team" (repeat it), or groups | Internal or external, by their App Store Connect names, in any case. |
submit_to_testflight: true | Name an external group | VibeView sends the build to Beta App Review when a chosen group is external, and Apple releases it once it approves. |
expire_build_submitted_for_review | No equivalent | VibeView never removes or expires a build in review. When another build of the version is in review, the submission says so and checks again on its own. To have this one reviewed first, remove the other build in App Store Connect (TestFlight → that build → Remove from Review). |
release_notes.json (one file) | --what-to-test "…" or --what-to-test-file | Put the default language’s text in a plain text file or pass it as the flag’s value. Up to 4,000 characters, required for an external group. VibeView doesn’t read JSON. |
release_notes_<code>.txt (one per language) | --notes-dir notes/ | CLI 0.58.0 or later. Rename each file to <code>.txt in one folder (release_notes_de-DE.txt becomes notes/de-DE.txt). The default language’s note comes from --what-to-test-file. |
| Post-processing (waits for Apple) | --wait-distribution | Checks every 15 seconds, prints each step, exits 0, 1 or 2, up to 2 h 15 min. Without it, VibeView keeps checking App Store Connect after the command exits and shows each step on the build’s page. |
submit_to_app_store, release_type, phased_release and the other App Store options | No equivalent | App Store review, release timing and phased release stay in App Store Connect. |
Apple’s export compliance question is answered once per app in VibeView. --no-uses-encryption or --uses-encryption saves the answer for later builds, and ITSAppUsesNonExemptEncryption in your Info.plist wins over it.
Google Play
Codemagic names are from its Google Play publishing docs[4] and its release notes docs[6].
| codemagic.yaml | VibeView | Notes |
|---|---|---|
credentials | vibeview credentials play-key add | Stored once in VibeView. |
track | --track or track | internal, alpha, beta or production. Internal app sharing, custom closed tracks and wear: tracks aren’t available. |
rollout_fraction | --rollout with --release-status inProgress | Or rollout with releaseStatus: inProgress in vibeview.json. A fraction strictly between 0 and 1. |
submit_as_draft: true | --release-status draft | The default on the production track. |
changes_not_sent_for_review | --changes-not-sent-for-review | Or changesNotSentForReview in vibeview.json. |
GOOGLE_PLAY_TRACK | --track "$TRACK" in your CI step | A flag always wins over vibeview.json. |
release_notes.txt or release_notes.json | --release-notes or --release-notes-file | Plain text, not JSON: the default language’s note, up to 500 characters. Other languages go in --notes-dir as <code>.txt, and each must be on your Play listing. |
release_name, in_app_update_priority, release_promotion | No equivalent | Promote a release to another track in Play Console. |
See Google Play tracks, staged rollout and changes not sent for review for the Play terms.
What has no equivalent
- Expiring a build in Beta App Review (
expire_build_submitted_for_review)[1]. VibeView never takes a build out of review. Apple reviews one build of a version at a time, so a new build waits for the earlier verdict. The submission’s card says so and checks again on its own. - App Store review and release.
submit_to_app_store,release_type,earliest_release_dateandphased_release[1] have no counterpart. Neither do the App Store fields inrelease_notes.json(description, keywords, promotional text)[6]. Phased release stays in App Store Connect. - More Google Play tracks and promotion. Custom tracks, internal app sharing,
release_promotionandin_app_update_priority[4] aren’t in VibeView. Promote and set update priority in Play Console. - Publishing a binary built elsewhere.
vibeview submitsends VibeView cloud builds only.
Before and after
A codemagic.yaml publishing section with keys from Codemagic’s docs[1][4], plus release_notes_en-US.txt and release_notes_de-DE.txt in the repository root[6]:
workflows:
release:
integrations:
app_store_connect: team
publishing:
app_store_connect:
auth: integration
submit_to_testflight: true
expire_build_submitted_for_review: true
beta_groups:
- QA team
- Public beta
google_play:
credentials: $GOOGLE_PLAY_SERVICE_ACCOUNT_CREDENTIALS
track: beta
rollout_fraction: 0.25
On VibeView, the groups, track and rollout go in vibeview.json, and the notes are flags:
{
"platforms": {
"ios": {
"appId": "app_ios123",
"build": { "...": "..." },
"submit": { "ascKey": "team", "groups": ["QA team", "Public beta"] }
},
"android": {
"appId": "app_android456",
"build": { "...": "..." },
"submit": { "track": "beta", "releaseStatus": "inProgress", "rollout": 0.25 }
}
}
}
vibeview build --cloud --production --platform all
vibeview submit --platform ios --latest \
--what-to-test-file release_notes_en-US.txt --notes-dir notes/ --wait-distribution
vibeview submit --platform android --latest \
--release-notes-file release_notes_en-US.txt --notes-dir notes/
Here notes/ holds de-DE.txt. expire_build_submitted_for_review has no line: see above.
Switch step by step
One trap first. Apple and Google refuse a build number they have already seen. While Codemagic and VibeView both upload the same app, check VibeView’s counter with vibeview versions list before each VibeView build, and raise it with vibeview versions set if Codemagic uploaded a higher number since (step 4).
-
Keep Codemagic publishing. VibeView doesn’t read
codemagic.yaml. Leave the workflow as it is while you try VibeView on internal testers. -
Set up a production build. Run
vibeview build --cloud --production. The first time, the CLI asks for the production profile’s build command and artifact, suggesting your framework’s usual build, and saves them invibeview.json. Add"autoIncrement": trueto that profile so each production build gets the next build number. Upload to TestFlight without a Mac and Build a React Native Android app in the cloud walk through signing. Upload the signing files you use today withvibeview credentials add(for Android, the same upload key your Play listing trusts), or generate new iOS ones withvibeview credentials generate. -
Store the keys. Add the App Store Connect API key with
vibeview credentials asc-key addand the Play service account withvibeview credentials play-key add. The App Store Connect key can be the one Codemagic uses. To send builds to groups it needs the App Manager or Admin role; Codemagic asks for App Manager[1]. -
Seed the build numbers. With an App Store Connect key stored, the first iOS number starts above your existing builds. For Android, set the counter once from your latest version code:
vibeview versions set --app <app-id> --platform android <number> -
Check before you build.
vibeview submit --check --platform ios --group "QA team" vibeview submit --check --platform android -
Internal testers first. Send VibeView builds to an internal TestFlight group and the internal Play track, while Codemagic keeps publishing the rest. Move on only after two builds in a row arrive the same way.
-
Fill in TestFlight details once.
vibeview testflight infoshows what Apple needs before external testing.set-infoandset-review-contact, or TestFlight details in the dashboard, fill it in. -
Move the rest. Add the external groups and the staged rollout to
vibeview.json. From your CI, add--auto-submittovibeview build --cloud --production, with a CI-only token: each build goes to its store as soon as it succeeds, like thepublishingsection did (GitHub Actions to TestFlight has a full workflow). It sends the default language’s note only; for notes in other languages (--notes-dir), runvibeview submitafter the build instead. Then remove thepublishingsection fromcodemagic.yaml.
A new Android app can start on VibeView without a manual first upload. Codemagic’s docs ask for one[5]; with VibeView, create the app in Play Console and the very first build can go up through vibeview submit. On iOS both need the App Store Connect app record first. Codemagic also recommends uploading the first iOS version by hand[3]; VibeView doesn’t need that.
Where Codemagic is the better fit
- App Store review and release timing. Codemagic can submit to App Store review, schedule the release and turn on phased release[1]; VibeView stops at TestFlight.
- More Google Play controls. Custom tracks, internal app sharing, release promotion and in-app update priority[4].
- Clearing the review queue for you.
expire_build_submitted_for_reviewlets a new build replace one waiting in Beta App Review without a manual step[1]. - Post-processing without build minutes. Codemagic’s TestFlight post-processing doesn’t use build minutes[2]. VibeView follows the build after upload without using your CI minutes, unless you pass
--wait-distribution.
What VibeView adds:
- A submission state that names what is missing and where to fix it, with Check again.
- A notification when testers have the build, and an email when it fails or needs you, where Codemagic sends no status updates on post-processing[2].
- The export compliance answer saved once per app.
- TestFlight details, the Beta App Review contact and external testers, set from the CLI or the dashboard.
- Amazon Appstore submission for Android and Android TV.
- The same project on cloud iOS, Android, Apple TV and Android TV devices for testing.
Frequently asked questions
Is VibeView a Codemagic publishing alternative?
For TestFlight and Google Play, yes. vibeview submit uploads a VibeView production build and
sends it to TestFlight groups (through Beta App Review for external groups) or to a Google
Play track with release notes and an optional staged rollout. It doesn’t submit to App Store
review.
What replaces expire_build_submitted_for_review?
Nothing automatic. VibeView never removes a build from Beta App Review. When another build of the same version is in review, the new submission says so and checks again on its own. Remove the older build in App Store Connect if you want the new one reviewed now.
Can I keep building on Codemagic?
Not for the builds you submit with VibeView: vibeview submit sends builds VibeView made.
Other Codemagic workflows, such as tests, can keep running.
Do my release notes files still work?
Partly. VibeView reads plain text, not JSON. Point --what-to-test-file (TestFlight) or
--release-notes-file (Google Play) at a text file with the default language’s note. If you
use one release_notes_<code>.txt file per language, rename the other languages to
<code>.txt in one folder for --notes-dir. A release_notes.json file needs its text copied
out.
Next: set up the build with Upload to TestFlight without a Mac, then move CI with GitHub Actions to TestFlight. Compare the platforms in Codemagic alternative, or see Migrate from EAS Submit.
Sources
Every claim about Codemagic on this page comes from Codemagic's own documentation, read on the date shown. Products change: check the linked page before you rely on a detail.
- Codemagic App Store Connect publishing (docs.codemagic.io/yaml-publishing/app-store-connect, checked ): publishing.app_store_connect in codemagic.yaml: auth: integration with integrations: app_store_connect: <App Store Connect API key name>, or api_key, key_id and issuer_id; submit_to_testflight ("Whether or not to submit the uploaded build to TestFlight beta review"); expire_build_submitted_for_review ("automatically expire previous build in review or waiting for review in Testflight before submitting a new build to beta review"); beta_groups ("the names of beta tester groups that will get access to the build"); submit_to_app_store; cancel_previous_submissions; release_type (MANUAL, AFTER_APPROVAL or SCHEDULED); earliest_release_date; copyright; phased_release; the key "needs to have App Manager permission"
- Codemagic App Store Connect post-processing (docs.codemagic.io/yaml-publishing/app-store-connect, checked ): submit_to_testflight, beta_groups, cancel_previous_submissions, expire_build_submitted_for_review and release notes "take place asynchronously in the post-processing step after the app artifact has been successfully published to App Store Connect and the main workflow has completed"; "The overall timeout for post-processing is 120 minutes"; "Codemagic does not send status updates on the post-processing step. You can check the build log for the status of post-processing or check your email"; "Post-processing does not consume any build minutes"
- Codemagic App Store Connect requirements (docs.codemagic.io/yaml-publishing/app-store-connect, checked ): "you will need to create an app record in App Store Connect before you can automate publishing with Codemagic. It is recommended to upload the very first version of the app manually"
- Codemagic Google Play publishing (docs.codemagic.io/yaml-publishing/google-play, checked ): publishing.google_play in codemagic.yaml: credentials, track ("internal, alpha, beta, production, internal app sharing, or your custom track name"), release_name, in_app_update_priority, rollout_fraction ("value between (0, 1)"), changes_not_sent_for_review, submit_as_draft ("Can not be used together with rollout_fraction"), release_promotion (track, rollout_fraction, promote_as_draft); the GOOGLE_PLAY_TRACK environment variable overrides the track
- Codemagic Google Play first release (docs.codemagic.io/yaml-publishing/google-play, checked ): "The very first version of your app must be uploaded to Google Play manually"; after that first manual upload, Codemagic can publish later versions
- Codemagic release notes publishing (docs.codemagic.io/yaml-notification/publish-release-notes, checked ): "Create a release_notes.txt or release_notes.json file for Play Store and a release_notes.json file for App Store Connect"; or "a release_notes_<language_localization_code>.txt file for every language used, e.g. release_notes_en-GB.txt"; or one release_notes.json listing {"language", "text"} entries. App Store Connect publishes them to "What to Test", Google Play to its release notes; for App Store review, release_notes.json can also carry description, keywords, promotional_text, marketing_url and support_url
Related guides
In the documentation
Try it yourself
Open a live iOS simulator, Android emulator, Apple TV, Android TV or Roku in your browser.
Start free