ADR 011: AppImage Update Information for Third-Party Update Managers
Status
⛔ Superseded
Superseded by: Electron-Updater Auto-Update Research
The appimagetool post-processing approach implemented by this ADR does not produce working results within the electron-builder ecosystem. electron-builder uses its own AppImageUpdater class and latest-linux.yml metadata, ignoring the standard .upd_info ELF section that appimagetool embeds. The CI steps have been removed from build.yml and the project will pursue native electron-updater auto-updates instead.
Context
Teams for Linux distributes AppImage builds for Linux users. A feature request (Issue #2065) proposed embedding update metadata into AppImage releases to enable third-party update managers like Gear Lever to automatically detect and manage updates.
Key Constraints:
- electron-builder Limitation: electron-builder uses its own proprietary update mechanism (electron-updater) instead of the standard AppImage update information specification
- Multiple Architectures: Need to support x86_64, arm64, and armv7l builds
- CI Integration: Solution must work in GitHub Actions environment (no FUSE available)
- Backward Compatibility: Must not break existing electron-updater in-app update mechanism
Investigation Date: January 2026
The Problem
Without embedded update information:
- Third-party AppImage update tools (Gear Lever, AppImageUpdate, etc.) cannot detect available updates
- Users must manually check GitHub releases for new versions
- The AppImages lack the embedded
.upd_infoELF section that standard tools expect
Decision
Post-process AppImages with appimagetool to embed update information. This approach adds update metadata without affecting the existing electron-updater mechanism.
Implementation
Added two new steps to each Linux build job (linux_x64, linux_arm64, linux_arm) in .github/workflows/build.yml:
- Add AppImage update info - Downloads appimagetool, extracts the AppImage, and repacks with embedded update info
- Upload to release - Uses
gh release upload --clobberto upload modified AppImage and generated.zsyncfile
Update Information Format
Uses the GitHub releases zsync format:
gh-releases-zsync|IsmaelMartinez|teams-for-linux|latest|teams-for-linux-*<arch>*.AppImage.zsync
| Architecture | ARCH env | Pattern |
|---|---|---|
| x86_64 | x86_64 | *x86_64*.AppImage.zsync |
| arm64 | aarch64 | *arm64*.AppImage.zsync |
| armv7l | armhf | *armv7l*.AppImage.zsync |
CI Compatibility
Uses --appimage-extract-and-run flag with appimagetool to avoid FUSE requirement in GitHub Actions runners.
Consequences
Positive
- ✅ Third-party update manager support - Gear Lever, AppImageUpdate, and similar tools can now detect and manage updates
- ✅ Delta updates -
.zsyncfiles enable efficient delta updates (only download changed parts) - ✅ Better Linux integration - Aligns with AppImage ecosystem standards
- ✅ Dual update paths - Users can choose between in-app updates (electron-updater) or external tools
- ✅ No breaking changes - Existing update mechanism unchanged
Negative
- ⚠️ Increased build time - Adds ~2-3 minutes to each Linux build job
- ⚠️ Additional release assets -
.zsyncfiles added to GitHub releases - ⚠️ Maintenance overhead - appimagetool dependency in CI workflow
Neutral
- Both update mechanisms (electron-updater and AppImage update info) coexist independently
- Users updating via external tools may briefly see in-app "update available" notification until it re-checks
Alternatives Considered
Option 1: electron-builder Native Configuration
Configure electron-builder to generate .zsync files via publish settings.
Why rejected:
- electron-builder does NOT embed update info in the AppImage's ELF section
- Third-party tools still cannot detect updates
- Only works with electron-updater, not standard AppImage tools
Option 2: afterAllArtifactBuild Hook
Implement post-processing in a custom electron-builder hook.
Why rejected:
- Requires appimagetool to be available during local builds
- Complicates local development workflow
- Less transparent than explicit CI steps
Option 3: Separate Post-Release Workflow
Create a separate workflow triggered after release publication.
Why rejected:
- Adds complexity with multiple workflows
- Potential timing issues with release publication
- Harder to debug failures
Related
- Issue: #2065
- Implementation:
.github/workflows/build.yml