Repository navigation
[Bug]: Linux/Hyprland desktop exits silently with no crash diagnostics #10911
Description
Before submitting
- I searched existing issues and did not find a duplicate of this specific failure.
- I included enough detail to reproduce or investigate the problem.
Area
apps/desktop
Steps to reproduce
- Launch T3 Code from the desktop under Hyprland/Wayland.
- Use the app normally. The exact interaction immediately preceding the failure is unknown.
- The desktop window/process disappears; launching T3 Code again restores access.
This was observed once so far and is not yet deterministic.
Expected behavior
The desktop app should remain open. If it has to exit, it should leave a visible error and a useful crash/exit diagnostic.
Actual behavior
The T3 Code desktop process disappeared unexpectedly. The prior app scope started at 2026-09-09 10:55:34 CEST, and the next launch occurred at 11:02:38 CEST. The replacement process is running normally now.
Impact
Major degradation or frequent failure
Version or commit
t3code-bin 0.0.38-1 (installed 2026-09-09 10:34 CEST)
Environment
Arch Linux x86_64, kernel 7.1.9-arch1-2
Hyprland 0.56.2, Wayland
Electron desktop launched with --ozone-platform=wayland
Intel UHD 630 + NVIDIA GeForce GTX 1050 Ti Mobile
Mesa 26.2.1
Logs or stack traces
# journalctl --user
2026-09-09 10:55:34.535443 CEST systemd[953]: Started app-t3code-87926.scope.
2026-09-09 11:02:38.906517 CEST uwsm_app-daemon[1445]: received: app -- gtk-launch t3code.desktop
2026-09-09 11:02:38.906517 CEST uwsm_app-daemon[1445]: sent: exec systemd-run --user --scope --slice=app-graphical.slice '--unit=app-Hyprland-gtk\\x2dlaunch-cf8add58.scope' --description=gtk-launch --quiet --collect --same-dir -- gtk-launch t3code.desktop
2026-09-09 11:02:39.902160 CEST systemd[953]: Started app-t3code-105259.scope.
# systemd scope state for the exited app
Id=app-t3code-87926.scope
ActiveState=inactive
SubState=dead
Result=success
# checks performed
- coredumpctl list: no entry for /usr/lib/t3code/t3code
- no OOM-killer event in the kernel/user journal
- no T3 Code Crashpad dump was present; only Crashpad/client_id existed
- free -h at investigation time: 31 GiB total, 22 GiB available
The available evidence confirms an unexpected process exit/relaunch, but does not identify whether the cause was an application-level exit, Electron/Wayland failure, or another external termination.
Workaround
Relaunching T3 Code restored the app.
Activity
juliusmarminge commentedon Sep 9, 2026
Triage
Confirmed as a real desktop diagnostic gap, and not a duplicate of #10517 or #2216. The mid-session exit itself is still unexplained — one observation, no app-side logs, no crash artifact.
What this is / is not
Result=success)ready-to-showon Wayland)#4918 (closed, unmerged) is the same user outcome on AppImage relaunch (“quit and never came back”).
t3code-binis an extracted AppImage without$APPIMAGE, and Linux auto-update is disabled unless that env is set, so this is probably not an updater/relaunch miss.No open or merged PR fixes a mid-session silent exit under Hyprland/Wayland.
What the journal actually shows
app-t3code-87926.scope→inactive/dead,Result=success. That is exit code 0, not SIGSEGV, SIGKILL, or OOM.Together with no
coredumpctlentry, no OOM, and Crashpad only havingclient_id, this looks like a clean shutdown or an uncaptured Chromium/Ozone abort, not a dumped native crash.What the desktop process does today
On Linux, last window closed calls
app.quit()(DesktopLifecyclewindow-all-closed). Hyprland closing the surface (killactive, close, or a Wayland protocol error) is enough to make the app disappear with no dialog.SIGINT/SIGTERMare treated as a normal quit (quitFromSignal→app.quit()), which also yieldsResult=success.Visible errors are startup-only (
whenReady/bootstrap→showErrorBox). Mid-session, there is no terminal UI.Crash reporting is effectively off:
crashReporter.start()is never called, so Crashpad often leaves onlyclient_id.uncaughtException/unhandledRejection.child-process-gone/gpu-process-crashedhandlers.render-process-goneonly logs and may reload the renderer; it does not keep a dead main process on screen.Logging: Effect goes to stdout (
Logger.consolePretty) plus~/.t3/userdata/logs/desktop.trace.ndjson. gtk-launch usesTerminal=false, so stdout never hits the journal. There is no rotatingdesktop-main.log. Backend child output is~/.t3/userdata/logs/server-child.logand would not take down the Electron window by itself (#10517).Forced
--ozone-platform=waylandon Intel UHD 630 + GTX 1050 Ti Mobile is a known Chromium/Electron hazard (wrong GPU, Vulkan/Ozone mismatch, GPU process death). Some of those paths exit 0 and skip Crashpad.Likely causes (unconfirmed)
Need traces to tell these apart.
Suggested next step
Not starting a crash-reporter or Wayland-GPU change until we have one more data point.
Please attach, if they still exist:
~/.t3/userdata/logs/desktop.trace.ndjsonfrom 10:55–11:03 CEST — look forbefore-quit received,desktop.lifecycle.windowAllClosed,process signal received,main window render process gone.~/.t3/userdata/logs/server-child.logfor the same window (rules out a child crash-loop).killactive/ Ctrl+Q, or it vanished while focused and idle.journalctl --userfor that interval (the snippet only has the scope start + relaunch).If it happens again:
Workaround to try:
--ozone-platform=x11(or drop the forced Wayland flag) on this hybrid box.If traces show
before-quit/windowAllClosed, this is quit-on-last-window and we should log a reason and/or keep the process. If traces just stop, next product work is a real mid-session diagnostic (file log + Crashpadstart()+ GPU/child-process handlers), related to #10517 but scoped to “the desktop process vanished.”Vanir20342222 commentedon Sep 9, 2026
AI model:
gpt-5.6-lunaThanks for the detailed triage. I checked the requested evidence locally and found no sensitive data that should be attached.
desktop.trace.ndjsonis present, but there is nobefore-quit,windowAllClosed, signal, renderer-process-gone, or GPU-process-crashed event in the relevant interval.server-child.logis not present. The available server trace shows normal activity around the relaunch and no backend crash or crash-loop.killactive/Ctrl+Q was used, or that a GPU abort occurred, so the trigger remains unknown.So this still looks like an uncaptured clean exit or compositor/Electron termination, with no local trace that distinguishes those cases. I have not attached the raw logs because they include local environment/project details. I’ll try the
--ozone-platform=x11workaround if it recurs, and will capture a focused trace with logging enabled before relaunching.kyryl-bogach commentedon Sep 17, 2026
Same failure on Arch + Hyprland, on 0.0.42. I have data that narrows this down: the backend child died first, and the desktop shell then quit itself on purpose. The shell is a victim, not the cause.
Environment
t3code-bin 0.0.42-1(Arch AUR), kernel7.2.5-3-omarchy--ozone-platform=waylandIncident
Session started 2026-09-17 09:23:33 CEST, died 09:40:20 CEST. No user action, an agent run was streaming.
~/.t3/userdata/logs/desktop.trace.ndjsonholds the cause. The span forrunBackendProcess, opened at session start, closes with:The shell then ran an orderly shutdown, which is why systemd sees a clean exit and why there is no crash artifact:
The backend leaves no error of its own
server.trace.ndjsonstops dead at 09:39:28, roughly 50 seconds before the shell gives up. The last line is a normalhandleSdkMessagespan with"exit":{"_tag":"Success"}. There is no error record, no shutdown span, nothing. The process had no chance to write one.Workload in its final 90 seconds, by span name:
883 SDK messages in 90 seconds, each driving a SQLite write plus a full rebuild of eight projections. Provider was
claudeAgenton a long-running thread.systemd accounting
Caveat on that number: cgroup
memory.peakcounts page cache, so it overstates real usage. In the session that followed I measuredMemoryPeak=5.7GagainstMemoryCurrent=544M, with about 1.3 GB of actual process RSS. So 25.6 G is not by itself proof of a leak. The CPU figure is solid: about 1.5 cores sustained for 17 minutes.Causes ruled out
app-graphical.slicehasMemoryHigh=infinityandMemoryMax=infinity, so no cgroup limit applied.coredumpctlhas no entry for t3code. An unrelated Node OOM on this machine two days earlier did produce a dump, so core dumps do work here. Electron's own handler suppresses them for t3code.~/.config/t3code/Crashpad/holds onlyclient_id.pacmanupgrading 0.0.40-1 to 0.0.42-1 eighteen seconds earlier. Worth knowing when reading Linux reports: an in-place upgrade looks identical to a silent crash in the journal.What is still unknown
Whether the backend hit the V8 heap cap, took a native crash, or was killed. Nothing on this machine records it.
Two things would close that gap:
BackendProcessExitStatusErrorsays the parent could not even read the exit status, which is its own bug.FATAL ERROR: ... JavaScript heap out of memoryto stderr and nowhere else. Neither trace log captures it, so it is lost unless the app is started from a terminal. I am running that way now and will report back if it reproduces.Trace excerpts
https://gist.github.com/kyryl-bogach/9d260d7ba4c1c98d12b7489176feaf9d
server-final-120s.ndjson- the backend's last 120 seconds. The file ends where the process died, mid stream, with no error record.desktop-shutdown.ndjson- the detection and shutdown, including therunBackendProcessFailure span.These are rebuilt from a field allowlist rather than scrubbed, so nothing outside the allowlist can appear. The gist README lists exactly what is kept and what is dropped.
Two things I had to drop are worth naming.
git.cwdcarries absolute paths to private repositories.url.fullcarries awsTicketbearer token in plain text, 31 times in one rotated file. A credential written unredacted into local trace logs may deserve its own issue.Happy to supply more on request.