StudySmarter - School & uni
Education app where lesson, course, and subscription changes need stakeholder review.
- Google Play installs
- 6.5M
- Store rating
- 4.8
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.
14-day unlimited free trial. No credit card required
Enterprise needs? Talk to our team
The Problem
Developer opens a PR
The change is ready for review, but nobody can try it on a phone yet.
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.
Invite and install
Reviewers need to be added as testers and install that exact build.
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.
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
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.
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
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
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
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
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.
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,
}
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
Anyone reviewing the pull request can check it on a phone, not only the author.
Find the solution that matches your team's needs
Apps built with Capacitor
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.
Education app where lesson, course, and subscription changes need stakeholder review.
Live engagement app where event flows should be tested before merge.
Community app where tournament and analysis screens benefit from device previews.
Customer proof
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.”
nethead emeritors
“Great job on the updater plugin. It works flawlessly for me, and live updates are a super accelerator for quick testing turnaround.”
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
Straight answers for the people who set up CI and the people who review.
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 buildNot 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 keysAn 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 referenceAdd 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 referenceYes. 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 integrationsAdd 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.