Skip to main content
PR Preview

Review every pull request on a real phone

Your CI uploads each pull request's web build to its own Capgo channel. Reviewers scan a QR code or switch channels in the app to try it on their device, and the channel is deleted when the PR closes. Changes to native code still need a new build.

  • One channel per pull request
  • QR code preview
  • Cleanup when the PR closes

The Problem

A web change should not need a new binary to be reviewed

Reviewing a PR with store testing builds

  1. Developer opens a PR

    The change is ready for review, but nobody can try it on a phone yet.

  2. Build, sign, and upload

    Someone builds a native binary for the branch, signs it, uploads it to TestFlight or a Play testing track, and waits for processing.

  3. Invite and install

    Reviewers need to be added as testers and install that exact build.

  4. Repeat for every fix

    Each review comment that changes code means another build, another upload, and another install.

Every round of review waits on a native build, even when only JavaScript changed.

What that costs the team

Every build

Waits for store processing

Each build you upload to TestFlight or a Play testing track is processed before testers can install it. That happens for every build.

Every PR

Needs its own native build to test

Without live updates, reviewers can only try a branch after someone builds, signs, and uploads a new binary, even for a web-only change.

Late feedback

Review happens after the author moved on

When review waits on builds, feedback arrives later, the author is on another task, and the branch drifts from main.

How it works

How teams preview pull requests with Capgo

Four CI steps: set up a scoped key once, upload per push, share the preview, clean up on close. Every command below is from the Capgo docs.

  1. Create an App Preview key and enable previews

    An admin creates an App Preview API key for CI. It can create preview channels and upload bundles, but it cannot change your default or production channel. Previews are turned on once per app.

    # once, run by an admin (not the preview key)
    npx @capgo/cli@latest app set com.example.app --preview
    App Preview API keys
  2. Upload the PR build to its own channel

    On each push, CI builds the web app and uploads it with a unique bundle version. bundle upload --channel creates the pr-<number> channel if it does not exist and links the bundle to it.

    npx @capgo/cli@latest bundle upload com.example.app \
      --apikey "$CAPGO_PREVIEW_KEY" \
      --path ./dist \
      --channel "pr-$PR_NUMBER" \
      --bundle "1.2.3-pr.$PR_NUMBER.$GITHUB_RUN_NUMBER"
    PR previews in the channels docs
  3. Post the preview on the PR

    get-qr prints a QR code for the channel, or the preview URLs with --url, so CI can add them to a PR comment.

    npx @capgo/cli@latest get-qr com.example.app \
      --channel "pr-$PR_NUMBER" \
      --apikey "$CAPGO_PREVIEW_KEY" \
      --url
    get-qr reference
  4. Delete the channel when the PR closes

    Run this on the pull request closed event. With an App Preview key, it removes only the channel and linked bundle that key created.

    npx @capgo/cli@latest channel delete \
      "pr-$PR_NUMBER" com.example.app \
      --apikey "$CAPGO_PREVIEW_KEY" \
      --delete-bundle \
      --success-if-not-found
    channel CLI reference

Other ways reviewers switch to a PR channel

Both need a channel that allows self-assignment. An App Preview key does not set that, so with that key, share the QR preview or set a device override in the console.

Shake menu

Turn on the shake menu in internal builds. Testers shake the device to open Capgo's test menu, and the shake channel selector lets them pick a channel.

// capacitor.config.ts (internal builds)
CapacitorUpdater: {
  shakeMenu: true,
}

In-app switcher

Add a channel field to a developer settings screen and call setChannel() with the PR channel name.

import { CapacitorUpdater } from '@capgo/capacitor-updater'

await CapacitorUpdater.setChannel({
  channel: 'pr-123',
  triggerAutoUpdate: true,
})
setChannel() reference

Who uses PR previews

Anyone reviewing the pull request can check it on a phone, not only the author.

QA Engineers

  • Test the PR's web build on your own device
  • Move between PR channels without reinstalling the app
  • The channel name matches the PR number, so you know which code you are running

Project Managers

  • Try a feature on a phone before it merges
  • Scan the QR code posted on the PR
  • Leave feedback on the PR itself

Developers

  • Get device feedback while the PR is still open
  • Each push updates the PR channel
  • No native build for JavaScript-only changes

Store testing builds vs Capgo PR channels

  • Getting a PR onto a phone

    TestFlight / Play testing
    Native build, signing, and store processing
    Capgo PR channel
    Web build and bundle upload from CI
  • Switching between PRs

    TestFlight / Play testing
    Install another build
    Capgo PR channel
    Scan another QR code or switch channel
  • Reviewer setup

    TestFlight / Play testing
    Tester invitation, then install each build
    Capgo PR channel
    Install the app once
  • Native code and plugin changes

    TestFlight / Play testing
    Yes
    Capgo PR channel
    No, needs a native build

Apps built with Capacitor

Product apps need reviewable mobile changes

Learning, event, and community apps can have onboarding, practice, live-session, and subscription changes under review at the same time. PR previews let product, QA, and support inspect a mobile-ready build before merge.

StudySmarter - School & uni app icon EDUCATION

StudySmarter - School & uni

Education app where lesson, course, and subscription changes need stakeholder review.

Google Play installs
6.5M
Store rating
4.8
Poll Everywhere app icon BUSINESS

Poll Everywhere

Live engagement app where event flows should be tested before merge.

Google Play installs
1.1M
Store rating
3.2
lichess • Free Online Chess app icon GAME BOARD

lichess • Free Online Chess

Community app where tournament and analysis screens benefit from device previews.

Google Play installs
11.3M
Store rating
4.3

Customer proof

What teams shipping with Capgo say

5.0/5 rated by developer teams 9,400+ teams Read reviews

Nate van Jole

CTO, Private

“Getting set up took less than a day. Channel-based rollouts let me test on my own device before anything hits production users.”

Portrait of Michael Haberler

Michael Haberler

nethead emeritors

“Great job on the updater plugin. It works flawlessly for me, and live updates are a super accelerator for quick testing turnaround.”

no-tone @ Webincode

Developer, Webincode

“Being able to add Device ID's to certain groups and push the changes to only certain groups is a life saver.”

FAQ

Questions teams ask about PR previews

Straight answers for the people who set up CI and the people who review.

Do reviewers need a new build for each PR?

Not when the PR only changes the web layer. Reviewers install the app once, and each PR's JavaScript, HTML, CSS, and assets go to its own channel. If the PR adds a plugin or changes native code, it needs a native build. Run build needed in CI to detect that.

What needs a native build

Can the CI key touch our production channel?

Not with an App Preview API key. It can create preview channels, upload bundles, and delete only the channel and bundle it created. It cannot change the default or main channel. In GitHub Actions, run the job on pull_request, not pull_request_target, and limit it to PRs from the same repository.

App Preview API keys

How do reviewers open the preview?

An admin enables previews once with app set --preview. After that, get-qr prints a QR code for the PR channel, and --url prints the web preview URL and deep link. Post them in a PR comment.

get-qr reference

What happens to old PR channels and bundles?

Add a job on the pull request closed event that runs channel delete with --delete-bundle and --success-if-not-found. With an App Preview key, that removes the channel and the bundle linked to it. Bundles from earlier pushes can be removed with bundle cleanup, using a key that has delete rights.

channel CLI reference

Does this work with GitLab, Bitbucket, or Azure DevOps?

Yes. The steps are Capgo CLI commands, so they run in any CI. The docs have integration guides for GitHub Actions, GitLab CI, Bitbucket Pipelines, and Azure DevOps.

CI/CD integrations

Preview your next pull request on a phone

Add the upload, QR, and cleanup steps to your CI and try them on your own app during the free trial.

14-day free trial, no credit card. Native changes still need a new build.