<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Takken.io Blog</title>
        <link>https://takken.io/blog/</link>
        <description>Takken.io Blog</description>
        <lastBuildDate>Sun, 06 Jul 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Seamless Windows-Linux development]]></title>
            <link>https://takken.io/blog/seamless-windows-linux-development</link>
            <guid>https://takken.io/blog/seamless-windows-linux-development</guid>
            <pubDate>Sun, 06 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[How to achieve native filesystem performance when developing across Windows and WSL using Mutagen for real-time bidirectional synchronisation.]]></description>
            <content:encoded><![CDATA[<p>Achieve native filesystem performance on both Windows and WSL2 with real-time bidirectional sync.</p>
<p>This approach enables Windows tools and Linux workloads (Python, ML, CUDA) to run at full speed by
eliminating the cross-filesystem bottleneck.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="introduction">Introduction<a href="https://takken.io/blog/seamless-windows-linux-development#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p><a href="https://2025.stateofdevs.com/en-US/technology/#desktop_os" target="_blank" rel="noopener noreferrer" class="">28%</a> of developers use Windows, yet many
need Linux for tools that don't run natively.
<a href="https://docs.microsoft.com/en-us/windows/wsl/about" target="_blank" rel="noopener noreferrer" class="">WSL2</a> has become the standard solution,
providing a full Linux kernel to run any
<a href="https://distrowatch.com/dwres.php?resource=popularity" target="_blank" rel="noopener noreferrer" class="">popular</a> distro - like
<a href="https://ubuntu.com/desktop" target="_blank" rel="noopener noreferrer" class="">Ubuntu</a>, <a href="https://www.debian.org/" target="_blank" rel="noopener noreferrer" class="">Debian</a>, or
<a href="https://system76.com/pop/" target="_blank" rel="noopener noreferrer" class="">Pop!OS</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="the-problem">The problem<a href="https://takken.io/blog/seamless-windows-linux-development#the-problem" class="hash-link" aria-label="Direct link to The problem" title="Direct link to The problem" translate="no">​</a></h2>
<p>WSL2's <strong>major limitation</strong>: cross-platform filesystem operations are terribly slow.</p>
<p>I've created a <a href="https://github.com/webbertakken/wsl-filesystem-benchmark" target="_blank" rel="noopener noreferrer" class="">benchmark</a> to quantify the
performance differences. The results are even worse than expected.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAzUlEQVR4nE2OMU/CQABG+SfGofSudy1wtNejXlOLXUgICQyMxg7GRBcnB8JuTBjcXF3cnZiITg7+qmfAhDB803t5+ToisgiZMRAlpucZxA47arDuCpNWHHhk6QiZE/UK8tWM6rpler+mGw6Ryh33LwqLzkqa31uWbxseP78IuwYVF+hkhNQnoko945+WxesLDx87zoM+QeQ4CyzitKjSkvH3DfPNM3fvW+o4Z3JR89TO0ElBKPfi/qxyxNajTUkyvCTtezLjaaoaqfJD8Q/HOGjwJiERaQAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="154"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/filesystem-performance-comparison.3d791a4.256.png" srcset="/assets/ideal-img/filesystem-performance-comparison.3d791a4.256.png 256w,/assets/ideal-img/filesystem-performance-comparison.d6fe007.717.png 717w,/assets/ideal-img/filesystem-performance-comparison.36f7ac2.1178.png 1178w,/assets/ideal-img/filesystem-performance-comparison.af4b76b.1639.png 1639w,/assets/ideal-img/filesystem-performance-comparison.24b592d.2000.png 2000w" width="256" height="154"></noscript></div></div></div>
<ul>
<li class=""><strong>WSL accessing the Windows filesystem</strong> (<code>/mnt/c/</code>) averages at <strong>~6%</strong> of native performance,
with <code>random reads</code> as low as <strong>3%</strong> 🤔.</li>
<li class=""><strong>Windows accessing the WSL filesystem</strong> (<code>\\wsl.localhost\</code>) averages at <strong>~14%</strong>, with
sequential writes for large files dropping below <strong>1%</strong> performance 🤯.</li>
</ul>
<p>In practice, this means that installing packages (<code>yarn install</code>), running the development server
(<code>yarn dev</code>), or even checking the status of a Git repository (<code>git status</code>) can typically take
<strong>10-20x longer</strong> when crossing filesystem boundaries.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="the-solution">The solution<a href="https://takken.io/blog/seamless-windows-linux-development#the-solution" class="hash-link" aria-label="Direct link to The solution" title="Direct link to The solution" translate="no">​</a></h2>
<p>We can completely circumvent the performance bottleneck by following a simple rule</p>
<ul>
<li class="">💡 When working in Windows, use the Windows filesystem</li>
<li class="">💡 When working in Linux, use the Linux filesystem</li>
</ul>
<p>This leaves us with a new problem:</p>
<ul>
<li class="">❌ Changes to files and folders only reflected on one side</li>
</ul>
<p>Both of which we can solve using:</p>
<ul>
<li class="">✅ Real-time cross-system file synchronisation</li>
</ul>
<p>There aren't many tools that do bidirectional local sync with conflict resolution well. But I've
found a solution.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="alternatives">Alternatives<a href="https://takken.io/blog/seamless-windows-linux-development#alternatives" class="hash-link" aria-label="Direct link to Alternatives" title="Direct link to Alternatives" translate="no">​</a></h2>
<p>Before we dive further into details, you might wonder: <strong>why not just use VMs or dual boot?</strong> It's a
fair question.</p>
<p>I evaluated the following alternatives before settling on WSL with bi-directional sync.</p>
<p>TL;DR:</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAECAYAAAC3OK7NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAlElEQVR4nAXBbw+BQADA4fswZobIXbqr/GlxoqLJYv7N2Hhh84bvv5/nEdoxbNyIzMQcy4K6yNivc85lgVnN6G0TOkGEiPsBd39MNQy4bmbUdsQpTzgvJ0S7BPlI6UxChNv20M0+pivRUqGlh1EevitxtE9DK1oDHzF3Q7465hZNeR8WvCrLs7J8asvokqJ+axw75Q9uZ0a+y9TeSQAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="93"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/development-workflow-comparison.94acd16.256.png" srcset="/assets/ideal-img/development-workflow-comparison.94acd16.256.png 256w,/assets/ideal-img/development-workflow-comparison.9fd56b4.717.png 717w,/assets/ideal-img/development-workflow-comparison.250bd24.1178.png 1178w,/assets/ideal-img/development-workflow-comparison.b56dc1f.1639.png 1639w,/assets/ideal-img/development-workflow-comparison.de74ce2.2000.png 2000w" width="256" height="93"></noscript></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="type-2-hypervisors">Type 2 hypervisors<a href="https://takken.io/blog/seamless-windows-linux-development#type-2-hypervisors" class="hash-link" aria-label="Direct link to Type 2 hypervisors" title="Direct link to Type 2 hypervisors" translate="no">​</a></h3>
<ul>
<li class="">❌ <strong>VMware Workstation Pro</strong>: The pro version allows using host APIs to access the GPU and
provides 3D acceleration, but not true passthrough (PCIe-level access). This limitation can be
significant for machine learning workloads that expect direct GPU access.</li>
<li class="">⚠️ <strong>QEMU/KVM VFIO</strong>: QEMU on Windows 11 typically runs without hardware-assisted virtualization
(like KVM), limiting its efficiency. Windows 11 lacks direct support for VFIO, inhibiting true GPU
passthrough.</li>
</ul>
<p>Since there is no passthrough, we would not be able to work with LLMs and other GPU workloads
effectively.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="type-1-hypervisors">Type 1 Hypervisors<a href="https://takken.io/blog/seamless-windows-linux-development#type-1-hypervisors" class="hash-link" aria-label="Direct link to Type 1 Hypervisors" title="Direct link to Type 1 Hypervisors" translate="no">​</a></h3>
<ul>
<li class="">⚠️ <strong>VMware ESXi</strong>: The free version has limited GPU passthrough support. The paid version
supports GPU passthrough (Direct Device Assignment), although no official support for consumer
GPUs.</li>
<li class="">⚠️ <strong>Hyper-V</strong>: Microsoft's Hyper-V does offer GPU passthrough (Discrete Device Assignment),
although no official support for either Windows 11 or consumer GPUs.</li>
<li class="">✅ <strong>Proxmox</strong>: Offers built-in PCI passthrough and works well for this task</li>
</ul>
<p>Looks like Proxmox is an excellent candidate bare metal hypervisor that allows you to run Windows
and Linux alongside each other and assign hardware to either of them</p>
<p>Caveat: To switch, Shut down VM #1 → detach GPU → attach GPU to VM #2 → start VM #2.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>For the gamers among us, this approach would also incur a small performance loss (1-5% loss in FPS).
Acceptable?</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dual-boot">Dual Boot<a href="https://takken.io/blog/seamless-windows-linux-development#dual-boot" class="hash-link" aria-label="Direct link to Dual Boot" title="Direct link to Dual Boot" translate="no">​</a></h3>
<ul>
<li class="">✅ <strong>Native performance</strong>: Files live natively where they're accessed most.</li>
<li class="">⚠️ <strong>Context switching</strong>: Rebooting between OSes disrupts flow.</li>
<li class="">⚠️ <strong>Shared state issues</strong>: Managing shared files and configurations between OSes is messy.</li>
</ul>
<p>A dual boot setup is probably a good option if you intend to do all development work on Linux and
other tasks on Windows that are not needed at the same time.</p>
<p>Personally I like to alternate between playing games and developing stuff on the regular.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="wsl2--sync-this-approach">WSL2 + Sync (This approach)<a href="https://takken.io/blog/seamless-windows-linux-development#wsl2--sync-this-approach" class="hash-link" aria-label="Direct link to WSL2 + Sync (This approach)" title="Direct link to WSL2 + Sync (This approach)" translate="no">​</a></h3>
<ul>
<li class="">✅ <strong>Native performance</strong>: Files live natively where they're accessed</li>
<li class="">✅ <strong>Unified development environment</strong>: No context switching, instant tool access</li>
<li class="">⚠️ <strong>GPU Virtualization</strong>: WSL2 provides GPU acceleration using a virtual GPU driver. It runs CUDA
and DirectX workloads (AI/ML workloads, graphics rendering, etc.) efficiently.</li>
</ul>
<p>For sake of moving forward I made the assumption that GPU virtualisation will be sufficient for my
development needs.</p>
<p>What remains then is to solve the cross-filesystem performance issue with real-time synchronisation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="enter-mutagen-real-time-bidirectional-sync">Enter Mutagen: real-time bidirectional sync<a href="https://takken.io/blog/seamless-windows-linux-development#enter-mutagen-real-time-bidirectional-sync" class="hash-link" aria-label="Direct link to Enter Mutagen: real-time bidirectional sync" title="Direct link to Enter Mutagen: real-time bidirectional sync" translate="no">​</a></h2>
<p><a href="https://mutagen.io/" target="_blank" rel="noopener noreferrer" class="">Mutagen</a> provides real-time bidirectional file synchronisation designed
specifically for development workflows:</p>
<ul>
<li class=""><strong>Real-time synchronization</strong> with cross-platform filesystem watchers</li>
<li class=""><strong>Conflict resolution</strong> for simultaneous edits, creation, deletes</li>
<li class=""><strong>Extensive ignore patterns</strong> for node_modules, build artifacts, etc.</li>
</ul>
<p>Each environment accesses files on their own filesystem. Mutagen synchronises files between them in
the background.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAf0lEQVR4nE2MQQ6DMAwEeU2L7QQIxXFo4dD/P2oqIlXtYaTVzmqHUQOx4C7OUk42f3fm5UDUEauMWhlSPpjziVlg5YX6jviT4jtbcUxXUnIGsYZaoBrotCNLQ+aGTYHZhnYqw3XbkYqsgdbGPT+4Je/d1/+GF6kiORin6PnffQALQU2l0QzuVAAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="126"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/mutagen-sync-architecture.84ea585.256.png" srcset="/assets/ideal-img/mutagen-sync-architecture.84ea585.256.png 256w,/assets/ideal-img/mutagen-sync-architecture.72852c0.717.png 717w,/assets/ideal-img/mutagen-sync-architecture.a233a61.1178.png 1178w,/assets/ideal-img/mutagen-sync-architecture.4e5fb25.1200.png 1200w" width="256" height="126"></noscript></div></div></div>
<p>Alternative solutions I've looked at lack important features:</p>
<ul>
<li class=""><strong>rsync</strong>: Not made for bidirectional sync; no conflict resolution</li>
<li class=""><strong>Unison</strong>: Requires multiple endpoints and complex configuration</li>
<li class=""><strong>rclone bisync</strong>: Cloud-optimised, complicated ignore patterns</li>
<li class=""><strong>Syncthing</strong>: Looked promising, but no same-host folder support</li>
<li class=""><strong>Native Windows tools</strong>: Not designed for development workflows</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="mutagen-setup-guide">Mutagen setup guide<a href="https://takken.io/blog/seamless-windows-linux-development#mutagen-setup-guide" class="hash-link" aria-label="Direct link to Mutagen setup guide" title="Direct link to Mutagen setup guide" translate="no">​</a></h2>
<p>Let's walk through setting up a robust, production-ready sync between Windows and WSL2.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://takken.io/blog/seamless-windows-linux-development#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class="">Windows 10/11 with WSL2 enabled</li>
<li class="">Ubuntu 22.04 (or your preferred WSL distro from <code>wsl --list --online</code>)</li>
<li class="">Username in WSL your Windows username in lowercase (e.g., <code>webber</code> for <code>Webber</code>)</li>
<li class="">Administrative access to Windows</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-install-the-mutagen-binary">Step 1: install the Mutagen binary<a href="https://takken.io/blog/seamless-windows-linux-development#step-1-install-the-mutagen-binary" class="hash-link" aria-label="Direct link to Step 1: install the Mutagen binary" title="Direct link to Step 1: install the Mutagen binary" translate="no">​</a></h3>
<p>Download the latest version of <a href="https://github.com/mutagen-io/mutagen/releases" target="_blank" rel="noopener noreferrer" class="">Mutagen</a> and install
it on Windows.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="manual-installation">Manual installation<a href="https://takken.io/blog/seamless-windows-linux-development#manual-installation" class="hash-link" aria-label="Direct link to Manual installation" title="Direct link to Manual installation" translate="no">​</a></h4>
<p>For example,</p>
<ul>
<li class="">download <code>mutagen_windows_amd64_v0.18.1.tar.gz</code> from that page,</li>
<li class="">use 7-Zip to extract it, and</li>
<li class="">place the <code>mutagen.exe</code> in a directory like <code>C:\Users\YourName\Bin</code>.</li>
<li class="">Then add that directory to your PATH environment variable.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="automated-installation">Automated installation<a href="https://takken.io/blog/seamless-windows-linux-development#automated-installation" class="hash-link" aria-label="Direct link to Automated installation" title="Direct link to Automated installation" translate="no">​</a></h4>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Installing the mutagen binary</summary><div><div class="collapsibleContent_i85q"><p>Here's a PowerShell script to automate the installation:</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Create directory and download (adjust version as needed)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mkdir C:\Users\</span><span class="token variable" style="color:#36acaa">$env</span><span class="token plain">:USERNAME\Bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd C:\Users\</span><span class="token variable" style="color:#36acaa">$env</span><span class="token plain">:USERNAME\Bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Download latest release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Invoke-WebRequest</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Uri </span><span class="token string" style="color:#e3116c">"https://github.com/mutagen-io/mutagen/releases/download/v0.18.1/mutagen_windows_amd64_v0.18.1.zip"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">OutFile </span><span class="token string" style="color:#e3116c">"mutagen.zip"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Extract</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Expand-Archive</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Path mutagen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">zip </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">DestinationPath </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Force</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Remove-Item</span><span class="token plain"> mutagen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">zip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Add to PATH</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token namespace" style="opacity:0.7">[Environment]</span><span class="token plain">::SetEnvironmentVariable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Path"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$env</span><span class="token plain">:Path </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">";C:\Users\</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERNAME\Bin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">[EnvironmentVariableTarget]</span><span class="token plain">::User</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Verify installation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mutagen version</span><br></span></code></pre></div></div></div></div></details>
<p>You can now run <code>mutagen</code> from any location.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-global-configuration">Step 2: global configuration<a href="https://takken.io/blog/seamless-windows-linux-development#step-2-global-configuration" class="hash-link" aria-label="Direct link to Step 2: global configuration" title="Direct link to Step 2: global configuration" translate="no">​</a></h3>
<p>Before setting up sync sessions, be sure to configure Mutagen globally. This ensures that all sync
sessions use consistent settings and ignore patterns.</p>
<p>Create a <code>.mutagen.yml</code> file in your Windows home directory.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Example `~/.mutagen.yml` with most important settings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">sync</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">defaults</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'two-way-resolved'</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Bidirectional sync with auto-resolution</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scanMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'accelerated'</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Filesystem watching for better performance</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">watch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'portable'</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Use watchers for Windows and Linux filesystems</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ignore</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Ignore unnecessary and platform specific files</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node_modules/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'__pycache__/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'vendor/'</span><br></span></code></pre></div></div>
<p>You can configure ignore patterns in two ways: Ignores that should always apply can be configured
globally in <code>.mutagen.yml</code>, while session-specific ignores can be defined when creating sync
sessions.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Here is my actual <code>.mutagen.yml</code> configuration</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># ~/.mutagen.yml (in Windows homedir)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">sync</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">defaults</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'two-way-resolved'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scanMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'accelerated'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">watch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'portable'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">pollingInterval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">permissions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">defaultFileMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0644</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">defaultDirectoryMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0755</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ignore</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">vcs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Add any ignore patterns you want to apply for every sync session</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">paths</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Node.js / JavaScript</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node_modules/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.next/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.nuxt/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.output/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dist/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'build/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'out/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.turbo/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.parcel-cache/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.cache/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.cache-loader/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'coverage/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.nyc_output/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.grunt/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'bower_components/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.sass-cache/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.fusebox/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.dynamodb/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.serverless/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.webpack/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.vuepress/dist/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.docusaurus/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.umi/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.umi-production/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tern-port'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.lock-wscript'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.node_repl_history'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.pid'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.seed'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.pid.lock'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.npm/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.config/configstore/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pnp.cjs'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pnp.loader.mjs'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.yarn/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pnp/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pnp.js'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pnp.*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.yarn-integrity'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.tsbuildinfo'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.eslintcache'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.stylelintcache'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.terser-cache'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.rpt2_cache/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.rts2_cache_cjs/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.rts2_cache_es/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.rts2_cache_umd/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'playwright-report/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'test-results/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cypress/videos/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cypress/screenshots/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Python</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'__pycache__/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.py[cod]'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*$py.class'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'venv/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'env/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ENV/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.Python'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pytest_cache/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tox/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.coverage'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.coverage.*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'htmlcov/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.hypothesis/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pytype/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.mypy_cache/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.dmypy.json'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dmypy.json'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.pyre/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.ruff_cache/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Rust</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'target/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Cargo.lock'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'**/*.rs.bk'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'src-tauri/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Java/Gradle</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.gradle/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'gradle-app.setting'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.gradletasknamecache'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># C#</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'bin/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'obj/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'artifacts/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Unity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Library/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Temp/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'obj/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Build/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Builds/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Logs/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'UserSettings/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'UnityConnectSettings.asset'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># PHP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.phpunit.result.cache'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'vendor/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Go</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'vendor/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'go.sum'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># IDEs and editors</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.swp'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.swo'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*~'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.project'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.classpath'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.vscode-test/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># OS files</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.DS_Store'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.DS_Store?'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'._*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.Spotlight-V100'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.Trashes'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ehthumbs.db'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Thumbs.db'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'desktop.ini'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Temporary files</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tmp/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'temp/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tmp/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.temp/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.tmp'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.temp'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.bak'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.backup'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.old'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.log'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*.log*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'logs/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Documentation builds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'_site/'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'site/'</span><br></span></code></pre></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-automate-startup">Step 3: Automate startup<a href="https://takken.io/blog/seamless-windows-linux-development#step-3-automate-startup" class="hash-link" aria-label="Direct link to Step 3: Automate startup" title="Direct link to Step 3: Automate startup" translate="no">​</a></h3>
<p>To ensure Mutagen starts automatically when Windows boots, create a startup script that's executed
when your system starts.</p>
<p>I've created a PowerShell script that checks all prerequisites and sets up the necessary
environment. It also creates a startup script that starts the Mutagen daemon and resumes all sync
sessions on startup.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install mutagen setup</summary><div><div class="collapsibleContent_i85q"><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># install-mutagen.ps1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Mutagen Installation and Setup</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># This script handles Mutagen installation checks and general setup</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Running this script multiple times will have no negative effects</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"=== Mutagen Installation and Setup ==="</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Cyan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Check if Mutagen is installed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Checking Mutagen installation..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">$mutagenVersion</span><span class="token plain"> = mutagen version 2&gt;</span><span class="token variable" style="color:#36acaa">$null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Mutagen command failed"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" OK"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Version: </span><span class="token string variable" style="color:#36acaa">$mutagenVersion</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" FAILED"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Error: Mutagen is not installed or not in PATH"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Please install Mutagen from: https://github.com/mutagen-io/mutagen/releases"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">exit</span><span class="token plain"> 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Check if WSL is available</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Checking WSL availability..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">$wslStatus</span><span class="token plain"> = wsl </span><span class="token operator" style="color:#393A34">--</span><span class="token plain">status 2&gt;</span><span class="token variable" style="color:#36acaa">$null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WSL command failed"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" OK"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" FAILED"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Error: WSL is not installed or not running"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Please install WSL: wsl --install"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">exit</span><span class="token plain"> 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Check if Ubuntu-22.04 distro exists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Checking Ubuntu-22.04 distro..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$distros</span><span class="token plain"> = wsl </span><span class="token operator" style="color:#393A34">--</span><span class="token plain">list </span><span class="token operator" style="color:#393A34">--</span><span class="token plain">quiet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$distros</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-notcontains</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Ubuntu-22.04"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" FAILED"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Error: Ubuntu-22.04 distro not found"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Available distros:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">$distros</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  - </span><span class="token string variable" style="color:#36acaa">$_</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">exit</span><span class="token plain"> 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" OK"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Check if .mutagen.yml exists in home directory</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$mutagenConfig</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERPROFILE\.mutagen.yml"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Checking .mutagen.yml configuration..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$mutagenConfig</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" MISSING"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Warning: No .mutagen.yml found in </span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERPROFILE"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Sync will use command-line ignore patterns only"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" OK"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Start Mutagen daemon if not running</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Starting Mutagen daemon..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mutagen daemon </span><span class="token function" style="color:#d73a49">start</span><span class="token plain"> 2&gt;</span><span class="token variable" style="color:#36acaa">$null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" OK"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" FAILED"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Error: Could not start Mutagen daemon"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">exit</span><span class="token plain"> 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Create startup bat file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$binDir</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"C:\Users\</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERNAME\Bin"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$startupScript</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$binDir</span><span class="token string" style="color:#e3116c">\mutagen-startup.bat"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Creating startup script..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$startupScript</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" EXISTS"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Found: </span><span class="token string variable" style="color:#36acaa">$startupScript</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Create Bin directory if it doesn't exist</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$binDir</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">New-Item</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ItemType Directory </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Path </span><span class="token variable" style="color:#36acaa">$binDir</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Force </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Out-Null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Create the bat file content</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">$batContent</span><span class="token plain"> = @</span><span class="token string" style="color:#e3116c">"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">@echo off</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">mutagen daemon start</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">mutagen sync resume --all</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">"</span><span class="token plain">@</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Set-Content</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Path </span><span class="token variable" style="color:#36acaa">$startupScript</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Value </span><span class="token variable" style="color:#36acaa">$batContent</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Encoding ASCII</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" OK"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Created: </span><span class="token string variable" style="color:#36acaa">$startupScript</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" FAILED"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Error: Could not create startup script"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$_</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Exception</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Message </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">exit</span><span class="token plain"> 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Register startup shortcut</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$startupShortcut</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\Mutagen.lnk"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Registering startup shortcut..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$startupShortcut</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" EXISTS"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Found: </span><span class="token string variable" style="color:#36acaa">$startupShortcut</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$startupScript</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token variable" style="color:#36acaa">$WshShell</span><span class="token plain"> = </span><span class="token function" style="color:#d73a49">New-Object</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">comObject WScript</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Shell</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token variable" style="color:#36acaa">$Shortcut</span><span class="token plain"> = </span><span class="token variable" style="color:#36acaa">$WshShell</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CreateShortcut</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$startupShortcut</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token variable" style="color:#36acaa">$Shortcut</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TargetPath = </span><span class="token variable" style="color:#36acaa">$startupScript</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token variable" style="color:#36acaa">$Shortcut</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">WorkingDirectory = </span><span class="token variable" style="color:#36acaa">$binDir</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token variable" style="color:#36acaa">$Shortcut</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">WindowStyle = 7  </span><span class="token comment" style="color:#999988;font-style:italic"># Minimized</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token variable" style="color:#36acaa">$Shortcut</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Description = </span><span class="token string" style="color:#e3116c">"Start Mutagen sync daemon and resume all sessions"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token variable" style="color:#36acaa">$Shortcut</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" OK"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Created: </span><span class="token string variable" style="color:#36acaa">$startupShortcut</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Startup script not found"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" FAILED"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Error: Could not create startup shortcut"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$_</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Exception</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Message </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">exit</span><span class="token plain"> 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"`n=== Installation Complete ==="</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Mutagen is installed and configured for auto-startup."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Green</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"`nNext steps:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Cyan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  .\install-mutagen-syncs.ps1          # Create sync sessions"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  .\install-mutagen-syncs.ps1 -Force   # Recreate sync sessions"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span></code></pre></div></div></div></div></details>
<p>Example output</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAECAYAAAC3OK7NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAdklEQVR4nCWNMQ6DMBAE+QqKb+9sbDAgglJE6fL/H00EKabZWWmG7/LmbAd7bkQk3BMuwyVMhpkhiWE9Tvbni7p2ksQ4jqRk5FKIXJAHJmdY9pm+zbRWqbVRLqmgTDNTXYg8/Y8f62wpsz2CkCP5nXOPmyt7bT/8rTt/R/ou/gAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="103"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/install-mutagen-example-output.5d20a83.256.png" srcset="/assets/ideal-img/install-mutagen-example-output.5d20a83.256.png 256w,/assets/ideal-img/install-mutagen-example-output.1e1ff6e.717.png 717w,/assets/ideal-img/install-mutagen-example-output.4b68586.1178.png 1178w,/assets/ideal-img/install-mutagen-example-output.7e645ce.1271.png 1271w" width="256" height="103"></noscript></div></div></div>
<p>Mutagen will now start automatically when you log in to Windows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="managing-sync-sessions">Managing sync sessions<a href="https://takken.io/blog/seamless-windows-linux-development#managing-sync-sessions" class="hash-link" aria-label="Direct link to Managing sync sessions" title="Direct link to Managing sync sessions" translate="no">​</a></h2>
<p>We can now create sync sessions.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-usage">Example usage<a href="https://takken.io/blog/seamless-windows-linux-development#example-usage" class="hash-link" aria-label="Direct link to Example usage" title="Direct link to Example usage" translate="no">​</a></h3>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example usage</summary><div><div class="collapsibleContent_i85q"><p>Create a sync</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Create a sync session</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mutagen sync create `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">"C:\Users\</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERNAME\Repositories"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">"\\wsl.localhost\Ubuntu-22.04\home\</span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$env</span><span class="token string function" style="color:#d73a49">:USERNAME</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">ToLower</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">)\Repositories\"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">--</span><span class="token plain">name=</span><span class="token string" style="color:#e3116c">"repositories"</span><br></span></code></pre></div></div><p>Monitor progress.</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Watch sync progress in real-time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mutagen sync monitor repositories</span><br></span></code></pre></div></div><p>Skip file discovery and force a sync cycle using the <code>flush</code> option.</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Skip file discovery and force a sync</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mutagen sync flush repositories</span><br></span></code></pre></div></div><p>Remove a sync session using the <code>terminate</code> command.</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Remove a sync session</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mutagen sync terminate repositories</span><br></span></code></pre></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-sync-sessions-with-a-script">Creating sync sessions with a script<a href="https://takken.io/blog/seamless-windows-linux-development#creating-sync-sessions-with-a-script" class="hash-link" aria-label="Direct link to Creating sync sessions with a script" title="Direct link to Creating sync sessions with a script" translate="no">​</a></h3>
<p>Here's my setup script that creates the sync session for my repositories and home directory.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Sync script</summary><div><div class="collapsibleContent_i85q"><p>Look for the <code>Create-Sync</code> function calls to see how syncs are configured.</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Mutagen Sync Session Management</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># This script manages Mutagen sync sessions between Windows and WSL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">param</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token namespace" style="opacity:0.7">[switch]</span><span class="token variable" style="color:#36acaa">$Force</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Force recreation of syncs even if they exist</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Mutagen Sync Session Management"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Cyan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Track if any syncs already exist (for showing tip at end)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$script</span><span class="token plain">:HasExistingSyncs = </span><span class="token boolean" style="color:#36acaa">$false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Function to create or recreate a sync with simpler positional parameters</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> Create-Sync </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">param</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[Parameter(Position=0, Mandatory=$true)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[string]</span><span class="token variable" style="color:#36acaa">$Name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[Parameter(Position=1, Mandatory=$true)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[string]</span><span class="token variable" style="color:#36acaa">$SourcePath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[Parameter(Position=2, Mandatory=$true)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[string]</span><span class="token variable" style="color:#36acaa">$DestPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[Parameter(Position=3, Mandatory=$false)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">[string[]]</span><span class="token variable" style="color:#36acaa">$IgnorePatterns</span><span class="token plain"> = @</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Managing '</span><span class="token string variable" style="color:#36acaa">$Name</span><span class="token string" style="color:#e3116c">' sync..."</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Sanitize name for mutagen:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># - Replace invalid characters with hyphens</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># - Only allow alphanumeric, hyphens, and underscores</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># - Truncate to 63 characters max</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">$SafeName</span><span class="token plain"> = </span><span class="token variable" style="color:#36acaa">$Name</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-replace</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[^a-zA-Z0-9_-]'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$SafeName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Length </span><span class="token operator" style="color:#393A34">-gt</span><span class="token plain"> 63</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$SafeName</span><span class="token plain"> = </span><span class="token variable" style="color:#36acaa">$SafeName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Substring</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> 63</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Check if sync exists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">$syncList</span><span class="token plain"> = mutagen sync list 2&gt;</span><span class="token variable" style="color:#36acaa">$null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">$existingSync</span><span class="token plain"> = </span><span class="token variable" style="color:#36acaa">$syncList</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$_</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-match</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^Name:\s+</span><span class="token string variable" style="color:#36acaa">$SafeName</span><span class="token string" style="color:#e3116c">\s*$"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$existingSync</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-and</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token variable" style="color:#36acaa">$Force</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" Exists"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$script</span><span class="token plain">:HasExistingSyncs = </span><span class="token boolean" style="color:#36acaa">$true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$existingSync</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-and</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$Force</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" Terminating"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        mutagen sync terminate </span><span class="token variable" style="color:#36acaa">$SafeName</span><span class="token plain"> 2&gt;</span><span class="token variable" style="color:#36acaa">$null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Start-Sleep</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Seconds 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token variable" style="color:#36acaa">$existingSync</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" Creating"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Check if source and destination exist</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SourcePath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" Failed"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Source path not found: </span><span class="token string variable" style="color:#36acaa">$SourcePath</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Create destination directory if it doesn't exist</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$DestPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">New-Item</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ItemType Directory </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Path </span><span class="token variable" style="color:#36acaa">$DestPath</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Force </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Out-Null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" Failed"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Cannot create destination: </span><span class="token string variable" style="color:#36acaa">$DestPath</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Build create command</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">$createArgs</span><span class="token plain"> = @</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"sync"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$SourcePath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$DestPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"--name=</span><span class="token string variable" style="color:#36acaa">$SafeName</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Add ignore patterns if provided</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$pattern</span><span class="token plain"> in </span><span class="token variable" style="color:#36acaa">$IgnorePatterns</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$createArgs</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"--ignore=</span><span class="token string variable" style="color:#36acaa">$pattern</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$output</span><span class="token plain"> = &amp; mutagen @createArgs 2&gt;&amp;1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Sync creation failed"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Show mutagen output indented and in dark gray (filter out empty lines)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$output</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$output</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$_</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-ne</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"    </span><span class="token string variable" style="color:#36acaa">$_</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" Failed"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Error creating sync: </span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$_</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">Exception</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">Message</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">exit</span><span class="token plain"> 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Create syncs using simplified positional parameters</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Home sync with specific ignore patterns</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Create-Sync `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"home"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"C:\Users\</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERNAME\"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"\\wsl.localhost\Ubuntu-22.04\home\</span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$env</span><span class="token string function" style="color:#d73a49">:USERNAME</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">ToLower</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">)\"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    @</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.mutagen.yml'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.gitconfig*'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.claude/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.claude/test.md'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.claude/CLAUDE.md'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.claude/mcp.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.claude/settings.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.claude/settings.local.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.aws/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.aws/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.config/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.config/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.ssh/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.ssh/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.editorconfig'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'!.wslconfig'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Repository syncs - explicit paths for clarity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Create-Sync `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"takken.io"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"C:\Users\</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERNAME\Repositories\takken.io\"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"\\wsl.localhost\Ubuntu-22.04\home\</span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$env</span><span class="token string function" style="color:#d73a49">:USERNAME</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">ToLower</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">)\Repositories\takken.io\"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Create-Sync `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"docusaurus-plugin-content-gists"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"C:\Users\</span><span class="token string variable" style="color:#36acaa">$env</span><span class="token string" style="color:#e3116c">:USERNAME\Repositories\docusaurus-plugin-content-gists\"</span><span class="token plain"> `</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"\\wsl.localhost\Ubuntu-22.04\home\</span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$env</span><span class="token string function" style="color:#d73a49">:USERNAME</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">ToLower</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">)\Repositories\docusaurus-plugin-content-gists\"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Show tip if any syncs already existed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$script</span><span class="token plain">:HasExistingSyncs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"`nTip: Use "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-Force"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor White </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" to recreate existing syncs"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"`nSync Status"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Cyan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Parse mutagen sync list output manually</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$syncListOutput</span><span class="token plain"> = mutagen sync list 2&gt;</span><span class="token variable" style="color:#36acaa">$null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$syncListOutput</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">$lines</span><span class="token plain"> = </span><span class="token variable" style="color:#36acaa">$syncListOutput</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">split </span><span class="token string" style="color:#e3116c">"`n"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token plain"> = @</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$line</span><span class="token plain"> in </span><span class="token variable" style="color:#36acaa">$lines</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$line</span><span class="token plain"> = </span><span class="token variable" style="color:#36acaa">$line</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$line</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-match</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^Name:\s*(.+)$"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name = </span><span class="token variable" style="color:#36acaa">$matches</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elseif</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$line</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-match</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^URL:\s*(.+)$"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-and</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Alpha</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Alpha = </span><span class="token variable" style="color:#36acaa">$matches</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elseif</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$line</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-match</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^URL:\s*(.+)$"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-and</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Alpha</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Beta = </span><span class="token variable" style="color:#36acaa">$matches</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elseif</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$line</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-match</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^Status:\s*(.+)$"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Status = </span><span class="token variable" style="color:#36acaa">$matches</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># Output the sync info when we have all parts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name </span><span class="token operator" style="color:#393A34">-and</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Alpha </span><span class="token operator" style="color:#393A34">-and</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Beta </span><span class="token operator" style="color:#393A34">-and</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Status</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Status </span><span class="token operator" style="color:#393A34">-match</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"(Watching for changes|Scanning files)"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token variable" style="color:#36acaa">$statusDisplay</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"✓"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token variable" style="color:#36acaa">$statusColor</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"Green"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">elseif</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Status </span><span class="token operator" style="color:#393A34">-match</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"(conflict|error|failed|problem)"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token variable" style="color:#36acaa">$statusDisplay</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"✗ </span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$currentSync</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">Status</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token variable" style="color:#36acaa">$statusColor</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"Red"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token variable" style="color:#36acaa">$statusDisplay</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"⚠ </span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$currentSync</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">Status</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token variable" style="color:#36acaa">$statusColor</span><span class="token plain"> = </span><span class="token string" style="color:#e3116c">"Yellow"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  </span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$currentSync</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">Name</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">: "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor White </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$statusDisplay</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor </span><span class="token variable" style="color:#36acaa">$statusColor</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"    "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$currentSync</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">Alpha</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c"> "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"↔ "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Yellow </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string function" style="color:#d73a49">$</span><span class="token string function punctuation" style="color:#393A34">(</span><span class="token string function variable" style="color:#36acaa">$currentSync</span><span class="token string function punctuation" style="color:#393A34">.</span><span class="token string function" style="color:#d73a49">Beta</span><span class="token string function punctuation" style="color:#393A34">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token variable" style="color:#36acaa">$currentSync</span><span class="token plain"> = @</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  No syncs found"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"`nUseful Commands"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Cyan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  mutagen sync create "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[name]"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Magenta </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[source]"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Magenta </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[dest]"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Magenta </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"   # Create a new sync"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  mutagen sync terminate "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[name]"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Magenta </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"                # Remove specific sync"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  mutagen sync list                            # List all syncs"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  mutagen sync list -l                         # List all syncs with detailed info"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  mutagen sync monitor "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[name]"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor Magenta </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">NoNewline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"                  # Watch sync activity for a specific sync"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ForegroundColor DarkGray</span><br></span></code></pre></div></div></div></div></details>
<p>Example output:</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAg0lEQVR4nE3ONw7CQBRAwT2Kwd6fNjoUFDTc/1APISREMf2kVzw4y8EVO8WDfVZGD0zzHyFZb6g7mwg5K0UzzTc8Lz8mK+k8LubYaa1j5hQ3WijFhepKDSVMST4nbR6M2jExIhq1TtQKIv6lRnquk7EGYxG2250ShV4rbo5+OtuKqvAGoJdKQGjFejQAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="131"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/install-mutagen-syncs-example-output.7ce44bb.256.png" srcset="/assets/ideal-img/install-mutagen-syncs-example-output.7ce44bb.256.png 256w,/assets/ideal-img/install-mutagen-syncs-example-output.854d2ba.717.png 717w,/assets/ideal-img/install-mutagen-syncs-example-output.82c05e4.1178.png 1178w,/assets/ideal-img/install-mutagen-syncs-example-output.f52a643.1269.png 1269w" width="256" height="131"></noscript></div></div></div>
<p><strong>And that's it!</strong> Mutagen will keep the desired folders in sync!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="wsl-configuration">WSL configuration<a href="https://takken.io/blog/seamless-windows-linux-development#wsl-configuration" class="hash-link" aria-label="Direct link to WSL configuration" title="Direct link to WSL configuration" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="config-file">Config file<a href="https://takken.io/blog/seamless-windows-linux-development#config-file" class="hash-link" aria-label="Direct link to Config file" title="Direct link to Config file" translate="no">​</a></h3>
<p>Create a <code>.wslconfig</code> file in your Windows home directory.</p>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">wsl2</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Machine configuration for WSL2 on Windows 11</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">16GB</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">processors</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">swap</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">0                      # Disable swap if you have enough RAM</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">nestedVirtualization</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">false  # Disable if not needed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Networking settings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">localhostForwarding</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">true    # Allows you to run dev server on WSL and access it via localhost</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">dhcp</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">true                   # WSL obtains IP via DHCP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">ipv6</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">true                   # Enable IPv6 support</span><br></span></code></pre></div></div>
<p>Change it to suit your hardware. This example allocates 16GB of RAM and 8 CPU cores to WSL2.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Run <code>wsl --shutdown</code> to apply the changes.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gpu-access">GPU access<a href="https://takken.io/blog/seamless-windows-linux-development#gpu-access" class="hash-link" aria-label="Direct link to GPU access" title="Direct link to GPU access" translate="no">​</a></h3>
<p>To run GPU workloads in WSL2, you need to install CUDA toolkit.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> nvidia-cuda-toolkit</span><br></span></code></pre></div></div>
<p>Verify that passthrough works:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">nvidia-smi</span><br></span></code></pre></div></div>
<p>It works if you see the driver version and CUDA version.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAjElEQVR4nEXMSRLCIBRFUZYSIPL5QGjSqJVy/9u6VuLAwZudd816vKl9R0QJMTFCpDwE1Ux/BKxzWOswY3vR+s7SVmrfONpga4PaBnsduBtaTC6VqBmJioRIKoVUEiEIohnv/Y1NH09aO8i5oxdarlNAYkRT+RejVGo5afVDPjf0XJjnGe+v/WqTnfgCw3xKcrgBzuoAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="118"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/nvidia-smi-output.0a0f8ff.256.png" srcset="/assets/ideal-img/nvidia-smi-output.0a0f8ff.256.png 256w,/assets/ideal-img/nvidia-smi-output.caff2fd.717.png 717w,/assets/ideal-img/nvidia-smi-output.2b37a0f.1178.png 1178w,/assets/ideal-img/nvidia-smi-output.5e7eb3b.1258.png 1258w" width="256" height="118"></noscript></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-cli-access">Docker CLI access<a href="https://takken.io/blog/seamless-windows-linux-development#docker-cli-access" class="hash-link" aria-label="Direct link to Docker CLI access" title="Direct link to Docker CLI access" translate="no">​</a></h3>
<p>To use Docker CLI in WSL2, enable Docker integration in Docker Desktop settings on Windows.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAACXBIWXMAAAsTAAALEwEAmpwYAAABCElEQVR4nBXKPU7DMACA0WxICKkVVZImdmo7v45p2oS0aUXpARADEhdgYwGWCrFwdA8f4s0vyM6/fnb/46/aLy+miy9OF18+fvtm+vTH8c1f2w9/07z7wKoMqxROClKRoHONLgzSaG6lIM4SIrEkWFcd0+bIVrdo09D1B1w34rod1vWovCXKCoK0tBi3YZ5I1sYyDRP77YirWtp6TWsaypUhMI3DdgNRZqilZhoOTOMDg9vQuR5navIsJ8j+47BDFDWJKlkPB2w30tz15O1AampCqQniUCASRRQLQlWjmo40r4lVhawcsrSE6Ypg8fLE/PWZxfnEIhLcLiXzKGEWSeKsROc50u35A00odN7PMWD3AAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="198"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/configure-docker-desktop-for-wsl.25d6649.256.png" srcset="/assets/ideal-img/configure-docker-desktop-for-wsl.25d6649.256.png 256w,/assets/ideal-img/configure-docker-desktop-for-wsl.ac07d9c.717.png 717w,/assets/ideal-img/configure-docker-desktop-for-wsl.97435c8.926.png 926w" width="256" height="198"></noscript></div></div></div>
<p>At that point you should be able to run Docker commands in WSL2.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://takken.io/blog/seamless-windows-linux-development#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h4>
<p>In my case, I wasn't able to connect to the Docker daemon in WSL2, even though Docker Desktop was
running.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Fix: Incorrect binary</summary><div><div class="collapsibleContent_i85q"><p>WSL was picking up the wrong Docker binary from the Windows filesystem.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">which</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># /mnt/c/Program Files/Docker/Docker/resources/bin/docker</span><br></span></code></pre></div></div><p>To fix this, prevent the Windows PATH from being passed to WSL.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /etc/wsl.conf </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token string" style="color:#e3116c">EOF</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[interop]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">appendWindowsPath = false</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><br></span></code></pre></div></div><p>Then in PowerShell run:</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">wsl </span><span class="token operator" style="color:#393A34">--</span><span class="token plain">shutdown</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Restart WSL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">wsl</span><br></span></code></pre></div></div><p>Once back into WSL, the correct binary should be picked up.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">which</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># /usr/bin/docker</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Fix: Cannot connect to <code>.sock</code></summary><div><div class="collapsibleContent_i85q"><p>You can run <code>docker context ls</code> to see if the context is set up correctly.</p><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAABCAYAAADn9T9+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAALklEQVR4nGPQ1zP9r6Nt9t/a2vy/hYXRfxVVtf9a2rr/NTW1/qupqYOxiorqfwAxOQ8lUo+9JAAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="24"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/wsl-docker-contexts.a10d3c2.256.png" srcset="/assets/ideal-img/wsl-docker-contexts.a10d3c2.256.png 256w,/assets/ideal-img/wsl-docker-contexts.93aca5c.717.png 717w,/assets/ideal-img/wsl-docker-contexts.f1dd664.1178.png 1178w,/assets/ideal-img/wsl-docker-contexts.13b3b30.1639.png 1639w,/assets/ideal-img/wsl-docker-contexts.6b5a133.1813.png 1813w" width="256" height="24"></noscript></div></div></div><p>It should be using <code>default</code>. If it's not, run <code>docker context use default</code> to switch.</p><p>Either way, you might see an error like this when running Docker commands:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> daemon running?</span><br></span></code></pre></div></div><p>First thing you think of when this happens is to start Docker Desktop on Windows.</p><p>In my case, it was already running, but the socket file was not created in WSL2.</p><p>You can check this by running:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-alh</span><span class="token plain"> /var/run/docker.sock</span><br></span></code></pre></div></div><p>If it doesn't exist, then you must link the Windows Docker socket to WSL2.</p><p>First find it:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># List in the general location</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> /mnt/wsl/docker-desktop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># drill down to find the socket file, in my case it was here:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> /mnt/wsl/docker-desktop/shared-sockets/host-services/</span><br></span></code></pre></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAABCAYAAADn9T9+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAL0lEQVR4nAXBgQ0AEAwAQdsobRAqqYT9x3p36e7HWZfwIHxjprRquA1qFqZ2ShY+PEcPppM8PPgAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="34"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/wls-find-docker-sock.4c45e3d.256.png" srcset="/assets/ideal-img/wls-find-docker-sock.4c45e3d.256.png 256w,/assets/ideal-img/wls-find-docker-sock.fd5cb56.717.png 717w,/assets/ideal-img/wls-find-docker-sock.6fa8499.1178.png 1178w,/assets/ideal-img/wls-find-docker-sock.a0e0d36.1229.png 1229w" width="256" height="34"></noscript></div></div></div><p>Link it to the WSL2 <code>/var/run/docker.sock</code> location:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Create the directory if it doesn't exist</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> /var/run</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Link the socket file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ln</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-sf</span><span class="token plain"> /mnt/wsl/docker-desktop/shared-sockets/host-services/docker.proxy.sock /var/run/docker.sock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Set the correct permissions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">666</span><span class="token plain"> /var/run/docker.sock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Make sure your user is part of the group that owns the link</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token assign-left variable" style="color:#36acaa">GROUP</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable function" style="color:#d73a49">stat</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable parameter variable" style="color:#36acaa">-c</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">'%G'</span><span class="token variable" style="color:#36acaa"> /var/run/docker.sock</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">usermod</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-aG</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$GROUP</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable function" style="color:#d73a49">whoami</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Verify the link</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-alh</span><span class="token plain"> /var/run/docker.sock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Verify that the sock works</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ps</span><br></span></code></pre></div></div><p>Your output should be similar to this:</p><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAACCAYAAABhYU3QAAAACXBIWXMAAAsTAAALEwEAmpwYAAAARklEQVR4nB3DyQ3AIAxFQWox9pdyyAohe/9lvUiMNGk/Lmq7mZaCNBBS7xFkd7IZZkbaysm6fLTj5fkq8zqSJbKiV4hw5wfBXB4KjD1x8QAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="59"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/wsl-symlink-socket.3723db4.256.png" srcset="/assets/ideal-img/wsl-symlink-socket.3723db4.256.png 256w,/assets/ideal-img/wsl-symlink-socket.37d9f0b.717.png 717w,/assets/ideal-img/wsl-symlink-socket.bfca03b.1178.png 1178w,/assets/ideal-img/wsl-symlink-socket.e1b8461.1498.png 1498w" width="256" height="59"></noscript></div></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="conclusion">Conclusion<a href="https://takken.io/blog/seamless-windows-linux-development#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>This solution, using Mutagen offers an elegant workaround that delivers the best of both worlds:
Windows productivity tools along with Linux capabilities.</p>
<ul>
<li class=""><strong>Preserved workflows</strong>: Use Windows tools on Windows paths, Linux tools on Linux paths</li>
<li class=""><strong>Native performance</strong>: Each environment accesses files at full native speed</li>
<li class=""><strong>Transparent synchronisation</strong>: Changes appear on both sides almost instantly</li>
<li class=""><strong>No manual intervention</strong>: Once configured, synchronisation happens automatically</li>
</ul>
<p>No more 10-20x slowdowns. No more choosing between ecosystems. Whether you're building web apps,
training ML models, or juggling mixed technology stacks, this approach will help make WSL2 viable
for serious development work.</p>
<p>Have you tried this setup? Share your experience in the comments!</p>]]></content:encoded>
            <category>Windows</category>
            <category>Linux</category>
            <category>WSL</category>
            <category>Filesystem</category>
            <category>Performance</category>
            <category>Mutagen</category>
            <category>Development tools</category>
        </item>
        <item>
            <title><![CDATA[A modern terminal for Windows]]></title>
            <link>https://takken.io/blog/a-modern-terminal-for-windows</link>
            <guid>https://takken.io/blog/a-modern-terminal-for-windows</guid>
            <pubDate>Sat, 08 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[How to set up a proper terminal, shell, prompt and integrated tools in Windows, the modern way.]]></description>
            <content:encoded><![CDATA[<p>Always wanted your terminal to look and function like that of a professional developer? This post is
my attempt at providing a concise guide to setting up a modern terminal, while explaining essential
terminology and decisions made along the way.</p>
<p>To make for a truly slick experience, I have considered different terminals, shells, prompts and
hotkeys, as well as command-line tools and plugins, including typeahead and fuzzy search.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="a-quick-tip-">A quick tip 💡<a href="https://takken.io/blog/a-modern-terminal-for-windows#a-quick-tip-" class="hash-link" aria-label="Direct link to A quick tip 💡" title="Direct link to A quick tip 💡" translate="no">​</a></h2>
<p>Customizing your terminal can be time-consuming, so I use a simple trick to avoid repeating the
process.</p>
<p>My home directory is a git repository. I track only specific config and settings files while
ignoring everything else.</p>
<p>This keeps my setup consistent and makes syncing configurations across machines effortless.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="tldr">TL;DR<a href="https://takken.io/blog/a-modern-terminal-for-windows#tldr" class="hash-link" aria-label="Direct link to TL;DR" title="Direct link to TL;DR" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Just looking for the result?</summary><div><div class="collapsibleContent_i85q"><p>Here's the result you'll get if you follow along.</p><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAECAYAAAC3OK7NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAfUlEQVR4nAXB2Q2DMBRFQSohip+5xsYLmwgoEmkgf+m/lpOZ7oorTRPVj3gJM8+eG8tRSFNBCgwS3bWclNwIJrx5nDMkMS+Z930T5Rjl6L79xhEqU4g4b8gZxzMxj4laMi0FShTd7/Hi7isfqwxBBOc5h8a67mzrTokDUcYfAew8FnTiFxEAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="109"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/resulting-terminal.f0043ed.256.png" srcset="/assets/ideal-img/resulting-terminal.f0043ed.256.png 256w,/assets/ideal-img/resulting-terminal.0efda64.717.png 717w,/assets/ideal-img/resulting-terminal.9e36c5f.1178.png 1178w,/assets/ideal-img/resulting-terminal.1e0d1a8.1639.png 1639w,/assets/ideal-img/resulting-terminal.4b32cea.2100.png 2100w,/assets/ideal-img/resulting-terminal.7e445e8.2556.png 2556w" width="256" height="109"></noscript></div></div></div><p>Technologies used:</p><ul>
<li class=""><a href="https://github.com/microsoft/terminal" target="_blank" rel="noopener noreferrer" class="">Windows Terminal</a></li>
<li class=""><a href="https://github.com/PowerShell/PowerShell" target="_blank" rel="noopener noreferrer" class="">PowerShell 7</a></li>
<li class=""><a href="https://github.com/ryanoasis/nerd-fonts" target="_blank" rel="noopener noreferrer" class="">Nerd Font</a></li>
<li class=""><a href="https://draculatheme.com/windows-terminal" target="_blank" rel="noopener noreferrer" class="">Dracula theme</a></li>
<li class=""><a href="https://github.com/starship/starship" target="_blank" rel="noopener noreferrer" class="">Starship</a></li>
<li class=""><a href="https://github.com/devblackops/Terminal-Icons" target="_blank" rel="noopener noreferrer" class="">Terminal-Icons</a></li>
<li class=""><a href="https://github.com/PowerShell/PSReadLine" target="_blank" rel="noopener noreferrer" class="">PSReadLine</a></li>
<li class=""><a href="https://github.com/kelleyma49/PSFzf" target="_blank" rel="noopener noreferrer" class="">PSFzf</a></li>
<li class=""><a href="https://gitforwindows.org/" target="_blank" rel="noopener noreferrer" class="">Git for Windows</a>, with "Optional Unix tools" option enabled.</li>
</ul><p>Configuration files:</p><ul>
<li class=""><a href="https://gist.github.com/webbertakken/b5413d9a8bcb3644974d719393179b74" target="_blank" rel="noopener noreferrer" class="">Starship config</a></li>
<li class=""><a href="https://gist.github.com/webbertakken/8af7e20cdfd548294a8ad188612ce27d" target="_blank" rel="noopener noreferrer" class="">Windows Terminal settings</a></li>
<li class=""><a href="https://gist.github.com/webbertakken/78ad5a15d7e8e2e140a9ee8ac62b8419" target="_blank" rel="noopener noreferrer" class="">PowerShell profile</a></li>
</ul></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="the-terminal">The Terminal<a href="https://takken.io/blog/a-modern-terminal-for-windows#the-terminal" class="hash-link" aria-label="Direct link to The Terminal" title="Direct link to The Terminal" translate="no">​</a></h2>
<p>For the purpose of this post, I'll differentiate between <code>terminal</code>, <code>shell</code> and <code>prompt</code>. Let's
start with the terminal.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="definition">Definition<a href="https://takken.io/blog/a-modern-terminal-for-windows#definition" class="hash-link" aria-label="Direct link to Definition" title="Direct link to Definition" translate="no">​</a></h3>
<p>Historically, a terminal was a physical device consisting of a keyboard and a display (first image),
used for interacting with a computer. Nowadays, we basically wrap a virtual version of such a
terminal in our operating system using a window (second image). Technically, it would be called a
<code>terminal emulator</code> but it's usually called <code>terminal</code> for simplicity.</p>
<div style="display:flex;gap:2rem;padding-bottom:1rem"><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAJCAYAAAALpr0TAAAACXBIWXMAAC4jAAAuIwF4pT92AAABaElEQVR4nGNYO6U7pL8ubV1ulPOyimTPDV2l4TsW92YevHWk58jftysW/3i7zpMBBFb1zeytz4z6b2mi/zvE1+1/ZLDPf2tjvf/5sQ5//n9d8v/3s+mHwQrn1PVNzI/x/x+ckP+ja8qcP3MWL//jYOfw18NG9df/h5P+/7rWuR+scGZN18TqtLD/4Qlpv6vrqv53tBX9d3c2+u/rqPXn55X+/69ONEEUzqrrLu8tif1vqif328de+396mOn/5GDz/1PrQ//c31f3/87O8u1gha2ZhY7TqqP/N2c5/W/OcvnXmOH6rybN5V9NmvPvnHCz/5mhxqvACv8/3CIY7W72Rk6E95+mjOgvTRmR/+rSwv/dzNT+Z4VZ/ytKcPy/YW5yIlhxT3HwgbQg8//ZkVZ/GnI8/k+qDf6+Zmrq8z1LCo7uW1Wy+tSW8hiwwg1TUqIPL8madHx5esLxZemur443qf7/f4wTLAkFANo/rrrNUwQIAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="227"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/historical-terminal.4c5c325.256.png" srcset="/assets/ideal-img/historical-terminal.4c5c325.256.png 256w,/assets/ideal-img/historical-terminal.e0a491c.717.png 717w,/assets/ideal-img/historical-terminal.fe44eac.1178.png 1178w,/assets/ideal-img/historical-terminal.b57093f.1217.png 1217w" width="256" height="227"></noscript></div><sup><sub>Gorthmog, <a href="https://creativecommons.org/licenses/by-sa/4.0" target="_blank" rel="noopener noreferrer" class="">CC BY-SA 4.0</a>, via Wikimedia Commons</sub></sup></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAJCAYAAAALpr0TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAArElEQVR4nFWQXRLCIAyEuUUfrJB/qR2r97/cOil0Rh++JMCyyaTE1rEfO8QFQg339Y5lWXC7rai1ThqKd8fz/UR/bTg+B3rfEBGIeCA8c0BEUYgEpj4xmDncBzrPRIzCLMPh/P04BWZ2iv6EGdxjCmKK9GyXZE1EQ5gtlRWaD6yQH1gErREKN4KLwkigPMmacgsCJkat09FtzJU558q5L+RyzDAu+U+QBhe5xy/7qH45yYHYnQAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="240"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/modern-terminal.8f231d3.256.png" srcset="/assets/ideal-img/modern-terminal.8f231d3.256.png 256w,/assets/ideal-img/modern-terminal.3567edc.717.png 717w,/assets/ideal-img/modern-terminal.bfbd96a.816.png 816w" width="256" height="240"></noscript></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="choice">Choice<a href="https://takken.io/blog/a-modern-terminal-for-windows#choice" class="hash-link" aria-label="Direct link to Choice" title="Direct link to Choice" translate="no">​</a></h3>
<p>There are different terminals out there, each with their pros and cons and different way of
configuration. Personally, I've used ConEmu, Cmder, windows-terminal-quake and Windows Terminal.</p>
<p>Out of those, I've found <a href="https://apps.microsoft.com/detail/9n0dx20hk701?hl=en-GB" target="_blank" rel="noopener noreferrer" class="">Windows Terminal</a>
to be the most modern and easy to use. It's also
<a href="https://github.com/microsoft/terminal" target="_blank" rel="noopener noreferrer" class="">actively developed</a> by Microsoft. It supports tabs, panes,
key bindings, different fonts and character sets, custom themes, quake-style console and much more.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install Windows Terminal</summary><div><div class="collapsibleContent_i85q"><p>To install Windows Terminal you have the choice to install it from the Microsoft
<a href="https://apps.microsoft.com/detail/9n0dx20hk701?rtc=1&amp;hl=en-gb" target="_blank" rel="noopener noreferrer" class="">Apps Store</a>, by installing the
<code>.msi</code> from the <code>assets</code> section of the
<a href="https://github.com/microsoft/terminal/releases" target="_blank" rel="noopener noreferrer" class="">latest release</a> directly, or using a Windows
package manager below.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chocolatey">Chocolatey<a href="https://takken.io/blog/a-modern-terminal-for-windows#chocolatey" class="hash-link" aria-label="Direct link to Chocolatey" title="Direct link to Chocolatey" translate="no">​</a></h4><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">choco </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> microsoft-windows-terminal</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="winget">Winget<a href="https://takken.io/blog/a-modern-terminal-for-windows#winget" class="hash-link" aria-label="Direct link to Winget" title="Direct link to Winget" translate="no">​</a></h4><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">winget </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--id</span><span class="token plain"> Microsoft.WindowsTerminal</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="scoop">Scoop<a href="https://takken.io/blog/a-modern-terminal-for-windows#scoop" class="hash-link" aria-label="Direct link to Scoop" title="Direct link to Scoop" translate="no">​</a></h4><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop bucket </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> extras</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">scoop </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> windows-terminal</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Once installed, Windows Update will keep Windows Terminal up-to-date for you.</p></div></div></div></div></details>
<p>Once you've installed Windows Terminal, run it. It should look similar to the image below.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAvElEQVR4nB3OzU7CUBCA0RvSQjuDcTlzr/1RtDRKbwuEYEKMcefC93+ez+j+LE4ovgrkokiuub/dIYtSdzXyIuhN0Xdh1awIm0vNbhro8iPt2NNNPd2xo9m1pH3CR2f9WhLKH8EORjxF/BSxyUnnRDw4vjiejWreENbfii32D3x2bDRsMNLeaZeIT4Z+1oTyWuHZ8SnicyTmSHpKpDHSHBP+ZlQfFeEvKrMiLsiDIL2g/RYdtkir6KAUzwW/rCZOa8YdezgAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="152"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/windows-terminal-installed.6c5da6d.256.png" srcset="/assets/ideal-img/windows-terminal-installed.6c5da6d.256.png 256w,/assets/ideal-img/windows-terminal-installed.991a77c.717.png 717w,/assets/ideal-img/windows-terminal-installed.c1dbed5.1178.png 1178w,/assets/ideal-img/windows-terminal-installed.5c22620.1639.png 1639w,/assets/ideal-img/windows-terminal-installed.23022f2.1643.png 1643w" width="256" height="152"></noscript></div></div></div>
<p>By default, it opens an outdated version of PowerShell, that can be recognised by its blue icon.</p>
<p>The first message printed on the terminal is a suggestion of replacing that with something more
modern. Let's do that next.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="the-shell">The Shell<a href="https://takken.io/blog/a-modern-terminal-for-windows#the-shell" class="hash-link" aria-label="Direct link to The Shell" title="Direct link to The Shell" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="definition-1">Definition<a href="https://takken.io/blog/a-modern-terminal-for-windows#definition-1" class="hash-link" aria-label="Direct link to Definition" title="Direct link to Definition" translate="no">​</a></h3>
<p>A shell is a digital interface that allows users to interact with the operating system. It can be
graphical, like the Windows Explorer, or command-line based, like Command Prompt (aka <code>cmd</code>) and
PowerShell. A shell lets you navigate the system, modify its files and launch scripts and
applications.</p>
<div style="display:flex;gap:2rem;padding-bottom:1rem"><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwklEQVR4nAXBAU6DMABA0bZs0sQoLGOZsIGFUlhZMZUtMUZNiN7/TN/3xMNPivgVyM+EzT1BzhI1K5IlQR0VyijkKBGyEeg/jb5pnr4e2X4nvCxHhtFjpx5jDWffIOSiMMFgbUffOaqPkmY9M/VXlttCfIvYa49Q6wbnLKZ+xdkBHyd8vOAvnhACfvRUrkLIVVLMe3K7ozQlYxwZwkDbtpyaE3VbU1QFQkdNek/Zvqc81xkmtHS+41AdyJqM3O3I+4x/zIRQLhL2kIcAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="144"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/windows-explorer-shell.7c39a63.256.png" srcset="/assets/ideal-img/windows-explorer-shell.7c39a63.256.png 256w,/assets/ideal-img/windows-explorer-shell.3413ddd.717.png 717w,/assets/ideal-img/windows-explorer-shell.e0edbcf.1178.png 1178w,/assets/ideal-img/windows-explorer-shell.d4b783f.1639.png 1639w,/assets/ideal-img/windows-explorer-shell.7eb2772.2100.png 2100w,/assets/ideal-img/windows-explorer-shell.9245d9e.2559.png 2559w" width="256" height="144"></noscript></div><sup><sub>Windows Explorer Shell</sub></sup></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAiUlEQVR4nC3OSxKCMBBFUTZBuoOmEyEQQEGqZP9buxafwRvdM3hV2lvCL/L4PtGtoSvGnmem3DIOmVgSoQ9U+hLc6nBLTT3VNL0n5UDKhvUB6w3LRiVFkI9DFkGK4rsGKwe6FkfDSqA6wSzIpMiqaPHYcMQbD0YYD/gWdD2wopvHz/4CN4w5nhf+WvxEm84ki3MAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="134"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/command-prompt-and-powershell.7bec652.256.png" srcset="/assets/ideal-img/command-prompt-and-powershell.7bec652.256.png 256w,/assets/ideal-img/command-prompt-and-powershell.6ab9467.717.png 717w,/assets/ideal-img/command-prompt-and-powershell.f2b22e2.1178.png 1178w,/assets/ideal-img/command-prompt-and-powershell.af2cbf0.1363.png 1363w" width="256" height="134"></noscript></div><sup><sub>Command Prompt and PowerShell</sub></sup></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://takken.io/blog/a-modern-terminal-for-windows#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h3>
<p>If you're a Windows user, chances are you've used Command Prompt, Git Bash, WSL or PowerShell
before. If yes, then you've most likely also found that not all commands work in your preferred
shell.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Example</div><div class="admonitionContent_BuS1"><p>For Linux commands you might opt for Git Bash or WSL with Ubuntu running Bash, whereas for Windows
specific commands you've probably used PowerShell or Command Prompt.</p></div></div>
<p>Working out how to cater for most use cases in a single shell can also take much time. Especially if
you like to integrate the various available productivity tools into it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rationale">Rationale<a href="https://takken.io/blog/a-modern-terminal-for-windows#rationale" class="hash-link" aria-label="Direct link to Rationale" title="Direct link to Rationale" translate="no">​</a></h3>
<p>To me, switching between multiple shells comes with two major downsides. Firstly, you lose the
context that you are working in, which means that you can not easily chain commands, reuse output or
pass variables between the shells. Secondly, each shell has unique configurations and quirks,
requiring setup and making for a learning curve. That means double the effort, the occasional
confusion and a huge inhibitor for becoming a command line power user.</p>
<p>Therefore, I'd argue that it is valuable to choose a single shell environment and master it
thoroughly. It is, then, also important to choose a shell that modern and powerful enough for most
use cases.</p>
<p>Luckily, today there are excellent tools available that can make a Windows shell almost as powerful
as their Linux counterparts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="choice-1">Choice<a href="https://takken.io/blog/a-modern-terminal-for-windows#choice-1" class="hash-link" aria-label="Direct link to Choice" title="Direct link to Choice" translate="no">​</a></h3>
<p>I've found PowerShell 7 to be the most modern and powerful command-line shell for Windows. It is
open-source, works across Windows, Linux and MacOS and features a built-in scripting language. It
also allows you to easily install plugins. PowerShell is well maintained and has a decent ecosystem.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-1">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-1" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install PowerShell 7</summary><div><div class="collapsibleContent_i85q"><p>To install PowerShell 7 you have the choice to install it from the Microsoft
<a href="https://apps.microsoft.com/detail/9MZ1SNWT0N5D?hl=en-gb" target="_blank" rel="noopener noreferrer" class="">Apps Store</a>, by installing the <code>.msi</code> from
the <code>assets</code> section of the <a href="https://github.com/PowerShell/PowerShell/releases" target="_blank" rel="noopener noreferrer" class="">latest release</a>
directly, or using a Windows package manager below.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="winget-1">Winget<a href="https://takken.io/blog/a-modern-terminal-for-windows#winget-1" class="hash-link" aria-label="Direct link to Winget" title="Direct link to Winget" translate="no">​</a></h4><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">winget </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--id</span><span class="token plain"> Microsoft.PowerShell</span><br></span></code></pre></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="alternatives">Alternatives<a href="https://takken.io/blog/a-modern-terminal-for-windows#alternatives" class="hash-link" aria-label="Direct link to Alternatives" title="Direct link to Alternatives" translate="no">​</a></h3>
<p>Below you will find the considered alternatives, each provided with a short rationale.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Command Prompt aka <code>cmd</code></summary><div><div class="collapsibleContent_i85q"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-not-cmdexe">Why not <code>cmd.exe</code>?<a href="https://takken.io/blog/a-modern-terminal-for-windows#why-not-cmdexe" class="hash-link" aria-label="Direct link to why-not-cmdexe" title="Direct link to why-not-cmdexe" translate="no">​</a></h4><p>For many a no-brainer, for others not so much because cmd is familiar, and it never failed them.</p><p>In 2016, Command Prompt or <code>cmd.exe</code> was
<a href="https://blogs.windows.com/windows-insider/2016/11/17/announcing-windows-10-insider-preview-build-14971-for-pc/" target="_blank" rel="noopener noreferrer" class="">deprecated</a>
as the default shell in Windows 10, version 1607. While there's no indication of <code>cmd.exe</code> being
removed, it is clear that Microsoft sets the direction in favour of the more modern and powerful
PowerShell.</p><p>Tools and features that are released after this deprecation may not work with Command Prompt because
they may rely on the advanced scripting capabilities and object-oriented nature of PowerShell.</p><p>I would recommend stop using it entirely for those reasons.</p></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Windows Subsystem for Linux (WSL)</summary><div><div class="collapsibleContent_i85q"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-about-wsl">What about <code>WSL</code>?<a href="https://takken.io/blog/a-modern-terminal-for-windows#what-about-wsl" class="hash-link" aria-label="Direct link to what-about-wsl" title="Direct link to what-about-wsl" translate="no">​</a></h4><p>I like <code>Windows Subsystem for Linux</code> (<code>WSL</code>). It allows you to do Linux-specific things from your
Windows machine very quickly. Most commonly used with Ubuntu, it allows you to install applications
using the standard package manager. It can be instrumental when prototyping commands to be used in
CI workflows.</p><p>You can create a great experience using <code>Windows Terminal</code> with <code>OhMyZsh</code> in <code>WSL2</code>.</p><p>However, I wouldn't recommend using it as your main shell, because a different kernel hides the
problem and creates a new category of problems, as you now have to manage your projects for two
operating systems.</p><p>For example, in many cases the dependency installation process (i.e. <code>yarn install</code>,
<code>cargo install</code>, <code>go get</code>, <code>pip install</code>) may create OS-specific bindings for some packages, meaning
the resulting local files won't work on other OSes. All other applications (e.g. IDEs, linters,
formatters etc.) now also have to be mapped to use WSL.</p><p>WSL also lacks direct integration with Windows-specific features and commands. And since your
environment is now effectively linux, it can lead to compatibility issues with Windows-based scripts
and the scripts you create will not work for other Windows users, unless they are also using WSL.</p><p>Lastly, while WSL does support the pass-through of physical devices (GPU and USB devices through
<a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/display/gpu-paravirtualization#gpu-paravirtualization-in-wddm" target="_blank" rel="noopener noreferrer" class="">WDDM GPU-PV</a> +
<a href="https://github.com/microsoft/wslg" target="_blank" rel="noopener noreferrer" class="">WSLg</a> and <a href="https://github.com/dorssel/usbipd-win" target="_blank" rel="noopener noreferrer" class="">USBIPD-WIN</a>,
respectively), in my experience, using graphics- or USB devices can be cumbersome.</p><p>My recommendation would be to use it when you specifically need a Unix/Linux environment. Not as
your default terminal.</p></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><code>Git Bash</code>, <code>MinGW</code>, <code>MSYS</code></summary><div><div class="collapsibleContent_i85q"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="and-what-about-git-bash--mingw--msys">And what about <code>Git Bash</code> / <code>MinGW</code> / <code>MSYS</code>?<a href="https://takken.io/blog/a-modern-terminal-for-windows#and-what-about-git-bash--mingw--msys" class="hash-link" aria-label="Direct link to and-what-about-git-bash--mingw--msys" title="Direct link to and-what-about-git-bash--mingw--msys" translate="no">​</a></h4><p><code>MSYS</code> focuses on providing a native Unix-like shell environment and tools to support the
development process, especially for projects being ported from Unix/Linux to Windows.</p><p><code>MinGW</code> stands for "Minimalist GNU for Windows." It focuses on providing a GCC compiler system for
developing native Windows applications. It uses MSYS under the hood to include a set of tools
allowing applications written for GNU/Linux to be compiled and run natively on Windows.</p><p><code>Git Bash</code> is a Windows-ported version of bash. It offers a Unix-like command-line environment on
Windows, making it familiar for users with Unix/Linux experience. It uses MinGW under the hood.</p><p>Using <code>Git Bash</code> or <code>MinGW</code> as your default terminal has the same environmental drawbacks as using
<code>WSL</code> with Ubuntu.</p><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The optional <code>Unix tools</code> that come with <code>Git for Windows</code> can still be used in any other shell.</p></div></div><p>I'd recommend to use them as needed, but probably not as your default terminal.</p></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="the-prompt">The Prompt<a href="https://takken.io/blog/a-modern-terminal-for-windows#the-prompt" class="hash-link" aria-label="Direct link to The Prompt" title="Direct link to The Prompt" translate="no">​</a></h2>
<p>This brings us to the third important part of the terminal setup: the prompt.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="definition-2">Definition<a href="https://takken.io/blog/a-modern-terminal-for-windows#definition-2" class="hash-link" aria-label="Direct link to Definition" title="Direct link to Definition" translate="no">​</a></h3>
<p>The prompt is the text that indicates the shell is ready to accept commands. It can be customised to
show specific information, like the current directory, the time and the exit code of the last
executed command.</p>
<p>Modern prompts can also show context specific information. A couple of examples:</p>
<ul>
<li class="">display the git branch (or other VCS equivalent) of the folder that you're in.</li>
<li class="">show the status of the repository, like untracked files, staged files, etc.</li>
<li class="">show the currently active language runtime for a project, like <code>go</code>, <code>node</code>, <code>python</code>, etc.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rationale-1">Rationale<a href="https://takken.io/blog/a-modern-terminal-for-windows#rationale-1" class="hash-link" aria-label="Direct link to Rationale" title="Direct link to Rationale" translate="no">​</a></h3>
<p>A great prompt can be very helpful for productivity. Ideally you'd be able to see with the blink of
an eye what project you're working on, what branch you're on and what version of <code>bun</code>, <code>rust</code> or
other language runtime you're using in your project.</p>
<p>And instead of having to type <code>echo $?</code> or <code>echo $LastExitCode</code> to find out whether the last command
ran successfully or not, wouldn't it be useful it would just show you red or green in your next
prompt?</p>
<p>I believe the best prompt possible would have the following characteristics:</p>
<ul>
<li class="">Run extremely <strong>fast</strong>, so that the terminal doesn't feel laggy.</li>
<li class="">Be <strong>portable</strong> across different shells.</li>
<li class="">No over information; show just <strong>practical</strong> information.</li>
<li class="">Show that needed information in a <strong>concise</strong> way, using symbols and colours where possible.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="choice-2">Choice<a href="https://takken.io/blog/a-modern-terminal-for-windows#choice-2" class="hash-link" aria-label="Direct link to Choice" title="Direct link to Choice" translate="no">​</a></h3>
<p>For years, I've used <a href="https://ohmyposh.dev/" target="_blank" rel="noopener noreferrer" class="">Oh-My-Posh</a>, combined with PoshGit. But more recently
I've started using <a href="https://starship.rs/" target="_blank" rel="noopener noreferrer" class="">Starship</a>. And while both are great options, The latter is
definitely the much more modern option here.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="starship">Starship<a href="https://takken.io/blog/a-modern-terminal-for-windows#starship" class="hash-link" aria-label="Direct link to Starship" title="Direct link to Starship" translate="no">​</a></h4>
<p>Starship is written from the ground up in Rust, with high performance in mind. It has made prompt
configuration so simple that creating your own config has become very accessible. It is also
cross-platform and works on any shell.</p>
<p>On their discussions page, the community shares their
<a href="https://github.com/starship/starship/discussions/1107" target="_blank" rel="noopener noreferrer" class="">setups</a> and
<a href="https://github.com/starship/starship/discussions/1252" target="_blank" rel="noopener noreferrer" class="">custom commands and modules</a>. These can be
very useful for inspiration purposes.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nerd-fonts">Nerd fonts<a href="https://takken.io/blog/a-modern-terminal-for-windows#nerd-fonts" class="hash-link" aria-label="Direct link to Nerd fonts" title="Direct link to Nerd fonts" translate="no">​</a></h4>
<p>Nerd fonts is an amazing open source initiative that takes existing fonts, and adds glyphs and icons
to it. These fonts are specialised for use by developers, in IDEs and Terminals.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-2">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-2" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>These are the steps to installing Starship.</p>
<ol>
<li class="">Install a <a href="https://www.nerdfonts.com/" target="_blank" rel="noopener noreferrer" class="">Nerd font</a></li>
<li class="">Install <a href="https://starship.rs/guide/" target="_blank" rel="noopener noreferrer" class="">Starship</a></li>
<li class=""><a href="https://starship.rs/guide/#step-2-set-up-your-shell-to-use-starship" target="_blank" rel="noopener noreferrer" class="">Tell your shell to use Starship</a>
for it's prompt</li>
</ol>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install Nerd font and Starship</summary><div><div class="collapsibleContent_i85q"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-nerd-font">Install Nerd font<a href="https://takken.io/blog/a-modern-terminal-for-windows#install-nerd-font" class="hash-link" aria-label="Direct link to Install Nerd font" title="Direct link to Install Nerd font" translate="no">​</a></h4><p>First you need to download and install a monospace-style <a href="https://www.nerdfonts.com/" target="_blank" rel="noopener noreferrer" class="">Nerd font</a> of
your choice. Then you need to configure your terminal to use that font.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-starship">Install Starship<a href="https://takken.io/blog/a-modern-terminal-for-windows#install-starship" class="hash-link" aria-label="Direct link to Install Starship" title="Direct link to Install Starship" translate="no">​</a></h4><p>Next, you can install Starship using your favourite package manager below, or by following
<a href="https://starship.rs/guide/" target="_blank" rel="noopener noreferrer" class="">the official guide</a>.</p><h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="chocolatey-1">Chocolatey<a href="https://takken.io/blog/a-modern-terminal-for-windows#chocolatey-1" class="hash-link" aria-label="Direct link to Chocolatey" title="Direct link to Chocolatey" translate="no">​</a></h5><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">choco </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> starship</span><br></span></code></pre></div></div><h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="winget-2">Winget<a href="https://takken.io/blog/a-modern-terminal-for-windows#winget-2" class="hash-link" aria-label="Direct link to Winget" title="Direct link to Winget" translate="no">​</a></h5><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">winget winget </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--id</span><span class="token plain"> Starship.Starship</span><br></span></code></pre></div></div><h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="scoop-1">Scoop<a href="https://takken.io/blog/a-modern-terminal-for-windows#scoop-1" class="hash-link" aria-label="Direct link to Scoop" title="Direct link to Scoop" translate="no">​</a></h5><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">scoop </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> starship</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tell-your-shell-to-use-starship">Tell your shell to use Starship<a href="https://takken.io/blog/a-modern-terminal-for-windows#tell-your-shell-to-use-starship" class="hash-link" aria-label="Direct link to Tell your shell to use Starship" title="Direct link to Tell your shell to use Starship" translate="no">​</a></h4><p>Follow <a href="https://starship.rs/guide/#step-2-set-up-your-shell-to-use-starship" target="_blank" rel="noopener noreferrer" class="">the instructions</a> to
set up your shell to use starship.</p></div></div></details>
<p>Once you've configured your shell to use Starship, restart your terminal. If you did everything
correctly, your terminal should look similar to the image below.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwklEQVR4nBXK0W6CMBiA0V5sGlqgiMto/1I1hA0nIIomzuxqicn2/i/0LTvXRyVfmtW1pLyuePkusXeLbSx2b8nvOcWvZdkvUcW5pPlokEGQLuAPnngJSBvwrSeMgbRLUeZhkb4m3jb4WZBJkLPH9Y5qrJCjkI0pyv6s2c4bZK5xJ4/vBbevkDdHGB1h8NjPHFU81mynyOtQ4af/6JBGkFaIs1AfAtktQz01z+hJk8QEvdOYk8HsDObdoFtN2qcsugV/hVVP80KQs9wAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="150"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/sharship-installed.d01dc61.256.png" srcset="/assets/ideal-img/sharship-installed.d01dc61.256.png 256w,/assets/ideal-img/sharship-installed.a116936.717.png 717w,/assets/ideal-img/sharship-installed.a7daefc.1178.png 1178w,/assets/ideal-img/sharship-installed.6d94b0d.1529.png 1529w" width="256" height="150"></noscript></div></div></div>
<p>From here you can go in many directions in terms of configuration and adding plugins. I'll dedicate
a few short chapters on what I've set up below.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="theme-config">Theme config<a href="https://takken.io/blog/a-modern-terminal-for-windows#theme-config" class="hash-link" aria-label="Direct link to Theme config" title="Direct link to Theme config" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="choice-3">Choice<a href="https://takken.io/blog/a-modern-terminal-for-windows#choice-3" class="hash-link" aria-label="Direct link to Choice" title="Direct link to Choice" translate="no">​</a></h3>
<p>Ever heard of Dracula theme?</p>
<p>As a developer it's important to reduce your cognitive load where possible. And once you get used to
a theme, you'll learn to recognise the meaning of each colour in different contexts, which will
reduce that load. For this reason I use the same developer-oriented colour scheme, called
<a href="https://draculatheme.com/" target="_blank" rel="noopener noreferrer" class="">Dracula</a>, across many applications, including my terminal.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-method">Test method<a href="https://takken.io/blog/a-modern-terminal-for-windows#test-method" class="hash-link" aria-label="Direct link to Test method" title="Direct link to Test method" translate="no">​</a></h3>
<p>In Starship's discussion called "share your setup", people have resorted to using <code>neofetch</code> or
<code>fastfetch</code> as a quick way to show structured information and the colour palette. Let's do the same!</p>
<p>We'll install the better maintained and cross-platform <code>fastfetch</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">winget </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Fastfetch-cli.Fastfetch</span><br></span></code></pre></div></div>
<p>Then run it.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">fastfetch</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="expected-result">Expected result<a href="https://takken.io/blog/a-modern-terminal-for-windows#expected-result" class="hash-link" aria-label="Direct link to Expected result" title="Direct link to Expected result" translate="no">​</a></h4>
<p>Here's a before and after picture, when applying Dracula theme.</p>
<div style="display:flex;gap:2rem;padding-bottom:1rem"><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAHCAYAAAAxrNxjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA5UlEQVR4nAXB21KCQACA4b3REjZYBB12wUMMgnIQEFKztGls6sb3f52/7xPPHxZBMWe68wkuPmrnoU4KN3FRpYvXeYziEcJuPVZ9T9Q1ZOeK7t6QNilRFmEqg2kNk3yCsN58ouaAHlq2l5Ljb83+XrFpN6y6JbrWWDsLYf0pTJMR9hvya87hu6H+qsmPGYtDjK40ziAR1o8kLGYE5Yz0fU17q9hfaqpTQTIsCIsQ9/qCmAw2pjTMCk15XvL5uFENPcs6Ju5iTGGQZ4kYp0+4tUIGkunaYZ5p1KuPndjIhcRJHMbbMf+TKGFWu8X2mwAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="180"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/fastfetch-before-theme.2ab5d32.256.png" srcset="/assets/ideal-img/fastfetch-before-theme.2ab5d32.256.png 256w,/assets/ideal-img/fastfetch-before-theme.b3ad3ff.717.png 717w,/assets/ideal-img/fastfetch-before-theme.3503d54.1178.png 1178w,/assets/ideal-img/fastfetch-before-theme.321dafe.1553.png 1553w" width="256" height="180"></noscript></div><sup><sub>Default theme</sub></sup></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAHCAYAAAAxrNxjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA6klEQVR4nB3MTW6CQACA0dlIxAEHtUQcMbT8iDDgIEqqxtqmadNNFz1C73+Jr0nfAZ4Y31xCEzLfzXm4LFDVjOAcoDKFMoqgDxitR4jpIWB3OpL1lvpiaN8taZuji5hVo9FW425dhBzmFLYnO3U0V0P/0VC9NaT7gk2XEDURk9pFTL4UiS3YHAuqe8n+tWN3a8mOW+JDzMpETAcPMf6ULE3IwoTk14TqXFMOLdVQ89hviMwSdfcR7iBZG01YLelecn5+v7HPA3ET/4/aaOTZQzi5g7IBciEJkilRGTFLZ8hU4sU+/pOPUzr8AZmmYW/62Ok8AAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="179"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/fastfetch-after-theme.acfc6bb.256.png" srcset="/assets/ideal-img/fastfetch-after-theme.acfc6bb.256.png 256w,/assets/ideal-img/fastfetch-after-theme.fe68006.717.png 717w,/assets/ideal-img/fastfetch-after-theme.665a024.1178.png 1178w,/assets/ideal-img/fastfetch-after-theme.e0a2ea2.1562.png 1562w" width="256" height="179"></noscript></div><sup><sub>Dracula Webber theme</sub></sup></div></div></div>
<p>As you can see, the changes are subtle. The slightly softer colours will however make it much easier
to look at an information overload, as they won't 'scream' so much. And the slightly darker whites
works better on light backgrounds, and it's fine-tuned for use with autocompletion.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-3">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-3" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>Start by following the official <a href="https://draculatheme.com/windows-terminal" target="_blank" rel="noopener noreferrer" class="">instructions</a> to install
Dracula in Windows Terminal.</p>
<p>Optionally, use my fine-tuned optimisations</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Configure theme optimisations</summary><div><div class="collapsibleContent_i85q"><p>In the <code>profiles</code> section, I've changed the <code>defaults</code> to look like this:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"profiles"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"defaults"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"background"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#0C0C0C"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"colorScheme"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Dracula Webber"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"font"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"face"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FiraCode Nerd Font Mono"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">14</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"opacity"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">70</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"useAcrylic"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div><p>And my scheme like this:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"schemes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Dracula Webber"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"background"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#22212C"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"black"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#22212C"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"blue"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#5D4FA1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightBlack"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#7E7A94"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightBlue"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#907AFF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightCyan"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#84FFEA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightGreen"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#7FFF73"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightPurple"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#FF99CC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightRed"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#FFAA99"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightWhite"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#FFFFFF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"brightYellow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#FFFF99"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"cursorColor"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#FFFFFF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"cyan"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#5ADBC6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"foreground"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#A2AECA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"green"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#51D378"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"purple"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#FF80BF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"red"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#E74A2A"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"selectionBackground"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#8B89FF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"white"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#F8F8F2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"yellow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#FFFF80"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... other schemes here.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="prompt-config">Prompt config<a href="https://takken.io/blog/a-modern-terminal-for-windows#prompt-config" class="hash-link" aria-label="Direct link to Prompt config" title="Direct link to Prompt config" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="choice-4">Choice<a href="https://takken.io/blog/a-modern-terminal-for-windows#choice-4" class="hash-link" aria-label="Direct link to Choice" title="Direct link to Choice" translate="no">​</a></h3>
<p>Starship allows you to <a href="https://starship.rs/config/" target="_blank" rel="noopener noreferrer" class="">create</a> and
<a href="https://github.com/starship/starship/discussions/1107" target="_blank" rel="noopener noreferrer" class="">share</a> prompt configurations. They also have
a couple of <a href="https://starship.rs/presets/" target="_blank" rel="noopener noreferrer" class="">presets</a> to choose from.</p>
<p>Since I was quite interested to have my own personalised prompt configuration that I can iterate on
over time, I've chosen to learn from the presets and build my own.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Building your own config can be fun. It does have a bit of a learning curve, and it is fairly
time-consuming at first.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-4">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-4" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>Installing my config is simple.</p>
<ul>
<li class="">Open the Starship config.</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">code ~/.config/starship.toml</span><br></span></code></pre></div></div>
<ul>
<li class="">Copy the contents of
<a href="https://gist.github.com/webbertakken/b5413d9a8bcb3644974d719393179b74" target="_blank" rel="noopener noreferrer" class="">my config</a> and paste it in
there.</li>
<li class="">Save the file.</li>
</ul>
<p>That's it!</p>
<p>When you now press 'enter' in your terminal, the change should be reflected as shown in the image
below.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAADCAYAAACqPZ51AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAdUlEQVR4nBXH0QqCMBiA0V0kQ2v/Vlg4hlFaURsmYSRd2k30Br3/i3zRuTsqGzWLg+DOFj+V1I9A+dogjSBJsDfHbJuhpDccLzv8yZPuDZ/vmzT0VG1FiIFwDeRtjpp3BXVcsxodRTT8v5wMZi/YQXBPQXeaH4yrKDgST0BjAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="69"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/before-and-after-prompt-config-change.d438f82.256.png" srcset="/assets/ideal-img/before-and-after-prompt-config-change.d438f82.256.png 256w,/assets/ideal-img/before-and-after-prompt-config-change.24f8df0.717.png 717w,/assets/ideal-img/before-and-after-prompt-config-change.2625d80.1178.png 1178w,/assets/ideal-img/before-and-after-prompt-config-change.e59e81f.1545.png 1545w" width="256" height="69"></noscript></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="terminal-icons">Terminal Icons<a href="https://takken.io/blog/a-modern-terminal-for-windows#terminal-icons" class="hash-link" aria-label="Direct link to Terminal Icons" title="Direct link to Terminal Icons" translate="no">​</a></h2>
<p>There's a nifty plugin called <a href="https://github.com/devblackops/Terminal-Icons" target="_blank" rel="noopener noreferrer" class="">Terminal Icons</a>. It
uses icons and colours that help you recognise common files in the blink of an eye.</p>
<div style="display:flex;gap:2rem;padding-bottom:1rem"><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAHCAYAAAAxrNxjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA4ElEQVR4nB3M3VKCQBiA4T00QCYhgY8fF1bUFREIiyId66Ar6P7v5W3G82ce9TR7xFbYfGiiIaKaWtZ9RLgPCLuQdf/CIligPOtRvdc0Xz15VzDf/9C2Jt7GyFlIW8HZOyhn71GOBntrSduc9ntCj+UDJl2CnAS3dVHubYkeDcefjqzPONwaqskQ2wjpE6QR/FcPtfxdUo5b7L0j7wvO1wvVqSazCcUgj/H500c5s8vmYjhcz2RvBXbu0LZCTjHpIKRNij/5KH9w2ekcvcmQKsKUBWLWrLYBq3JFuAtxjMM/SRBg959+ndAAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="181"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/terminal-icons-before.0cf462e.256.png" srcset="/assets/ideal-img/terminal-icons-before.0cf462e.256.png 256w,/assets/ideal-img/terminal-icons-before.c82f232.717.png 717w,/assets/ideal-img/terminal-icons-before.ee55f5c.1178.png 1178w,/assets/ideal-img/terminal-icons-before.dbe1146.1525.png 1525w" width="256" height="181"></noscript></div><sup><sub>Without Terminal Icons</sub></sup></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAHCAYAAAAxrNxjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA3ElEQVR4nCXM2XKCMABA0bypLHYELElYFJQgsqTFMlWGti/9/1+6nbHvZ47Y3F3kRZFNGXu7R46SyEYEVUDYh0RDxCpYIdzGo/qsaR49utOUtxOpSZBniRwkutU4tYNwjEf5YTDzFd0mXL4b8jEjPsXIIUa1Cs+6CHfxKCdD/dOhhxS7GOr7gdcmRtn/cTv6CP/Xf0KztKR9ivl6o3g3JE1MauVzfJl9xObhUkyGam7Rt4xuqTl3OaqVaKvQV40/+YitdamOGXmmUcWe6ijRZcSuDAgOO8IqZF2s+QO6VGBYaOUqEQAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="180"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/terminal-icons-after.66bece1.256.png" srcset="/assets/ideal-img/terminal-icons-after.66bece1.256.png 256w,/assets/ideal-img/terminal-icons-after.da11422.717.png 717w,/assets/ideal-img/terminal-icons-after.9670bc8.1178.png 1178w,/assets/ideal-img/terminal-icons-after.5c60855.1534.png 1534w" width="256" height="180"></noscript></div><sup><sub>With Terminal Icons</sub></sup></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-5">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-5" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install Terminal Icons</summary><div><div class="collapsibleContent_i85q"><p>Open the powershell configuration</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">code </span><span class="token variable" style="color:#36acaa">$PROFILE</span><br></span></code></pre></div></div><p>Add the following line to the end of the file.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Import-Module </span><span class="token parameter variable" style="color:#36acaa">-Name</span><span class="token plain"> Terminal-Icons </span><span class="token comment" style="color:#999988;font-style:italic"># Icons when listing directories</span><br></span></code></pre></div></div><p>Save the file and restart your terminal.</p><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Reference</div><div class="admonitionContent_BuS1"><p>Here's my
<a href="https://gist.github.com/webbertakken/78ad5a15d7e8e2e140a9ee8ac62b8419" target="_blank" rel="noopener noreferrer" class="">PowerShell profile</a>.</p></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="autocompletion">Autocompletion<a href="https://takken.io/blog/a-modern-terminal-for-windows#autocompletion" class="hash-link" aria-label="Direct link to Autocompletion" title="Direct link to Autocompletion" translate="no">​</a></h2>
<p>Now that things are starting to look good, let's add some functionality.</p>
<p>There are a few types of autocompletion that I find very useful.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="types">Types<a href="https://takken.io/blog/a-modern-terminal-for-windows#types" class="hash-link" aria-label="Direct link to Types" title="Direct link to Types" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-autocomplete">Basic autocomplete<a href="https://takken.io/blog/a-modern-terminal-for-windows#basic-autocomplete" class="hash-link" aria-label="Direct link to Basic autocomplete" title="Direct link to Basic autocomplete" translate="no">​</a></h4>
<p>You type a few characters. A suggestion appears. You use <code>ctrl+f</code> to accept one word, or
<code>ctrl+space</code> to accept the complete suggestion.</p>
<p><img decoding="async" loading="lazy" alt="Example of basic autocompletion" src="https://takken.io/assets/images/basic-autocompletion-8e4178028e04cfcc21f60ade3d9d7a2a.gif" width="1484" height="514" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tab-autocomplete">Tab autocomplete<a href="https://takken.io/blog/a-modern-terminal-for-windows#tab-autocomplete" class="hash-link" aria-label="Direct link to Tab autocomplete" title="Direct link to Tab autocomplete" translate="no">​</a></h4>
<p>You type a few characters. You press <code>tab</code> to cycle though the different options.</p>
<p><img decoding="async" loading="lazy" alt="Example of tab autocompletion" src="https://takken.io/assets/images/tab-autocompletion-4f176151b9ad7dfef5c369ffe9342382.gif" width="1484" height="514" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-history">Using history<a href="https://takken.io/blog/a-modern-terminal-for-windows#using-history" class="hash-link" aria-label="Direct link to Using history" title="Direct link to Using history" translate="no">​</a></h4>
<p>You can use the <code>up</code> and <code>down</code> arrow keys to cycle through previously used commands.</p>
<p><img decoding="async" loading="lazy" alt="Example of history autocompletion" src="https://takken.io/assets/images/history-autocompletion-b4d92c6e582d75d0ce826ec1e41935b1.gif" width="1484" height="514" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="fuzzy-search">Fuzzy search<a href="https://takken.io/blog/a-modern-terminal-for-windows#fuzzy-search" class="hash-link" aria-label="Direct link to Fuzzy search" title="Direct link to Fuzzy search" translate="no">​</a></h4>
<p>Fuzzy search allows you to query the history, autocomplete suggestions, files and folders, by typing
a partial match.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="example">Example<a href="https://takken.io/blog/a-modern-terminal-for-windows#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h5>
<p>If you are looking for a folder called <code>~/Repositories/takken.io</code>, you can type things like
<code>repotak</code> to find it. See highlights for query matches.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAADCAYAAACqPZ51AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAb0lEQVR4nBXMWwrCMBBA0fzHIEhm0sSCIvYVYmMLUtEPwf3v6YpnAcc0jwM1D3T1wul9RkdFqiC94LNHZ8XeLSYsgef3Rf0s5K0Qb4njlEjXROwjbW1xxWHcuicOEV0DUgQ/eZotoKPgu/8o7GbLD+hWKUzi/pTPAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="89"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/fuzzy-search-folder.985f2d6.256.png" srcset="/assets/ideal-img/fuzzy-search-folder.985f2d6.256.png 256w,/assets/ideal-img/fuzzy-search-folder.30e42a1.717.png 717w,/assets/ideal-img/fuzzy-search-folder.c3c27ea.1178.png 1178w,/assets/ideal-img/fuzzy-search-folder.0ec8509.1473.png 1473w" width="256" height="89"></noscript></div></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="hotkeys">Hotkeys<a href="https://takken.io/blog/a-modern-terminal-for-windows#hotkeys" class="hash-link" aria-label="Direct link to Hotkeys" title="Direct link to Hotkeys" translate="no">​</a></h5>
<ul>
<li class=""><code>Alt</code> + <code>C</code> to quickly change directory</li>
<li class=""><code>Ctrl</code> + <code>T</code> to autocomplete files</li>
<li class=""><code>Ctrl</code> + <code>R</code> to search and autocomplete from history</li>
</ul>
<p>This is where a few keystrokes can start to become very powerful.</p>
<p><img decoding="async" loading="lazy" alt="Example of fuzzy search" src="https://takken.io/assets/images/fuzzy-search-de856af660974332a9143af9e0dd6852.gif" width="1484" height="514" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Since this is fuzzy search, you can search any character in the string, not just the first
characters.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-6">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-6" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>To achieve autocompletion for above examples we'll need two plugins. <code>PSReadLine</code> and <code>PSFzf</code>.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install autocompletion</summary><div><div class="collapsibleContent_i85q"><p>Open the powershell configuration</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">code </span><span class="token variable" style="color:#36acaa">$PROFILE</span><br></span></code></pre></div></div><p>Add the following lines to the end of the file.</p><div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">Import-Module</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Name PSReadLine </span><span class="token comment" style="color:#999988;font-style:italic"># typeahead predictions and whatnot</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Import-Module</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Name PSFzf </span><span class="token comment" style="color:#999988;font-style:italic"># activate using `Ctrl T`, `Ctrl R` and `Alt C`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Advanced completion features (arrow up and down after having started typing)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineOption</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">HistorySearchCursorMovesToEnd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineKeyHandler</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Key UpArrow </span><span class="token operator" style="color:#393A34">-</span><span class="token keyword" style="color:#00009f">Function</span><span class="token plain"> HistorySearchBackward</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineKeyHandler</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Key DownArrow </span><span class="token operator" style="color:#393A34">-</span><span class="token keyword" style="color:#00009f">Function</span><span class="token plain"> HistorySearchForward</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Autocomplete suggestions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineKeyHandler</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Key Tab </span><span class="token operator" style="color:#393A34">-</span><span class="token keyword" style="color:#00009f">Function</span><span class="token plain"> MenuComplete </span><span class="token comment" style="color:#999988;font-style:italic"># options: [Complete|MenuComplete]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Autocomplete predictions [HistoryAndPlugin, History, Plugin] requires PS 7.1+</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineOption</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">PredictionSource HistoryAndPlugin </span><span class="token comment" style="color:#999988;font-style:italic"># accept prediction using right arrow</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineOption</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Colors @</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> InlinePrediction = </span><span class="token string" style="color:#e3116c">'#888888'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># accepting suggestions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineKeyHandler</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Chord </span><span class="token string" style="color:#e3116c">"Ctrl+f"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token keyword" style="color:#00009f">Function</span><span class="token plain"> ForwardWord </span><span class="token comment" style="color:#999988;font-style:italic"># Accept one word</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Set-PSReadLineKeyHandler</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Chord </span><span class="token string" style="color:#e3116c">"Ctrl+Spacebar"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token keyword" style="color:#00009f">Function</span><span class="token plain"> ForwardChar </span><span class="token comment" style="color:#999988;font-style:italic"># Accept full suggestion</span><br></span></code></pre></div></div><p>Save the file and restart your terminal.</p><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Reference</div><div class="admonitionContent_BuS1"><p>Here's my
<a href="https://gist.github.com/webbertakken/78ad5a15d7e8e2e140a9ee8ac62b8419" target="_blank" rel="noopener noreferrer" class="">PowerShell profile</a>.</p></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="unix-tools">Unix tools<a href="https://takken.io/blog/a-modern-terminal-for-windows#unix-tools" class="hash-link" aria-label="Direct link to Unix tools" title="Direct link to Unix tools" translate="no">​</a></h2>
<p>Some of the most common Linux commands are available as part of Git's "Optional Unix tools" package.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAHCAYAAAAxrNxjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA3UlEQVR4nBXK3W6CMACAUa6MUYzQTWkpIFRpKT8W3DKzZWbz/R/qW3auTxR/btDmiOwF2UNwPKe8/qSIXpCGhGRJWIUVkfQJ336i7xou54LZX/DeUPqSvFfoWbO1G6LDIrhZiw9njCsYvMHdG6SVSJehroptvyHSvy88jGfoaqzVzPWJYW7QS4kOinxU7N5iovKZ8XQTYWiZJsvNXHBthWoVVVDoIWf/tSM63gXvnWMMjn5xDL6hNSfKsULPOXrM2d3/o4z5MDXmcKDIUrxU1FVG0gr2pz1pk7Bu1/wB/CFgq51MXKYAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="174"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/unix-commands-in-powershell.ef36845.256.png" srcset="/assets/ideal-img/unix-commands-in-powershell.ef36845.256.png 256w,/assets/ideal-img/unix-commands-in-powershell.cb78493.717.png 717w,/assets/ideal-img/unix-commands-in-powershell.5c6f155.1178.png 1178w,/assets/ideal-img/unix-commands-in-powershell.7d1870e.1509.png 1509w" width="256" height="174"></noscript></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-7">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-7" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>All you have to do is install Git for Windows with the "Optional Unix tools" option enabled.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install Unix tools</summary><div><div class="collapsibleContent_i85q"><p>Either download the <code>.exe</code> from the <a href="https://gitforwindows.org/" target="_blank" rel="noopener noreferrer" class="">official website</a> or open the
terminal as administrator and run the following command:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">choco </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--params</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/GitAndUnixToolsOnPath /WindowsTerminal /NoAutoCrlf"</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="quake-style-console">Quake-style console<a href="https://takken.io/blog/a-modern-terminal-for-windows#quake-style-console" class="hash-link" aria-label="Direct link to Quake-style console" title="Direct link to Quake-style console" translate="no">​</a></h2>
<p>The Quake-style console is a terminal that slides down from the top of the screen when you press a
hotkey. It's a great way to quickly access the terminal without having to switch windows.</p>
<p><img decoding="async" loading="lazy" alt="Example of Quake-style console" src="https://takken.io/assets/images/quake-console-1f7e7f2db5e63dfa6306245a024ce00b.gif" width="853" height="480" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-8">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-8" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Install Quake-style console</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">Open Windows Terminal. Press <code>Ctrl</code> + <code>,</code> to open the settings.</li>
<li class="">Open the <code>settings.json</code> file.</li>
<li class="">Add the following to the <code>actions</code> section.</li>
</ul><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"quakeMode"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"User.quakeMode.F1E129A4"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ctrl+`"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></span></code></pre></div></div><ul>
<li class="">Save the file. Settings are applied immediately.</li>
</ul><p>Now press <code>Ctrl</code> + <code>`</code> (below your <code>Esc</code> key) to open the Quake-style console.</p><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Reference</div><div class="admonitionContent_BuS1"><p>Here's my Windows Terminal
<a href="https://gist.github.com/webbertakken/8af7e20cdfd548294a8ad188612ce27d" target="_blank" rel="noopener noreferrer" class="">settings.json</a>.</p></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="split-panes">Split panes<a href="https://takken.io/blog/a-modern-terminal-for-windows#split-panes" class="hash-link" aria-label="Direct link to Split panes" title="Direct link to Split panes" translate="no">​</a></h2>
<p>Split panes are a great way to multitask in the terminal. For example, run an application in one
pane, and while that application runs, enter commands in a different pane.</p>
<p>See official docs about <a href="https://learn.microsoft.com/en-us/windows/terminal/panes" target="_blank" rel="noopener noreferrer" class="">panes</a> for more
information.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Split pane hotkeys</summary><div><div class="collapsibleContent_i85q"><p>Panes are natively supported in Windows Terminal. You can use the following hotkeys to manage them:</p><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Basic hotkeys</div><div class="admonitionContent_BuS1"><ul>
<li class="">Split horizontally: <code>Alt</code> + <code>Shift</code> + <code>-</code></li>
<li class="">Split vertically: <code>Alt</code> + <code>Shift</code> + <code>+</code></li>
<li class="">Close pane: <code>Alt</code> + <code>Shift</code> + <code>W</code></li>
</ul></div></div><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Directional splits</div><div class="admonitionContent_BuS1"><ul>
<li class="">Top: <code>Ctrl</code> + <code>Alt</code> + <code>Shift</code> + <code>Up</code></li>
<li class="">Right: <code>Ctrl</code> + <code>Alt</code> + <code>Shift</code> + <code>Right</code></li>
<li class="">Bottom: <code>Ctrl</code> + <code>Alt</code> + <code>Shift</code> + <code>Down</code></li>
<li class="">Left: <code>Ctrl</code> + <code>Alt</code> + <code>Shift</code> + <code>Left</code></li>
</ul></div></div></div></div></details>
<p>Once you know the hotkeys it works super fast and smooth.</p>
<p><img decoding="async" loading="lazy" alt="Example of using multiple panes" src="https://takken.io/assets/images/multiple-panes-edbb4bab813014f19389fd55829bd69d.gif" width="853" height="480" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-9">Installation<a href="https://takken.io/blog/a-modern-terminal-for-windows#installation-9" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>These hotkeys should mostly work out of the box. If you want to change them, you can do so by
modifying the <code>settings.json</code> file.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Configure split hotkeys</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">Open Windows Terminal. Press <code>Ctrl</code> + <code>,</code> to open the settings.</li>
<li class="">Open the <code>settings.json</code> file.</li>
<li class="">Add the following to the <code>actions</code> section.</li>
</ul><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"closePane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Terminal.ClosePane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ctrl+shift+w"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"splitPane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"split"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"auto"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"splitMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"duplicate"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"User.splitPane.A6751878"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"alt+shift+d"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"splitPane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"split"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"down"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"splitMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"duplicate"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"User.splitPane.10B260D2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"alt+shift+minus"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"splitPane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"split"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"right"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"splitMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"duplicate"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"User.splitPane.FEF0D40B"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"alt+shift+plus"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"splitPane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"split"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"up"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"splitMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"duplicate"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"User.splitPane.7A967A9"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ctrl+alt+shift+up"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"splitPane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"split"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"right"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"splitMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"duplicate"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ctrl+alt+shift+right"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"splitPane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"split"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"down"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"splitMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"duplicate"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ctrl+alt+shift+down"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"splitPane"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"split"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"left"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"splitMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"duplicate"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"User.splitPane.652D529A"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keys"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ctrl+alt+shift+left"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div><ul>
<li class="">Save the file. Settings are applied immediately.</li>
</ul><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Reference</div><div class="admonitionContent_BuS1"><p>Here's my Windows Terminal
<a href="https://gist.github.com/webbertakken/8af7e20cdfd548294a8ad188612ce27d" target="_blank" rel="noopener noreferrer" class="">settings.json</a>.</p></div></div></div></div></details>
<p>And there we have it. A modern terminal setup for Windows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="limitations">Limitations<a href="https://takken.io/blog/a-modern-terminal-for-windows#limitations" class="hash-link" aria-label="Direct link to Limitations" title="Direct link to Limitations" translate="no">​</a></h2>
<p>The terminal setup I've described is very powerful and modern. It's also very customisable. But it
does take about half a second to load and does have some limitations when it comes to third party
integrations.</p>
<p>Some modern tools and services export configuration for command completion. These are often written
for Unix-like systems and might not always be compatible with PowerShell or Windows-based systems.</p>
<p>Some of the most used completion tools:</p>
<table><thead><tr><th>Tool</th><th>Supported</th><th>How to make it work</th></tr></thead><tbody><tr><td><a href="https://kubernetes.io/docs/reference/kubectl/quick-reference/#kubectl-autocomplete" target="_blank" rel="noopener noreferrer" class=""><code>kubectl completion</code></a></td><td>✅</td><td><code>kubectl completion powershell &gt;&gt; $PROFILE</code></td></tr><tr><td><a href="https://helm.sh/docs/helm/helm_completion/" target="_blank" rel="noopener noreferrer" class=""><code>helm completion</code></a></td><td>✅</td><td><code>helm completion powershell &gt;&gt; $PROFILE</code></td></tr><tr><td><a href="https://developer.hashicorp.com/terraform/cli/commands#shell-tab-completion" target="_blank" rel="noopener noreferrer" class=""><code>terraform completion</code></a></td><td>❌</td><td><a href="https://github.com/shellwhale/terraform-target-autocompletion" target="_blank" rel="noopener noreferrer" class="">Terraform target completion</a></td></tr><tr><td><a href="https://docs.docker.com/engine/cli/completion/" target="_blank" rel="noopener noreferrer" class=""><code>docker completion</code></a></td><td>❌</td><td><a href="https://github.com/matt9ucci/DockerCompletion" target="_blank" rel="noopener noreferrer" class="">DockerCompletion</a></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="conclusion">Conclusion<a href="https://takken.io/blog/a-modern-terminal-for-windows#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>For years, the terminal experience in Windows has left much to be desired. But with Microsoft's
recent efforts, the terminal experience has improved significantly. Windows Terminal and PowerShell
7 are very modern, and no longer lag behind their Unix counterparts.</p>
<p>There are many components to a full terminal setup. At every step there are multiple options to
consider. Having a combination that works for almost every use-case without too many edge cases can
be a challenge.</p>
<p>By using Starship, Terminal Icons, and autocompletion features that can deliver an impressive
terminal experience.</p>
<p>I hope this guide has been helpful to you. If you have any questions or suggestions, please leave a
comment below.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="glossary">Glossary<a href="https://takken.io/blog/a-modern-terminal-for-windows#glossary" class="hash-link" aria-label="Direct link to Glossary" title="Direct link to Glossary" translate="no">​</a></h2>
<p>In everyday use, you might find the terms 'terminal', 'console', and 'shell' used interchangeably,
often referring to the interface you type your commands into on a Unix-like or Windows system.</p>
<table><thead><tr><th>Term</th><th>Definition</th><th>Examples</th></tr></thead><tbody><tr><td>Terminal (emulator) / Console window / Tty</td><td>The window that hosts the shell. (e.g.</td><td>GNOME Terminal, Windows Terminal, iTerm2, Cmder, WezTerm</td></tr><tr><td>Shell</td><td>The software that interprets the commands and renders output.</td><td>Sh, Bash, Zsh, Fish, PowerShell</td></tr><tr><td>Prompt</td><td>The text that indicates the shell is ready to accept commands.</td><td>(shell native), Starship, Oh-My-Posh, Powerlevel10k</td></tr><tr><td>Profile</td><td>The script that runs when the shell starts and sets up the environment.</td><td>PowerShell profile, .bashrc, .zshrc</td></tr><tr><td>Module</td><td>A collection of functions and scripts within PowerShell.</td><td>Oh-My-Posh, Terminal Icons, PSReadLine, PSFzf</td></tr></tbody></table>]]></content:encoded>
            <category>Windows</category>
            <category>Terminal</category>
            <category>PowerShell</category>
            <category>Starship</category>
            <category>Productivity</category>
            <category>Software Engineering</category>
        </item>
        <item>
            <title><![CDATA[Building an energy efficient server]]></title>
            <link>https://takken.io/blog/building-an-energy-efficient-server</link>
            <guid>https://takken.io/blog/building-an-energy-efficient-server</guid>
            <pubDate>Sat, 16 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[I've built a server that's both powerful and quite energy efficient. It has modern hardware running on less than 10 Watts!]]></description>
            <content:encoded><![CDATA[<p>I've built a server that's both powerful and quite energy efficient. It has modern hardware running
on less than 10 Watts!</p>
<p>In this chapter I've documented my reasoning around the build and each component. I also explain the
tweaks I've done for my specific setup.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This post was originally part of my <a class="" href="https://takken.io/notes/introduction">developer notes</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="hardware">Hardware<a href="https://takken.io/blog/building-an-energy-efficient-server#hardware" class="hash-link" aria-label="Direct link to Hardware" title="Direct link to Hardware" translate="no">​</a></h2>
<p>Let's start with the hardware. What did I get and why?</p>
<p>In order to tell you why, I need to tell you what requirements I had.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="requirements">Requirements<a href="https://takken.io/blog/building-an-energy-efficient-server#requirements" class="hash-link" aria-label="Direct link to Requirements" title="Direct link to Requirements" translate="no">​</a></h3>
<ul>
<li class="">Since it will be running Home Assistant, and basically be the brain of my home, it needs to be
<strong>reliable</strong>.</li>
<li class="">It also needs to run 24/7 without costing a fortune in electricity, so <strong>low power usage</strong>.</li>
<li class="">I really wanted it to be able to run a few virtualised workloads for when I want to play around
with stuff, so <strong>decent performance</strong>.</li>
<li class="">My 19" rack is connected to the kitchen, so it needs to be <strong>quiet</strong>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="research">Research<a href="https://takken.io/blog/building-an-energy-efficient-server#research" class="hash-link" aria-label="Direct link to Research" title="Direct link to Research" translate="no">​</a></h3>
<p>I did a lot of research on what hardware to get and looked at many different options.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>One of the main resources I used was
<a href="https://gathering.tweakers.net/forum/list_messages/2096876/0" target="_blank" rel="noopener noreferrer" class="">The Big Efficient Server Topic (Part 3)</a>
on a Dutch tech website called <a href="https://tweakers.net/" target="_blank" rel="noopener noreferrer" class="">Tweakers.net</a>. It really is a great resource
for anyone looking to build an energy efficient server.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="components">Components<a href="https://takken.io/blog/building-an-energy-efficient-server#components" class="hash-link" aria-label="Direct link to Components" title="Direct link to Components" translate="no">​</a></h3>
<p>These are the components I ended up with. I've tried to describe my reasoning for each component,
but if you have any questions please don't hesitate to drop a comment.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="main-components">Main components<a href="https://takken.io/blog/building-an-energy-efficient-server#main-components" class="hash-link" aria-label="Direct link to Main components" title="Direct link to Main components" translate="no">​</a></h4>
<table><thead><tr><th>#</th><th>Component</th><th>Product</th><th>Reasoning</th></tr></thead><tbody><tr><td>1</td><td>Enclosure</td><td><a href="https://tweakers.net/pricewatch/439087/inter-tech-ipc-2u-20248.html" target="_blank" rel="noopener noreferrer" class="">Inter-Tech IPC 2U-20248</a></td><td>2U, small enough to fit in my very small server rack</td></tr><tr><td>1</td><td>Motherboard</td><td><a href="https://tweakers.net/pricewatch/1216049/fujitsu-d3642-b.html" target="_blank" rel="noopener noreferrer" class="">Fujitsu D3642-B</a></td><td>With a cost around €200 it's not exactly a budget board, but it's a modern and energy efficient mobo that's well worth the price.</td></tr><tr><td>1</td><td>CPU</td><td><a href="https://tweakers.net/pricewatch/1539830/intel-core-i7-9700k-tray-srg15.html" target="_blank" rel="noopener noreferrer" class="">Intel Core i7-9700K Tray (SRG15)</a></td><td>Supports virtualisation technologies like VT-x. 9th gen because it's more efficient than 10th gen, and especially 11~13th gen. I7 over I3 because it's more powerful, even with the TDP being limited</td></tr><tr><td>1</td><td>CPU Cooling</td><td><a href="https://tweakers.net/pricewatch/320033/noctua-nh-l9i-bruin.html" target="_blank" rel="noopener noreferrer" class="">Noctua NH-L9i Brown</a></td><td>I love this brand. Absolutely silent.</td></tr><tr><td>1</td><td>Memory</td><td><a href="https://tweakers.net/pricewatch/1490902/crucial-ct2k32g4dfd832a.html" target="_blank" rel="noopener noreferrer" class="">64GB Crucial CT2K32G4DFD832A</a></td><td>Memory size has a relatively small effect on energy usage. 64GB for running virtual workloads without worries.</td></tr><tr><td>1</td><td>Drive bay</td><td><a href="https://www.delock.com/produkt/47221/merkmale.html" target="_blank" rel="noopener noreferrer" class="">DeLOCK 47221 drive bay panel</a></td><td>I didn't want to go for a SASS backplane because it might need upgrading when disk sizes become larger. Also challenging to find SASS platforms that don't require much power. This is rather simple: 6 sata cables directly to the mobo.</td></tr><tr><td>2</td><td>Solid state drives</td><td><a href="https://tweakers.net/pricewatch/1645084/samsung-870-evo-mz-77e4t0b-eu-4tb.html" target="_blank" rel="noopener noreferrer" class="">Samsung 870 Evo (MZ-77E4T0B/EU) 4TB</a></td><td>To be used as the Array in Unraid, which requires 1 Parity disk (which you can not use). Unraid is basically utilising a modern version of software RAID.</td></tr><tr><td>1</td><td>Power Supply</td><td><a href="https://tweakers.net/pricewatch/273614/mini-box-picopsu-90-+-84w-fortron-adapter-power-kit.html" target="_blank" rel="noopener noreferrer" class="">Mini-box PicoPSU-90 + 84W (Fortron) Adapter Power Kit</a></td><td>Power supplies become very inefficient when utilised below 20%. This PSU is tailored towards idle load, which is expected to be lower than 10W</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="accessories">Accessories<a href="https://takken.io/blog/building-an-energy-efficient-server#accessories" class="hash-link" aria-label="Direct link to Accessories" title="Direct link to Accessories" translate="no">​</a></h4>
<table><thead><tr><th>#</th><th>Component</th><th>Product</th><th>Reasoning</th></tr></thead><tbody><tr><td>1</td><td>Rack rails</td><td><a href="https://tweakers.net/pricewatch/1429530/inter-tech-18-inch-telescopic-rails-350mm-450mm.html" target="_blank" rel="noopener noreferrer" class="">Inter-Tech 18" telescopic rails 350mm - 450mm</a></td><td>For fitting it in the server rack. I had to customise these to fit in my very small 60cm rack</td></tr><tr><td>2</td><td>Sata cables</td><td><a href="https://www.amazon.nl/dp/B01LFB3R0W" target="_blank" rel="noopener noreferrer" class="">3 x 7-pin SATA 3 / 6Gbit/s 30cm</a></td><td>Standard cables that look nice</td></tr><tr><td>1</td><td>Sata to Molex</td><td><a href="https://www.amazon.nl/dp/B08PQFXVBV" target="_blank" rel="noopener noreferrer" class="">zdyCGTime SATA 15 Pin to Dual 4 Pin Molex One to Two Power Cable</a></td><td>PicoPSU only has 1x SATA power and 1x Molex power. This cable splits the SATA power connector into two Molex connectors, both of which go into the drive bay. It powers all six potential SSDs</td></tr><tr><td>1</td><td>USB flash drive (OS)</td><td><a href="https://www.amazon.de/-/en/gp/product/B017L5BXSY" target="_blank" rel="noopener noreferrer" class="">Verbatim Metal Executive USB 3.0 flash drive 64 GB, USB flash drive</a></td><td>The operating system will run from this USB flash drive, simply because it uses less power than when using another disk</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-build">The build<a href="https://takken.io/blog/building-an-energy-efficient-server#the-build" class="hash-link" aria-label="Direct link to The build" title="Direct link to The build" translate="no">​</a></h3>
<p>Here's what the build looks like.</p>
<div style="display:flex;gap:2rem;padding-bottom:1rem"><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAYH/8QAHxAAAQQCAgMAAAAAAAAAAAAAAQACAxEEEgUGEyFB/8QAFAEBAAAAAAAAAAAAAAAAAAAAAf/EABgRAAIDAAAAAAAAAAAAAAAAAAABAxIh/9oADAMBAAIRAxEAPwCQ6e6aPmsfFmwXeaCTeHIdI4QAkXVgHYla0HihsPf2kRMbstGRVeH/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="192"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/hardware-front.a3cffe0.256.jpg" srcset="/assets/ideal-img/hardware-front.a3cffe0.256.jpg 256w,/assets/ideal-img/hardware-front.ac8b13b.717.jpg 717w,/assets/ideal-img/hardware-front.17f9575.1178.jpg 1178w,/assets/ideal-img/hardware-front.ddfa28f.1639.jpg 1639w,/assets/ideal-img/hardware-front.9d5f079.1825.jpg 1825w" width="256" height="192"></noscript></div></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAX/xAAfEAACAQMFAQAAAAAAAAAAAAABAgMABBEFBhIhQTH/xAAUAQEAAAAAAAAAAAAAAAAAAAAC/8QAGBEBAAMBAAAAAAAAAAAAAAAAAQACEUH/2gAMAwEAAhEDEQA/AJ2u6ZfwQLl75klLsypJI3FSehjOFHuKopt2CJRGt4zBBxDGY949+0pSqasDbk//2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="192"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/hardware-overview.c4f2175.256.jpg" srcset="/assets/ideal-img/hardware-overview.c4f2175.256.jpg 256w,/assets/ideal-img/hardware-overview.ceaa2a1.717.jpg 717w,/assets/ideal-img/hardware-overview.78f9b0e.1178.jpg 1178w,/assets/ideal-img/hardware-overview.beec2ab.1639.jpg 1639w,/assets/ideal-img/hardware-overview.7628d8c.1909.jpg 1909w" width="256" height="192"></noscript></div></div></div></div>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAYH/8QAIBAAAQMEAgMAAAAAAAAAAAAAAQIDBAAFESEGEjFRYf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEhAv/aAAwDAQACEQMRAD8AkeAcBcvUJElEdlbIcca7Sn+qQQQR1SnZO96xWzwlwIkNiMuwW4qZbS2cKT5Ax7+UpQqVqH//2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="192"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/hardware-running.41a2123.256.jpg" srcset="/assets/ideal-img/hardware-running.41a2123.256.jpg 256w,/assets/ideal-img/hardware-running.ba6c95d.717.jpg 717w,/assets/ideal-img/hardware-running.a84638e.1178.jpg 1178w,/assets/ideal-img/hardware-running.fb33b68.1639.jpg 1639w,/assets/ideal-img/hardware-running.8803f8d.1825.jpg 1825w" width="256" height="192"></noscript></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="efficiency-tweaks">Efficiency tweaks<a href="https://takken.io/blog/building-an-energy-efficient-server#efficiency-tweaks" class="hash-link" aria-label="Direct link to Efficiency tweaks" title="Direct link to Efficiency tweaks" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="measuring">Measuring<a href="https://takken.io/blog/building-an-energy-efficient-server#measuring" class="hash-link" aria-label="Direct link to Measuring" title="Direct link to Measuring" translate="no">​</a></h3>
<p>To measure the power usage I used a calibrated
<a class="" href="https://takken.io/notes/home-assistant/devices/nous-a1t-16a-power-monitoring-plug/">Nous A1T</a>.</p>
<p>I calibrated the plug using a multi meter and a 40W light bulb (resistive load).</p>
<div style="display:flex;gap:2rem;padding-bottom:1rem"><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAANAAoDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAgQFBv/EACQQAAIBAwMDBQAAAAAAAAAAAAECAwQRIQAFBhQxURIycsLR/8QAFAEBAAAAAAAAAAAAAAAAAAAABP/EABkRAAIDAQAAAAAAAAAAAAAAAAECAAMEMf/aAAwDAQACEQMRAD8Ay/K6ubkc3SU9DVOY3EkbLGUUEZ9xAHkWvpXqd6GDsVbf5qPtqhPuu41cMktTWysquIwi2Ud++MeNGYWc+ppGLHJNz+6JbrFZj68TOoPJ/9k=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="341"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/amps-reading.484d123.256.jpg" srcset="/assets/ideal-img/amps-reading.484d123.256.jpg 256w,/assets/ideal-img/amps-reading.d39d8b3.717.jpg 717w,/assets/ideal-img/amps-reading.0d7cdc6.1027.jpg 1027w" width="256" height="341"></noscript></div></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAANAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAABAb/xAAkEAACAQMDBAMBAAAAAAAAAAABAgMEBREAEiEGEzFRFSJxof/EABUBAQEAAAAAAAAAAAAAAAAAAAME/8QAHBEAAQMFAAAAAAAAAAAAAAAAAQACAwQREyFB/9oADAMBAAIRAxEAPwA/UEVVe4HaGWnVGVkPcjKrg5yBuBB9ZHg6g/hLqv1N0ogRxgzE4/ml33qKsqKlp523Rg9sRKSAPz1zz41NvcJJWMhDLvO7AbgZ0RkIceqqOmyDRsv/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="341"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/voltage-reading.42ee811.256.jpg" srcset="/assets/ideal-img/voltage-reading.42ee811.256.jpg 256w,/assets/ideal-img/voltage-reading.ea6551a.717.jpg 717w,/assets/ideal-img/voltage-reading.c1fe2f8.1027.jpg 1027w" width="256" height="341"></noscript></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-boot">First boot<a href="https://takken.io/blog/building-an-energy-efficient-server#first-boot" class="hash-link" aria-label="Direct link to First boot" title="Direct link to First boot" translate="no">​</a></h3>
<p>First thing I did was boot it up with no additional settings. Not surprisingly, it crashed while
booting into Unraid. Loading an OS is CPU heavy task and the energy usage spiked above the maximum
the PSU could handle.</p>
<p>So the first tweak was to</p>
<ul>
<li class="">set the CPU TDP limit to 35W.</li>
</ul>
<p>After this everything worked very smoothly. 🎉</p>
<p>Time for stats!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stress-testing">Stress testing<a href="https://takken.io/blog/building-an-energy-efficient-server#stress-testing" class="hash-link" aria-label="Direct link to Stress testing" title="Direct link to Stress testing" translate="no">​</a></h3>
<p>I ran a stress test with <code>mprime</code> to see what the maximum power usage was.</p>
<p>Source: <a href="https://www.mersenne.org/download/" target="_blank" rel="noopener noreferrer" class="">https://www.mersenne.org/download/</a></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Download</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://www.mersenne.org/download/software/v30/30.8/p95v308b17.linux64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Extract</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> mprime </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xf</span><span class="token plain"> ./p95v308b17.linux64.tar.gz </span><span class="token parameter variable" style="color:#36acaa">-C</span><span class="token plain"> mprime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Manual</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./mprime/mprime </span><span class="token parameter variable" style="color:#36acaa">--help</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Run</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./mprime/mprime </span><span class="token parameter variable" style="color:#36acaa">-t</span><br></span></code></pre></div></div>
<p>For the visual people among us, here's what that looks like:</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAo0lEQVR4nG2NuwrCMBhGs9okzZ80SVutQq0OKg6KiwhOgrj5/i9zROskDmc630XdTnee+wuPw8D1tOZ43rHcbEg545zD9VvCsELN+yWzfmC6WJGaOSFkqhARH7C2xBQTdDFB1c2UFDNVVeG9R0TwPoxrHwRblqhuvaBtO5q2I8aEE6F0jpje14IxGmMMKnWZupmNQgRr7Uf8onSh0br4Mrb/BV81BEqNt3v5LQAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="144"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/install-mprime.210d5f9.256.png" srcset="/assets/ideal-img/install-mprime.210d5f9.256.png 256w,/assets/ideal-img/install-mprime.f4be2bc.717.png 717w,/assets/ideal-img/install-mprime.1e0531e.1178.png 1178w,/assets/ideal-img/install-mprime.5cd18d2.1266.png 1266w" width="256" height="144"></noscript></div></div></div>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAjUlEQVR4nG2PzQ7DIAyDuQ6oNFh/Bk1JoGv7/k/oKVymTTtYSqTPjmMKNxTZQZtgGAZ47//K1Hai7iekHRjHGeO04B4ivHPfIMsBllcHV2JQqR12v6A0TdPUq0NqmqYF1t467Jz9nGbeUdsFnbuxHthK7b31hxAfMCkT5iXhmQgpF+iuFVR53bCSIISIN/bvTH7Ng38XAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="144"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/run-mprime.55c088e.256.png" srcset="/assets/ideal-img/run-mprime.55c088e.256.png 256w,/assets/ideal-img/run-mprime.226edbd.717.png 717w,/assets/ideal-img/run-mprime.091ff04.1178.png 1178w,/assets/ideal-img/run-mprime.71a02da.1257.png 1257w" width="256" height="144"></noscript></div></div></div>
<div style="display:flex;gap:2rem;padding-bottom:1rem"><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABHUlEQVR4nD2QzUrDQBRG8wBijQVt0k6mM3cmv20NbZJawYWCC8FNoQhdFBduXPn+uyNJi4vDXdxzPy5f0HYdq4eaNC/I0hTRGnfBa02qNWItwaLe4NIMSTM2maNVEZ2K2amYp1nMq1ZURgjKaolKNMZnvDjFPhpxiEOOUcgpCvm5D9mqGcFiuUTpOSbNefOKz8kVx+iGr8mI78mI37trdrNpn7g4iz7j2Wne45CP6Zh9NOYQjTlFtzTJjKAoK+ZWMNaiB2Qgucy5CNqYs+i9H0QzLC8H0ksO3WOFYPu4Y9O05FVFJsLKu4FCJ+SJotQJrq+n6bohwecF66pk7YTGOxqxtGLZisWZXmw7tLFY71nUa7JljRQVJi//6V/4A+v+kUWLE/gUAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="259"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/unraid-load.683843f.256.png" srcset="/assets/ideal-img/unraid-load.683843f.256.png 256w,/assets/ideal-img/unraid-load.1649876.687.png 687w" width="256" height="259"></noscript></div></div></div><div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAXCAYAAAAyet74AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACz0lEQVR4nE2Q224TVxSG90sAJUqI5+TYcx7PyQ6xISTjZpLYcZzQcoMoVNxUaqVcIFFVtLQOkSqa1jIJbtIHaKNKILjtC5TEBlFAalX1WT7kMVV78e+9tPa31r/2EpqmMZKqqriuSxzHBEGA4zhZ7t93MTry+TyyLDM3VyVNU5J6nSgMURXlP3BclUeSJCqzs9TrCUlSZ3a2giRLWdeRhK7rFAoFTNPM7FzXwXVcbNvGNAwsy8IwTMTCYsJaaw3LMlE1LSsaWflBQBRFWUGxUEC8v5TSXGtSq9XQ9SKKoqAoKmEQEscRrueNwWarRXujzXqrxeXLm5RKXjZvFEboxSJhFOF5LmIpXaaxukq6lLKYJMwUCtkGwjDEdZxsPt3QEelyyuZGm9Zai2ajgWPbKIpMHJe5eOEilUo524BIkkXa6y1WlleoLyZZp9GcQRBSrc5RrdayW5R8n3K5/O6HDkVdp1jUsWwbz/PwSiUc10Woo6XKOaYmJ2i3mux0vqa/12Ozvc7kxHvkFRlVkRCa7ZMvVZAsn/nVNjc+u8XVT7aor19hWvfQShU0y0dIXzwi9/BPpN5LJnaf4+0P8fdPOLs7zHK5/t9It39ByB9sId/YRr52F+36N1g3O9g3t7NYvnYX+eN7KBufInJfPiXXfc65757h7p1QOxxy/mCQxdP3fyfXeznumLvzZAzef8ZM94Tg4YC4P0DrnnDu/6D01VOmuy9QfzjG3hu8A4e4+wOU74+Z7v2BdPsIIWfWL5jpHlPuD6kcDCn/OOTC4ZBidwzKnx8hznZ+40z/L049eM3pB28wD1/h/PSa03tvONV7xZmDf5i48wSxX0349dIqP8+vcLTQ4PGV6zz+8COO5ley3KNLDXbPLyBumQY7lknHMtm2TO6VY3YqZbZtk45t8q1jsWUaiCldZ8o0M00aBjnLZsYPUEs+mu+TjyI0z+Mt+dS0GafFZuAAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="585"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/energy-reading.cb477ce.256.png" srcset="/assets/ideal-img/energy-reading.cb477ce.256.png 256w,/assets/ideal-img/energy-reading.93b329f.350.png 350w" width="256" height="585"></noscript></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="initial-stats">Initial stats<a href="https://takken.io/blog/building-an-energy-efficient-server#initial-stats" class="hash-link" aria-label="Direct link to Initial stats" title="Direct link to Initial stats" translate="no">​</a></h3>
<p>Now that we know both our idle and stress power usage, we can start tweaking.</p>
<p>But before that, time for the initial stats!</p>
<table><thead><tr><th style="text-align:center">Idle low</th><th style="text-align:center">Idle avg</th><th style="text-align:center">Idle high</th><th></th><th style="text-align:center">Stress low</th><th style="text-align:center">Stress avg</th><th style="text-align:center">Stress high</th></tr></thead><tbody><tr><td style="text-align:center">11W</td><td style="text-align:center"><strong>13W</strong></td><td style="text-align:center">16W</td><td></td><td style="text-align:center">54W</td><td style="text-align:center"><strong>56W</strong></td><td style="text-align:center">62W</td></tr></tbody></table>
<p>What's interesting is that even without any tweaks, the idle power usage of the server is already
very low.</p>
<p>This has everything to do with the specific hardware that was chosen, especially the motherboard
with its focus on energy efficiency and the power supply unit (PSU) not being so large that it
becomes inefficient at low loads.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The server will be running 24/7, so the average idle power usage is the most important metric here.</p></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The artificial load of the stress test is not representative of real world usage. Therefore, I will
not be using the <code>high</code> values but at maximum the <code>avg</code> values when reconfiguring max TDP for the
CPU.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="bios-tweaks">BIOS tweaks<a href="https://takken.io/blog/building-an-energy-efficient-server#bios-tweaks" class="hash-link" aria-label="Direct link to BIOS tweaks" title="Direct link to BIOS tweaks" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bios-tweaks-turn-off-unused-devices">BIOS tweaks: Turn off unused devices<a href="https://takken.io/blog/building-an-energy-efficient-server#bios-tweaks-turn-off-unused-devices" class="hash-link" aria-label="Direct link to BIOS tweaks: Turn off unused devices" title="Direct link to BIOS tweaks: Turn off unused devices" translate="no">​</a></h3>
<p>Firstly, the most obvious tweaks: turning off all the things we don't need.</p>
<ul>
<li class="">Audio: Disabled</li>
<li class="">PCI Express Slot 1: Disabled</li>
<li class="">PCI Express Slot 2: Disabled</li>
<li class="">PCI Express Slot 3: Disabled</li>
<li class="">PCI Express Slot 4: Disabled</li>
<li class="">Serial port: Disabled</li>
</ul>
<p>Great results so far!</p>
<table><thead><tr><th style="text-align:center">Idle low</th><th style="text-align:center">Idle avg</th><th style="text-align:center">Idle high</th></tr></thead><tbody><tr><td style="text-align:center">8W</td><td style="text-align:center"><strong>10W</strong></td><td style="text-align:center">13W</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bios-tweaks-review-all-relevant-settings">BIOS tweaks: Review all relevant settings<a href="https://takken.io/blog/building-an-energy-efficient-server#bios-tweaks-review-all-relevant-settings" class="hash-link" aria-label="Direct link to BIOS tweaks: Review all relevant settings" title="Direct link to BIOS tweaks: Review all relevant settings" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cpu">CPU<a href="https://takken.io/blog/building-an-energy-efficient-server#cpu" class="hash-link" aria-label="Direct link to CPU" title="Direct link to CPU" translate="no">​</a></h4>
<ul>
<li class="">Enhanced Intel SpeedStep Technology: Enabled (was Enabled)</li>
<li class="">Turbo Boost: Disabled (was Enabled)</li>
<li class="">C States: Enabled (was Enabled)</li>
<li class="">Package C State Limit: Auto (was Auto)</li>
</ul>
<p>And since there's some headroom left, I also increase the maximum power limit.</p>
<ul>
<li class="">CPU TDP Limit: 60W (was 35W)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="usb">USB<a href="https://takken.io/blog/building-an-energy-efficient-server#usb" class="hash-link" aria-label="Direct link to USB" title="Direct link to USB" translate="no">​</a></h4>
<ul>
<li class="">USB 3.1 Gen 2 speed: Disabled (was Enabled)</li>
<li class="">USB Port Control: Enable rear and internal ports (was Enable all ports)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nic">NIC<a href="https://takken.io/blog/building-an-energy-efficient-server#nic" class="hash-link" aria-label="Direct link to NIC" title="Direct link to NIC" translate="no">​</a></h4>
<ul>
<li class="">Wake on LAN: Disabled (was Enabled)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="pci">PCI<a href="https://takken.io/blog/building-an-energy-efficient-server#pci" class="hash-link" aria-label="Direct link to PCI" title="Direct link to PCI" translate="no">​</a></h4>
<ul>
<li class="">Above 4G Decoding: Disabled (was Enabled)</li>
</ul>
<table><thead><tr><th style="text-align:center">Idle low</th><th style="text-align:center">Idle avg</th><th style="text-align:center">Idle high</th></tr></thead><tbody><tr><td style="text-align:center">7W</td><td style="text-align:center"><strong>9.5W</strong></td><td style="text-align:center">12W</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bios-tweaks-disable-graphics">BIOS tweaks: Disable graphics<a href="https://takken.io/blog/building-an-energy-efficient-server#bios-tweaks-disable-graphics" class="hash-link" aria-label="Direct link to BIOS tweaks: Disable graphics" title="Direct link to BIOS tweaks: Disable graphics" translate="no">​</a></h3>
<p>The default settings for my motherboard are as follows:</p>
<ul>
<li class="">Primary display: Auto</li>
<li class="">Internal graphics: Auto</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>When using <code>Internal graphics: Auto</code>, the BIOS detects automatically if the internal graphics
controller can be disabled.</p></div></div>
<p>This means that the next test is to pull out the monitor cable and see how it affects power usage.
Unfortunately pulling out the cable didn't make any difference.</p>
<p>I then manually disabled the internal graphics controller, which did seem to make a small
difference, but still too small to measure.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>At this point the difference also becomes hard to measure, as the power usage can jump around a bit
and the update interval of the Nous A1T is about 1 second.</p></div></div>
<p>I wasn't able to detect a significant difference in power usage with this tweak.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="software-tweaks">Software tweaks<a href="https://takken.io/blog/building-an-energy-efficient-server#software-tweaks" class="hash-link" aria-label="Direct link to Software tweaks" title="Direct link to Software tweaks" translate="no">​</a></h2>
<p>Software tweaks can help out where hardware settings are not sufficient or not available. One of the
main things to focus on is the CPU, or more specifically, the C-states.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="c-states">C-states<a href="https://takken.io/blog/building-an-energy-efficient-server#c-states" class="hash-link" aria-label="Direct link to C-states" title="Direct link to C-states" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>C-states, also known as CPU states, are power-saving states for processors (CPUs) in modern computer
systems. These states are designed to reduce the power consumption of the CPU when it is idle or not
performing any computational tasks.</p></div></div>
<p>The different C-states (C0 through C10) represent varying levels of power-saving modes:</p>
<ul>
<li class="">C0 is the operating state.</li>
<li class="">C10 is the deepest idle state.</li>
<li class="">The higher the C-state, the more power is saved.</li>
</ul>
<p>We'll use Powertop to try and improve the C-state usage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="powertop">Powertop<a href="https://takken.io/blog/building-an-energy-efficient-server#powertop" class="hash-link" aria-label="Direct link to Powertop" title="Direct link to Powertop" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Powertop is a tool provided by Intel to enable various power saving modes in userspace, kernel and
on hardware level.</p></div></div>
<p>Powertop comes as one of the recommended tools to tweak power usage on Linux. It's a tool that gives
you quite a bit of insight into what's going on with your system. It also allows you to tweak some
settings.</p>
<p>I've followed
<a href="https://forums.unraid.net/topic/98070-reduce-power-consumption-with-powertop/" target="_blank" rel="noopener noreferrer" class="">this guide</a> to
install it on Unraid. I'll describe some of the steps here.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install">Install<a href="https://takken.io/blog/building-an-energy-efficient-server#install" class="hash-link" aria-label="Direct link to Install" title="Direct link to Install" translate="no">​</a></h4>
<p>Download the file in /boot/extra, then reboot to automatically install it.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /boot/extra</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> /boot/extra</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://github.com/mgutt/unraid-packages/raw/main/6.11.0/powertop-2.15-x86_64-1.txz</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="analyse">Analyse<a href="https://takken.io/blog/building-an-energy-efficient-server#analyse" class="hash-link" aria-label="Direct link to Analyse" title="Direct link to Analyse" translate="no">​</a></h4>
<p>Run powertop without <code>--auto-tune</code> (for now) to get an overview of what's going on.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">powertop</span><br></span></code></pre></div></div>
<p>On the <code>Idle stats</code> tab it looks like much of the time is spent in the C2 state.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAArklEQVR4nF3PzW6DMBBFYXbFE9tgbH7SLKqqSVoZAiGNaDZ9/8c6ka2uuji7T3M1RZxujPOdYX/gcv1huT2I8zfTsrFuv7y9nxBRFG1o6VyDazxVVeNDi+yEsnzJJaS1phiGV/o/1PhA1++x1mKMySWUoYhgjMU5jw+BtuvROgGD/g8rm2BDXbt80WiNKkuUUuxEcsXHaeR4njieR77iSrzc+YxX5nVjWR/5mbT2BHCHTByqJLUfAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="143"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/powertop-idle-states.956963b.256.png" srcset="/assets/ideal-img/powertop-idle-states.956963b.256.png 256w,/assets/ideal-img/powertop-idle-states.ba925d1.717.png 717w,/assets/ideal-img/powertop-idle-states.f12fa73.1178.png 1178w,/assets/ideal-img/powertop-idle-states.7acd37a.1270.png 1270w" width="256" height="143"></noscript></div></div></div>
<p>Looking at the <code>Tunables</code> tab: It seems like there are many things to tune still.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAxElEQVR4nD3NuW6DQAAA0S1jA8vhYFhgYbnMIUicFGksmciJRIPS5v+/ZCJRpJjuSSNu95XP7x+Wx8b9sbF8bczXD27Lyrr9MkzvHA5PiCTNqZqefrzSDTOZNkRxwjlShOcYzw+wLQvh+wFJqtFFRaxS4jjdoUr0Dq3jEdu2EafnkFQbCtOQ5QadlxSmJi8qokghpcRxHERwCsnykrLuMGX7n1IZrufjuh5Suoi6HenHV4bpjUs/0w0ve007cuknVJLt+z+7T1LR8EmaVwAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="143"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/powertop-tunables.4672de7.256.png" srcset="/assets/ideal-img/powertop-tunables.4672de7.256.png 256w,/assets/ideal-img/powertop-tunables.9bd9ed1.717.png 717w,/assets/ideal-img/powertop-tunables.bfc18da.1178.png 1178w,/assets/ideal-img/powertop-tunables.194b67b.1270.png 1270w" width="256" height="143"></noscript></div></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tuning">Tuning<a href="https://takken.io/blog/building-an-energy-efficient-server#tuning" class="hash-link" aria-label="Direct link to Tuning" title="Direct link to Tuning" translate="no">​</a></h4>
<p>Now that we have an overview of what's going on, let's try to tune some of the settings.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">powertop --auto-tune</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># or alternatively</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">powertop </span><span class="token parameter variable" style="color:#36acaa">--quiet</span><span class="token plain"> --auto-tune</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This command will be undone after every reboot, unless you add it to the <code>go</code> file. Keep reading 🙂</p></div></div>
<p>After running this command, the <code>Tunables</code> tab looks like this:</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAxklEQVR4nCXOuU7DQABF0enwMpEXvMT7wtiO7ZgERNJESpCCFAqLlv//kos0FE+3OcUTl+uDz68fbveV633VXY5nLrdvHusv4/4d0zQQWV7x0o3spgPdsCcraqI4IYy2BGGM6/lIWyJ8/5k0L6kaRVE2JGmO3GwwjCcsy8S2baSUiCCMyIuauu2pm46qViRpSbxNcV1Po38YRBRVS9MOGrZqQPUzZdXieb7GjuMgVD/pf+P8pje/frAcTuymI924kGYltmXxB4i/UrfrD0BiAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="143"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/powertop-tunables-tuned.cd2dc17.256.png" srcset="/assets/ideal-img/powertop-tunables-tuned.cd2dc17.256.png 256w,/assets/ideal-img/powertop-tunables-tuned.e34f2c7.717.png 717w,/assets/ideal-img/powertop-tunables-tuned.e7211be.1178.png 1178w,/assets/ideal-img/powertop-tunables-tuned.6703f2d.1270.png 1270w" width="256" height="143"></noscript></div></div></div>
<p>The <code>Idle stats</code> tab looks a lot better now too: Instead of the CPU spending most of the time in the
C2 state it's now spending most of the time in the C8 state.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAp0lEQVR4nFXOzVKDMBSGYXa2+SEhgUKqjiCGagultWrHjfd/V69Ddize3XO+OdnpfGOcv2nCI+frnfnzl3H+Yrr8cLv/0b4OCLEl876kso6icBhjKasdQgg2m4fUgpRSZE0dqJzHWMtytKsDuTForVMLSlBKidZ5WnS+pKzqFVhBay3O+VTYP5HnBqXkGr50MT3cdpG34cjwPtHHI338IB5Gwv4ZKQX/fw5LoL0rXewAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="143"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/powertop-idle-states-tuned.567952e.256.png" srcset="/assets/ideal-img/powertop-idle-states-tuned.567952e.256.png 256w,/assets/ideal-img/powertop-idle-states-tuned.1a652dc.717.png 717w,/assets/ideal-img/powertop-idle-states-tuned.a97d02b.1178.png 1178w,/assets/ideal-img/powertop-idle-states-tuned.974429a.1268.png 1268w" width="256" height="143"></noscript></div></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="keep-tuning-after-reboot">Keep tuning after reboot<a href="https://takken.io/blog/building-an-energy-efficient-server#keep-tuning-after-reboot" class="hash-link" aria-label="Direct link to Keep tuning after reboot" title="Direct link to Keep tuning after reboot" translate="no">​</a></h4>
<p>First of, let's test that the array still comes up after tuning.</p>
<p>In Unraid stop the array, then run the tuning command again.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">powertop </span><span class="token parameter variable" style="color:#36acaa">--quiet</span><span class="token plain"> --auto-tune</span><br></span></code></pre></div></div>
<p>Now start the array again. If the array comes up, you should be good to go.</p>
<p>To keep the tuning after reboot, add the tuning command to the <code>go</code> file like so:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"powertop --quiet --auto-tune"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> /boot/config/go</span><br></span></code></pre></div></div>
<p>Finally, reboot and check if everything still works as expected.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">reboot</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="results">Results<a href="https://takken.io/blog/building-an-energy-efficient-server#results" class="hash-link" aria-label="Direct link to Results" title="Direct link to Results" translate="no">​</a></h3>
<p>Et voilà! After applying tuning, the power usage is down to 7W on average. Awesome! 🎉</p>
<table><thead><tr><th style="text-align:center">Idle low</th><th style="text-align:center">Idle avg</th><th style="text-align:center">Idle high</th></tr></thead><tbody><tr><td style="text-align:center">6W</td><td style="text-align:center"><strong>7W</strong></td><td style="text-align:center">10W</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="conclusion">Conclusion<a href="https://takken.io/blog/building-an-energy-efficient-server#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>And there we have it!</p>
<p>A powerful server that uses only 7W on average when idle. I'm really happy with the results.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="credits">Credits<a href="https://takken.io/blog/building-an-energy-efficient-server#credits" class="hash-link" aria-label="Direct link to Credits" title="Direct link to Credits" translate="no">​</a></h2>
<p>I could not have done it without the awesome contributions people made to the
<a href="https://gathering.tweakers.net/forum/list_messages/2096876/0" target="_blank" rel="noopener noreferrer" class="">Big Efficient Server Topic</a> (Dutch).</p>
<p>Special thanks to <a href="https://tweakers.net/gallery/216161/" target="_blank" rel="noopener noreferrer" class="">mrmrmr</a> in particular. 🙏🏻</p>]]></content:encoded>
            <category>Hardware</category>
            <category>Unraid</category>
            <category>Sustainability</category>
        </item>
        <item>
            <title><![CDATA[Cleaning a CPU]]></title>
            <link>https://takken.io/blog/cleaning-a-cpu</link>
            <guid>https://takken.io/blog/cleaning-a-cpu</guid>
            <pubDate>Mon, 24 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[That time you buy a second hand CPU and dirt is stuck connecting the pins together.]]></description>
            <content:encoded><![CDATA[<p>While ordering parts for my new
<a class="" href="https://takken.io/blog/building-an-energy-efficient-server">energy efficient server</a>, I ended up buying a second
hand <code>I7 9700K</code> processor.</p>
<p>When the piece had arrived, I was surprised to see a chunk of dirt that was burnt in, seemingly
connecting some contact points together. I was worried that this would cause a short circuit and
damage the CPU.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="analysis">Analysis<a href="https://takken.io/blog/cleaning-a-cpu#analysis" class="hash-link" aria-label="Direct link to Analysis" title="Direct link to Analysis" translate="no">​</a></h2>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAANAAoDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAQQFBv/EACQQAAIBAwMDBQAAAAAAAAAAAAECAwQFEQAGIRIiYRVBUZHB/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgT/xAAbEQACAgMBAAAAAAAAAAAAAAABAgADExQhof/aAAwDAQACEQMRAD8AO3K2l3dbZae5UyxXGnAK1kSc+C36p4IzjGpEtgtaSusttt7yKxDMpIBPuQPjTNFINvWKKOlXraRu9zwWYqT1H6xjWV9HuL94vtWgbnpVBgeB41QleQkgch2GqUKfZ//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="341"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/cpu-with-dirt.3cac11e.256.jpg" srcset="/assets/ideal-img/cpu-with-dirt.3cac11e.256.jpg 256w,/assets/ideal-img/cpu-with-dirt.39777b4.717.jpg 717w,/assets/ideal-img/cpu-with-dirt.2c36881.1027.jpg 1027w" width="256" height="341"></noscript></div></div></div>
<p>I found that the shape of the dirt was different from what it seems on the first picture.</p>
<p>Upon closer inspection, using a digital microscope, the dirt seemed to be a bit more loose and some
discolouration became visible.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAYH/8QAIBAAAQQBBAMAAAAAAAAAAAAAAQACBBEFAwYSIRNB0f/EABUBAQEAAAAAAAAAAAAAAAAAAAED/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAIDITH/2gAMAwEAAhEDEQA/AI3I4/Z0rawfoysJGnuawjk5ocw33ddlZwYkAGvNjTXvmPqIqRUoNp//2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="192"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/cpu-under-microscope.73eed91.256.jpg" srcset="/assets/ideal-img/cpu-under-microscope.73eed91.256.jpg 256w,/assets/ideal-img/cpu-under-microscope.7674560.717.jpg 717w,/assets/ideal-img/cpu-under-microscope.7c69cd8.1178.jpg 1178w,/assets/ideal-img/cpu-under-microscope.a598384.1639.jpg 1639w,/assets/ideal-img/cpu-under-microscope.e587622.1825.jpg 1825w" width="256" height="192"></noscript></div></div></div>
<p>On this second picture you see more discolouration and one contact that's almost completely covered
in dirt.</p>
<div class="cursor-zoom-in leading-[0]"><div class="flex flex-col pb-8"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAYH/8QAHxAAAgEEAgMAAAAAAAAAAAAAAQMCAAQFEQYhEiSh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAZEQACAwEAAAAAAAAAAAAAAAABAgADEVH/2gAMAwEAAhEDEQA/AI1fEcLccLQ4ss4ZByoadN+vGRMSZS3Lqs7bgVxZMevLRI2Gjv7SlVpUFdPYXJ2f/9k=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="256" height="192"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/cpu-under-microscope-2.71fddd4.256.jpg" srcset="/assets/ideal-img/cpu-under-microscope-2.71fddd4.256.jpg 256w,/assets/ideal-img/cpu-under-microscope-2.b3cb5f7.717.jpg 717w,/assets/ideal-img/cpu-under-microscope-2.f3871c7.1178.jpg 1178w,/assets/ideal-img/cpu-under-microscope-2.6c4f911.1639.jpg 1639w,/assets/ideal-img/cpu-under-microscope-2.2d82a54.1825.jpg 1825w" width="256" height="192"></noscript></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="cleaning">Cleaning<a href="https://takken.io/blog/cleaning-a-cpu#cleaning" class="hash-link" aria-label="Direct link to Cleaning" title="Direct link to Cleaning" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-not-to-use">What not to use?<a href="https://takken.io/blog/cleaning-a-cpu#what-not-to-use" class="hash-link" aria-label="Direct link to What not to use?" title="Direct link to What not to use?" translate="no">​</a></h3>
<p>After some research, I found out the following:</p>
<ul>
<li class="">Don't use any liquid that corrodes the metal</li>
<li class="">Don't use any liquid that leaves a residue</li>
<li class="">Don't use any liquid that evaporates too slowly</li>
<li class="">Don't use a material that can leave behind residue</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-what-can-you-use">So what can you use?<a href="https://takken.io/blog/cleaning-a-cpu#so-what-can-you-use" class="hash-link" aria-label="Direct link to So what can you use?" title="Direct link to So what can you use?" translate="no">​</a></h3>
<ul>
<li class="">I found that <strong>isopropyl alcohol</strong> is a good choice. It's a solvent that evaporates quickly and
doesn't leave any residue. It's also used to clean electronics. I use
<a href="https://www.amazon.de/-/en/gp/product/B07G5MT4N1" target="_blank" rel="noopener noreferrer" class="">Isopropanol 99.9% Isopropyl Alcohol 2-Propanol 250ml in Glass Bottle</a>.</li>
<li class=""><strong>Cotton swabs</strong> are a good choice. They are small and don't leave behind any residue.</li>
<li class=""><strong>Toothpicks</strong> are a good choice. They are small and can be used to scrape off dirt.</li>
<li class="">A <strong>plastic scraper</strong> can also be helpful to scrape off dirt. Be sure to remove any particles that
might break off.<!-- -->
<ul>
<li class="">I happened to have
<a href="https://www.amazon.nl/FOSHIO-kunststof-schrapers-verwijderen-lijmverwijderaar/dp/B07YDF2RFJ" target="_blank" rel="noopener noreferrer" class="">this glue remover</a>
lying around. While it's not ideal, it's better than using a metal scraper.</li>
</ul>
</li>
</ul>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_BuS1"><p>I'm not responsible for any damage you might cause to your hardware.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-process">The process<a href="https://takken.io/blog/cleaning-a-cpu#the-process" class="hash-link" aria-label="Direct link to The process" title="Direct link to The process" translate="no">​</a></h3>
<p>There is always a risk that your hardware stops working. I would recommend to only clean your
hardware if there is a good reason to do so.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="rubbing">Rubbing<a href="https://takken.io/blog/cleaning-a-cpu#rubbing" class="hash-link" aria-label="Direct link to Rubbing" title="Direct link to Rubbing" translate="no">​</a></h4>
<p>Cleaning with isopropyl alcohol and a cotton swab</p>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_BuS1"><p>Be careful not to touch parts in the center of the CPU, as some components may be sensitive to
static or alcohol.</p></div></div>
<ol>
<li class="">Dip the cotton swab in the isopropyl alcohol</li>
<li class="">Gently rub the dirt with the cotton swab</li>
<li class="">Repeat until the dirt is gone</li>
</ol>
<p>In my case, the dirt was pretty <strong>persistent</strong>. I had to use something with an edge to scrape it
off.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="scraping">Scraping<a href="https://takken.io/blog/cleaning-a-cpu#scraping" class="hash-link" aria-label="Direct link to Scraping" title="Direct link to Scraping" translate="no">​</a></h4>
<ol start="4">
<li class="">Use a toothpick or plastic scraper in a gentle motion to scrape off the dirt.</li>
<li class="">Use the cotton swab to remove any material that might have broken off.</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="rubbing-again">Rubbing again<a href="https://takken.io/blog/cleaning-a-cpu#rubbing-again" class="hash-link" aria-label="Direct link to Rubbing again" title="Direct link to Rubbing again" translate="no">​</a></h4>
<p>After scraping off the dirt, I used the cotton swab again to remove any residue.</p>
<ol start="6">
<li class="">Dip the cotton swab in the isopropyl alcohol</li>
<li class="">Gently rub the dirt with the cotton swab.</li>
</ol>
<p>This is a video of what it looked like for me:</p>
<iframe width="560" height="315" style="width:100%" src="https://www.youtube.com/embed/rjfujfhaVRA" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
<p>As you can see in the video, the dirt isn't completely gone. However, this should be clean enough to
get it working without short-circuiting.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="drying">Drying<a href="https://takken.io/blog/cleaning-a-cpu#drying" class="hash-link" aria-label="Direct link to Drying" title="Direct link to Drying" translate="no">​</a></h4>
<p>Some alcohol may have seeped into the CPU. It's important to let it dry before installing it.</p>
<ol start="8">
<li class="">Wait 15 minutes to make sure the CPU is completely.</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing">Testing<a href="https://takken.io/blog/cleaning-a-cpu#testing" class="hash-link" aria-label="Direct link to Testing" title="Direct link to Testing" translate="no">​</a></h4>
<ol start="9">
<li class="">Install the CPU, apply thermal paste and install the cooler.</li>
<li class="">Boot the system and check if it works.</li>
</ol>
<p>In my case, I installed the CPU, and it worked without any issues.</p>]]></content:encoded>
            <category>Hardware</category>
        </item>
        <item>
            <title><![CDATA[Sweet Transition]]></title>
            <link>https://takken.io/blog/sweet-transition</link>
            <guid>https://takken.io/blog/sweet-transition</guid>
            <pubDate>Sun, 15 May 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[A story about language, diversity, context and understanding]]></description>
            <content:encoded><![CDATA[<p>The other day I got into an interesting conversation with someone from Brazil after discussing some
game design aspects inside the #feedback channel on a closed beta of a new game. I'll refer to them
as Raiane for this short story.</p>
<p>The game is all about building your own logistic network using train railway tracks combined with
different signals. A game that requires a lot of structure and/or creativity of you in order to
succeed.</p>
<p>After receiving a first direct message from Raiane, we soon found out that we had both made the same
observation: that surprisingly many conservative people with very clear structures in their mind,
using circular conversational approaches (not unlike OCD) seem to be drawn to this game's Discord
server.</p>
<p>Raiane stated that the critics in the feedback channel were being pricks. While admittedly that
sentiment resonated well with me as they weren't being particularly polite, I also argued that they
probably weren't being pricks on purpose. And that intention counts.</p>
<p>For the next two hours or so we continued our conversation. We asked ourselves “How and when should
we be more inclusive of others?”. It brought forth the importance of context and nuance among other
things. I would like to share the following condensed snippets from that conversation with you.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="german-and-portuguese">German and Portuguese<a href="https://takken.io/blog/sweet-transition#german-and-portuguese" class="hash-link" aria-label="Direct link to German and Portuguese" title="Direct link to German and Portuguese" translate="no">​</a></h2>
<ul>
<li class=""><strong>Raiane:</strong> German, one of the hardest languages to learn! I believe it is only a little harder
than Portuguese, though both have complex conjugations.</li>
<li class=""><strong>Webber:</strong> Portuguese seems hard to learn as well. The same word can have a different gender in
each language, and I hear there are no clear rules to deduce whether a word should be masculine or
feminine in Portuguese.</li>
<li class=""><strong>Raiane:</strong> Oh yeah... nouns can be masculine or feminine... and yes, there's not really a "why"
that was chosen. And it can become confusing too.</li>
<li class=""><strong>Raiane:</strong> For example a car can be a she or a he, and sometimes one would just call it whatever
feels right in that context. <!-- -->:P</li>
<li class=""><strong>Raiane:</strong> I mean, you could say "My (she) Ranger", or "My (he, for the make Ford) Ranger" - so
in this case either gender is fine.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="evolution-of-language">Evolution of language<a href="https://takken.io/blog/sweet-transition#evolution-of-language" class="hash-link" aria-label="Direct link to Evolution of language" title="Direct link to Evolution of language" translate="no">​</a></h2>
<ul>
<li class=""><strong>Webber:</strong> Now that there's a rising preference to use "they", rather than “he/she” and also “hey
peeps” instead of “hey guys”, German grammar is getting into some trouble.</li>
<li class=""><strong>Webber:</strong> For example, the English word <em>colleagues</em> in German becomes <em>Kolleg*innen</em>, where
the asterisk denotes the inclusion of any gender.</li>
<li class=""><strong>Webber:</strong> Does it become easier or harder in Portuguese or Brazilian Portuguese?</li>
<li class=""><strong>Raiane:</strong> We use <em>masculino</em> and <em>feminino</em> when the subject is masculine (Webber). But when the
subject is feminine, like when using a feminine noun or pronoun (she), the same words are used as
<em>masculina</em> and <em>feminina</em>. So that by itself is a great example.</li>
<li class=""><strong>Raiane:</strong> As part of the inclusion discussion these became exactly how it is written in English:
"masculine" and "feminine". Some also suggest "masculinx" and "femininx". There are all kinds of
jokes going around about this in Brazil. There’s a gender for "they" as well (eles/elas, m/f).</li>
<li class=""><strong>Webber:</strong> Not everyone agrees in Germany either, often because of language fundamentals based on
dated views on gender identity that ended up breaking the grammar in a way.</li>
<li class=""><strong>Raiane:</strong> I think for Portuguese it would take a full grammar reform to propagate those
inclusivity changes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="inclusivity">Inclusivity<a href="https://takken.io/blog/sweet-transition#inclusivity" class="hash-link" aria-label="Direct link to Inclusivity" title="Direct link to Inclusivity" translate="no">​</a></h2>
<ul>
<li class=""><strong>Raiane:</strong> I feel very reluctant about these inclusion things. I don't know to which extent they
are really including, or actually excluding or giving unfair advantages for minorities.</li>
<li class=""><strong>Raiane:</strong> For example, someone with autism spectrum disorder could go out of their way to let
people know about it, just to get an advantage.</li>
<li class=""><strong>Raiane:</strong> Isn't giving advantages to disadvantaged minorities and acknowledging they are a
disadvantaged minority creating segregation by itself?</li>
<li class=""><strong>Webber:</strong> Agreed one the point that it's a very nuanced discussion.</li>
<li class=""><strong>Webber:</strong> I believe a good heuristic might be to imagine when one would feel offended if
something was said or not accounted for 10 years from now.</li>
<li class=""><strong>Webber:</strong> For example: If you were to treat someone like a slave today, as people would in
history (not even that long ago), many people would be offended, not excluding bystanders.</li>
<li class=""><strong>Webber:</strong> Or if you were to tell someone - who you know is diagnosed with classic autism - to
“deal with it”, referring to the noise level in an office.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="identity">Identity<a href="https://takken.io/blog/sweet-transition#identity" class="hash-link" aria-label="Direct link to Identity" title="Direct link to Identity" translate="no">​</a></h2>
<ul>
<li class=""><strong>Webber:</strong> And I believe the key is in identity.</li>
<li class=""><strong>Webber:</strong> Lets take your example of a neurodiverse person and an example about gender:<!-- -->
<ul>
<li class="">As a neurodiverse person, I wouldn't feel offended if somebody does not take my neurological
condition in mind, because it's not what defines me as a person.</li>
<li class="">If you tell someone "you are not a boy, because you don't have a penis and biology says so" to
someone who doesn't identify with their biological sex, they will likely be offended because
you're effectively telling them they can't be themselves.</li>
</ul>
</li>
<li class=""><strong>Webber:</strong> After the inclusivity revolution has passed, we'll probably look at gender inclusion
as the most normal thing in the world - something you just do out of respect.</li>
<li class=""><strong>Webber:</strong> However, before the end of that revolution it'll take society many examples, nuances,
explanations and pioneers to pave the way, because it has to balance against conservatism. Which I
wouldn't say is a bad thing by the way, as this process filters many bad ideas.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-neurodiversity-example">The neurodiversity example<a href="https://takken.io/blog/sweet-transition#the-neurodiversity-example" class="hash-link" aria-label="Direct link to The neurodiversity example" title="Direct link to The neurodiversity example" translate="no">​</a></h3>
<ul>
<li class=""><strong>Raiane:</strong> While chatting in discord, people would probably hate it if someone told them they are
this or that neuro-wise. So wouldn't it be hard to bring that up even when you’d feel offended?</li>
<li class=""><strong>Webber:</strong> Yea exactly. But my point is that you can't really be offended by people not taking
into account that you’re neurodiverse, because it doesn't define you. It's not a big part of your
identity. So while some people might feel offended I believe it's not always warranted.</li>
<li class=""><strong>Webber:</strong> There's something called owning up to it as well. That said, there are traits that do
require people's understanding.</li>
<li class=""><strong>Webber:</strong> In the end it’s all about respecting each other; if someone places their autism very
close to their identity, who are we to judge them?</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-gender-example">The gender example<a href="https://takken.io/blog/sweet-transition#the-gender-example" class="hash-link" aria-label="Direct link to The gender example" title="Direct link to The gender example" translate="no">​</a></h3>
<ul>
<li class=""><strong>Raiane:</strong> How would a professor give a lecture about biology in a class with someone that has an
identity that doesn't match their biological gender?</li>
<li class=""><strong>Raiane:</strong> Another example that has been becoming a meme recently, are the women in sports
performing remarkably well... well, and them not being biological women.</li>
<li class=""><strong>Raiane:</strong> I mean, I want to treat people equally but the very concept of inclusion seems
contradictory to equality!</li>
<li class=""><strong>Webber:</strong> So yea, this seems controversial, but for me it can also be simplified to the
following.</li>
<li class=""><strong>Webber:</strong> Consider these two facts:<!-- -->
<ul>
<li class="">Women are more socially intelligent than men on average.</li>
<li class="">On average male bodies are stronger than female bodies.</li>
</ul>
</li>
<li class=""><strong>Webber:</strong> We don't have to be afraid of these facts, because both of these are purely based in
biology and it’s just how humans evolved for thousands of years.</li>
<li class=""><strong>Webber:</strong> However, we have to recognise is that there is a difference between sex (biology) and
gender (identity), and that these facts do not make either sex more valuable.</li>
<li class=""><strong>Webber:</strong> Furthermore, it has been scientifically proven (and not disproven) that for example
men and women should be mixed equally in order to combine their qualities and to make for the best
outcomes in governments, leadership, teamwork and so on.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="racial-bias">Racial bias<a href="https://takken.io/blog/sweet-transition#racial-bias" class="hash-link" aria-label="Direct link to Racial bias" title="Direct link to Racial bias" translate="no">​</a></h2>
<ul>
<li class=""><strong>Raiane:</strong> And here's a case from Brazil. There's a ProUni (something like pro-university) that
gives advantages, for instance, for black people to qualify for university.</li>
<li class=""><strong>Raiane:</strong> Knowing this ProUni, how can you help not thinking "that black person in class" is
taking the place of a "more committed white person"?</li>
<li class=""><strong>Webber:</strong> Yea so thinking "is that black person not taking the space of a white person" and "the
white person being more committed, or more deserving" is called racial bias.</li>
<li class=""><strong>Webber:</strong> It is normal, but it is not a good thing. Over time we should all learn to accept that
Latin Americans are just as deserving as African people and vice versa. And that Europeans have
humour not so different from Latin Americans.</li>
<li class=""><strong>Webber:</strong> I believe the only real way to do that is by exposure.</li>
<li class=""><strong>Webber:</strong> For example by having a friend, classmate or colleague, and finding out that prejudice
was just a story, never based on facts, but based in fear of change and fear of the unknown.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="conclusion">Conclusion<a href="https://takken.io/blog/sweet-transition#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Ultimately something I keep learning is that context matters.</p>
<p>Every conversation is different, as it is with different people in different situations. A
conversation about the Russo-Ukrainian War with someone from Brazil brings up very different nuances
than a conversation about the same topic with my colleagues from Ukraine and Russia.</p>
<p>And yes, as a <del>wealthy, able, white, european, male</del> person I feel it's my responsibility to not
perpetuate sexual, racial or other bias. This is the reason why I can no longer laugh at some of my
friends’ jokes, which can sometimes be at the expense of gay people.</p>
<p>And to do that I will sometimes have to change my own point of view compared to what it was before,
in order to better align with reality. And if it were up to me, ideally, so would everyone. Yes, it
can sometimes be tiring, but it is also the right thing to do.</p>]]></content:encoded>
            <category>Social</category>
            <category>Language</category>
            <category>Neurodiversity</category>
            <category>Inclusivity</category>
            <category>Context</category>
        </item>
        <item>
            <title><![CDATA[Choosing the right stack]]></title>
            <link>https://takken.io/blog/choosing-the-right-stack</link>
            <guid>https://takken.io/blog/choosing-the-right-stack</guid>
            <pubDate>Wed, 28 Apr 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[A point of view on how to approach choosing a stack for a new application, with examples for each step along the way.]]></description>
            <content:encoded><![CDATA[<p>For some developers choosing the right stack for an application may seem like a trivial task; simply
follow best practices and choose the most modern well-supported tools out there.</p>
<p>While this approach will usually lead to a successful outcome, I've found that spending just enough
time up-front has led me to create working products much faster and with less effort.</p>
<p>As a developer, for several years I have underestimated both the importance of choosing the right
tools for the job, and how crucial the time spent evaluating them really is. The key is in making
informed-enough decisions about how best to achieve your goal, be it another feature, or an entirely
new stack.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="thinking-up-front">Thinking up front<a href="https://takken.io/blog/choosing-the-right-stack#thinking-up-front" class="hash-link" aria-label="Direct link to Thinking up front" title="Direct link to Thinking up front" translate="no">​</a></h2>
<p>Think about "What should we be building? For whom? Why do they need it?"</p>
<p>Once we start coding we may no longer think about important concepts like development speed,
maintainability and scalability of code. A good reason to do research up-front.</p>
<p>Another important aspect is the level of familiarity with any preferred programming languages and
frameworks within the team that will build the application.</p>
<p>In case of a new stack, we may take these thoughts and convert them into technical requirements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="mindset">Mindset<a href="https://takken.io/blog/choosing-the-right-stack#mindset" class="hash-link" aria-label="Direct link to Mindset" title="Direct link to Mindset" translate="no">​</a></h2>
<p>Requirements for an application may change at any time, sometimes very unexpectedly. Change usually
doesn't have to be a bad thing, as long as you're prepared for it. This is why I believe it's best
to keep architectural decisions quite practical.</p>
<p>Thinking ahead and not skipping over important decisions can end up saving much time. It allows you
to imagine the big picture, which in turn will help you choose your tools with more insight. Then,
given any collection of tools, you should also be ready to adapt to changing needs and requirements.</p>
<p>It is likely a good idea to start building as soon as possible after some research, to verify
whether choices about tools that you have made indeed satisfy the requirements, as you suspected
they would.</p>
<p>Make the best decisions you can, based on your current knowledge and continue doing so while moving
forward and building your application. These decisions can be considered informed-enough.</p>
<p>Also, try to accept that some decisions you make now may be superseded by those of the future you.
Once you accept that you have made the best decision at the time and that you can change your mind
as you learn more, you can let go of negative feelings that could slow you down.</p>
<p>This mindset helps create forward momentum.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="mental-model">Mental model<a href="https://takken.io/blog/choosing-the-right-stack#mental-model" class="hash-link" aria-label="Direct link to Mental model" title="Direct link to Mental model" translate="no">​</a></h2>
<p>Perhaps keeping it practical is easier said than done. It does take a little experience to really
keep things practical when there are so many nuances to explore and consider.</p>
<p>Having a mental model is a simple way to not get lost. Over the years I have developed a mental
model that contains a few steps to consider when trying to systematically determine the most fitting
stack for an application. You may use it as a starting point and remove steps or add your own as you
see fit for your projects.</p>
<p><strong>1. Analysis</strong></p>
<ul>
<li class="">Requirements<!-- -->
<ul>
<li class="">Using modal verbs to describe must haves, nice to haves and clarify scope and limitations.</li>
</ul>
</li>
</ul>
<p><strong>2. Fundamental choices</strong></p>
<ul>
<li class="">Should I use code at all?</li>
<li class="">Language and frameworks<!-- -->
<ul>
<li class="">Which languages does my team already know?</li>
<li class="">Which languages offer the most suitable frameworks?</li>
<li class="">Which framework will be at the core of my application?</li>
</ul>
</li>
</ul>
<p><strong>3. Technologies</strong></p>
<ul>
<li class="">User interface</li>
<li class="">Data persistence</li>
<li class="">Authentication</li>
<li class="">Continuous Integration</li>
<li class="">Deployment</li>
</ul>
<p>I would recommend to timebox research for the combined steps. Probably no more than an hour for
small projects, and up to a few days for projects that will likely be maintained for over two years.</p>
<p>Keep in mind that decisions don't have to be written in stone and may be revised as we learn more.
And that's usually a good thing - we're now spending less time trying to make "perfect" decisions
up-front, and we're feeding a healthy mindset of acting on informed-enough decisions based on what
we know now.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="example">Example<a href="https://takken.io/blog/choosing-the-right-stack#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h2>
<p>I will use Takken.io as a case example to demonstrate one way of interpreting these steps and also
to illustrate each step in more detail.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-analysis">1. Analysis<a href="https://takken.io/blog/choosing-the-right-stack#1-analysis" class="hash-link" aria-label="Direct link to 1. Analysis" title="Direct link to 1. Analysis" translate="no">​</a></h3>
<p><strong>Application:</strong> Takken.io</p>
<p><strong>Goal:</strong> A personal blog and a showcase for my hobby projects.</p>
<p><strong>Requirements:</strong></p>
<ul>
<li class="">Easy to change and extend</li>
<li class="">Search engine friendly</li>
<li class="">May not take longer than a weekend or two to set up</li>
</ul>
<p><strong>Nice to have:</strong></p>
<ul>
<li class="">Categories for blog posts</li>
<li class="">Some design space for custom tools I might be creating</li>
<li class="">Easy to migrate</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-fundamental-choices">2. Fundamental choices<a href="https://takken.io/blog/choosing-the-right-stack#2-fundamental-choices" class="hash-link" aria-label="Direct link to 2. Fundamental choices" title="Direct link to 2. Fundamental choices" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="should-i-use-code-at-all">Should I use code at all?<a href="https://takken.io/blog/choosing-the-right-stack#should-i-use-code-at-all" class="hash-link" aria-label="Direct link to Should I use code at all?" title="Direct link to Should I use code at all?" translate="no">​</a></h4>
<p>Once requirements are clear, some may be eager to jump into the code editor to get started, where
others may look forward to explore the options. I believe it is important to consider existing
services that may already offer what you're trying to achieve. There can be much value in the <em>work
not done</em>.</p>
<p>In most scenarios you'll find there are three categories of options:</p>
<ul>
<li class="">no-code options like Tumblr and Medium,</li>
<li class="">ready-made blogging applications like WordPress, and</li>
<li class="">building your own.</li>
</ul>
<p>The technical knowledge that's required grows with each category respectively.</p>
<p>For this blog I have chosen to build my own, so that it will be easier to create a custom
experience, which is something I'm looking to do over time. Since coding is my hobby it's also fine
for me if that means doing a little more work than strictly necessary.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="language">Language<a href="https://takken.io/blog/choosing-the-right-stack#language" class="hash-link" aria-label="Direct link to Language" title="Direct link to Language" translate="no">​</a></h4>
<p>Front-end applications usually require JavaScript and are nowadays made easy by libraries like React
and Vue making them the de facto choices for highly productive teams. For my simple use-case there's
no reason not to choose from one of these.</p>
<p>Between JavaScript and TypeScript (a superset of the former) I went with TypeScript based on three
major selling points:</p>
<ul>
<li class="">Many errors show up earlier during the development process because of static typing</li>
<li class="">Editor better understands the code, which makes things like autocompletion work much better out of
the box</li>
<li class="">Setting up transpilation and linting is a breeze compared to using Babeljs</li>
</ul>
<p>The community seems to agree, as a
<a href="https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved" target="_blank" rel="noopener noreferrer" class="">survey</a>
by StackOverflow puts TypeScript among the most loved languages.</p>
<p>Python, although capable, was not a great option for the backend because of how useful reusing types
between server, client and UI components can be.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="runtime">Runtime<a href="https://takken.io/blog/choosing-the-right-stack#runtime" class="hash-link" aria-label="Direct link to Runtime" title="Direct link to Runtime" translate="no">​</a></h4>
<p>For JavaScript there's a choice to make about which runtime to use. We'll quickly look into that
too.</p>
<p>Deno will likely take over from Node in a while. I would prefer to use Deno as soon as possible. At
the time of writing it does not support some very powerful frameworks just yet, so I've gone with
Node for now.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="framework">Framework<a href="https://takken.io/blog/choosing-the-right-stack#framework" class="hash-link" aria-label="Direct link to Framework" title="Direct link to Framework" translate="no">​</a></h4>
<p>Frameworks help you get a lot done quickly at the expense of their learning curve and often some
loss of performance.</p>
<p>Over time, I've grown in favour of writing code as high-level as possible, while maintaining enough
flexibility to achieve my goals. High-level code allows producing features much faster than with
low-level code. This is part of why choosing a fitting framework for your project is very important.</p>
<p>There is an excellent comparison of both
<a href="https://2020.stateofjs.com/en-US/technologies/front-end-frameworks/" target="_blank" rel="noopener noreferrer" class="">frontend frameworks</a> and
<a href="https://2020.stateofjs.com/en-US/technologies/back-end-frameworks/" target="_blank" rel="noopener noreferrer" class="">backend frameworks</a> on
StateOfJS.com that I highly recommend checking out to get a feel for what is out there.</p>
<p>React was my UI framework of choice because its development team at Facebook has shown their
expertise and motivation to continuously improve what they have started, which includes extensive
care for the experience of the developers who use their library to build complex UIs.</p>
<p>For the backend Next.js was a great choice because of its server side rendering capability, which is
great for Search Engine Optimisation (SEO) purposes.</p>
<p>The more opinionated Gatsby would be an excellent alternative as it is very capable and has GraphQL
integrated out of the box. I'll also keep an eye out for new and upcoming frameworks.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-technologies">3. Technologies<a href="https://takken.io/blog/choosing-the-right-stack#3-technologies" class="hash-link" aria-label="Direct link to 3. Technologies" title="Direct link to 3. Technologies" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="user-interface">User interface<a href="https://takken.io/blog/choosing-the-right-stack#user-interface" class="hash-link" aria-label="Direct link to User interface" title="Direct link to User interface" translate="no">​</a></h4>
<p>For the blog it would be great to have a visually attractive page that can be found in search
engines. Perhaps the posts should also be translatable.</p>
<p>For translations my visitors may just use Google Translate for now. For SEO, I will keep in mind
that the meta information about the pages should be properly populated and further optimisations can
be checked later.</p>
<p>To create that attractive page, my aim is to be able to customise colors, spacing and typography
while keeping a consistent look throughout the application. Picking a design system up-front would
most likely save me time later.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-system">Design System<a href="https://takken.io/blog/choosing-the-right-stack#design-system" class="hash-link" aria-label="Direct link to Design System" title="Direct link to Design System" translate="no">​</a></h5>
<p>A design system is a set of rules and principles that describe how a design should be implemented.
Much like with choosing a framework for the core of the application, a design system implementation
can help significantly speed up development by not reinventing the wheel through very time-consuming
tasks.</p>
<p>A great comparison of CSS frameworks can be found on
<a href="https://2020.stateofcss.com/en-US/report/" target="_blank" rel="noopener noreferrer" class="">https://2020.stateofcss.com/en-US/report/</a>.</p>
<p>Having tried most of the options listed in the comparison, I ended up with Ant design. Mostly
because it offers a lot of functionality out of the box for React and it is relatively easy to
customise; through CSS Modules and LESS variables as well as in line styles for quick fixes. It is
quite good!</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-persistence">Data persistence<a href="https://takken.io/blog/choosing-the-right-stack#data-persistence" class="hash-link" aria-label="Direct link to Data persistence" title="Direct link to Data persistence" translate="no">​</a></h4>
<p>Whether it's being done locally or in the cloud; storing and querying data is an essential part of
most applications. Most storage services have significant performance capabilities, so there isn't
going to be the need to worry about it much in this initial phase.</p>
<p>Decide what level of control is needed over the structure of the data, whether other systems may
need to use the same data, and who should have ownership. It may also be helpful to consider who
will be interacting with the data and how to comply with data privacy laws.</p>
<p>For Takken.io the posts will be written by myself. Readers and reviewers should be able to comment
or fix typographic mistakes directly. Feedback or comments should be possible in some kind of
comment section, or at least a thumbs up or down with an input field.</p>
<p>The posts can be stored as markdown. As the code of Takken.io is publicly available, readers will be
able to place comments and suggest changes to the blog posts directly on GitHub.</p>
<p>Metadata such as likes, dislikes and feedback still needs their own storage and custom
implementation in the UI. For that any database or backend-as-a-service will do.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication">Authentication<a href="https://takken.io/blog/choosing-the-right-stack#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h4>
<p>To keep things simple it may be nice to have the authentication layer and the data layer from the
same service, be it a CMS or a database.</p>
<p>Contentful CMS looks truly promising, but has a hard limit after which it would become quite
expensive for personal projects and the prospect of hitting that limit feels somewhat discouraging.</p>
<p>Then there is the lightweight option of mongodb using a denormalised schema or one may find an
elegant way to use sql databases using Next.js and some library. Vercel is a modern group that
supports very big companies and their recommendations were also quite useful.
<a href="https://www.google.com/amp/s/vercel.com/docs/solutions/databases.amp" target="_blank" rel="noopener noreferrer" class="">https://www.google.com/amp/s/vercel.com/docs/solutions/databases.amp</a></p>
<p>After evaluating which databases would be easiest to use, my choice fell on Firebase firestore in
conjunction with reactfire. Reason for choosing this is that it allows for running queries on the
client and it gives control over which documents may be accessed based on the authenticated user, if
any. Firebase authentication works extremely well and it's also easy to configure.</p>
<p>Firebase firestore works very similar to MongoDB, which can be used to migrate towards in the event
that the scale of the application grows beyond optimisation limits. At that point it may be worth
investing time in.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="continuous-integration">Continuous Integration<a href="https://takken.io/blog/choosing-the-right-stack#continuous-integration" class="hash-link" aria-label="Direct link to Continuous Integration" title="Direct link to Continuous Integration" translate="no">​</a></h4>
<p>Continuous Integration is about making the process to merge code into the primary branch a
lightweight activity. Let's keep our mind on building features instead of worrying about code
styles, formatting, merge conflicts, too much; Instead it's useful to set up a first iteration of a
CI workflow before anything else.</p>
<p>Because I am using GitHub for all my projects, I will also use their CI system called GitHub
Actions. For Takken.io, the compile step is done through Next.js. After compilation, the result
needs to be verified.</p>
<p>Since Vercel has created a ready-to-use action for building and deploying Next.js applications it
was the first thing to check. It turned out to be sufficient for a first iteration of the CI for
this project as deployments can quickly be checked for correctness. Their plugin supports
deployments both for pull requests (feature branches) and the main branch (production), so it also
covers the deployment topic. Awesome!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="outcome">Outcome<a href="https://takken.io/blog/choosing-the-right-stack#outcome" class="hash-link" aria-label="Direct link to Outcome" title="Direct link to Outcome" translate="no">​</a></h3>
<p>For whoever may be interested; the result of the example case is a template repository called
<a href="https://github.com/webbertakken/simple-react-app" target="_blank" rel="noopener noreferrer" class="">Simple React App</a>. The code of Takken.io is based
on that and is also <a href="https://github.com/webbertakken/takken.io" target="_blank" rel="noopener noreferrer" class="">publicly available</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq text-3xl leading-9 md:text-2xl md:leading-8" id="conclusion">Conclusion<a href="https://takken.io/blog/choosing-the-right-stack#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In order to be ready to adapt to changing requirements and in an effort to maximise the value
created, it can often be useful to schedule a session to consider the right tools for the job.</p>
<p>By spending limited time researching up-front, we allow ourselves to make informed-enough decisions
and to create forward momentum.</p>
<p>A mental model and timeboxing can help to stay on track, so that we do not end up spending much time
on details that may not turn out to be proportionally relevant.</p>
<p>Decisions probably do not need to be written in stone, as many details only become clear during
implementation and each iteration offers the opportunity to inspect and adapt.</p>]]></content:encoded>
            <category>Software Engineering</category>
            <category>Language agnostic</category>
        </item>
    </channel>
</rss>