Skip to content

[Bug]: The QUIC → HTTP/2 fallback is lost on every server restart, so each update brings back minutes of 530 on QUIC-hostile networks #26513

Closed

Description

@1007cordon-ux

Before submitting

Area

apps/server

Steps to reproduce

  1. Run T3 Code with T3 Connect on a network where QUIC to the tunnel edge (UDP 7844) stalls but TCP 7844 works. Here: macOS behind a TUN-mode proxy.
  2. Wait for ManagedEndpointRuntime to see QUIC_STALLS_BEFORE_HTTP2 stalls and restart cloudflared with --protocol http2. The tunnel is then healthy.
  3. Restart the server or desktop app (here an auto-update restart: "Keeping the managed tunnel across the update restart").

Expected behavior

The connector keeps using HTTP/2 after the restart, because this machine has already shown that QUIC does not work for it.

Actual behavior

http2Ref is Ref.make(false) inside the runtime (apps/server/src/cloud/ManagedEndpointRuntime.ts, around L197), so every new server process starts cloudflared with protocol: "auto" again and has to relearn the fallback. Timeline from server.trace.ndjson (local time, UTC+8, 2026-10-28):

  • 20:40:51 update restart; 20:41:00 relay client started, protocol: "auto"; 20:41:06 Tunnel connected · 4 connections · QUIC
  • 20:45:33 cloudflared has not connected to Cloudflare yet (0 ready connections)
  • 20:47:18 relay client restarted with protocol: "http2"
  • 20:52:22 Tunnel connected · 4 connections · HTTP2

Before the restart, the same machine had been on HTTP/2 with 4 connections (20:32).

Impact

Each restart on such a network costs several minutes of HTTP 530 for remote clients, including outside MCP agents that reach the environment only through T3 Connect. Nightly updates restart often, so this keeps happening.

Version or commit

v0.1.4-nightly.20261028.3824 (desktop), managed cloudflared 2026.10.4. Same code on main @ 5211acf.

Environment

macOS (Apple silicon), desktop app with the bundled server, T3 Connect managed tunnel, system-wide TUN proxy.

Logs or stack traces

Relay client start events from the trace (ids omitted):

20:41:00 Relay client process started; waiting for tunnel connection { version: "2026.10.4", protocol: "auto" }
20:47:18 Relay client process started; waiting for tunnel connection { version: "2026.10.4", protocol: "http2" }

Workaround

Set TUNNEL_TRANSPORT_PROTOCOL=http2 in the server's environment (on macOS: launchctl setenv before T3 Code starts). T3 then treats it as the user's choice.

Suggestion

Persist the fallback, for example in server state per network or with a TTL, or start with HTTP/2 when the previous run had to fall back.

Activity

  1. Matt-BF commented on Oct 29, 2026

    @Matt-BF

    Hey t3 team! First of all, thanks for this great software, It has been quite useful for my workflow in bio research.

    I think I'm having a similar issue. I'm running t3 code inside an HPC environment, and trying to connect to it via t3 connect from my desktop app. The connection keeps falling randomly, and when I first try to start in the morning it takes quite a long time to actually connect the environments. If it helps, here's what codex (GPT-6.1-Sol medium, CLI) via t3 triage has suggested:

    Additional evidence from a Linux host running T3 Code as a systemd user service.
    
    What happened
    
    The desktop app could not connect through T3 Connect. Diagnostics reported tunnel_down, HTTP 530, and endpoint_request_failed. The local server remained healthy.
    
    Environment
    
    - Desktop app and host version: 0.1.3.
    - Host: Linux x64, kernel 4.18.0-553.150.1.el8_10.x86_64.
    - Node: v26.12.1.
    - Managed cloudflared: 2026.10.4.
    
    Evidence
    
    Timeline on 2026-10-29, UTC, from the host service log:
    
    16:16:43  Relay client started with protocol: 'auto'.
    16:16:48  Failed to dial a quic connection:
              timeout: no recent network activity.
              Repeated across multiple Cloudflare edge addresses.
    16:17:16  T3 Connect NOT reachable; connector_not_ready.
    16:19:11  cloudflared warned that outbound UDP 7844
              was likely blocked or dropped.
    16:19:12  First tunnel connection registered with protocol=http2.
    16:19:17  T3 Connect reachable; 4 connections; HTTP2.
    
    Startup to confirmed recovery took approximately 154 seconds. Recovery occurred automatically, without configuration changes or a restart during investigation.
    
    Read-only checks confirmed:
    
    - The local environment endpoint answered and reported server version 0.1.3.
    - TCP port 7844 connected successfully to two affected Cloudflare edge addresses.
    - After recovery, t3 connect status confirmed four working HTTP/2 connections.
    
    Diagnosis and reproduction limits
    
    This is consistent with QUIC failing on the host network while HTTP/2 works. In the v0.1.3 source, ManagedEndpointRuntime.ts initializes http2Ref to false for each server process and supports TUNNEL_TRANSPORT_PROTOCOL=http2.
    
    A controlled restart reproduction was not performed. This evidence confirms the startup delay and automatic recovery.
    
    Workaround
    
    Forcing HTTP/2 through the service environment was proposed but not applied.
    
    Prepared by Codex, GPT-6, via t3 triage.
    
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