A self-hosted update server for Tauri apps that securely serves updates from private GitHub releases.
It works as a proxy so your apps can update without exposing GitHub tokens.
Configuration is entirely environment-based, making it perfect for Docker deployments.
- Multi-Product Support – Serve updates for multiple apps from one server.
- Private Repositories – Securely fetch release assets from private GitHub repos.
- Dynamic Configuration – No static config files; everything comes from environment variables.
- Proxy Downloads – Keeps tokens server-side and hides GitHub asset URLs.
- Docker-Friendly – Includes a
Dockerfile
for quick deployment.
Copy the provided .env.SAMPLE
and adjust it for your products:
# --- Example Product Config ---
MYAPP_TOKEN=github_pat_xxxxxxxxxxxxxxxxxxxx
MYAPP_OWNER=your-github-username
MYAPP_REPO=my-awesome-app
# --- Another Product Example ---
ANOTHERAPP_TOKEN=github_pat_xxxxxxxxxxxxxxxxxxxx
ANOTHERAPP_OWNER=another-owner
ANOTHERAPP_REPO=another-repo
# --- Server Config (defaults: ADDRESS=0.0.0.0, PORT=8080) ---
ADDRESS=0.0.0.0
PORT=8080
HOSTNAME=https://updates.example.com
The _TOKEN
variable (e.g., MYAPP_TOKEN
) must be a GitHub Personal Access Token (PAT) with read-only
permission for the Contents of your private repository to access its release assets.
On startup a map of the product configs is read from the .env. Add as many products as you wish.
Locally
cargo run
With Docker
docker build -t tauri-update-server .
docker run --rm -it --env-file ./.env -p 8080:8080 tauri-update-server
-p 8080:8080
) matches your PORT
variable.
For production, consider hosting on Google Cloud Run, Fly.io, or Railway. They all support deploying directly from a Dockerfile and make it easy to manage environment variables.
When the updater
plugin is active in your tauri.conf.json
, Tauri's GitHub Action workflow automatically generates release assets with the correct naming convention. For more details, see the official Tauri documentation.
- Feature Channels: To support channels like
beta
, prefix the asset filename (e.g.,BETA.my-app_1.2.0_x64.msi
). The stable channel uses files without a prefix.
Refer to the Updater plugin docs and the official Tauri GitHub pipelines documentation for full details.
In your tauri.conf.json
, set the updater endpoints to your server:
{
"plugins": {
"updater": {
"active": true,
"endpoints": [
"https://updates.example.com/myapp/stable/{{target}}/{{arch}}/{{current_version}}"
]
}
}
}
Replace the following in the URL:
updates.example.com
→ your server’sHOSTNAME
myapp
→ the product name (from your.env
file)