Capacitor plugin to update your app remotely in real-time.
Open-source Alternative to Appflow, Codepush or Capawesome
App store review processes can take days or weeks, blocking critical bug fixes and updates from reaching your users. Capacitor Updater solves this by:
Perfect for fixing bugs immediately, A/B testing features, and maintaining control over your release schedule.
You have 3 ways possible : - Use capgo.app a full featured auto-update system in 5 min Setup, to manage version, update, revert and see stats. - Use your own server update with auto-update system - Use manual methods to zip, upload, download, from JS to do it when you want.
The most complete documentation here.
Join the discord to get help.
This major version is here to follow Capacitor major version 8
First follow the migration guide of Capacitor:
https://capacitorjs.com/docs/updating/8-0
setChannel() now stores channel assignments locally on the device instead of in the cloud. This provides better offline support and reduces backend load.unsetChannel() to clear the local assignment and revert to defaultChannelchannelPrivate event to handle cases where a user tries to assign themselves to a private channel (one that doesn't allow self-assignment). See example in the setChannel() documentation above.The minimum iOS version is now 15.0 to match Capacitor 7/8 requirements.
Starting from v8, the plugin uses ZIPFoundation instead of SSZipArchive/ZipArchive for ZIP extraction. ZIPFoundation uses Apple's native libcompression framework, which removes the previous zlib dependency and its associated security constraints.
| Plugin version | Capacitor compatibility | Maintained |
|---|---|---|
| v8.*.* | v8.*.* | ✅ |
| v7.*.* | v7.*.* | ✅ |
| v6.*.* | v6.*.* | ✅ |
| v5.*.* | v5.*.* | ✅ |
| v4.*.* | v4.*.* | ✅ |
| v3.*.* | v3.*.* | ⚠️ Deprecated |
| > 7 | v4.*.* | ⚠️ Deprecated, our CI got crazy and bumped too much version |
Note: Versions 4, 5, 6, 7, and 8 all share the same features. The major version simply follows your Capacitor version. You can safely use any of these versions that matches your Capacitor installation.
Add the NSPrivacyAccessedAPICategoryUserDefaults dictionary key to your Privacy Manifest (usually ios/App/PrivacyInfo.xcprivacy):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
We recommend to declare CA92.1 as the reason for accessing the UserDefaults API.
You can use our AI-Assisted Setup to install the plugin. Add the Capgo skills to your AI tool using the following command:
npx skills add https://github.com/cap-go/capacitor-skills --skill capacitor-plugins
Then use the following prompt:
Use the `capacitor-plugins` skill from `cap-go/capacitor-skills` to install the `@capgo/capacitor-updater` plugin in my project.
If you prefer Manual Setup, install the plugin by running the following commands and follow the platform-specific instructions below:
Step by step here: Getting started
Or
npm install @capgo/capacitor-updater
npx cap sync
Use npm tags to install the version matching your Capacitor version:
# For Capacitor 8 (latest)
npm install @capgo/capacitor-updater@latest
# For Capacitor 7
npm install @capgo/capacitor-updater@lts-v7
# For Capacitor 6
npm install @capgo/capacitor-updater@lts-v6
# For Capacitor 5
npm install @capgo/capacitor-updater@lts-v5
# For Capacitor 4
npm install @capgo/capacitor-updater@lts-v4
Create your account in capgo.app and get your API key
- Login to CLI npx @capgo/cli@latest init API_KEY
And follow the steps by step to setup your app.
For detailed instructions on the auto-update setup, refer to the Auto update documentation.
Download update distribution zipfiles from a custom URL. Manually control the entire update process.
capacitor.config.json like below, set autoUpdate to false.// capacitor.config.json
{
"appId": "**.***.**",
"appName": "Name",
"plugins": {
"CapacitorUpdater": {
"autoUpdate": false,
}
}
}
import { CapacitorUpdater } from '@capgo/capacitor-updater'
CapacitorUpdater.notifyAppReady()
This informs Capacitor Updater that the current update bundle has loaded successfully. Failing to call this method will cause your application to be rolled back to the previously successful version (or built-in bundle). - Add this to your application.
const version = await CapacitorUpdater.download({
version: '0.0.4',
url: 'https://github.com/Cap-go/demo-app/releases/download/0.0.4/dist.zip',
})
await CapacitorUpdater.set(version); // sets the new version, and reloads the app
import { CapacitorUpdater, VersionInfo } from '@capgo/capacitor-updater'
import { SplashScreen } from '@capacitor/splash-screen'
import { App } from '@capacitor/app'
let version: VersionInfo;
App.addListener('appStateChange', async (state) => {
if (state.isActive) {
// Ensure download occurs while the app is active, or download may fail
version = await CapacitorUpdater.download({
version: '0.0.4',
url: 'https://github.com/Cap-go/demo-app/releases/download/0.0.4/dist.zip',
})
}
if (!state.isActive && version) {
// Activate the update when the application is sent to background
SplashScreen.show()
try {
await CapacitorUpdater.set(version);
// At this point, the new version should be active, and will need to hide the splash screen
} catch () {
SplashScreen.hide() // Hide the splash screen again if something went wrong
}
}
})
TIP: If you prefer a secure and automated way to update your app, you can use capgo.app - a full-featured, auto-update system.
Android Google Play and iOS App Store have corresponding guidelines that have rules you should be aware of before integrating the Capacitor-updater solution within your application.
Third paragraph of Device and Network Abuse topic describe that updating source code by any method besides Google Play's update mechanism is restricted. But this restriction does not apply to updating JavaScript bundles.
This restriction does not apply to code that runs in a virtual machine and has limited access to Android APIs (such as JavaScript in a web view or browser).
That fully allow Capacitor-updater as it updates just JS bundles and can't update native code part.
Paragraph 3.3.2, since back in 2015's Apple Developer Program License Agreement fully allowed performing over-the-air updates of JavaScript and assets.
And in its latest version (20170605) downloadable here this ruling is even broader:
Interpreted code may be downloaded to an Application, but only so long as such code: - (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store - (b) does not create a store or
$ claude mcp add capacitor-updater \
-- python -m otcore.mcp_server <graph>