<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Open-Source on Luther Monson</title>
    <link>https://luth.io/tags/open-source/</link>
    <description>Recent content in Open-Source on Luther Monson</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 04 Oct 2026 19:40:00 -0700</lastBuildDate>
    <atom:link href="https://luth.io/tags/open-source/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Breaking Changes Without Breaking Trust: Five Years to go-proxmox v0.8</title>
      <link>https://luth.io/blog/2026/10/go-proxmox-five-years-to-v0-8/</link>
      <pubDate>Sun, 04 Oct 2026 19:40:00 -0700</pubDate>
      <guid>https://luth.io/blog/2026/10/go-proxmox-five-years-to-v0-8/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/luthermonson/go-proxmox&#34;&gt;go-proxmox&lt;/a&gt; had its first commit in June 2021 and v0.8.2 went out on&#xA;September 30th. In between there were 366 commits and 43 people besides me with a merged PR. More to the point of this&#xA;post, there are downstream projects that I don&amp;rsquo;t control pinning it in their &lt;code&gt;go.mod&lt;/code&gt;. IONOS&amp;rsquo;s&#xA;&lt;a href=&#34;https://github.com/ionos-cloud/cluster-api-provider-proxmox&#34;&gt;Cluster API provider&lt;/a&gt; and Sidero&amp;rsquo;s&#xA;&lt;a href=&#34;https://github.com/siderolabs/omni-infra-provider-proxmox&#34;&gt;Omni Proxmox provider&lt;/a&gt; are both on v0.8.1 today. A library&#xA;with users like that gets judged less on its API. It gets judged more on what happens to their build when they bump the&#xA;version. I didn&amp;rsquo;t always get that right, so here is the history, measured.&lt;/p&gt;</description>
    </item>
    <item>
      <title>shipmates: Persona-Based AI Coding Crews That Remember</title>
      <link>https://luth.io/blog/2026/08/shipmates-persona-based-ai-coding-crews/</link>
      <pubDate>Fri, 21 Aug 2026 21:18:00 -0700</pubDate>
      <guid>https://luth.io/blog/2026/08/shipmates-persona-based-ai-coding-crews/</guid>
      <description>&lt;p&gt;Since June most of my evenings have gone into &lt;a href=&#34;https://github.com/luthermonson/shipmates&#34;&gt;shipmates&lt;/a&gt;, a Go CLI and daemon&#xA;for running crews of AI coding agents. I tagged &lt;a href=&#34;https://github.com/luthermonson/shipmates/releases/tag/v0.5.0&#34;&gt;v0.5.0&lt;/a&gt;&#xA;on August 17th. That was two months and about 240 commits after the first architecture doc. So it&amp;rsquo;s a good time to write&#xA;down what it is and why it exists.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-problem&#34;&gt;The problem&lt;/h3&gt;&#xA;&lt;p&gt;I run a lot of agent sessions. On a normal night this workstation has four or five projects going at once. Each has a&#xA;few Claude Code sessions doing different jobs: one reviewing, one writing tests, one chasing a bug. Two things kept&#xA;annoying me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing Windows Archive Extraction in SPC</title>
      <link>https://luth.io/blog/2026/07/spc-windows-archive-extraction/</link>
      <pubDate>Sat, 18 Jul 2026 16:10:00 -0700</pubDate>
      <guid>https://luth.io/blog/2026/07/spc-windows-archive-extraction/</guid>
      <description>&lt;p&gt;One of the first things that broke when I started building PHP on Windows with&#xA;&lt;a href=&#34;https://github.com/crazywhalecc/static-php-cli&#34;&gt;static-php-cli&lt;/a&gt; (SPC) wasn&amp;rsquo;t PHP at all. It was unpacking the source&#xA;tarballs. libxml2, xz and a couple of others would die partway through extraction with:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ERROR: The pipe has been ended.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Over the last few months I&amp;rsquo;ve &amp;ldquo;fixed&amp;rdquo; this two different ways, and the maintainers fixed it a third. It&amp;rsquo;s a small piece&#xA;of code. But it&amp;rsquo;s a good example of how much Linux assumption hides in a single shell pipeline, so here&amp;rsquo;s the whole&#xA;thing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Maintaining an Open-Source Library With AI Agents: AGENTS.md and the Rule They Kept Breaking</title>
      <link>https://luth.io/blog/2026/06/go-proxmox-agents-md/</link>
      <pubDate>Sat, 27 Jun 2026 18:47:00 -0700</pubDate>
      <guid>https://luth.io/blog/2026/06/go-proxmox-agents-md/</guid>
      <description>&lt;p&gt;On May 9th I merged &lt;a href=&#34;https://github.com/luthermonson/go-proxmox/pull/264&#34;&gt;#264&lt;/a&gt;. It added an &lt;code&gt;AGENTS.md&lt;/code&gt; to&#xA;&lt;a href=&#34;https://github.com/luthermonson/go-proxmox&#34;&gt;go-proxmox&lt;/a&gt; and a stub &lt;code&gt;CLAUDE.md&lt;/code&gt; that just points at it. The next six&#xA;weeks ran through the v0.8.0 migration guide on June 15th. In that time &lt;code&gt;main&lt;/code&gt; took 77 commits and +31,794 / -1,144&#xA;lines. The repo went from 84 to 186 &lt;code&gt;.go&lt;/code&gt; files. Endpoint coverage went from 30% to&#xA;&lt;a href=&#34;https://luth.io/blog/2026/06/go-proxmox-endpoint-coverage/&#34;&gt;100% of the Proxmox API&lt;/a&gt;. Most of that code was typed by coding agents,&#xA;a lot of it by several at once. This is what that looked like from the maintainer&amp;rsquo;s chair. It&amp;rsquo;s mostly the parts that&#xA;went wrong, because that&amp;rsquo;s where &lt;code&gt;AGENTS.md&lt;/code&gt; got its content.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Pragmatism of ePHPm - Every Decision Has a &#34;Because&#34; Behind It</title>
      <link>https://luth.io/blog/2026/06/ephpm-pragmatism/</link>
      <pubDate>Sun, 21 Jun 2026 19:05:00 -0700</pubDate>
      <guid>https://luth.io/blog/2026/06/ephpm-pragmatism/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/ephpm/ephpm&#34;&gt;ePHPm&lt;/a&gt; tagged &lt;a href=&#34;https://github.com/ephpm/ephpm/releases/tag/v0.1.0&#34;&gt;v0.1.0&lt;/a&gt; this&#xA;week, three months after the first commit. Before the feature list grows any further I want to write down how&#xA;decisions get made on it. This is mostly for myself. The easiest way to ruin a project like this is to let it turn&#xA;into a checklist of things other projects have.&lt;/p&gt;&#xA;&lt;p&gt;The pitch is simple. One binary that runs a PHP app with fewer moving parts than nginx + php-fpm + Redis + MySQL. Every&#xA;feature has to trace back to that. If I can&amp;rsquo;t finish the sentence &amp;ldquo;this exists because&amp;hellip;&amp;rdquo; with a real problem from&#xA;running PHP in production, it doesn&amp;rsquo;t go in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>go-diskfs: Getting Rock Ridge Working for Joliet on Windows</title>
      <link>https://luth.io/blog/2026/05/go-diskfs-rock-ridge-joliet-windows/</link>
      <pubDate>Sun, 17 May 2026 20:40:00 -0700</pubDate>
      <guid>https://luth.io/blog/2026/05/go-diskfs-rock-ridge-joliet-windows/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/luthermonson/go-proxmox&#34;&gt;go-proxmox&lt;/a&gt; has had a &lt;code&gt;CloudInit()&lt;/code&gt; helper since 2023. It builds a small&#xA;nocloud ISO in Go, uploads it to Proxmox and mounts it on the VM as a CD-ROM. It&amp;rsquo;s always worked fine for Linux guests. It&#xA;has never worked for Windows guests running &lt;a href=&#34;https://cloudbase.it/cloudbase-init/&#34;&gt;cloudbase-init&lt;/a&gt;. The reason is a&#xA;filesystem extension from 1995 called Joliet.&lt;/p&gt;&#xA;&lt;p&gt;Getting it fixed took three PRs to &lt;a href=&#34;https://github.com/diskfs/go-diskfs&#34;&gt;go-diskfs&lt;/a&gt; over about seven weeks. It also took a&#xA;bug report from a user who ran it on Windows. That turned out to be the most important part.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Maintaining a Go Tool That Edits /etc/hosts on Every OS</title>
      <link>https://luth.io/blog/2024/02/goodhosts/</link>
      <pubDate>Sat, 03 Feb 2024 19:22:00 -0700</pubDate>
      <guid>https://luth.io/blog/2024/02/goodhosts/</guid>
      <description>&lt;p&gt;Editing the hosts file sounds like the most boring problem in software. Read a text file, add a line, write it back. Then you find out&#xA;your binary is being shelled out to from a Ruby Vagrant plugin on a Windows laptop with UAC prompts. Your library is being called in a&#xA;loop by &lt;a href=&#34;https://github.com/ddev/ddev&#34;&gt;ddev&lt;/a&gt;. And every hosts file you parse was hand-edited by somebody at some point. I&amp;rsquo;ve been&#xA;maintaining &lt;a href=&#34;https://github.com/goodhosts&#34;&gt;goodhosts&lt;/a&gt; for a few years now. I just spent a chunk of the fall and the holidays on it, so&#xA;here&amp;rsquo;s what that looks like.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
