

OTA (Over-The-Air) updates for Tauri applications. 100% feature parity with @capgo/capacitor-updater.
Open-source alternative to Tauri's built-in updater with live update capabilities.
- ๐ Live Updates - Push updates instantly without app store review
- ๐ Auto-Update - Automatic update checking and installation
- ๐ก๏ธ Rollback Protection - Automatic rollback if update fails
- ๐ฆ Bundle Management - Full control over downloaded bundles
- ๐ End-to-End Encryption - Secure update delivery
- ๐ Channel System - Deploy to different user groups
- โฑ๏ธ Delay Conditions - Control when updates are applied
npm install @capgo/tauri-updater
Install and register these Tauri plugins in your app:
@tauri-apps/plugin-fs
@tauri-apps/plugin-http
@tauri-apps/plugin-process
import { TauriUpdater } from '@capgo/tauri-updater';
const updater = new TauriUpdater({
appId: 'com.example.app',
autoUpdate: true,
});
await updater.initialize();
// IMPORTANT: Call this on every app launch!
await updater.notifyAppReady();
// Check for updates manually
const latest = await updater.getLatest();
if (latest.url && !latest.error) {
const bundle = await updater.download({
url: latest.url,
version: latest.version,
checksum: latest.checksum,
});
// Queue for next restart
await updater.next({ id: bundle.id });
}
updater.addListener('download', (event) => {
console.log(`Download progress: ${event.percent}%`);
});
| Method | Description |
|---|
notifyAppReady() | Must be called on every launch - Confirms bundle loaded successfully |
download(options) | Download a bundle from URL |
next(options) | Queue bundle for next restart |
set(options) | Immediately switch to bundle and reload |
reload() | Reload the app with current bundle |
delete(options) | Delete a bundle from storage |
reset(options) | Reset to builtin or last successful bundle |
| Method | Description |
|---|
current() | Get current bundle and native version |
list(options) | List all downloaded bundles |
getNextBundle() | Get bundle queued for next restart |
getFailedUpdate() | Get info about last failed update |
getBuiltinVersion() | Get version shipped with app |
| Method | Description |
|---|
getLatest(options) | Check server for latest version |
| Method | Description |
|---|
setChannel(options) | Assign device to a channel |
unsetChannel(options) | Remove channel assignment |
getChannel() | Get current channel |
listChannels() | List available channels |
| Method | Description |
|---|
setMultiDelay(options) | Set conditions before update applies |
cancelDelay() | Clear all delay conditions |
Delay condition types:
background - Wait for app to be backgrounded (with optional duration)
kill - Wait for app to be killed and restarted
date - Wait until specific date/time
nativeVersion - Wait for native app update
| Method | Description |
|---|
getDeviceId() | Get unique device ID |
setCustomId(options) | Set custom identifier |
| Method | Description |
|---|
setUpdateUrl(options) | Change update server URL |
setStatsUrl(options) | Change statistics URL |
setChannelUrl(options) | Change channel URL |
setAppId(options) | Change App ID |
getAppId() | Get current App ID |
| Method | Description |
|---|
setDebugMenu(options) | Enable/disable debug menu |
isDebugMenuEnabled() | Check debug menu state |
| Event | Description |
|---|
download | Download progress updates |
updateAvailable | New update available |
noNeedUpdate | Already up-to-date |
downloadComplete | Download finished |
downloadFailed | Download failed |
breakingAvailable | Incompatible update available |
updateFailed | Update installation failed |
appReloaded | App was reloaded |
appReady | notifyAppReady() was called |
const updater = new TauriUpdater({
appId: 'com.example.app',
version: '1.0.0',
autoUpdate: true,
appReadyTimeout: 10000,
updateUrl: 'https://plugin.capgo.app/updates',
channelUrl: 'https://plugin.capgo.app/channel_self',
statsUrl: 'https://plugin.capgo.app/stats',
publicKey: '...',
defaultChannel: 'production',
autoDeleteFailed: true,
autoDeletePrevious: true,
resetWhenUpdate: true,
directUpdate: false,
allowModifyUrl: false,
allowModifyAppId: false,
persistCustomId: false,
persistModifyUrl: false,
debugMenu: false,
disableJSLogging: false,
periodCheckDelay: 0,
});
- When a new bundle loads, a timer starts (default: 10 seconds)
- Your app must call
notifyAppReady() before the timer expires
- If the timer expires, the update is considered failed
- The app reloads the last-known good bundle
Full documentation is available at capgo.app/docs.
Join the discord to get help.
Mozilla Public License Version 2.0. See LICENSE for details.