README
This page mirrors the GitHub README. For the full docs, use the sidebar.
What is this?
Section titled “What is this?”An open-source Tauri v2 plugin that pushes OTA frontend updates to users instantly — without rebuilding the native binary, without app store review, and without requiring a cloud service. Self-hosted, bring your own CDN.
It works by swapping Tauri’s embedded asset provider at startup. The WebView keeps loading from tauri://localhost — the swap is invisible. Your keys, your server, your infrastructure. If anything goes wrong, the app rolls back to embedded assets on next launch.
Platform Support
Section titled “Platform Support”| Platform | Supported |
|---|---|
| macOS | ✅ |
| Windows | ✅ |
| Linux | ✅ |
| Android | ✅ |
| iOS | 🔜 |
How it works
Section titled “How it works”Quickstart
Section titled “Quickstart”1. Install
Section titled “1. Install”[dependencies]tauri-plugin-hotswap = "0.0.1"npm install tauri-plugin-hotswap-api2. Configure
Section titled “2. Configure”Add to your tauri.conf.json:
{ "plugins": { "hotswap": { "endpoint": "https://your-server.com/api/updates/{{current_sequence}}", "pubkey": "<YOUR_MINISIGN_PUBKEY>" } }}3. Register the plugin
Section titled “3. Register the plugin”pub fn run() { let context = tauri::generate_context!(); let (hotswap, context) = tauri_plugin_hotswap::init(context) .expect("failed to initialize hotswap");
tauri::Builder::default() .plugin(hotswap) .run(context) .expect("error running app");}4. Add capability
Section titled “4. Add capability”In src-tauri/capabilities/default.json:
{ "identifier": "default", "windows": ["main"], "permissions": [ "core:default", "hotswap:default" ]}5. Use from the frontend
Section titled “5. Use from the frontend”import { checkUpdate, applyUpdate, notifyReady } from 'tauri-plugin-hotswap-api';
// Confirm current version works (call on every startup)await notifyReady();
// Check for updatesconst result = await checkUpdate();
if (result.available) { // Download, verify, and activate await applyUpdate();
// Reload to serve new assets window.location.reload();}You can also change configuration at runtime:
import { configure } from 'tauri-plugin-hotswap-api';
// Switch to a beta channel at runtimeawait configure({ channel: 'beta' });Features
Section titled “Features”| Feature | Description |
|---|---|
| Signed bundles | Every download is verified with minisign before extraction |
| Auto-rollback | If notifyReady() isn’t called, the next launch rolls back automatically |
| Channels | Route users to production, staging, beta — switchable at runtime |
| Custom headers | Auth tokens, API keys — sent on every check and download request |
| Retry with backoff | Failed downloads retry automatically (1s → 2s → 4s → 8s) |
| Download/activate split | Download now, apply later — you control the timing |
| Lifecycle events | hotswap://lifecycle events for telemetry (Sentry, PostHog, etc.) |
| Platform-aware | Sends platform, arch, channel on every check request |
| HTTPS enforced | Non-HTTPS URLs rejected by default |
| Atomic operations | Temp dir extraction + rename for crash safety |
| Custom resolvers | HotswapResolver trait — bring your own update source |
| Zip support | Enable with features = ["zip"] |
License
Section titled “License”MIT OR Apache-2.0 (same as Tauri)