VibeView builds iOS, Apple TV, Android and Android TV apps in the cloud, with no Mac. It submits them to TestFlight, Google Play and the Amazon Appstore from one CLI and one dashboard. The simulator builds of the same project open on live cloud devices.
This page is for teams whose release lane ends in upload_to_testflight (also called pilot or testflight). It maps each option you use to its VibeView equivalent and says which ones have none. Then it gives a switch plan that keeps fastlane running until you trust the new path.
Who this is for
- You run a
lane :betathat callsbuild_appandupload_to_testflight[4], on your own Mac or a hosted macOS runner.build_appdrivesxcodebuild[5], so the lane needs a Mac with Xcode. pilot itself can upload from Linux with Apple’s Transporter[3]. - You want build, signing and upload to run without a Mac you maintain.
- You also ship an Apple TV, Android or Android TV build of the same app and want one tool for all of them.
If your lane is mostly deliver (App Store review, metadata and screenshots), read What has no equivalent first: VibeView stops at TestFlight and the store tracks.
How the pieces map
vibeview submit sends a VibeView production cloud build, so the switch covers three fastlane actions[4], not one:
| fastlane | VibeView | Notes |
|---|---|---|
sync_code_signing | vibeview credentials generate | Or vibeview credentials add with the certificate and profile you have. |
build_app | vibeview build --cloud --production | Needs a production build profile in vibeview.json. |
upload_to_testflight | vibeview submit --platform ios | The rest of this page. |
Option mapping
Each row is an upload_to_testflight option or pilot command, as named in fastlane’s parameter reference[1] and its pilot commands[2]. Flags are vibeview submit flags unless the row names another command. vibeview.json means its platforms.ios.submit block.
| fastlane option | VibeView | Notes |
|---|---|---|
api_key_path, api_key | vibeview credentials asc-key add once, then --asc-key team or "ascKey": "team" | Stored once in VibeView and write-only: it can be replaced or removed, never read back. With one key stored, there’s nothing to pass. |
ipa | --latest or --build <id> | A cloud build id, not a file path. In CI, pass the id your build step printed. |
groups | --group "QA team" (repeat it), or groups in vibeview.json | Internal and external groups both go here, by their App Store Connect names, in any case. An unknown name stops the command and lists the app’s groups. |
distribute_external | Name an external group in --group | VibeView reads each group’s kind from App Store Connect; there’s no separate switch. |
submit_beta_review | Automatic for an external group | VibeView sends the build to Beta App Review when you chose an external group, and Apple releases it to those testers once it approves. |
changelog | --what-to-test "…" or --what-to-test-file | Up to 4,000 characters. Required when a group is external. Never read from vibeview.json, so an old note is never resent. |
localized_build_info | --notes-dir notes/ | CLI 0.58.0 or later. One flat folder, one <code>.txt per language, for example notes/de-DE.txt. The default language’s note still comes from --what-to-test. |
uses_non_exempt_encryption | --uses-encryption or --no-uses-encryption | ITSAppUsesNonExemptEncryption in your Info.plist wins. VibeView saves your answer on the app, so later builds don’t need the flag. |
beta_app_review_info, demo_account_required | vibeview testflight set-review-contact | Set once per app, not on every upload (example below). |
localized_app_info, beta_app_description, beta_app_feedback_email | vibeview testflight set-info | One language per call. Also in Builds → Stores → your app → TestFlight details. |
skip_waiting_for_build_processing | The default | Without --wait-distribution, the command exits when the upload ends. VibeView keeps checking App Store Connect and shows each step on the build’s page: processing, export compliance, notes, groups, review. |
wait_processing_timeout_duration | --wait-distribution | Checks every 15 seconds and exits 0, 1 or 2. The wait has a fixed limit of 2 h 15 min. |
skip_submission | No --group and no groups in vibeview.json | The build goes to TestFlight with no groups added (In TestFlight). |
pilot add with -g | vibeview testflight add-testers | External groups only, up to 100 people at a time. |
pilot import | add-testers --testers-file | One tester per line, as email or email, first name, last name. The group is the --group flag, not a column. |
The two testflight commands that replace the review and test-information options, set once per app:
vibeview testflight set-review-contact --first-name Ada --last-name Lovelace \
--phone "+1 555 0100" --email review@example.com \
--sign-in-required --sign-in-user demo@example.com --sign-in-password-file demo-password.txt
vibeview testflight set-info --locale en-US --description "What testers should try" \
--feedback-email beta@example.com --privacy-url https://example.com/privacy
The sign-in password is read from a file or a pipe, never from the command line.
What has no equivalent
Said plainly, so nothing surprises you after the switch:
- App Store review and listings.
deliveruploads metadata, screenshots and App Preview videos and submits for App Store review, withautomatic_releaseandphased_release[7]. VibeView does none of that. App Store review, phased release, the listing and screenshots stay in App Store Connect. Keepdeliverfor them if you use it. - Removing and listing testers.
pilot remove,pilot list,pilot findandpilot export[2] have no VibeView command. Remove testers and see who installed a build in App Store Connect. - Internal testers. VibeView adds testers to external groups only. Add someone to an internal group in App Store Connect.
notify_external_testers,expire_previous_builds,reject_build_waiting_for_review[1]. VibeView doesn’t change notification settings, never expires a build, and never removes a build from review. When another build of the version is in review, the submission says so and checks again on its own. Remove that build in App Store Connect if you want to.distribute_only(distribute a build already in App Store Connect). VibeView sends the builds it made; it doesn’t take an.ipabuilt elsewhere or a build someone uploaded by hand.app_clip_invocations: not available.
Before and after
A typical fastlane beta lane, with options from fastlane’s own docs[4]:
# fastlane/Fastfile
lane :beta do
sync_code_signing(type: "appstore")
build_app(scheme: "MyApp")
upload_to_testflight(
api_key_path: "fastlane/api_key.json",
groups: ["QA team", "Beta testers"],
distribute_external: true,
changelog: "Try the new checkout",
uses_non_exempt_encryption: false
)
end
The same release on VibeView. autoIncrement on the production profile gives every production build the next build number from a counter VibeView keeps per app, so the lane needs no build-number step. The groups and the key go in vibeview.json; the note and the encryption answer are flags:
{
"platforms": {
"ios": {
"appId": "app_abc123",
"build": {
"profiles": {
"production": { "command": "...", "artifact": "ios/build/*.ipa", "autoIncrement": true }
}
},
"submit": { "ascKey": "team", "groups": ["QA team", "Beta testers"] }
}
}
}
vibeview build --cloud --production --platform ios
vibeview submit --platform ios --latest \
--what-to-test "Try the new checkout" --no-uses-encryption --wait-distribution
The encryption flag is needed once: the answer is saved on the app.
Switch step by step
One trap first. Apple refuses a build number it has already seen. While fastlane and VibeView both upload the same app, check VibeView’s counter with vibeview versions list before each VibeView build. If fastlane uploaded a higher number since, raise it with vibeview versions set (step 4).
-
Keep fastlane shipping. Change nothing in your
Fastfileyet. Until the last step, fastlane stays the path your external testers get builds from. -
Install the CLI and store the key. Run
npm install -g vibeview, thenvibeview login. Store the App Store Connect API key withvibeview credentials asc-key add(the.p8file plus--key-id,--issuer-idand--name team). It can be the same key yourapi_key_pathfile points at. To send builds to groups it needs the App Manager or Admin role, the role fastlane’s docs give for pilot updating testers[3]. -
Signing.
vibeview credentials generatecreates a distribution certificate and profile through Apple’s API. Or upload the certificate and provisioning profile you already have withvibeview credentials add.vibeview credentials generate --platform ios --name release --app <app-id> -
Add a production build profile with
autoIncrement(the JSON above). With an App Store Connect key stored, the first number starts above your app’s existing builds. If fastlane uploads again after that, raise the counter before the next VibeView build:vibeview versions set --app <app-id> --platform ios <number> -
Check before you build. This asks App Store Connect whether it knows the app and the group names, and exits
1if not:vibeview submit --check --platform ios --group "QA team" -
Ship to internal testers only. Build, then send to an internal group while fastlane keeps sending external builds:
vibeview submit --platform ios --latest --group "QA team"Compare what arrives in TestFlight. Move on only after two builds in a row arrive the same way.
-
Set the external details once.
vibeview testflight infolists what Apple still needs before external testing.set-infoandset-review-contactfill it in (or TestFlight details in the dashboard). -
Move external groups, then CI. Add the external group to
groupsand send one build with--what-to-test. When it reaches Beta App Review, move the pipeline: GitHub Actions to TestFlight, no Mac runner has a complete workflow onubuntu-latestwith a CI-only token. Then delete theupload_to_testflightcall, and thebuild_appandsync_code_signingsteps if nothing else uses them.
If you also use supply for Google Play
The Android side maps the same way. Option names are from fastlane’s upload_to_play_store reference[8]; the VibeView keys go in platforms.android.submit.
| supply option | VibeView | Notes |
|---|---|---|
track | --track or track | internal, alpha, beta or production |
rollout | --rollout or rollout | With --release-status inProgress: a staged rollout |
release_status | --release-status or releaseStatus | completed, draft or inProgress; halt a release in Play Console |
changes_not_sent_for_review | --changes-not-sent-for-review | Or changesNotSentForReview in vibeview.json |
| changelogs per locale, named for the version code | --release-notes plus --notes-dir | One <code>.txt per language; fastlane’s per-language folders aren’t read |
track_promote_to | No equivalent | Promote in Play Console |
See staged rollout and version code for the Play terms.
Where fastlane is the better fit
- It’s free and open source, under the MIT license, and it runs on your own computer or server[6]. VibeView is a hosted service: builds use your plan’s build minutes, and your store keys are stored in VibeView.
- It covers App Store review and metadata.
deliversubmits for review and manages listings and screenshots[7]; VibeView doesn’t. - It manages testers both ways. pilot removes, lists and exports testers[2]; VibeView only adds them to external groups.
- It uploads any
.ipa. pilot uploads the file you point it at[1];vibeview submitsends VibeView cloud builds only.
What VibeView adds:
- Builds without a Mac or Xcode to maintain.
- A submission state that says what is missing and where to fix it, with Check again.
- The export compliance answer saved once per app.
- The same project on cloud iOS, Android, Apple TV and Android TV devices for testing before it ships.
Frequently asked questions
Is VibeView a fastlane pilot alternative?
For uploading to TestFlight and sending builds to testers, yes. vibeview submit covers
groups, What to Test notes in several languages, export compliance and Beta App Review, and
follows the build until testers have it. It also builds and signs the .ipa in the cloud, so
no Mac is involved. It doesn’t replace deliver.
Can I keep fastlane for some steps?
Yes. A common split is VibeView for building and TestFlight, and deliver for App Store review
and metadata. deliver takes an App Store Connect API key too[7],
so both can use the same key.
Does VibeView wait for Apple's processing like pilot does?
VibeView keeps checking App Store Connect after the upload, even after the command exits, and
shows each step on the build’s page. Add --wait-distribution to keep the command running
until the build is with your testers, is in Beta App Review, or needs you, with an exit code
for each.
Does it work for Apple TV apps?
Yes. Use --platform tvos with the same flags; groups, notes and export compliance work the
same way.
Next: set up the one-time pieces in Upload to TestFlight without a Mac, then move the pipeline with GitHub Actions to TestFlight. Moving from EAS instead? See Migrate from EAS Submit.
Sources
Every claim about fastlane on this page comes from fastlane's own documentation, read on the date shown. Products change: check the linked page before you rely on a detail.
- fastlane upload_to_testflight parameters (docs.fastlane.tools/actions/upload_to_testflight, checked ): upload_to_testflight parameters: api_key_path, api_key, ipa, groups ("Associate tester to one group or more by group name / group id ... required when distribute_external option is set to true"), changelog ("What to Test"), localized_build_info ("whats_new" per locale), localized_app_info, beta_app_description, beta_app_feedback_email, beta_app_review_info, demo_account_required, distribute_external, notify_external_testers, submit_beta_review (default true), uses_non_exempt_encryption ("used if ... ITSAppUsesNonExemptEncryption is not set in the Info.plist"), skip_submission, skip_waiting_for_build_processing, wait_processing_timeout_duration, distribute_only, expire_previous_builds, reject_build_waiting_for_review, app_clip_invocations
- fastlane pilot tester commands (docs.fastlane.tools/actions/upload_to_testflight, checked ): pilot commands: pilot add (create a tester and add them to groups with -g), pilot remove, pilot list, pilot find, pilot export and pilot import (a CSV in the format First,Last,email,group-1;group-2)
- fastlane pilot: Linux upload and App Store Connect role (docs.fastlane.tools/actions/upload_to_testflight, checked ): "Upload from Linux": with Transporter installed and FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPT set; pilot "updates build information and testers after the build has finished processing", which needs the "App Manager" or "Admin" role
- fastlane iOS beta deployment guide (docs.fastlane.tools/getting-started/ios/beta-deployment, checked ): Beta deployment guide: a lane :beta with sync_code_signing(type: "appstore"), build_app(scheme: "MyApp") and upload_to_testflight; "Variant 1: Provide a changelog", upload_to_testflight(changelog: ...)
- fastlane build_app reference (docs.fastlane.tools/actions/build_app, checked ): build_app (gym) "builds and packages iOS apps"; its two main components are xcodebuild and xcpretty; a different Xcode installation is chosen with xcodes or DEVELOPER_DIR
- fastlane docs home (docs.fastlane.tools, checked ): "100% open source under the MIT license"; "All fastlane tools run on your own computer or server, so your credentials or other sensitive information will never leave your own computer"
- fastlane upload_to_app_store (deliver) reference (docs.fastlane.tools/actions/upload_to_app_store, checked ): deliver "uploads screenshots, App Preview videos, metadata and binaries to App Store Connect. Use deliver to submit your app for App Store review"; options submit_for_review, automatic_release, phased_release, and api_key_path / api_key for an App Store Connect API key
- fastlane upload_to_play_store (supply) reference (docs.fastlane.tools/actions/upload_to_play_store, checked ): upload_to_play_store (supply) parameters: json_key, aab, track (production, beta, alpha, internal), rollout, release_status (completed, draft, halted, inProgress), changes_not_sent_for_review, track_promote_to, in_app_update_priority, metadata_path; changelogs under changelogs/ per locale, each file named for the version code
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