Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

Description

@AxENSRennes

Related: #192

Summary

T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

The core idea is:

  • keep the desktop UI local
  • run the backend natively in the selected target environment
  • let the desktop process resolve, start, supervise, and reconnect that backend
  • keep the renderer connected through one stable desktop-provided endpoint
  • expose target capabilities to the UI instead of scattering target-specific checks everywhere

Why this matters

WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

A naive implementation usually turns into some combination of:

  • spawning wsl.exe ad hoc
  • translating paths back and forth in multiple places
  • letting the renderer infer execution context indirectly
  • mixing Windows desktop concerns with Linux runtime concerns

That tends to become brittle around:

  • terminal behavior
  • Git/toolchain behavior
  • cwd semantics
  • Linux-native workspace paths
  • reconnect/restart handling
  • version compatibility
  • network transport differences
  • desktop integrations like folder selection or opening files in an editor

If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

Why this is also a general remote-backend issue

After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

  • the client UI stays local
  • the backend runs natively in the target environment
  • transport is a separate concern
  • startup is deterministic
  • auth and version compatibility are explicit
  • target capabilities are modeled directly

That is useful for WSL, but it also sets up a clean path for future remote targets.

So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

Current T3 Code shape

T3 Code already seems close to supporting this architecture:

  • the desktop app starts the backend process in apps/desktop/src/main.ts
  • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
  • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

Proposal

1. Introduce an explicit backend target model

Something like:

  • local
  • wsl:auto
  • wsl:<distro>

Longer term this could also support:

  • ssh:<host>
  • other remote Linux targets

2. Move backend lifecycle behind a desktop-side controller

Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

  • resolving the target
  • selecting the distro/host
  • bootstrapping the backend
  • readiness detection
  • reconnect/restart policy
  • surfacing errors and diagnostics
  • exposing target metadata/capabilities to the renderer

3. Run the backend natively in the target

In WSL mode, the backend should run inside the selected distro, not on Windows.

That preserves the right semantics for:

  • Linux paths
  • shell/cwd behavior
  • Git
  • package managers
  • local toolchains
  • terminal sessions

4. Keep one stable renderer-facing connection contract

The renderer should not need to know if the backend is local, in WSL, or elsewhere.

It should keep consuming:

  • one desktop-provided connection endpoint
  • one set of target metadata/capabilities

5. Expose capabilities instead of adding isWsl checks

For example:

  • requiresLinuxWorkspacePaths
  • supportsNativeFolderPicker
  • supportsDesktopEditorBridge
  • supportsTargetBootstrap
  • supportsReconnect

This keeps UI logic from becoming target-specific over time.

6. Keep desktop-only integrations on the desktop side

Especially in WSL mode:

  • folder picking should not blindly inject Windows paths into a Linux backend
  • opening files in an external editor should remain desktop-owned
  • path translation should happen only at explicit boundaries, not throughout core runtime logic

7. Keep backend startup deterministic

Startup should not depend on interactive shell init files or user shell customization.

That is one of the clearest lessons from the mature remote tooling already out there.

Why WSL should be the first target

WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

  • different runtime OS from the desktop app
  • different filesystem semantics
  • different path formats
  • different shell/toolchain environment
  • target-local backend process
  • desktop-local UI integrations
  • transport/reconnect concerns

If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

Sources that support this direction

VS Code / Remote WSL

VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

  • WSL is treated as a real remote authority / target identity
  • the client resolves that target on the desktop side
  • a Linux-native server is started in WSL
  • the client connects through a stable resolved endpoint
  • startup is kept deterministic

Relevant references:

  • VS Code remote authority infrastructure:
    • src/vs/platform/remote/common/remoteAuthorityResolver.ts
    • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
  • WSL detection in core:
    • src/vs/platform/remote/node/wsl.ts
  • Windows shell handoff:
    • resources/win32/bin/code.sh
  • WSL sanity tests:
    • test/sanity/src/wsl.test.ts

Public docs / package-level references:

WSL platform docs

WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

Other relevant open-source references

code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

Suggested implementation order

  1. Introduce BackendTarget
  2. Introduce a desktop BackendController
  3. Wrap current behavior as LocalBackendTarget
  4. Add WslBackendTarget
  5. Expose target metadata/capabilities through the desktop bridge
  6. Make renderer behavior capability-driven
  7. Add WSL-aware workspace selection and editor-open flows
  8. Add Windows + WSL integration tests

Expected outcome

This would give T3 Code:

  • a clean way to support WSL on Windows
  • a better separation between UI, transport, and backend runtime
  • a path toward future remote backends without redoing the architecture later

I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

      Description

      @AxENSRennes

      Related: #192

      Summary

      T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

      The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

      The core idea is:

      • keep the desktop UI local
      • run the backend natively in the selected target environment
      • let the desktop process resolve, start, supervise, and reconnect that backend
      • keep the renderer connected through one stable desktop-provided endpoint
      • expose target capabilities to the UI instead of scattering target-specific checks everywhere

      Why this matters

      WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

      A naive implementation usually turns into some combination of:

      • spawning wsl.exe ad hoc
      • translating paths back and forth in multiple places
      • letting the renderer infer execution context indirectly
      • mixing Windows desktop concerns with Linux runtime concerns

      That tends to become brittle around:

      • terminal behavior
      • Git/toolchain behavior
      • cwd semantics
      • Linux-native workspace paths
      • reconnect/restart handling
      • version compatibility
      • network transport differences
      • desktop integrations like folder selection or opening files in an editor

      If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

      Why this is also a general remote-backend issue

      After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

      • the client UI stays local
      • the backend runs natively in the target environment
      • transport is a separate concern
      • startup is deterministic
      • auth and version compatibility are explicit
      • target capabilities are modeled directly

      That is useful for WSL, but it also sets up a clean path for future remote targets.

      So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

      Current T3 Code shape

      T3 Code already seems close to supporting this architecture:

      • the desktop app starts the backend process in apps/desktop/src/main.ts
      • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
      • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

      That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

      Proposal

      1. Introduce an explicit backend target model

      Something like:

      • local
      • wsl:auto
      • wsl:<distro>

      Longer term this could also support:

      • ssh:<host>
      • other remote Linux targets

      2. Move backend lifecycle behind a desktop-side controller

      Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

      • resolving the target
      • selecting the distro/host
      • bootstrapping the backend
      • readiness detection
      • reconnect/restart policy
      • surfacing errors and diagnostics
      • exposing target metadata/capabilities to the renderer

      3. Run the backend natively in the target

      In WSL mode, the backend should run inside the selected distro, not on Windows.

      That preserves the right semantics for:

      • Linux paths
      • shell/cwd behavior
      • Git
      • package managers
      • local toolchains
      • terminal sessions

      4. Keep one stable renderer-facing connection contract

      The renderer should not need to know if the backend is local, in WSL, or elsewhere.

      It should keep consuming:

      • one desktop-provided connection endpoint
      • one set of target metadata/capabilities

      5. Expose capabilities instead of adding isWsl checks

      For example:

      • requiresLinuxWorkspacePaths
      • supportsNativeFolderPicker
      • supportsDesktopEditorBridge
      • supportsTargetBootstrap
      • supportsReconnect

      This keeps UI logic from becoming target-specific over time.

      6. Keep desktop-only integrations on the desktop side

      Especially in WSL mode:

      • folder picking should not blindly inject Windows paths into a Linux backend
      • opening files in an external editor should remain desktop-owned
      • path translation should happen only at explicit boundaries, not throughout core runtime logic

      7. Keep backend startup deterministic

      Startup should not depend on interactive shell init files or user shell customization.

      That is one of the clearest lessons from the mature remote tooling already out there.

      Why WSL should be the first target

      WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

      • different runtime OS from the desktop app
      • different filesystem semantics
      • different path formats
      • different shell/toolchain environment
      • target-local backend process
      • desktop-local UI integrations
      • transport/reconnect concerns

      If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

      Sources that support this direction

      VS Code / Remote WSL

      VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

      • WSL is treated as a real remote authority / target identity
      • the client resolves that target on the desktop side
      • a Linux-native server is started in WSL
      • the client connects through a stable resolved endpoint
      • startup is kept deterministic

      Relevant references:

      • VS Code remote authority infrastructure:
        • src/vs/platform/remote/common/remoteAuthorityResolver.ts
        • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
      • WSL detection in core:
        • src/vs/platform/remote/node/wsl.ts
      • Windows shell handoff:
        • resources/win32/bin/code.sh
      • WSL sanity tests:
        • test/sanity/src/wsl.test.ts

      Public docs / package-level references:

      WSL platform docs

      WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

      Other relevant open-source references

      code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

      devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

      WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

      Suggested implementation order

      1. Introduce BackendTarget
      2. Introduce a desktop BackendController
      3. Wrap current behavior as LocalBackendTarget
      4. Add WslBackendTarget
      5. Expose target metadata/capabilities through the desktop bridge
      6. Make renderer behavior capability-driven
      7. Add WSL-aware workspace selection and editor-open flows
      8. Add Windows + WSL integration tests

      Expected outcome

      This would give T3 Code:

      • a clean way to support WSL on Windows
      • a better separation between UI, transport, and backend runtime
      • a path toward future remote backends without redoing the architecture later

      I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

          Description

          @AxENSRennes

          Related: #192

          Summary

          T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

          The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

          The core idea is:

          • keep the desktop UI local
          • run the backend natively in the selected target environment
          • let the desktop process resolve, start, supervise, and reconnect that backend
          • keep the renderer connected through one stable desktop-provided endpoint
          • expose target capabilities to the UI instead of scattering target-specific checks everywhere

          Why this matters

          WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

          A naive implementation usually turns into some combination of:

          • spawning wsl.exe ad hoc
          • translating paths back and forth in multiple places
          • letting the renderer infer execution context indirectly
          • mixing Windows desktop concerns with Linux runtime concerns

          That tends to become brittle around:

          • terminal behavior
          • Git/toolchain behavior
          • cwd semantics
          • Linux-native workspace paths
          • reconnect/restart handling
          • version compatibility
          • network transport differences
          • desktop integrations like folder selection or opening files in an editor

          If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

          Why this is also a general remote-backend issue

          After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

          • the client UI stays local
          • the backend runs natively in the target environment
          • transport is a separate concern
          • startup is deterministic
          • auth and version compatibility are explicit
          • target capabilities are modeled directly

          That is useful for WSL, but it also sets up a clean path for future remote targets.

          So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

          Current T3 Code shape

          T3 Code already seems close to supporting this architecture:

          • the desktop app starts the backend process in apps/desktop/src/main.ts
          • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
          • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

          That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

          Proposal

          1. Introduce an explicit backend target model

          Something like:

          • local
          • wsl:auto
          • wsl:<distro>

          Longer term this could also support:

          • ssh:<host>
          • other remote Linux targets

          2. Move backend lifecycle behind a desktop-side controller

          Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

          • resolving the target
          • selecting the distro/host
          • bootstrapping the backend
          • readiness detection
          • reconnect/restart policy
          • surfacing errors and diagnostics
          • exposing target metadata/capabilities to the renderer

          3. Run the backend natively in the target

          In WSL mode, the backend should run inside the selected distro, not on Windows.

          That preserves the right semantics for:

          • Linux paths
          • shell/cwd behavior
          • Git
          • package managers
          • local toolchains
          • terminal sessions

          4. Keep one stable renderer-facing connection contract

          The renderer should not need to know if the backend is local, in WSL, or elsewhere.

          It should keep consuming:

          • one desktop-provided connection endpoint
          • one set of target metadata/capabilities

          5. Expose capabilities instead of adding isWsl checks

          For example:

          • requiresLinuxWorkspacePaths
          • supportsNativeFolderPicker
          • supportsDesktopEditorBridge
          • supportsTargetBootstrap
          • supportsReconnect

          This keeps UI logic from becoming target-specific over time.

          6. Keep desktop-only integrations on the desktop side

          Especially in WSL mode:

          • folder picking should not blindly inject Windows paths into a Linux backend
          • opening files in an external editor should remain desktop-owned
          • path translation should happen only at explicit boundaries, not throughout core runtime logic

          7. Keep backend startup deterministic

          Startup should not depend on interactive shell init files or user shell customization.

          That is one of the clearest lessons from the mature remote tooling already out there.

          Why WSL should be the first target

          WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

          • different runtime OS from the desktop app
          • different filesystem semantics
          • different path formats
          • different shell/toolchain environment
          • target-local backend process
          • desktop-local UI integrations
          • transport/reconnect concerns

          If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

          Sources that support this direction

          VS Code / Remote WSL

          VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

          • WSL is treated as a real remote authority / target identity
          • the client resolves that target on the desktop side
          • a Linux-native server is started in WSL
          • the client connects through a stable resolved endpoint
          • startup is kept deterministic

          Relevant references:

          • VS Code remote authority infrastructure:
            • src/vs/platform/remote/common/remoteAuthorityResolver.ts
            • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
          • WSL detection in core:
            • src/vs/platform/remote/node/wsl.ts
          • Windows shell handoff:
            • resources/win32/bin/code.sh
          • WSL sanity tests:
            • test/sanity/src/wsl.test.ts

          Public docs / package-level references:

          WSL platform docs

          WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

          Other relevant open-source references

          code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

          devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

          WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

          Suggested implementation order

          1. Introduce BackendTarget
          2. Introduce a desktop BackendController
          3. Wrap current behavior as LocalBackendTarget
          4. Add WslBackendTarget
          5. Expose target metadata/capabilities through the desktop bridge
          6. Make renderer behavior capability-driven
          7. Add WSL-aware workspace selection and editor-open flows
          8. Add Windows + WSL integration tests

          Expected outcome

          This would give T3 Code:

          • a clean way to support WSL on Windows
          • a better separation between UI, transport, and backend runtime
          • a path toward future remote backends without redoing the architecture later

          I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

              Description

              @AxENSRennes

              Related: #192

              Summary

              T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

              The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

              The core idea is:

              • keep the desktop UI local
              • run the backend natively in the selected target environment
              • let the desktop process resolve, start, supervise, and reconnect that backend
              • keep the renderer connected through one stable desktop-provided endpoint
              • expose target capabilities to the UI instead of scattering target-specific checks everywhere

              Why this matters

              WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

              A naive implementation usually turns into some combination of:

              • spawning wsl.exe ad hoc
              • translating paths back and forth in multiple places
              • letting the renderer infer execution context indirectly
              • mixing Windows desktop concerns with Linux runtime concerns

              That tends to become brittle around:

              • terminal behavior
              • Git/toolchain behavior
              • cwd semantics
              • Linux-native workspace paths
              • reconnect/restart handling
              • version compatibility
              • network transport differences
              • desktop integrations like folder selection or opening files in an editor

              If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

              Why this is also a general remote-backend issue

              After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

              • the client UI stays local
              • the backend runs natively in the target environment
              • transport is a separate concern
              • startup is deterministic
              • auth and version compatibility are explicit
              • target capabilities are modeled directly

              That is useful for WSL, but it also sets up a clean path for future remote targets.

              So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

              Current T3 Code shape

              T3 Code already seems close to supporting this architecture:

              • the desktop app starts the backend process in apps/desktop/src/main.ts
              • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
              • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

              That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

              Proposal

              1. Introduce an explicit backend target model

              Something like:

              • local
              • wsl:auto
              • wsl:<distro>

              Longer term this could also support:

              • ssh:<host>
              • other remote Linux targets

              2. Move backend lifecycle behind a desktop-side controller

              Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

              • resolving the target
              • selecting the distro/host
              • bootstrapping the backend
              • readiness detection
              • reconnect/restart policy
              • surfacing errors and diagnostics
              • exposing target metadata/capabilities to the renderer

              3. Run the backend natively in the target

              In WSL mode, the backend should run inside the selected distro, not on Windows.

              That preserves the right semantics for:

              • Linux paths
              • shell/cwd behavior
              • Git
              • package managers
              • local toolchains
              • terminal sessions

              4. Keep one stable renderer-facing connection contract

              The renderer should not need to know if the backend is local, in WSL, or elsewhere.

              It should keep consuming:

              • one desktop-provided connection endpoint
              • one set of target metadata/capabilities

              5. Expose capabilities instead of adding isWsl checks

              For example:

              • requiresLinuxWorkspacePaths
              • supportsNativeFolderPicker
              • supportsDesktopEditorBridge
              • supportsTargetBootstrap
              • supportsReconnect

              This keeps UI logic from becoming target-specific over time.

              6. Keep desktop-only integrations on the desktop side

              Especially in WSL mode:

              • folder picking should not blindly inject Windows paths into a Linux backend
              • opening files in an external editor should remain desktop-owned
              • path translation should happen only at explicit boundaries, not throughout core runtime logic

              7. Keep backend startup deterministic

              Startup should not depend on interactive shell init files or user shell customization.

              That is one of the clearest lessons from the mature remote tooling already out there.

              Why WSL should be the first target

              WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

              • different runtime OS from the desktop app
              • different filesystem semantics
              • different path formats
              • different shell/toolchain environment
              • target-local backend process
              • desktop-local UI integrations
              • transport/reconnect concerns

              If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

              Sources that support this direction

              VS Code / Remote WSL

              VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

              • WSL is treated as a real remote authority / target identity
              • the client resolves that target on the desktop side
              • a Linux-native server is started in WSL
              • the client connects through a stable resolved endpoint
              • startup is kept deterministic

              Relevant references:

              • VS Code remote authority infrastructure:
                • src/vs/platform/remote/common/remoteAuthorityResolver.ts
                • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
              • WSL detection in core:
                • src/vs/platform/remote/node/wsl.ts
              • Windows shell handoff:
                • resources/win32/bin/code.sh
              • WSL sanity tests:
                • test/sanity/src/wsl.test.ts

              Public docs / package-level references:

              WSL platform docs

              WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

              Other relevant open-source references

              code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

              devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

              WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

              Suggested implementation order

              1. Introduce BackendTarget
              2. Introduce a desktop BackendController
              3. Wrap current behavior as LocalBackendTarget
              4. Add WslBackendTarget
              5. Expose target metadata/capabilities through the desktop bridge
              6. Make renderer behavior capability-driven
              7. Add WSL-aware workspace selection and editor-open flows
              8. Add Windows + WSL integration tests

              Expected outcome

              This would give T3 Code:

              • a clean way to support WSL on Windows
              • a better separation between UI, transport, and backend runtime
              • a path toward future remote backends without redoing the architecture later

              I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

                  Description

                  @AxENSRennes

                  Related: #192

                  Summary

                  T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

                  The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

                  The core idea is:

                  • keep the desktop UI local
                  • run the backend natively in the selected target environment
                  • let the desktop process resolve, start, supervise, and reconnect that backend
                  • keep the renderer connected through one stable desktop-provided endpoint
                  • expose target capabilities to the UI instead of scattering target-specific checks everywhere

                  Why this matters

                  WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

                  A naive implementation usually turns into some combination of:

                  • spawning wsl.exe ad hoc
                  • translating paths back and forth in multiple places
                  • letting the renderer infer execution context indirectly
                  • mixing Windows desktop concerns with Linux runtime concerns

                  That tends to become brittle around:

                  • terminal behavior
                  • Git/toolchain behavior
                  • cwd semantics
                  • Linux-native workspace paths
                  • reconnect/restart handling
                  • version compatibility
                  • network transport differences
                  • desktop integrations like folder selection or opening files in an editor

                  If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

                  Why this is also a general remote-backend issue

                  After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

                  • the client UI stays local
                  • the backend runs natively in the target environment
                  • transport is a separate concern
                  • startup is deterministic
                  • auth and version compatibility are explicit
                  • target capabilities are modeled directly

                  That is useful for WSL, but it also sets up a clean path for future remote targets.

                  So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

                  Current T3 Code shape

                  T3 Code already seems close to supporting this architecture:

                  • the desktop app starts the backend process in apps/desktop/src/main.ts
                  • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
                  • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

                  That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

                  Proposal

                  1. Introduce an explicit backend target model

                  Something like:

                  • local
                  • wsl:auto
                  • wsl:<distro>

                  Longer term this could also support:

                  • ssh:<host>
                  • other remote Linux targets

                  2. Move backend lifecycle behind a desktop-side controller

                  Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

                  • resolving the target
                  • selecting the distro/host
                  • bootstrapping the backend
                  • readiness detection
                  • reconnect/restart policy
                  • surfacing errors and diagnostics
                  • exposing target metadata/capabilities to the renderer

                  3. Run the backend natively in the target

                  In WSL mode, the backend should run inside the selected distro, not on Windows.

                  That preserves the right semantics for:

                  • Linux paths
                  • shell/cwd behavior
                  • Git
                  • package managers
                  • local toolchains
                  • terminal sessions

                  4. Keep one stable renderer-facing connection contract

                  The renderer should not need to know if the backend is local, in WSL, or elsewhere.

                  It should keep consuming:

                  • one desktop-provided connection endpoint
                  • one set of target metadata/capabilities

                  5. Expose capabilities instead of adding isWsl checks

                  For example:

                  • requiresLinuxWorkspacePaths
                  • supportsNativeFolderPicker
                  • supportsDesktopEditorBridge
                  • supportsTargetBootstrap
                  • supportsReconnect

                  This keeps UI logic from becoming target-specific over time.

                  6. Keep desktop-only integrations on the desktop side

                  Especially in WSL mode:

                  • folder picking should not blindly inject Windows paths into a Linux backend
                  • opening files in an external editor should remain desktop-owned
                  • path translation should happen only at explicit boundaries, not throughout core runtime logic

                  7. Keep backend startup deterministic

                  Startup should not depend on interactive shell init files or user shell customization.

                  That is one of the clearest lessons from the mature remote tooling already out there.

                  Why WSL should be the first target

                  WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

                  • different runtime OS from the desktop app
                  • different filesystem semantics
                  • different path formats
                  • different shell/toolchain environment
                  • target-local backend process
                  • desktop-local UI integrations
                  • transport/reconnect concerns

                  If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

                  Sources that support this direction

                  VS Code / Remote WSL

                  VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

                  • WSL is treated as a real remote authority / target identity
                  • the client resolves that target on the desktop side
                  • a Linux-native server is started in WSL
                  • the client connects through a stable resolved endpoint
                  • startup is kept deterministic

                  Relevant references:

                  • VS Code remote authority infrastructure:
                    • src/vs/platform/remote/common/remoteAuthorityResolver.ts
                    • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
                  • WSL detection in core:
                    • src/vs/platform/remote/node/wsl.ts
                  • Windows shell handoff:
                    • resources/win32/bin/code.sh
                  • WSL sanity tests:
                    • test/sanity/src/wsl.test.ts

                  Public docs / package-level references:

                  WSL platform docs

                  WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

                  Other relevant open-source references

                  code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

                  devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

                  WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

                  Suggested implementation order

                  1. Introduce BackendTarget
                  2. Introduce a desktop BackendController
                  3. Wrap current behavior as LocalBackendTarget
                  4. Add WslBackendTarget
                  5. Expose target metadata/capabilities through the desktop bridge
                  6. Make renderer behavior capability-driven
                  7. Add WSL-aware workspace selection and editor-open flows
                  8. Add Windows + WSL integration tests

                  Expected outcome

                  This would give T3 Code:

                  • a clean way to support WSL on Windows
                  • a better separation between UI, transport, and backend runtime
                  • a path toward future remote backends without redoing the architecture later

                  I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

                      Description

                      @AxENSRennes

                      Related: #192

                      Summary

                      T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

                      The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

                      The core idea is:

                      • keep the desktop UI local
                      • run the backend natively in the selected target environment
                      • let the desktop process resolve, start, supervise, and reconnect that backend
                      • keep the renderer connected through one stable desktop-provided endpoint
                      • expose target capabilities to the UI instead of scattering target-specific checks everywhere

                      Why this matters

                      WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

                      A naive implementation usually turns into some combination of:

                      • spawning wsl.exe ad hoc
                      • translating paths back and forth in multiple places
                      • letting the renderer infer execution context indirectly
                      • mixing Windows desktop concerns with Linux runtime concerns

                      That tends to become brittle around:

                      • terminal behavior
                      • Git/toolchain behavior
                      • cwd semantics
                      • Linux-native workspace paths
                      • reconnect/restart handling
                      • version compatibility
                      • network transport differences
                      • desktop integrations like folder selection or opening files in an editor

                      If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

                      Why this is also a general remote-backend issue

                      After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

                      • the client UI stays local
                      • the backend runs natively in the target environment
                      • transport is a separate concern
                      • startup is deterministic
                      • auth and version compatibility are explicit
                      • target capabilities are modeled directly

                      That is useful for WSL, but it also sets up a clean path for future remote targets.

                      So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

                      Current T3 Code shape

                      T3 Code already seems close to supporting this architecture:

                      • the desktop app starts the backend process in apps/desktop/src/main.ts
                      • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
                      • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

                      That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

                      Proposal

                      1. Introduce an explicit backend target model

                      Something like:

                      • local
                      • wsl:auto
                      • wsl:<distro>

                      Longer term this could also support:

                      • ssh:<host>
                      • other remote Linux targets

                      2. Move backend lifecycle behind a desktop-side controller

                      Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

                      • resolving the target
                      • selecting the distro/host
                      • bootstrapping the backend
                      • readiness detection
                      • reconnect/restart policy
                      • surfacing errors and diagnostics
                      • exposing target metadata/capabilities to the renderer

                      3. Run the backend natively in the target

                      In WSL mode, the backend should run inside the selected distro, not on Windows.

                      That preserves the right semantics for:

                      • Linux paths
                      • shell/cwd behavior
                      • Git
                      • package managers
                      • local toolchains
                      • terminal sessions

                      4. Keep one stable renderer-facing connection contract

                      The renderer should not need to know if the backend is local, in WSL, or elsewhere.

                      It should keep consuming:

                      • one desktop-provided connection endpoint
                      • one set of target metadata/capabilities

                      5. Expose capabilities instead of adding isWsl checks

                      For example:

                      • requiresLinuxWorkspacePaths
                      • supportsNativeFolderPicker
                      • supportsDesktopEditorBridge
                      • supportsTargetBootstrap
                      • supportsReconnect

                      This keeps UI logic from becoming target-specific over time.

                      6. Keep desktop-only integrations on the desktop side

                      Especially in WSL mode:

                      • folder picking should not blindly inject Windows paths into a Linux backend
                      • opening files in an external editor should remain desktop-owned
                      • path translation should happen only at explicit boundaries, not throughout core runtime logic

                      7. Keep backend startup deterministic

                      Startup should not depend on interactive shell init files or user shell customization.

                      That is one of the clearest lessons from the mature remote tooling already out there.

                      Why WSL should be the first target

                      WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

                      • different runtime OS from the desktop app
                      • different filesystem semantics
                      • different path formats
                      • different shell/toolchain environment
                      • target-local backend process
                      • desktop-local UI integrations
                      • transport/reconnect concerns

                      If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

                      Sources that support this direction

                      VS Code / Remote WSL

                      VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

                      • WSL is treated as a real remote authority / target identity
                      • the client resolves that target on the desktop side
                      • a Linux-native server is started in WSL
                      • the client connects through a stable resolved endpoint
                      • startup is kept deterministic

                      Relevant references:

                      • VS Code remote authority infrastructure:
                        • src/vs/platform/remote/common/remoteAuthorityResolver.ts
                        • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
                      • WSL detection in core:
                        • src/vs/platform/remote/node/wsl.ts
                      • Windows shell handoff:
                        • resources/win32/bin/code.sh
                      • WSL sanity tests:
                        • test/sanity/src/wsl.test.ts

                      Public docs / package-level references:

                      WSL platform docs

                      WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

                      Other relevant open-source references

                      code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

                      devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

                      WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

                      Suggested implementation order

                      1. Introduce BackendTarget
                      2. Introduce a desktop BackendController
                      3. Wrap current behavior as LocalBackendTarget
                      4. Add WslBackendTarget
                      5. Expose target metadata/capabilities through the desktop bridge
                      6. Make renderer behavior capability-driven
                      7. Add WSL-aware workspace selection and editor-open flows
                      8. Add Windows + WSL integration tests

                      Expected outcome

                      This would give T3 Code:

                      • a clean way to support WSL on Windows
                      • a better separation between UI, transport, and backend runtime
                      • a path toward future remote backends without redoing the architecture later

                      I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

                          Description

                          @AxENSRennes

                          Related: #192

                          Summary

                          T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

                          The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

                          The core idea is:

                          • keep the desktop UI local
                          • run the backend natively in the selected target environment
                          • let the desktop process resolve, start, supervise, and reconnect that backend
                          • keep the renderer connected through one stable desktop-provided endpoint
                          • expose target capabilities to the UI instead of scattering target-specific checks everywhere

                          Why this matters

                          WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

                          A naive implementation usually turns into some combination of:

                          • spawning wsl.exe ad hoc
                          • translating paths back and forth in multiple places
                          • letting the renderer infer execution context indirectly
                          • mixing Windows desktop concerns with Linux runtime concerns

                          That tends to become brittle around:

                          • terminal behavior
                          • Git/toolchain behavior
                          • cwd semantics
                          • Linux-native workspace paths
                          • reconnect/restart handling
                          • version compatibility
                          • network transport differences
                          • desktop integrations like folder selection or opening files in an editor

                          If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

                          Why this is also a general remote-backend issue

                          After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

                          • the client UI stays local
                          • the backend runs natively in the target environment
                          • transport is a separate concern
                          • startup is deterministic
                          • auth and version compatibility are explicit
                          • target capabilities are modeled directly

                          That is useful for WSL, but it also sets up a clean path for future remote targets.

                          So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

                          Current T3 Code shape

                          T3 Code already seems close to supporting this architecture:

                          • the desktop app starts the backend process in apps/desktop/src/main.ts
                          • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
                          • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

                          That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

                          Proposal

                          1. Introduce an explicit backend target model

                          Something like:

                          • local
                          • wsl:auto
                          • wsl:<distro>

                          Longer term this could also support:

                          • ssh:<host>
                          • other remote Linux targets

                          2. Move backend lifecycle behind a desktop-side controller

                          Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

                          • resolving the target
                          • selecting the distro/host
                          • bootstrapping the backend
                          • readiness detection
                          • reconnect/restart policy
                          • surfacing errors and diagnostics
                          • exposing target metadata/capabilities to the renderer

                          3. Run the backend natively in the target

                          In WSL mode, the backend should run inside the selected distro, not on Windows.

                          That preserves the right semantics for:

                          • Linux paths
                          • shell/cwd behavior
                          • Git
                          • package managers
                          • local toolchains
                          • terminal sessions

                          4. Keep one stable renderer-facing connection contract

                          The renderer should not need to know if the backend is local, in WSL, or elsewhere.

                          It should keep consuming:

                          • one desktop-provided connection endpoint
                          • one set of target metadata/capabilities

                          5. Expose capabilities instead of adding isWsl checks

                          For example:

                          • requiresLinuxWorkspacePaths
                          • supportsNativeFolderPicker
                          • supportsDesktopEditorBridge
                          • supportsTargetBootstrap
                          • supportsReconnect

                          This keeps UI logic from becoming target-specific over time.

                          6. Keep desktop-only integrations on the desktop side

                          Especially in WSL mode:

                          • folder picking should not blindly inject Windows paths into a Linux backend
                          • opening files in an external editor should remain desktop-owned
                          • path translation should happen only at explicit boundaries, not throughout core runtime logic

                          7. Keep backend startup deterministic

                          Startup should not depend on interactive shell init files or user shell customization.

                          That is one of the clearest lessons from the mature remote tooling already out there.

                          Why WSL should be the first target

                          WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

                          • different runtime OS from the desktop app
                          • different filesystem semantics
                          • different path formats
                          • different shell/toolchain environment
                          • target-local backend process
                          • desktop-local UI integrations
                          • transport/reconnect concerns

                          If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

                          Sources that support this direction

                          VS Code / Remote WSL

                          VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

                          • WSL is treated as a real remote authority / target identity
                          • the client resolves that target on the desktop side
                          • a Linux-native server is started in WSL
                          • the client connects through a stable resolved endpoint
                          • startup is kept deterministic

                          Relevant references:

                          • VS Code remote authority infrastructure:
                            • src/vs/platform/remote/common/remoteAuthorityResolver.ts
                            • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
                          • WSL detection in core:
                            • src/vs/platform/remote/node/wsl.ts
                          • Windows shell handoff:
                            • resources/win32/bin/code.sh
                          • WSL sanity tests:
                            • test/sanity/src/wsl.test.ts

                          Public docs / package-level references:

                          WSL platform docs

                          WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

                          Other relevant open-source references

                          code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

                          devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

                          WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

                          Suggested implementation order

                          1. Introduce BackendTarget
                          2. Introduce a desktop BackendController
                          3. Wrap current behavior as LocalBackendTarget
                          4. Add WslBackendTarget
                          5. Expose target metadata/capabilities through the desktop bridge
                          6. Make renderer behavior capability-driven
                          7. Add WSL-aware workspace selection and editor-open flows
                          8. Add Windows + WSL integration tests

                          Expected outcome

                          This would give T3 Code:

                          • a clean way to support WSL on Windows
                          • a better separation between UI, transport, and backend runtime
                          • a path toward future remote backends without redoing the architecture later

                          I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Architecture proposal: first-class remote backend targets (with WSL as the first implementation) #671

                              Description

                              @AxENSRennes

                              Related: #192

                              Summary

                              T3 Code should support running its backend outside the local desktop environment through a first-class BackendTarget model, instead of treating WSL or other remote environments as shell/path special cases.

                              The most immediate use case is Windows + WSL, but the same architecture would also make future remote targets possible (for example SSH or other Linux hosts).

                              The core idea is:

                              • keep the desktop UI local
                              • run the backend natively in the selected target environment
                              • let the desktop process resolve, start, supervise, and reconnect that backend
                              • keep the renderer connected through one stable desktop-provided endpoint
                              • expose target capabilities to the UI instead of scattering target-specific checks everywhere

                              Why this matters

                              WSL support is deceptively hard to get right if it is approached as a subprocess or path-conversion problem.

                              A naive implementation usually turns into some combination of:

                              • spawning wsl.exe ad hoc
                              • translating paths back and forth in multiple places
                              • letting the renderer infer execution context indirectly
                              • mixing Windows desktop concerns with Linux runtime concerns

                              That tends to become brittle around:

                              • terminal behavior
                              • Git/toolchain behavior
                              • cwd semantics
                              • Linux-native workspace paths
                              • reconnect/restart handling
                              • version compatibility
                              • network transport differences
                              • desktop integrations like folder selection or opening files in an editor

                              If T3 Code wants WSL to feel reliable and native, WSL should be modeled as a real backend target, not as a compatibility mode.

                              Why this is also a general remote-backend issue

                              After looking at T3 Code’s current structure, VS Code’s remote architecture, the public Remote - WSL package, code-server, devcontainers/cli, and WSL docs, the pattern is pretty consistent:

                              • the client UI stays local
                              • the backend runs natively in the target environment
                              • transport is a separate concern
                              • startup is deterministic
                              • auth and version compatibility are explicit
                              • target capabilities are modeled directly

                              That is useful for WSL, but it also sets up a clean path for future remote targets.

                              So this issue is intentionally broader than “add WSL support”: it is proposing the abstraction that would make WSL the first clean implementation.

                              Current T3 Code shape

                              T3 Code already seems close to supporting this architecture:

                              • the desktop app starts the backend process in apps/desktop/src/main.ts
                              • the renderer already depends on a desktop-provided WebSocket URL through the desktop bridge
                              • the backend is already separated enough from the UI boundary that target-aware startup could live mostly on the desktop side

                              That suggests this can be introduced as a lifecycle/target refactor, not as a frontend rewrite.

                              Proposal

                              1. Introduce an explicit backend target model

                              Something like:

                              • local
                              • wsl:auto
                              • wsl:<distro>

                              Longer term this could also support:

                              • ssh:<host>
                              • other remote Linux targets

                              2. Move backend lifecycle behind a desktop-side controller

                              Instead of assuming one local child process forever, the desktop app should own a target-aware controller responsible for:

                              • resolving the target
                              • selecting the distro/host
                              • bootstrapping the backend
                              • readiness detection
                              • reconnect/restart policy
                              • surfacing errors and diagnostics
                              • exposing target metadata/capabilities to the renderer

                              3. Run the backend natively in the target

                              In WSL mode, the backend should run inside the selected distro, not on Windows.

                              That preserves the right semantics for:

                              • Linux paths
                              • shell/cwd behavior
                              • Git
                              • package managers
                              • local toolchains
                              • terminal sessions

                              4. Keep one stable renderer-facing connection contract

                              The renderer should not need to know if the backend is local, in WSL, or elsewhere.

                              It should keep consuming:

                              • one desktop-provided connection endpoint
                              • one set of target metadata/capabilities

                              5. Expose capabilities instead of adding isWsl checks

                              For example:

                              • requiresLinuxWorkspacePaths
                              • supportsNativeFolderPicker
                              • supportsDesktopEditorBridge
                              • supportsTargetBootstrap
                              • supportsReconnect

                              This keeps UI logic from becoming target-specific over time.

                              6. Keep desktop-only integrations on the desktop side

                              Especially in WSL mode:

                              • folder picking should not blindly inject Windows paths into a Linux backend
                              • opening files in an external editor should remain desktop-owned
                              • path translation should happen only at explicit boundaries, not throughout core runtime logic

                              7. Keep backend startup deterministic

                              Startup should not depend on interactive shell init files or user shell customization.

                              That is one of the clearest lessons from the mature remote tooling already out there.

                              Why WSL should be the first target

                              WSL is the most practical first implementation because it exercises the exact boundaries that a general remote architecture needs:

                              • different runtime OS from the desktop app
                              • different filesystem semantics
                              • different path formats
                              • different shell/toolchain environment
                              • target-local backend process
                              • desktop-local UI integrations
                              • transport/reconnect concerns

                              If the abstraction works for WSL, it is much more likely to scale to future remote targets cleanly.

                              Sources that support this direction

                              VS Code / Remote WSL

                              VS Code’s public OSS and distributed Remote - WSL package strongly suggest the following model:

                              • WSL is treated as a real remote authority / target identity
                              • the client resolves that target on the desktop side
                              • a Linux-native server is started in WSL
                              • the client connects through a stable resolved endpoint
                              • startup is kept deterministic

                              Relevant references:

                              • VS Code remote authority infrastructure:
                                • src/vs/platform/remote/common/remoteAuthorityResolver.ts
                                • src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts
                              • WSL detection in core:
                                • src/vs/platform/remote/node/wsl.ts
                              • Windows shell handoff:
                                • resources/win32/bin/code.sh
                              • WSL sanity tests:
                                • test/sanity/src/wsl.test.ts

                              Public docs / package-level references:

                              WSL platform docs

                              WSL networking and behavior vary depending on configuration, which is a strong argument for an explicit target/transport layer rather than assumptions baked into the renderer:

                              Other relevant open-source references

                              code-server is useful as a reference for remote server concerns such as auth, transport, and reverse-proxy assumptions:

                              devcontainers/cli is useful as a reference for separating target bootstrap, environment resolution, and runtime lifecycle:

                              WezTerm is a useful reference for modeling WSL as a first-class domain/target rather than a subprocess trick:

                              Suggested implementation order

                              1. Introduce BackendTarget
                              2. Introduce a desktop BackendController
                              3. Wrap current behavior as LocalBackendTarget
                              4. Add WslBackendTarget
                              5. Expose target metadata/capabilities through the desktop bridge
                              6. Make renderer behavior capability-driven
                              7. Add WSL-aware workspace selection and editor-open flows
                              8. Add Windows + WSL integration tests

                              Expected outcome

                              This would give T3 Code:

                              • a clean way to support WSL on Windows
                              • a better separation between UI, transport, and backend runtime
                              • a path toward future remote backends without redoing the architecture later

                              I’m opening this as an architecture proposal rather than a PR because the main value here is agreeing on the model before implementation.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                enhancementRequested improvement or new capability.needs-juliussize:XXL1,000+ changed lines (additions + deletions).

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions