Skip to content

[Bug]: T3 Connect relay client cannot be installed on Windows ARM64 (no win32-arm64 cloudflared asset) #14836

Description

@zachspartofaday

Before submitting

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

Area

packages/contracts or packages/shared

Steps to reproduce

  1. Install the Windows ARM64 desktop build of T3 Code on a Windows 11 ARM64 machine with no cloudflared on PATH and T3CODE_CLOUDFLARED_PATH unset.
  2. Open Connections and turn on T3 Connect for that environment.

Expected behavior

T3 Code downloads, verifies, and activates the managed relay client, as it does on win32-x64, darwin-, and linux-.

Actual behavior

T3 Connect cannot be enabled. The UI reports that the relay client cannot be installed automatically.

CLOUDFLARED_RELEASE_ASSETS in packages/shared/src/relayClient.ts has no win32-arm64 key (still true on main @ 54084ae). resolveReleaseAsset("win32", "arm64") returns null, so resolve reports status: "unsupported" and installWithProgress fails with unsupported_platform ("T3 Code does not provide a managed relay client binary for win32-arm64").

Cloudflare does not publish a native Windows ARM64 cloudflared. Both 2026.5.2 and the current 2026.9.3 ship only windows-386 and windows-amd64 Windows assets.

Impact

Blocks work completely

Version or commit

0.0.45-nightly.20261002.2584 (desktop); code path confirmed on main @ 54084ae

Environment

Windows 11 ARM64 (build 26200), T3 Code (Nightly) desktop, Windows ARM64 build

Logs or stack traces

# relayClient.ts on main
if (!releaseAsset) {
  return yield* new RelayClientInstallError({
    reason: "unsupported_platform",
    message: `T3 Code does not provide a managed relay client binary for ${platform}-${arch}.`,
  });
}

Proposed fix

Map win32-arm64 to the existing pinned windows-amd64 asset. Windows 11 on ARM runs x64 binaries under its built-in emulation, and the managed path already keys on ${platform}-${arch}, so nothing else needs to change:

const WINDOWS_AMD64_ASSET: CloudflaredReleaseAsset = {
  url: "https://github.com/cloudflare/cloudflared/releases/download/2026.5.2/cloudflared-windows-amd64.exe",
  sha256: "20b9638f685333d623798e733effbad2487093f15ba592f6c7752360ff3b7ab7",
  archive: "binary",
};

// in CLOUDFLARED_RELEASE_ASSETS
"win32-x64": WINDOWS_AMD64_ASSET,
// Cloudflare publishes no native Windows ARM64 build; Windows 11 on ARM runs it under x64 emulation.
"win32-arm64": WINDOWS_AMD64_ASSET,

This keeps the pinned checksum and the existing download → verify → version validation → atomic activate flow unchanged. A focused test would assert that resolveReleaseAsset("win32", "arm64") returns the amd64 asset.

I verified this manually on the ARM64 machine:

  • I placed the pinned cloudflared-windows-amd64.exe 2026.5.2 at the managed path %USERPROFILE%\.t3\tools\cloudflared\2026.5.2\win32-arm64\cloudflared.exe. Its SHA-256 matched the pinned value.
  • cloudflared version reported 2026.5.2 under emulation and exited 0.
  • T3 Code then resolved it as the managed client and started the tunnel.
  • The iOS app connected through the relay: /.well-known/t3/environment, /oauth/token, /api/auth/websocket-ticket, /ws, and /api/orchestration/shell all succeeded.

I did not check Windows 10 on ARM, which cannot run x64 binaries. If that platform matters, windows-386 would be the fallback asset there.

Workaround

Download the pinned x64 asset yourself and place it at the managed path for your arch (<base dir>\tools\cloudflared\2026.5.2\win32-arm64\cloudflared.exe). Alternatively, set T3CODE_CLOUDFLARED_PATH to it. You have to repeat this whenever CLOUDFLARED_VERSION changes.

Activity

  1. juliusmarminge commented on Oct 2, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Triage

    Thanks for the thorough report, @zachspartofaday, and especially for testing the fix end to end on real ARM64 hardware. Confirmed on main at 54084ae.

    CLOUDFLARED_RELEASE_ASSETS in packages/shared/src/relayClient.ts only has entries for darwin-arm64, darwin-x64, linux-arm64, linux-x64, and win32-x64. With no override, managed binary, or cloudflared on PATH, resolve returns unsupported for win32-arm64, and turning on T3 Connect stops in ensureRelayClientAvailable (apps/web/src/cloud/linkEnvironment.ts). This only affects the native Windows ARM64 desktop build and the win32-arm64 CLI archive. An x64 build running under emulation reports x64 and already uses the existing asset.

    Cloudflare doesn't publish a Windows ARM64 cloudflared. The pinned 2026.5.2 and the current 2026.9.3 both ship only windows-386 and windows-amd64. Open PR #11184 bumps the pin to 2026.9.3, but it still maps only win32-x64, so it won't fix this on its own.

    Your proposed fix looks right: alias win32-arm64 to the same pinned windows-amd64 asset. Windows 11 on ARM runs it under emulation, the managed path stays under win32-arm64, and the existing cloudflared version check still has to pass before activation. Windows 10 on ARM is out of support and isn't a desktop target, so the windows-386 fallback shouldn't be needed. resolveReleaseAsset isn't exported. A focused test could set HostProcessPlatform to win32 and HostProcessArchitecture to arm64 and expect resolve() to return missing instead of unsupported when no binary is present.

    Until then, your workaround is the way to go: place the pinned x64 binary at the managed path or point T3CODE_CLOUDFLARED_PATH at it.

  2. added
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 2, 2026
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

    bugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions