<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: araguard</title>
    <description>The latest articles on DEV Community by araguard (@aleixrodriala).</description>
    <link>https://dev.to/aleixrodriala</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3844827%2Fffd2257e-98b7-4fa5-a0da-4551f7068af5.jpeg</url>
      <title>DEV Community: araguard</title>
      <link>https://dev.to/aleixrodriala</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aleixrodriala"/>
    <language>en</language>
    <item>
      <title>I built the VS Code Remote WSL extension, but for GitHub Desktop</title>
      <dc:creator>araguard</dc:creator>
      <pubDate>Thu, 26 Mar 2026 14:01:12 +0000</pubDate>
      <link>https://dev.to/aleixrodriala/i-built-the-vs-code-remote-wsl-extension-but-for-github-desktop-4pic</link>
      <guid>https://dev.to/aleixrodriala/i-built-the-vs-code-remote-wsl-extension-but-for-github-desktop-4pic</guid>
      <description>&lt;p&gt;If you use GitHub Desktop with repos stored in WSL, you know the pain. Every operation takes 10-30 seconds. Switching branches? 30 seconds. Fetching? 10 seconds. Even &lt;code&gt;git status&lt;/code&gt; on a tiny repo takes 40ms+ because Desktop runs &lt;code&gt;git.exe&lt;/code&gt; on Windows, which accesses WSL files through the 9P protocol — every file stat is a round-trip across the VM boundary.&lt;/p&gt;

&lt;p&gt;Meanwhile, VS Code solved this years ago with the Remote WSL extension. It runs a server inside WSL and talks to it over a socket. Fast, native, no 9P overhead.&lt;/p&gt;

&lt;p&gt;I wanted the same thing for GitHub Desktop. So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/aleixrodriala/GithubDesktopWSL" rel="noopener noreferrer"&gt;GithubDesktopWSL&lt;/a&gt; is a fork of GitHub Desktop that runs a lightweight daemon inside WSL. The daemon handles git commands and file operations natively over TCP. Desktop connects to it instead of going through 9P.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Official Desktop (slow):
  Desktop -&amp;gt; git.exe -&amp;gt; 9P -&amp;gt; VM boundary -&amp;gt; WSL -&amp;gt; ext4

This fork (fast):
  Desktop -&amp;gt; TCP -&amp;gt; daemon -&amp;gt; git (native) -&amp;gt; ext4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The daemon is bundled in the installer. When you open a WSL repo, it deploys and starts automatically. There's nothing to configure.&lt;/p&gt;
&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Fork&lt;/th&gt;
&lt;th&gt;Official&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;git status&lt;/td&gt;
&lt;td&gt;2 ms&lt;/td&gt;
&lt;td&gt;43 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git log&lt;/td&gt;
&lt;td&gt;2 ms&lt;/td&gt;
&lt;td&gt;41 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open repo&lt;/td&gt;
&lt;td&gt;16 ms&lt;/td&gt;
&lt;td&gt;173 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;11x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git rev-parse&lt;/td&gt;
&lt;td&gt;2 ms&lt;/td&gt;
&lt;td&gt;41 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The ~40ms floor in official Desktop is the cost of launching git.exe through 9P. The daemon has ~2ms overhead (TCP round-trip + message framing). The actual git work is the same.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Three components:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;wsl-git-daemon&lt;/strong&gt; (C, ~550 lines) — persistent daemon inside WSL. Listens on localhost TCP, handles git commands and file operations (read, write, stat, unlink). Token-based auth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;wsl.ts&lt;/strong&gt; (TypeScript, ~490 lines) — Desktop-side client. Detects WSL paths, manages daemon lifecycle (deploy, start, restart), implements the binary protocol, provides drop-in wrappers for fs operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;core.ts patch&lt;/strong&gt; (1 if-block) — all git commands in Desktop flow through one function. A single &lt;code&gt;if (isWSLPath(path))&lt;/code&gt; routes WSL repos through the daemon. Windows repos are completely untouched.&lt;/p&gt;
&lt;h2&gt;
  
  
  What else it fixes
&lt;/h2&gt;

&lt;p&gt;Beyond performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SSH keys just work&lt;/strong&gt; — daemon runs in WSL natively, so &lt;code&gt;~/.ssh/&lt;/code&gt; keys are accessible. No more SSH_ASKPASS issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No CRLF problems&lt;/strong&gt; — git runs in Linux, line endings stay as they should.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File operations work&lt;/strong&gt; — diffs, merge state, .gitignore reads/writes all go through the daemon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo deletion works&lt;/strong&gt; — handles WSL UNC paths that Windows Recycle Bin can't.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Staying current
&lt;/h2&gt;

&lt;p&gt;It's patch-based — 6 patch files applied on top of upstream releases via &lt;code&gt;git apply&lt;/code&gt;. CI checks for new upstream releases every 6 hours, applies patches, builds, and publishes automatically. So it stays current with official Desktop features.&lt;/p&gt;

&lt;p&gt;Installs side-by-side with official Desktop. You can keep both.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Download the installer from the &lt;a href="https://github.com/aleixrodriala/GithubDesktopWSL/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;, run it, open a WSL repo. That's it.&lt;/p&gt;

&lt;p&gt;Would love feedback, especially if you hit any issues with specific WSL distros or repo setups.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aleixrodriala" rel="noopener noreferrer"&gt;
        aleixrodriala
      &lt;/a&gt; / &lt;a href="https://github.com/aleixrodriala/GithubDesktopWSL" rel="noopener noreferrer"&gt;
        GithubDesktopWSL
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GitHub Desktop with native WSL support — 6-27x faster git operations
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;GitHub Desktop WSL&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Think of it like the &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl" rel="nofollow noopener noreferrer"&gt;VS Code Remote WSL extension&lt;/a&gt; but for GitHub Desktop. A fork of &lt;a href="https://github.com/desktop/desktop" rel="noopener noreferrer"&gt;GitHub Desktop&lt;/a&gt; that makes WSL repositories work properly — &lt;strong&gt;16-50x faster git operations&lt;/strong&gt;, working SSH keys, and no more CRLF issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/aleixrodriala/GithubDesktopWSL/releases/latest" rel="noopener noreferrer"&gt;Download the latest release&lt;/a&gt;&lt;/strong&gt; — installs side-by-side with official GitHub Desktop&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The problem&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Official GitHub Desktop can't handle repos inside WSL. When you open a &lt;code&gt;\\wsl.localhost\...&lt;/code&gt; path:&lt;/p&gt;


&lt;ul&gt;

&lt;li&gt;

&lt;strong&gt;Git commands are unusably slow&lt;/strong&gt; — Desktop runs Windows &lt;code&gt;git.exe&lt;/code&gt;, which accesses WSL files through the &lt;a href="https://learn.microsoft.com/en-us/windows/wsl/filesystems" rel="nofollow noopener noreferrer"&gt;9P protocol&lt;/a&gt;. Every file stat, read, and open is a round-trip across the VM boundary.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;SSH keys don't work&lt;/strong&gt; — Desktop injects a Windows-only &lt;code&gt;SSH_ASKPASS&lt;/code&gt; binary that breaks SSH inside WSL.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;File operations fail&lt;/strong&gt; — Checking merge/rebase state, reading diffs, writing &lt;code&gt;.gitignore&lt;/code&gt; — all go through 9P and are either slow or broken.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Deleting repos fails&lt;/strong&gt; — Windows Recycle Bin doesn't support WSL…&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aleixrodriala/GithubDesktopWSL" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>linux</category>
      <category>github</category>
      <category>opensource</category>
      <category>git</category>
    </item>
  </channel>
</rss>
