<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Design Notes on Barn</title>
    <link>https://barn.pgsty.com/blog/design/</link>
    <description>Recent content in Design Notes on Barn</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    
    
    
      <lastBuildDate>Tue, 29 Sep 2026 00:00:00 +0800</lastBuildDate>
    
    
      <atom:link href="https://barn.pgsty.com/blog/design/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
        <title>Why Barn Has No Projects</title>
        <link>https://barn.pgsty.com/blog/design/one-deployment-no-projects/</link>
        <pubDate>Thu, 27 Aug 2026 19:00:00 +0800</pubDate>
        
        <guid>https://barn.pgsty.com/blog/design/one-deployment-no-projects/</guid>
        <description>&lt;div class=&#34;td-callout td-callout--note&#34; role=&#34;note&#34;&gt;&#xA;  &lt;div class=&#34;td-callout__title&#34;&gt;&lt;i class=&#34;td-callout__icon fa-solid fa-circle-info&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&lt;span class=&#34;td-callout__label&#34;&gt;Note&lt;/span&gt;&lt;/div&gt;&#xA;  &lt;div class=&#34;td-callout__body&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Renamed 2026-09-29:&lt;/strong&gt; names now follow the unreleased Barn 0.9.0 candidate.&#xA;The prior source review was on 2026-09-26: the original publication date is retained; the text&#xA;below reflects the implementation reviewed on this date. See&#xA;&lt;a href=&#34;https://barn.pgsty.com/docs/about/status/&#34;&gt;Status&lt;/a&gt; for released versus candidate behavior and&#xA;dated acceptance evidence.&lt;/p&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;Barn began with a familiar VM-manager abstraction: a working directory was&#xA;a project, a hidden marker gave it identity, a registry found projects again,&#xA;and a host-global lease kept their private networks from colliding. That model&#xA;can support many independent VM sets. It was also the wrong model for the&#xA;product Barn was actually becoming.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Why Every Barn Node Has Two NICs</title>
        <link>https://barn.pgsty.com/blog/design/fixed-ip-two-nics/</link>
        <pubDate>Thu, 27 Aug 2026 20:00:00 +0800</pubDate>
        
        <guid>https://barn.pgsty.com/blog/design/fixed-ip-two-nics/</guid>
        <description>&lt;div class=&#34;td-callout td-callout--note&#34; role=&#34;note&#34;&gt;&#xA;  &lt;div class=&#34;td-callout__title&#34;&gt;&lt;i class=&#34;td-callout__icon fa-solid fa-circle-info&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&lt;span class=&#34;td-callout__label&#34;&gt;Note&lt;/span&gt;&lt;/div&gt;&#xA;  &lt;div class=&#34;td-callout__body&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Renamed 2026-09-29:&lt;/strong&gt; names now follow the unreleased Barn 0.9.0 candidate.&#xA;The prior source review was on 2026-09-26: the original publication date is retained; the text&#xA;below reflects the implementation reviewed on this date. See&#xA;&lt;a href=&#34;https://barn.pgsty.com/docs/about/status/&#34;&gt;Status&lt;/a&gt; for released versus candidate behavior and&#xA;dated acceptance evidence.&lt;/p&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;A Pigsty Inventory names machines by stable addresses. PostgreSQL replication,&#xA;etcd membership, HAProxy backends, VIPs, monitoring targets, and Ansible all&#xA;assume that &lt;code&gt;10.10.10.11&lt;/code&gt; continues to mean the same node. A loopback port&#xA;forward can expose SSH or PostgreSQL to the host, but it cannot provide that&#xA;network identity to peers.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Declarative Does Not Mean Destructive</title>
        <link>https://barn.pgsty.com/blog/design/convergence-without-surprise/</link>
        <pubDate>Thu, 27 Aug 2026 21:00:00 +0800</pubDate>
        
        <guid>https://barn.pgsty.com/blog/design/convergence-without-surprise/</guid>
        <description>&lt;div class=&#34;td-callout td-callout--note&#34; role=&#34;note&#34;&gt;&#xA;  &lt;div class=&#34;td-callout__title&#34;&gt;&lt;i class=&#34;td-callout__icon fa-solid fa-circle-info&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&lt;span class=&#34;td-callout__label&#34;&gt;Note&lt;/span&gt;&lt;/div&gt;&#xA;  &lt;div class=&#34;td-callout__body&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Renamed 2026-09-29:&lt;/strong&gt; names now follow the unreleased Barn 0.9.0 candidate.&#xA;The prior source review was on 2026-09-26: the original publication date is retained; the text&#xA;below reflects the implementation reviewed on this date. See&#xA;&lt;a href=&#34;https://barn.pgsty.com/docs/about/status/&#34;&gt;Status&lt;/a&gt; for released versus candidate behavior and&#xA;dated acceptance evidence.&lt;/p&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;“Declarative” is often shortened to “make reality equal the file.” That is a&#xA;useful slogan until the file is incomplete, the wrong branch is checked out,&#xA;or one YAML group is temporarily removed. If absence is treated as deletion,&#xA;an ordinary editing mistake becomes a destructive operation.&lt;/p&gt;</description>
      </item>
    <item>
        <title>A PID Is Not a Virtual Machine</title>
        <link>https://barn.pgsty.com/blog/design/identity-before-pid/</link>
        <pubDate>Fri, 28 Aug 2026 10:00:00 +0800</pubDate>
        
        <guid>https://barn.pgsty.com/blog/design/identity-before-pid/</guid>
        <description>&lt;div class=&#34;td-callout td-callout--note&#34; role=&#34;note&#34;&gt;&#xA;  &lt;div class=&#34;td-callout__title&#34;&gt;&lt;i class=&#34;td-callout__icon fa-solid fa-circle-info&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&lt;span class=&#34;td-callout__label&#34;&gt;Note&lt;/span&gt;&lt;/div&gt;&#xA;  &lt;div class=&#34;td-callout__body&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Renamed 2026-09-29:&lt;/strong&gt; names now follow the unreleased Barn 0.9.0 candidate.&#xA;The prior source review was on 2026-09-26: the original publication date is retained; the text&#xA;below reflects the implementation reviewed on this date. See&#xA;&lt;a href=&#34;https://barn.pgsty.com/docs/about/status/&#34;&gt;Status&lt;/a&gt; for released versus candidate behavior and&#xA;dated acceptance evidence.&lt;/p&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;A pidfile answers one question: which integer did a process have when the file&#xA;was written? It does not prove that the process is still alive, that the PID&#xA;was not reused, that the executable is QEMU, or that this particular QEMU owns&#xA;the node an operator wants to stop.&lt;/p&gt;</description>
      </item>
    <item>
        <title>repo.yaml Is Intent; catalog.json Is Evidence</title>
        <link>https://barn.pgsty.com/blog/design/repo-yaml-catalog-json/</link>
        <pubDate>Sat, 29 Aug 2026 19:00:00 +0800</pubDate>
        
        <guid>https://barn.pgsty.com/blog/design/repo-yaml-catalog-json/</guid>
        <description>&lt;div class=&#34;td-callout td-callout--note&#34; role=&#34;note&#34;&gt;&#xA;  &lt;div class=&#34;td-callout__title&#34;&gt;&lt;i class=&#34;td-callout__icon fa-solid fa-circle-info&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&lt;span class=&#34;td-callout__label&#34;&gt;Note&lt;/span&gt;&lt;/div&gt;&#xA;  &lt;div class=&#34;td-callout__body&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Renamed 2026-09-29:&lt;/strong&gt; names now follow the unreleased Barn 0.9.0 candidate.&#xA;The prior source review was on 2026-09-26: the original publication date is retained; the text&#xA;below reflects the implementation reviewed on this date. See&#xA;&lt;a href=&#34;https://barn.pgsty.com/docs/about/status/&#34;&gt;Status&lt;/a&gt; for released versus candidate behavior and&#xA;dated acceptance evidence.&lt;/p&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;A static image repository sounds like a directory of qcow2 files plus a JSON&#xA;index. The difficult part is deciding which facts a maintainer may write by&#xA;hand and which facts must be derived from the bytes being published.&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>
