AppImageUpdate
Fast, bandwidth-efficient AppImage updater using zsync
Install / Use
/learn @pkgforge-dev/AppImageUpdateREADME
AppImageUpdate
<img src="https://img.shields.io/github/downloads/pkgforge-dev/AppImageUpdate/total" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/v/release/pkgforge-dev/AppImageUpdate" alt="GitHub Release"> <img src="https://img.shields.io/github/release-date/pkgforge-dev/AppImageUpdate" alt="GitHub Release Date">
A Rust implementation of AppImageUpdate - a tool for updating AppImages using efficient delta updates.
Features
- Delta Updates - Only download the changed portions of the AppImage, saving bandwidth and time
- Parallel Updates - Update multiple AppImages concurrently with per-URL deduplication
- Decentralized - No central repository required; updates come directly from the source
- Directory Scanning - Pass a directory to update all AppImages inside
- Progress Bars - Real-time progress during downloads with per-file bars
- Checksum Verification - SHA1 verification ensures downloaded files are valid
- Permission Preservation - Maintains executable permissions from the original AppImage
- Skip Unnecessary Updates - Automatically skips update if the target file already exists with the correct checksum
- In-Place Updates - Updates to same filename preserve old version as
.oldbackup
Installation
From Source
git clone https://github.com/pkgforge-dev/appimageupdate.git
cd appimageupdate
cargo install --path .
Usage
Update an AppImage
appimageupdate ./myapp.AppImage
Update Multiple AppImages in Parallel
appimageupdate ./app1.AppImage ./app2.AppImage ./app3.AppImage
AppImages are updated concurrently. When multiple AppImages share the same update source, the download happens only once and the result is copied to the rest.
Control parallelism with -J:
appimageupdate -J 4 ~/Applications/
Use 0 (default) to auto-detect based on CPU count.
Update All AppImages in a Directory
appimageupdate ~/Applications/
Check for Updates
appimageupdate -j ./myapp.AppImage
Check multiple AppImages in parallel:
appimageupdate -j ~/Applications/
Exit code 1 if any update available, 0 if all up to date.
Describe an AppImage
appimageupdate -d ./myapp.AppImage
Options
appimageupdate [OPTIONS] [APPIMAGE]...
Arguments:
[APPIMAGE]... Path(s) to AppImage(s) or directories to update
Options:
-O, --overwrite Overwrite existing target file
-r, --remove-old Remove old AppImage after successful update
-u, --update-info <INFO> Override update information in the AppImage
--output-dir <DIR> Output directory for updated AppImages
-d, --describe Parse and describe AppImage and its update information
-j, --check-for-update Check for update (exit 1 if any available, 0 if not)
-J, --jobs <N> Number of parallel jobs (default: 0 = auto-detect)
--github-api-proxy <URL> GitHub API proxy URL [env: GITHUB_API_PROXY]
(supports comma-separated list for fallback)
-h, --help Print help
-V, --version Print version
How It Works
- Reads Update Information - Extracts embedded update info from the AppImage's
.upd-infoELF section - Fetches Zsync Metadata - Downloads the
.zsynccontrol file which contains block checksums and file metadata - Calculates Delta - Compares local file blocks against remote blocks using rolling checksums
- Downloads Only Changes - Fetches only the blocks that differ from the local copy
- Assembles & Verifies - Reconstructs the file and verifies SHA1 checksum
Configuration
Create a config file at ~/.config/appimageupdate/config.toml:
# GitHub API proxy (supports single or multiple for fallback)
github_api_proxy = "https://ghproxy.net"
# Or multiple proxies:
# github_api_proxy = ["https://ghproxy.net", "https://mirror.example.com"]
# Remove old AppImage after successful update
remove_old = true
# Output directory for updated AppImages (supports shell expansion)
output_dir = "~/Applications"
Environment Variables
| Variable | Description |
|----------|-------------|
| GITHUB_API_PROXY | GitHub API proxy URL (comma-separated for multiple) |
| APPIMAGEUPDATE_REMOVE_OLD | Set to true to remove old AppImage after update |
| APPIMAGEUPDATE_OUTPUT_DIR | Output directory for updated AppImages |
Priority: CLI args > Environment variables > Config file
Supported Update Formats
zsync|<url>- Direct zsync URLgh-releases-zsync|<user>|<repo>|<tag>|<filename>- GitHub releases with glob pattern matching
Comparison with Upstream
This is a Rust rewrite of the upstream AppImageUpdate (C++/Qt).
Advantages:
- Single static binary with no runtime dependencies
- Over 10x smaller
- Cleaner, more maintainable codebase
- URL caching to avoid redundant API calls
- Proxy support
- Better error messages
Differences:
- No GPG signature verification (not implemented)
- No pling integration (not implemented)
- No GUI (not implemented)
Library Usage
use appimageupdate::{Updater, Error};
fn main() -> Result<(), Error> {
let updater = Updater::new("./myapp.AppImage")?
.progress_callback(|done, total| {
if total > 0 {
eprintln!("Progress: {}/{}", done, total);
}
});
if updater.check_for_update()? {
let (path, stats) = updater.perform_update()?;
println!("Updated to: {}", path.display());
println!("Saved {}% bandwidth", stats.saved_percentage());
} else {
println!("Already up to date!");
}
Ok(())
}
Related Skills
himalaya
344.1kCLI to manage emails via IMAP/SMTP. Use `himalaya` to list, read, write, reply, forward, search, and organize emails from the terminal. Supports multiple accounts and message composition with MML (MIME Meta Language).
node-connect
344.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
96.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
coding-agent
344.1kDelegate coding tasks to Codex, Claude Code, or Pi agents via background process
