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
Dockerfilefor 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.comThe _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 runWith 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’sHOSTNAMEmyapp→ the product name (from your.envfile)