[Bug]: Preview tabs can't be seen from mobile and all automation times out (Windows desktop unattended)#23015

opened21d agobyCcabamarcos

Before submitting

  • I searched existing issues and did not find a duplicate. Possibly related: #16921 (Windows snapshot/evaluate timeouts) and #19420 (remote preview stuck on "Connecting to browser…").
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server (preview automation / server browser), seen while the user was on the mobile client.

Steps to reproduce

  1. On Windows 11 desktop (T3 Code Beta 0.1.1), run a Claude Code thread. The user is away from the desktop and follows the thread from the mobile client.
  2. The agent calls preview_open with open: true and an external URL that redirects to a Microsoft Entra sign-in page (corporate SSO), so the user can sign in.
  3. The agent then calls preview_snapshot (with and without includeImage), preview_evaluate (document.body.innerText), preview_navigate and preview_wait_for.
  4. The user tries to view the tab from the mobile client to type the credentials.

Expected behavior

  • The tab opened with open: true is viewable and controllable from the mobile client, so the user can complete the sign-in.
  • Automation calls on the tab return a result, or a clear error explaining why the tab cannot be automated (e.g. no visible renderer).

Actual behavior

  • preview_open responses report "visible": false even with open: true; a later preview_status reported "visible": true, but the user still could not see the tab on mobile ("no lo puedo ver").
  • Every preview_snapshot, preview_evaluate and preview_navigate call timed out after 15000 ms (Preview automation snapshot timed out after 15000ms., Preview automation evaluate timed out after 15000ms., Preview automation navigate timed out after 15000ms.), across two different tabs.
  • preview_wait_for with a trivial text condition did return, reporting the page URL, so the page itself was loading.
  • While the agent owned the tabs, the user reported they could not sign in; closing the tabs with t3_preview_close released them. Reopening a new tab gave the same result.
  • Workaround for AWS SSO was a device-code flow approved on the phone; for apps that only support the web redirect flow there is no way to sign in until the user is back at the desktop.

Impact

Major degradation or frequent failure (blocks any login-gated browser work while the user is on mobile).

Version or commit

T3 Code (Beta) 0.1.1.0, Windows desktop; provider Claude (Agent SDK).

Environment

Windows 11 Pro 10.0.26300, desktop app running unattended; user connected from the mobile client. Default browser profile.

Logs or stack traces

1preview_open -> {"available":true,"visible":false,"url":"https://login.microsoftonline.com/<tenant>/saml2","title":"Sign in to your account","loading":false,"control":{"owner":"agent","ownedByCaller":true}}
2preview_snapshot -> Preview snapshot failed: Preview automation snapshot timed out after 15000ms.
3preview_evaluate -> Preview automation evaluate timed out after 15000ms.
4preview_navigate -> Preview automation navigate timed out after 15000ms.
5preview_status -> {"available":true,"visible":true,...,"control":{"owner":"agent","ownedByCaller":true}}
Synced from GitHub

Note

Posted by Claude Code (Opus 5.5) on behalf of the account owner.

This also happens on macOS, with a desktop client instead of a phone.

Setup: The host is the macOS desktop app on 0.1.3-nightly.20261023.3579; the desktop app runs the server itself. The client is the macOS desktop app on a second Mac, connected via T3 Connect.

What happens:

  • An agent opens a tab in a thread that isn't open in the host's window, because nobody is at the host.
  • The client's preview pane stays on "Connecting to browser…" forever. preview_snapshot times out, while preview_evaluate works.
  • When the same thread is opened on the host, new tabs connect immediately.
  • Tabs whose screenshot already hung never recover, even once the thread is on screen. Only new tabs work.

Why, from the source (commit 5bb54a0f):

  1. A tab of a thread that isn't on screen sits at (-100000, -100000). Electron doesn't composite it (apps/web/src/browser/hostedBrowserWebviewStyle.ts:51-74), so Page.captureScreenshot and Page.startScreencast never produce a frame. JS keeps running; requestAnimationFrame still ticks.
  2. attachViewer waits for startScreencast(1), then for pushStill (apps/server/src/preview/ServerBrowser.ts:2408-2410), before it returns the viewer's stream. pushStill → captureViewport has no timeout (:2346-2355). The viewer is therefore never wired up, and the client shows "Connecting…".
  3. The desktop host runs one screenshot per tab at a time (apps/desktop/src/preview/DesktopBrowserHost.ts:101-123), and the slot has no timeout. A capture that never returns blocks every later screenshot of that tab: viewer stills and agent snapshots alike. That explains why the old tabs stayed broken after the thread was opened.
  4. Since #19919, the desktop app also hosts tabs for threads that aren't open. So this now hits every agent tab whenever the user isn't at the host. That covers the "unattended" cases here and in #23139 / #23936.

It isn't the network or T3 Connect: the remote client reaches the server fine (navigation, reload and preview_evaluate work). The cause is that the desktop app draws the tab while the remote client is the one viewing it.

Fixes: #24133 and #22877 both take a background-activity lease around agent screenshots. That should fix point 2's initial still. I left a note on #24133 about the live stream. Points 2 and 3 would also be safer with a timeout, so one lost capture can't block a tab permanently.

Workaround meanwhile: keep the thread open on the host and open a fresh tab. Or run T3 as a standalone server (t3 serve) so tabs use headless Chrome.

Synced from GitHub

Additional observation on Windows with a remote T3 Connect client (collected 2026-10-27; posted by Codex on behalf of the account owner).

Environment: Windows 11 Enterprise build 26200, T3 Code desktop executable 0.1.2 / server 0.1.2, x64. The owner connected from another device through T3 Connect; the remote device OS/client type was not recorded. Whether this thread was visible in the host desktop window was not checked.

Observed:

  • The remote conversation remained usable. The owner saw the preview pane stuck on Connecting..., including after a fresh tab was opened.
  • preview_open / preview_navigate reported the local Node.js application's title and loading: false; a later status reported the tab visible. That metadata did not mean the owner could see it.
  • preview_snapshot returned Preview automation snapshot timed out after 15000ms. and preview_evaluate returned Preview automation evaluate timed out after 15000ms. The snapshot error recurred in a later check.
  • An independent headless browser on the host rendered the local application's overview and project list. This is a local control; it does not test T3 preview streaming. Remote interaction was not verified.

Sanitized server trace excerpts (UTC):

text
12026-10-27 01:26:01 snapshot tool call begins; duration 16014.1 ms
2 event: preview snapshot failed; operation=snapshot;
3 errorTag=PreviewAutomationTimeoutError; failureCount=1
42026-10-27 01:26:17 PreviewAutomationBroker.closeConnection / disconnect
52026-10-27 01:26:18 PreviewAutomationBroker.connect / acquireConnection
62026-10-27 01:26:19 subsequent preview call begins; duration 16011.4 ms
72026-10-27 01:26:35 PreviewAutomationBroker.closeConnection / disconnect
82026-10-27 01:26:36 PreviewAutomationBroker.connect / acquireConnection
92026-10-27 01:47:16 snapshot tool call begins; duration 16013.2 ms
10 event: preview snapshot failed; operation=snapshot;
11 errorTag=PreviewAutomationTimeoutError; failureCount=1
122026-10-27 01:47:32 PreviewAutomationBroker.closeConnection / disconnect
132026-10-27 01:47:33 PreviewAutomationBroker.connect / acquireConnection

The 15,000 ms value is the reported automation deadline; the approximately 16-second values above are measured enclosing trace durations. The broker reconnect events describe the preview automation host, not a demonstrated interruption of the T3 Connect conversation.

Limits: This resembles the report here and the broker sequence in #16921. It does not establish the cause of the initial stall or prove that the stream and automation failures share a cause. We did not restart the app, change the connection, test with the host thread foregrounded, or test the standalone-server workaround. No raw logs, credentials, pairing links or private application data are included.

Synced from GitHub

Same issue here on 2026-10-29. Windows 11 Pro (build 26300), Claude Code harness, following the thread from my phone. preview_open on http://localhost:4817/ (a local static server) first returned "visible": false with url chrome-error://chromewebdata/. That was a race: the server wasn't up yet. Calling it again loaded the page and reported the correct title with "visible": true. preview_resize (freeform 1440×900) succeeded but reported a viewport of 1280×800. preview_snapshot with includeImage: true failed with Preview automation snapshot timed out after 15000ms. On retry, the call was interrupted with no result. Workaround: close the tab and take screenshots with headless Edge (msedge --headless=new --screenshot).

So it isn't limited to SSO or external pages. Snapshots of a plain localhost page also time out when the user is on mobile.

Synced from GitHub

Note

Posted by Claude Code (Opus 5.5) on behalf of the account owner, from a t3 triage session.

Possibly the same problem, on the latest nightly: the desktop tab hangs for a phone viewer, and running the server without the desktop app avoids it. The cause of the unanswered tab is not established, so this may or may not share a root cause with this issue.

Environment

  • Host: Windows 10 Pro (build 19045) x64, T3 Code (Nightly) desktop app, server 0.1.7-nightly.20261101.4016
  • Viewer: Xiaomi 15, Android app t3code-android-internal-2.2.0-739.apk, from the 0.1.7-nightly.20261101.4016 release page
  • The phone connected to the host's private-network address

What happened Starting the browser from the phone worked in one thread. In a new thread it stayed on "Connecting to browser…". chrome-headless-shell was running the whole time, but it belonged to the first thread's tab.

Trace comparison (server.trace.ndjson, UTC, 2026-11-01)

TabHow it openedServerBrowser.attachViewer
First thread, 09:47Desktop created the tab but registered no webview. awaitAttached ran for 10 s, the desktop closed its tab, and chrome-headless-shell launchedFinished in under 2.4 s, repeatedly
New thread, 10:25Desktop registered the webview, awaitAttached 265 msNever finished: 45,845 ms and 132,955 ms, both Interrupted, with the GET /api/preview-stream/ws ending in 499
Replacement tab, 10:55Desktop registered the webviewPhone still on "Connecting to browser…" at 11:00. No finished attach in the trace when checked about 90 s later
Three threads, 11:13-11:19, server run with t3 serve and the desktop app closedHeadlessFinished in 58-1,621 ms, stream upgraded (101)

Diagnosis ServerBrowserStream runs attachViewer before upgrading the socket (ServerBrowserStream.ts:84, :109), and attachViewer waits on startScreencast and then the first still with no deadline (ServerBrowser.ts:2605, :2608, at tag v0.1.7-nightly.20261101.4016). A desktop-rendered tab that doesn't answer therefore leaves the phone connecting indefinitely.

Not established: why the desktop tab didn't answer, and why the first tab registered no webview. One check at 11:01, during this triage session, found the T3 window not minimized and not the foreground window.

Workaround Quit the desktop app and run the server with the matching version, so new tabs open headless:

npm dlx t3@0.1.7-nightly.20261101.4016 serve

Related #27663 look like they address the hang, and both were still open when checked. Also related: #24852, #23139.

Synced from GitHub

Note

Posted by Claude Code (Opus 5.5) on behalf of pdotwalt.

Another trigger for this on Windows: the host session is a Remote Desktop session that gets disconnected. Nobody uses the host's physical console; the account is only reached over RDP (from the same iPad that views the preview). When the RDP client disconnects (here: iOS suspends the RDP app after switching to T3), the Windows session has no display at all, the desktop app's tabs stop producing frames, and attachViewer hangs. It finishes a few seconds after the RDP session reconnects.

Environment: Windows 11 Pro (build 26200), T3 Code (Beta) desktop app 0.1.6 hosting the server; viewer is the iPad (iOS TestFlight app) over Tailscale, not T3 Connect.

Host trace (server.trace.ndjson) next to the TerminalServices-LocalSessionManager log, UTC, 2026-11-09:

EventTime
iPad opens stream (GET /api/preview-stream/ws), two attempts08:48:38, 08:48:53
RDP session reconnects08:54:31
Both attempts end (499 after 357,767 ms and 342,850 ms)08:54:35–36
Streams while RDP is connected: upgraded (101)08:56, after 0.5–11 s
RDP session disconnects09:09:44
iPad opens stream, two attempts (ServerBrowser.attachViewer 72,621 ms and 20,759 ms)09:11:04, 09:11:56
RDP session reconnects09:12:13
Both attaches finish09:12:17

The network is not involved: the iPad reaches the host directly at 13 ms, and the proxy in front of the server logs only "Opening handshake has timed out" towards T3.

So "nobody is at the host" also includes "the host's only session is a disconnected RDP session". In that state the thread being open in the T3 window doesn't help, because nothing is drawn. On Windows there is no way to make the desktop app use headless Chrome for its tabs, so a bounded attachViewer (#27663 / #25381 / #25862) plus a headless fallback when the desktop tab produces no frame would cover it. Workaround in the meantime: run tabs on a standalone t3 serve host (headless Chrome works there).