Skip to content

[Bug]: Linux AppImage crashes with ICU SIGTRAP when enabling Network access #16629

Open

Description

@piotrnowakowski

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

The matching proposed fix is #15681, which is open and unmerged. This issue records the observed failure and independent reproduction for maintainer triage; it does not request approval of a particular implementation. Related reports and their differences are listed below.

Area

apps/desktop

Steps to reproduce

  1. On Fedora 44 x86-64 / KDE / Wayland, launch the official T3 Code 0.0.45 x86_64 AppImage with --no-sandbox. Start with Network access disabled (serverExposureMode: "local-only").
  2. Open Settings → Connections and enable Network access; allow the requested desktop restart.
  3. The existing process exits, but the replacement does not return to a usable window. Inspect coredumpctl for the replacement process: it has SIGTRAP.

An empty isolated profile reproduces the failure, so no project, chat history, active agent turn, or long-running session is required. To start a separate test instance from a writable directory:

# Set this to the downloaded 0.0.45 x86_64 AppImage.
appimage_path=/absolute/path/T3-Code-0.0.45-x86_64.AppImage
trial_dir=$(mktemp -d "$PWD/t3-repro.XXXXXX")
# Choose an unused backend port.
trial_port=43773

env -u APPIMAGE -u APPDIR -u ELECTRON_RUN_AS_NODE -u NODE_OPTIONS \
  T3CODE_HOME="$trial_dir/t3-home" \
  XDG_CONFIG_HOME="$trial_dir/config" \
  XDG_DATA_HOME="$trial_dir/data" \
  XDG_CACHE_HOME="$trial_dir/cache" \
  T3CODE_DISABLE_AUTO_UPDATE=true \
  T3CODE_PORT="$trial_port" \
  "$appimage_path" --no-sandbox > "$trial_dir/startup.log" 2>&1

# After triggering the restart in that test window:
coredumpctl list --since "5 minutes ago"

How the controlled reproduction was operated: the unmodified packaged AppImage was launched with the separate paths above and a dynamically selected unused port. A loopback Node inspector invoked the main window's webContents.executeJavaScript with:

window.desktopBridge.setServerExposureMode("network-accessible")

This is the renderer bridge for the setting's desktop:set-server-exposure-mode IPC method. The test first confirmed the initial mode was local-only and the main window had finished loading. The automated reproduction directly exercised that setting action; manual clicks through its confirmation dialog were not recorded.

Expected behavior

The setting is saved, the desktop restarts successfully, and the replacement opens a usable window with Network access enabled.

Actual behavior

The setting is saved, the old process exits normally, and the replacement crashes during Chromium/ICU startup with SIGTRAP / int3. Both the original crash core and the reproduced crash core contain:

ERROR:base/i18n/icu_util.cc:237
Invalid file descriptor to ICU data received.

The evidence strongly isolates the failure to the packaged AppImage restart/resource lifetime:

Check Observation
Original user incident Enabling Network access requested a relaunch; replacement PID 30875 crashed with SIGTRAP about two seconds later.
Unmodified AppImage, fresh isolated profile The same setting action requested a relaunch. The old mount /tmp/.mount_T3-CodDGCtZU was absent afterward; replacement PID 35459 crashed with the same ICU error and the same first five native stack offsets.
Minimal missing-ICU test The shipped t3code executable and libffmpeg.so, placed in a scratch directory without icudtl.dat, failed under GDB with --no-sandbox --version: same ICU error, SIGTRAP, and crash offset 0x5736e5e, before T3's interface loaded.
Persistent extracted-directory control The same AppImage was extracted to a persistent scratch directory, then its AppRun was launched with another empty profile. The same setting action restarted successfully. Replacement PID 37277 had a loaded t3code://app/#/welcome window and returned mode: "network-accessible" with an advertised endpoint.

Relevant shipped source: DesktopLifecycle.ts at commit 6c8fed35dded, lines 165–169 calls:

electronApp.relaunch({
  execPath: process.execPath,
  args: process.argv.slice(1),
});
electronApp.exit(0);

The bundled main.cjs was checked against that source. In the AppImage reproduction, process.execPath pointed to /tmp/.mount_T3-CodDGCtZU/t3code, while APPIMAGE pointed to the durable outer AppImage. The temporary mount disappeared after the old process exited.

Interpretation and limits: relaunching inside the outgoing AppImage mount is consistent with loss of icudtl.dat and the matching startup crash. The successful persistent-directory control and minimal missing-ICU test support that diagnosis. The precise native ordering of unmount, exec, and ICU file lookup was not captured with strace, and the original unsymbolized frames were not mapped to native function names. This report does not establish that simply changing the execPath passed to Electron's native relauncher is a sufficient fix; #15681 also addresses inherited descriptors and no_new_privs.

Impact

Major degradation or frequent failure

The settings restart terminates the desktop instead of returning a usable replacement. The original setting change affected the running desktop session; controlled reproductions used empty profiles. Whether in-progress provider turns recover after this failure was not tested.

Version or commit

  • Official T3-Code-0.0.45-x86_64.AppImage, stable release.
  • Package commit: 6c8fed35dded.
  • Bundled Electron: 44.4.2.
  • AppImage SHA-256: ab7b0a86d1ea657ccc162b60b772c61f70bc7c8b9e259b46939d53bb38faa02a.
  • The repository's latest stable release was still v0.0.45 when checked on 7 October 2026. No nightly build was tested in this investigation.

Environment

Fedora Linux 44 (KDE Plasma Desktop Edition), x86-64; kernel 7.2.4-200.fc44.x86_64; KDE / native Wayland; manual AppImage installation launched with --no-sandbox.

No particular provider or model is needed for the reproduction. The isolated-profile startup performed its normal provider discovery, but no user prompt or agent turn was started by the reproduction.

Logs or stack traces

Original incident, 7 October 2026, CEST (UTC+02:00); relevant lines only:

01:10:13.418  INFO: desktop relaunch requested
  channel: desktop:set-server-exposure-mode
  component: desktop-lifecycle
  reason: serverExposureMode=network-accessible

01:10:15  replacement PID 30875
  Signal: 5 (TRAP)
  Command Line: /t3code --no-sandbox
  kernel: trap int3

The crash occurred at 0x5736e5e relative to the executable. The independently reproduced replacement crash at 01:27:53 CEST, PID 35459, matches the first five original stack offsets:

Frame Original PID 30875 Reproduced PID 35459
0 0x5736e5e 0x5736e5e
1 0x598ba11 0x598ba11
2 0x4fd8688 0x4fd8688
3 0x4fd7fba 0x4fd7fba
4 0x4fd7dd7 0x4fd7dd7

Minimal missing-ICU GDB run:

ERROR:base/i18n/icu_util.cc:237] Invalid file descriptor to ICU data received.
Program received signal SIGTRAP, Trace/breakpoint trap.
CRASH_OFFSET 0x5736e5e

Shutdown also produced desktop:get-local-environment-enabled / ipcRenderer.sendSync() listener warnings. The same warning appeared in the successful extracted-directory control, so it does not by itself explain the native crash. No out-of-memory message was found in the original crash window.

Screenshots, recordings, or supporting files

All relevant text evidence is included above. No screenshot or recording was captured. Raw core dumps, complete process environments, usernames, home-directory paths, private host addresses, and full provider logs are deliberately excluded from this public report.

The original AppImage was read and extracted, not patched. Test processes were closed. A separate initial inspector-setup attempt caused a SIGBUS during forced test cleanup; that setup artifact is excluded from the matching setting-change reproduction and stack comparison above.

Workaround

Verified: run the same extracted AppImage files from a persistent directory; the setting restart succeeded in the isolated control. This was a diagnostic control, not a change to the reporter's installed application.

Manually reopening the outer AppImage after the failed automatic restart is a plausible recovery path, but was not verified against the reporter's existing profile. No source fix was applied or tested.

Related reports and proposed fixes

Investigated and drafted with Codex desktop at the reporter's request. Maintainer triage is requested for the observed failure; no particular implementation or PR approval is assumed.

Activity

  1. Chris-Peeters commented on Oct 19, 2026

    @Chris-Peeters

    Follow-up: affected relaunch implementation remains in current source

    While investigating another user's report of AppImage self-restart failing, I checked the release source for v0.1.1-nightly.20261019.3360 (1451e7cb23034d29774338608368a15d8845df36) and current main (5307c233b1f0ae72b8894dd39d94019aaf9e7cb8). Both still use this production relaunch path:

    yield* electronApp.relaunch({
      execPath: process.execPath,
      args: process.argv.slice(1),
    });
    yield* electronApp.exit(0);

    Source permalinks:

    The settings IPC handlers call this lifecycle relaunch when Network access or Tailscale Serve changes require a restart. There is no APPIMAGE-aware executable selection in that relaunch block, so the outgoing-mount concern documented in this issue still applies to the implementation.

    Scope/verification: this is source confirmation, not a new packaged runtime reproduction. The additional user's exact restart action, desktop-client version and crash logs have not been verified, so I am not claiming their incident is conclusively the same crash. In particular, “Restart to update” is a separate path: DesktopUpdates.ts calls quitAndInstall({ isSilent: true, isForceRunAfter: true }); this source finding alone does not diagnose update-restart failures.

    Adding this here instead of opening a duplicate. No fix was applied or runtime-tested in this follow-up. Prepared with Hermes Agent at the user's request.

  2. added
    needs more infoInitial triage showed no bug. Awaiting more info
    and removed
    needs more infoInitial triage showed no bug. Awaiting more info
    on Oct 22, 2026
  3. juliusmarminge commented on Oct 24, 2026

    @juliusmarminge
    Member

    Reproduced the packaged restart failure on current main d53873b6a4 under Ubuntu/Xvfb: two fresh-profile Network access bridge actions lost the old FUSE mount and returned no usable replacement. Replacement-main SIGBUS was observed; the historical ICU signature remains unverified. The extracted-main control and packaged head of #15681 restarted successfully. Commands, recordings and limitations. Supplemental evidence is on that existing, unmerged PR.

  4. cpcodes commented on Oct 31, 2026

    @cpcodes

    Reproduced on T3 Code v0.1.6 (desktop AppImage, t3_code_alpha.appimage --no-sandbox), Fedora 44 (kernel 6.18.56), KDE Plasma Wayland, Node 26.

    Trigger: Settings → Sharing & Access → enable Tailscale HTTPS. The desktop logs desktop relaunch requested (reason tailscale-serve-enabled), then ElectronApp.relaunch → Success, and exits. No replacement window ever appears.

    coredumpctl shows the replacement /t3code dying with SIGTRAP at every restart. Four reproductions in 20 minutes (08:20, 08:22, 08:24, 08:38 PDT), each matching a relaunch span in desktop.trace.ndjson. Starting the AppImage manually afterwards always works.

    The v0.1.6 tag (2359643c) still relaunches with execPath: process.execPath (apps/desktop/src/app/DesktopLifecycle.ts:226), which points inside the /tmp/.mount_* FUSE mount that the AppImage runtime tears down when the old process exits. +1 for #15681.

    Triage by Niss (Claude Opus 5.5, claude-opus-5-5) via t3 triage, Claude Code.

  5. greatcorrectandglory commented on Nov 9, 2026

    @greatcorrectandglory

    Another reproduction on 0.1.7 beta (Arch/Omarchy, Wayland) — and it also happens when disabling exposure

    Adding this here instead of opening a duplicate; same signature as the ICU-startup SIGTRAP above.

    Version: T3 Code 0.1.7 beta, official x86_64 AppImage, Electron 44.10.1 / Chrome 152.0.7977.169. Launched from the .desktop entry via uwsm/gtk-launch on Arch-based Linux (Omarchy), Hyprland / native Wayland (no --no-sandbox in the desktop entry).

    Reproductions: 3 crashes in 13 minutes on the same install. Every server-exposure change that requests a restart killed the replacement, and all three landed on the same instruction (SIGTRAP, int3) with identical frames 0–4:

    desktop.lifecycle.relaunch reason replacement crash stack frames 0–4
    02:29:25.403 serverExposureMode=network-accessible 02:29:27, PID 119104 0x519a1ce / 0x56e9b21 / 0x58fabd8 / 0x58fa50a / 0x58fa2a7
    02:38:44.771 tailscale-serve-enabled 02:38:45/46, PID 122724 same
    02:42:04.406 serverExposureMode=local-only 02:42:06, PID 125641 same

    The absolute offset differs from the 0.0.45 report only because the bundled Electron/Chromium build differs.

    What coredumpctl and the journal show

    • The crashed PID is never the systemd scope leader (app-com.t3tools.T3Code-<oldpid>.scope); it is the replacement the app spawned. e.g. old instance 123207 → crashed 125641.
    • Kernel: traps: t3code[...] trap int3 ip:... in t3code[51991ce,...]. The core's NT_PRPSINFO.pr_psargs is /t3code, and NT_FILE maps /t3code — i.e. the path inside the AppImage, after the mount has been detached.
    • tmp-.mount_T3-Code<random>.mount: Deactivated successfully is logged in the same second as every trap.
    • The crash stack unwinds to __libc_start_main (shallow startup path), consistent with a failed early ICU-data lookup.
    • I could not capture the ERROR:base/i18n/icu_util.cc:237 line: the app's stdout/stderr is not in the journal and the core is filtered (1.9 MB). The location and stack are reproducible every time, though.
    • No OOM or resource pressure: 15 GiB RAM, 31 GiB swap, zero oom-kill entries in the window.

    It fails in both directions. The title says "enabling Network access", but the same happens switching back to local-only, and when toggling Tailscale Serve. So it is any exposure change that calls DesktopLifecycle.relaunch, not only enabling.

    No data loss. The setting is persisted before the restart (desktop.settings.writeSettings → Success), and manually launching the AppImage again starts normally with the new setting applied. Only the automatic restart is lost.

    Source: 0.1.7's app.asar still relaunches with execPath: yield* ExecutablePath (defaults to process.execPath); environment.appImagePath (from $APPIMAGE) is already available but not used for relaunch. Matches #15681.

    Happy to provide the redacted trace lines or the core note details if useful.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions