<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Elle</title>
    <description>The latest articles on DEV Community by Elle (@elle43824glitch).</description>
    <link>https://dev.to/elle43824glitch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4232501%2F231e1685-e3d7-43a1-ad16-2cb8c41acaa7.png</url>
      <title>DEV Community: Elle</title>
      <link>https://dev.to/elle43824glitch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elle43824glitch"/>
    <language>en</language>
    <item>
      <title>My first two open-source PRs, on Windows, in four days: what broke when I set up Switch and what I learned</title>
      <dc:creator>Elle</dc:creator>
      <pubDate>Sat, 07 Nov 2026 17:19:14 +0000</pubDate>
      <link>https://dev.to/elle43824glitch/my-first-two-open-source-prs-on-windows-in-four-days-what-broke-when-i-set-up-switch-and-what-i-201e</link>
      <guid>https://dev.to/elle43824glitch/my-first-two-open-source-prs-on-windows-in-four-days-what-broke-when-i-set-up-switch-and-what-i-201e</guid>
      <description>&lt;p&gt;Four days ago I had never opened a pull request. I knew what GitHub was, roughly, and that was it. This is the story of how I set up &lt;a href="https://github.com/sandbox-quantum/switch" rel="noopener noreferrer"&gt;Switch&lt;/a&gt; — the open-source layer that puts AI coding agents like Claude Code, Codex and OpenCode into team chat — from a clean clone on &lt;strong&gt;Windows 11&lt;/strong&gt; and &lt;strong&gt;Debian 13&lt;/strong&gt; for the Flip the Switch hackathon, what broke along the way, and how that turned into two documentation PRs to Switch's core repository.&lt;/p&gt;

&lt;p&gt;If you are a first-time contributor, or on Windows, or both: this is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I set out to do
&lt;/h2&gt;

&lt;p&gt;Switch's hackathon had a "core contribution" track with issues labelled &lt;code&gt;hackathon&lt;/code&gt;. Two of them were documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;#807&lt;/strong&gt; — write a user guide for the headless &lt;em&gt;agent controller&lt;/em&gt;, the small Node program that runs agents on a machine of yours (a server, a VM) instead of your desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;#808&lt;/strong&gt; — a &lt;em&gt;five-minute quickstart&lt;/em&gt; for new contributors: from clone to an agent answering in a room.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docs issues sounded "easy". They were not easy; they were honest. You cannot write a guide that says "run this and you will see that" without running it and seeing it, so most of my four days went into running things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up Switch from a clean clone
&lt;/h2&gt;

&lt;p&gt;The developer setup is small and well designed: a &lt;code&gt;justfile&lt;/code&gt; with a handful of recipes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/&amp;lt;you&amp;gt;/switch.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;switch
just init-env             &lt;span class="c"&gt;# writes .env with freshly generated secrets, prints the admin login&lt;/span&gt;
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; core    &lt;span class="c"&gt;# Python packages for switch-core (the project lives in core/)&lt;/span&gt;
just up                   &lt;span class="c"&gt;# PostgreSQL + Mattermost in Docker&lt;/span&gt;
just run                  &lt;span class="c"&gt;# switch-core on http://localhost:8000&lt;/span&gt;
just gateway-dev          &lt;span class="c"&gt;# the dashboard on http://localhost:5173&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Debian this took about a minute of actual compute. &lt;code&gt;uv sync --project core&lt;/code&gt; took one second, &lt;code&gt;just run&lt;/code&gt; was ready in four. On Windows 11 the first &lt;code&gt;just up&lt;/code&gt; took 2 min 8 s (it pulls two images and builds a small setup image) and &lt;code&gt;just run&lt;/code&gt; booted in about 30 s. Then you open Switch Console, &lt;strong&gt;Add a Switch server → Connect to an existing server&lt;/strong&gt;, type &lt;code&gt;http://localhost:8000&lt;/code&gt;, sign in as &lt;code&gt;admin@switch.local&lt;/code&gt; with the password &lt;code&gt;just init-env&lt;/code&gt; printed, and Console even shows the local Mattermost as already linked, because a &lt;code&gt;switch-setup&lt;/code&gt; container connected it for you.&lt;/p&gt;

&lt;p&gt;That is the happy path. Here is everything that was not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke on Windows (and how to get past it)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;just&lt;/code&gt; from PowerShell does not work
&lt;/h3&gt;

&lt;p&gt;Several &lt;code&gt;just&lt;/code&gt; recipes are bash scripts (&lt;code&gt;#!/usr/bin/env bash&lt;/code&gt;). From PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: could not find `cygpath` executable to translate recipe `init-env` shebang interpreter path: program not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix: run everything from &lt;strong&gt;Git Bash&lt;/strong&gt;, the shell that comes with Git for Windows. (And open a new window after &lt;code&gt;winget install Casey.Just&lt;/code&gt;, so it is on your &lt;code&gt;PATH&lt;/code&gt;.)&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A fresh clone cannot start switch-core: CRLF
&lt;/h3&gt;

&lt;p&gt;Git for Windows defaults to &lt;code&gt;core.autocrlf=true&lt;/code&gt;, so every file is checked out with CRLF line endings. Switch's connector catalog loader reads &lt;code&gt;SKILL.md&lt;/code&gt; files as raw bytes and matches the frontmatter against &lt;code&gt;---\n&lt;/code&gt;, which never matches &lt;code&gt;---\r\n&lt;/code&gt;. So, on an untouched clone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;switch_core.connections.loader.CatalogError: Connection airtable SKILL.md needs frontmatter with name: airtable and a description.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another contributor had found this before me and opened a one-line &lt;code&gt;.gitattributes&lt;/code&gt; fix (&lt;code&gt;* text=auto eol=lf&lt;/code&gt;, PR #1016). Until it lands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config core.autocrlf &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;--cached&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git reset &lt;span class="nt"&gt;--hard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;re-checks the clone out with LF endings, and &lt;code&gt;just run&lt;/code&gt; starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The controller's npm package refuses Windows
&lt;/h3&gt;

&lt;p&gt;The README says the agent controller "runs natively on Windows". The published package says otherwise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm error code EBADPLATFORM
npm error notsup Unsupported platform for switch-agent-controller@0.31.0: wanted {"os":"darwin,linux"} (current: {"os":"win32"})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;npm install --global --force &amp;lt;tarball-url&amp;gt;&lt;/code&gt; installs a working binary (&lt;code&gt;--version&lt;/code&gt;, &lt;code&gt;doctor&lt;/code&gt; work). The fix is one word (&lt;code&gt;win32&lt;/code&gt;) in the package's &lt;code&gt;os&lt;/code&gt; list; I documented the workaround in the guide and offered the fix as a separate PR.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Switch Console 0.40.1 does not see npm-installed CLIs
&lt;/h3&gt;

&lt;p&gt;This one I could not get past. Console's own check shows OpenCode as &lt;strong&gt;Installed&lt;/strong&gt; (&lt;code&gt;Found v1.19.3&lt;/code&gt;), but the embedded controller that would actually run the agent reports &lt;strong&gt;CLI not installed&lt;/strong&gt;, so every provider in the New agent form is "Not supported here". Choosing the &lt;code&gt;opencode.cmd&lt;/code&gt; shim explicitly, rechecking, restarting Console, even uninstalling and reinstalling OpenCode from Console's own Install button: same result. So on my Windows machine I got everything up to a signed-in Console connected to my dev server, and not the first room reply. I wrote that down in the quickstart rather than pretending otherwise.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Small things in CONTRIBUTING.md
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;uv sync&lt;/code&gt; at the repository root fails with &lt;code&gt;No pyproject.toml found&lt;/code&gt; — the Python project lives in &lt;code&gt;core/&lt;/code&gt;, so it is &lt;code&gt;uv sync --project core&lt;/code&gt;. And the link to the README's "getting started" pointed at a heading that no longer exists. Both fixed in my PR.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Linux side taught me about the controller
&lt;/h2&gt;

&lt;p&gt;For the controller guide I enrolled a real controller (release 0.31.0) against a local switch-core on Debian 13 with the &lt;code&gt;agent_management&lt;/code&gt; flag on, and ran every command and every error path I could think of. Two findings worth sharing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The controller's error messages are &lt;strong&gt;excellent&lt;/strong&gt;. Enrolling a data directory twice tells you it "already belongs to controller … Use another --data-dir, or remove that directory"; a non-loopback &lt;code&gt;http://&lt;/code&gt; server tells you it "must use https (plain http is accepted only for a loopback server)"; a machine without systemd tells you to "Run &lt;code&gt;switch-agent-controller run&lt;/code&gt; under your own supervisor, restarting it on exit code 1 only". Every exit code means one thing. That made the troubleshooting table almost write itself.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;install.sh&lt;/code&gt; on &lt;code&gt;main&lt;/code&gt; only installs &lt;strong&gt;signed&lt;/strong&gt; releases, and the stable 0.31.0 release has no signature yet, so the one-liner currently fails with "the release has no signature". The guide shows the &lt;code&gt;npm install&lt;/code&gt; fallback and explains why.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The two PRs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/sandbox-quantum/switch/pull/1538" rel="noopener noreferrer"&gt;#1538&lt;/a&gt;&lt;/strong&gt; — &lt;code&gt;docs/agent-controller-guide.md&lt;/code&gt; (530 lines): requirements, install, enrollment, service, doctor/status, provider sign-in, updates, Windows, exit codes, troubleshooting, uninstall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/sandbox-quantum/switch/pull/1540" rel="noopener noreferrer"&gt;#1540&lt;/a&gt;&lt;/strong&gt; — &lt;code&gt;docs/contributing/quickstart.md&lt;/code&gt; (277 lines) plus the CONTRIBUTING fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both say exactly which OS each statement was tested on and what did not work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned, as a first-timer
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Comment on the issue first, with a plan.&lt;/strong&gt; The maintainers assigned issues to everyone who asked, and they answered every question within hours, including "where should this page live?" — which saved several people from writing in a generated directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git is less scary than it looks&lt;/strong&gt; when you only need six commands: &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;checkout -b&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;, and the PR button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on the machine your reader has.&lt;/strong&gt; Half of what is in my pages came from Windows doing something the README did not expect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say what did not work.&lt;/strong&gt; A guide that admits "this step fails on Windows 11 with Console 0.40.1, here is why" is more useful than one that pretends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign the CLA with the exact sentence the bot asks for.&lt;/strong&gt; It takes ten seconds and covers all your future PRs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you have Docker, Git and an afternoon, Switch is a very good first open-source repository: the maintainers are responsive, the dev stack is clean, and the &lt;code&gt;hackathon&lt;/code&gt; label still has issues with one or two PRs on them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All commands above were run on Windows 11 (Git for Windows 2.56, Docker Desktop, Node 24, uv 0.11, just 1.59, Switch Console 0.40.1) and Debian 13, against Switch &lt;code&gt;main&lt;/code&gt; on 29 October and 5 November 2026 and controller release 0.31.0.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>hackathon</category>
      <category>windows</category>
    </item>
  </channel>
</rss>
