Skip to content

Fix Linux AppImage launch failure (libfuse2) + per-arch artifact name - #1575

Open
kkerti wants to merge 1 commit into
stablefrom
fix/linux-appimage-runtime-and-arch-artifactname
Open

Fix Linux AppImage launch failure (libfuse2) + per-arch artifact name#1575
kkerti wants to merge 1 commit into
stablefrom
fix/linux-appimage-runtime-and-arch-artifactname

Conversation

@kkerti

@kkerti kkerti commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Problem

Since the Linux build pipeline changed, users report the AppImage failing to launch:

  • Manjaro: execv error: Transport endpoint is not connected (ENOTCONN)
  • Ubuntu: execv error: Input/output error (EIO)

Flatpak builds are unaffected.

Root cause

1. Legacy FUSE2 AppImage runtime. electron-builder 26.8's toolsets.appimage defaults to "0.0.0", which uses the legacy runtime (buildFuse2AppImage). That runtime dynamically links libfuse.so.2 to self-mount its embedded squashfs. Manjaro/Arch and current Ubuntu (23.10 / 24.04+) no longer ship libfuse2 by default, so the mount never comes up → accessing AppRun at the dead mountpoint returns ENOTCONN / EIO → the runtime prints execv error: <errno> before the app starts. Flatpak doesn't use the AppImage/FUSE runtime, so it was never affected.

2. artifactName missing ${arch}. The matrix builds AppImages on both ubuntu-22.04 (x64) and ubuntu-22.04-arm (arm64). The publish job downloads all artifacts into one directory with merge-multiple: true, so both builds shared the filename grid-editor-linux-<ver>.AppImage and silently overwrote each other — one arch's users could get the wrong-arch binary.

Fix

  • Set toolsets.appimage: "1.0.2" (runtime 20251108). This toolset bundles the FUSE libraries inside the AppImage (usr/lib), removing the host libfuse2 dependency.
  • Add ${arch} to linux.artifactName so x64/arm64 keep distinct filenames.

Auto-update: verified safe

Checked against the installed electron-updater:

  • Update file is selected by extension (findFile(..., "AppImage", ...)), not by filename — the rename doesn't affect selection.
  • Each arch already reads its own channel file (getChannelFilePrefix(): x64 → latest-linux.yml, arm64 → latest-linux-arm64.yml), and electron-builder regenerates those pointing at the new arch-specific files. This actually repairs the prior collision where both channels referenced a single overwritten AppImage.
  • Differential (blockmap) updates keep working: the version string is substituted per update while the arch token stays constant. The first hop from an old no-arch build falls back to a full download, which is the normal safe fallback.

Note

toolsets.appimage: "1.0.2" is marked beta in electron-builder. Recommend validating a produced AppImage on a clean Manjaro / Ubuntu 24.04 box without libfuse2 installed before the release goes out.

🤖 Generated with Claude Code

Users on Manjaro and Ubuntu report the AppImage failing to launch with
"execv error: Transport endpoint is not connected" / "Input/output
error". Two Linux packaging issues, both introduced with the new build
pipeline:

1. electron-builder's default AppImage toolset ("0.0.0") embeds the
   legacy runtime that dynamically links libfuse.so.2 to self-mount its
   squashfs. Manjaro/Arch and current Ubuntu (23.10 / 24.04+) no longer
   ship libfuse2 by default, so the mount fails and the runtime aborts
   with ENOTCONN/EIO before the app starts. Opt into the modern toolset
   ("1.0.2", runtime 20251108), which bundles the FUSE libraries inside
   the AppImage and drops the host libfuse2 dependency. Flatpak was
   unaffected because it never uses the AppImage/FUSE runtime.

2. linux.artifactName was missing ${arch}. The matrix builds AppImages
   on both x64 and arm64 runners, and the publish step merges all
   artifacts into one directory, so the two builds shared a filename and
   silently overwrote each other. Add ${arch} so each arch keeps its own
   file.

Auto-update path is preserved: electron-updater selects the update by
".AppImage" extension (not filename), and each arch already reads its
own channel file (latest-linux.yml / latest-linux-arm64.yml), so the
arch-specific names line up. This actually repairs the prior collision
where both channels referenced one overwritten file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@kkerti

kkerti commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

This PR also fixes the fact, that appimage artifacts overwrote each other without {arch} in their filename. We introduced arm builds, this caused the regression. As files were ovewritten, but electron updater yaml held correct metadata targeting specific files, this corrupted the automatic update flow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant