<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>plain on SOW</title>
    <link>https://sow.pgsty.com/tags/plain/</link>
    <description>Recent content in plain on SOW</description>
    <generator>Hugo</generator>
    <language>en</language>
    
    
    
      <lastBuildDate>Fri, 28 Aug 2026 18:32:04 +0800</lastBuildDate>
    
    
      <atom:link href="https://sow.pgsty.com/tags/plain/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
        <title>SOW v0.3.0</title>
        <link>https://sow.pgsty.com/blog/release/sow-v0.3.0/</link>
        <pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/blog/release/sow-v0.3.0/</guid>
        <description>&lt;p&gt;SOW 0.3.0 is a performance, durability, and product-focus release. Plain repository&#xA;generation completes with one package-content pass. Managed repositories avoid&#xA;per-object membership queries, reuse authenticated package facts, and promote payloads&#xA;in bounded group commits. The shipping binary and its release pipeline are also&#xA;consolidated around the repository workflows that SOW supports.&lt;/p&gt;&#xA;&lt;h2 id=&#34;plain-one-package-content-pass&#34;&gt;Plain: one package-content pass&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The default unsigned &lt;code&gt;sow create&lt;/code&gt; path hashes and parses each RPM or DEB once, with&#xA;parallelism controlled by &lt;code&gt;--jobs&lt;/code&gt;. Metadata is rendered from the retained inspection&#xA;result. Before publication, SOW performs one final package-set and file-&lt;code&gt;stat&lt;/code&gt; snapshot&#xA;check, catching concurrent input changes without reading and hashing every package again.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Design Principles</title>
        <link>https://sow.pgsty.com/blog/design/principles/</link>
        <pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/blog/design/principles/</guid>
        <description>&lt;p&gt;SOW is not primarily a metadata generator. It is an ownership and state-transition system&#xA;whose output happens to be APT and RPM repositories. The following principles keep that&#xA;system small enough to reason about.&lt;/p&gt;&#xA;&lt;h2 id=&#34;one-owner-for-every-durable-fact&#34;&gt;One owner for every durable fact&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every durable fact has one scope and one authority:&lt;/p&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Fact&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Owner&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Package bytes and package identity&lt;/td&gt;&#xA;      &lt;td&gt;Repository&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Desired memberships and Built state&lt;/td&gt;&#xA;      &lt;td&gt;Repository&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Generation and Changeset&lt;/td&gt;&#xA;      &lt;td&gt;Repository&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Publication target binding and revisions&lt;/td&gt;&#xA;      &lt;td&gt;Repository + target storage/prefix&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Publication attempt and applied checkpoint&lt;/td&gt;&#xA;      &lt;td&gt;Repository + target prefix&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Remote inventory, grace, and delete evidence&lt;/td&gt;&#xA;      &lt;td&gt;Repository + target prefix&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;State is not silently shared across Repositories or publish prefixes. The same package may&#xA;therefore exist once in each Repository or target. That is intentional: local deduplication&#xA;must not create distributed ownership.&lt;/p&gt;</description>
      </item>
    <item>
        <title>sow create</title>
        <link>https://sow.pgsty.com/docs/command/create/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/command/create/</guid>
        <description>&lt;p&gt;&lt;code&gt;sow create&lt;/code&gt; turns a directory that already contains &lt;code&gt;.rpm&lt;/code&gt; and &lt;code&gt;.deb&lt;/code&gt; files into a flat repository&#xA;by writing indexes next to the packages. It is the whole of Plain mode: no &lt;code&gt;sow.yml&lt;/code&gt;, no SQLite, no&#xA;Workspace discovery. This page covers the one-pass scan contract, the &lt;code&gt;--pigsty&lt;/code&gt; completion gate,&#xA;and RPM signing with &lt;code&gt;--sign-with&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;synopsis&#34;&gt;Synopsis&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-4090f8e0-fence-0&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;text&#34; data-td-line-count=&#34;1&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-4090f8e0-fence-0-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sow create [DIR] [-j N] [--pigsty] [-S KEY [--overwrite]] [-T DUR | -N] [--json]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;code&gt;DIR&lt;/code&gt; defaults to the current directory.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Get Started</title>
        <link>https://sow.pgsty.com/docs/start/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/start/</guid>
        <description>&lt;p&gt;SOW builds static RPM/YUM and DEB/APT repositories; it is not an HTTP daemon. Choose one&#xA;of two isolated paths:&lt;/p&gt;&#xA;&lt;ul class=&#34;cards&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Plain:&lt;/strong&gt; &lt;code&gt;sow create&lt;/code&gt; rebuilds indexes beside the packages in an ordinary directory.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Managed:&lt;/strong&gt; a workspace tracks package membership, Dists, architecture views, policy,&#xA;signing, generations, audit history, and publication targets.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://sow.pgsty.com/docs/start/install/&#34;&gt;Installation&lt;/a&gt; — Choose a release archive, RPM/DEB package, or source build; verify the installed binary.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://sow.pgsty.com/docs/start/quickstart/&#34;&gt;Quick Start&lt;/a&gt; — Create and serve a flat repository from a directory of packages.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Plain Flat Repositories</title>
        <link>https://sow.pgsty.com/docs/feature/plain/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/feature/plain/</guid>
        <description>&lt;p&gt;&lt;code&gt;sow create&lt;/code&gt; takes a directory that already contains &lt;code&gt;.rpm&lt;/code&gt; and &lt;code&gt;.deb&lt;/code&gt; files and writes flat repository indexes beside them. Plain mode has no workspace, configuration file, database, desired state, or operation journal. The package directory is the authority; every index is a disposable projection of its current contents.&lt;/p&gt;&#xA;&lt;p&gt;That distinction is intentional. Managed repositories retain state and recover transactions. Plain repositories are cheap to recreate: if a run fails or is interrupted, run the same command again and overwrite the derived metadata.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Quick Start</title>
        <link>https://sow.pgsty.com/docs/start/quickstart/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/start/quickstart/</guid>
        <description>&lt;p&gt;Plain mode builds a flat repository in one directory. It does not read &lt;code&gt;sow.yml&lt;/code&gt;, create&#xA;a workspace, or keep a database.&lt;/p&gt;&#xA;&lt;div class=&#34;td-steps td-max-width-on-larger-screens&#34;&gt;&#xA;&lt;h2 id=&#34;1-prepare-a-directory&#34;&gt;Prepare a directory&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Put RPM and/or DEB files at the directory top level. &lt;code&gt;sow create&lt;/code&gt; does not recurse and&#xA;does not move or rename package files.&lt;/p&gt;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-baa82ceb-fence-0&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;2&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-baa82ceb-fence-0-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p /srv/repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp /path/to/packages/*.rpm /path/to/packages/*.deb /srv/repo/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;If one glob has no matches, copy the formats you actually have instead.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Features</title>
        <link>https://sow.pgsty.com/docs/feature/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/feature/</guid>
        <description>&lt;p&gt;SOW has two isolated execution paths. Plain mode is a stateless rebuild of one directory;&#xA;Managed mode records package membership and immutable repository generations in a workspace.&#xA;Neither path silently adopts state from the other.&lt;/p&gt;&#xA;&lt;h2 id=&#34;capability-matrix&#34;&gt;Capability matrix&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Capability&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34; style=&#34;text-align: right&#34;&gt;Plain&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34; style=&#34;text-align: right&#34;&gt;Managed&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;RPM and DEB metadata&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;yes&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Mixed RPM + DEB operation&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;one directory&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;one Repository, separate Dists&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Persistent membership and generations&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;no&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Per-architecture views and neutral packages&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;no&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;exclude&lt;/code&gt; and version &lt;code&gt;limit&lt;/code&gt; policy&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;no&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Metadata signing&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;no&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;RPM and DEB&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;RPM package signing&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;--sign-with&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;never&lt;/code&gt;, &lt;code&gt;fill&lt;/code&gt;, &lt;code&gt;always&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Transaction journal and recovery&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;rerun &lt;code&gt;create&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;workspace, Repository, publication&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Queryable operation log and JSONL export&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;no&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Publication targets&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;no&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;filesystem and R2&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;SOW parses packages and renders metadata in-process. It does not invoke&#xA;&lt;code&gt;createrepo_c&lt;/code&gt;, &lt;code&gt;dpkg-scanpackages&lt;/code&gt;, &lt;code&gt;reprepro&lt;/code&gt;, or &lt;code&gt;modifyrepo_c&lt;/code&gt;. RPM package signing&#xA;is the exception: it needs the host &lt;code&gt;rpm&lt;/code&gt; command and GPG environment because it rewrites&#xA;package payloads.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Core Concepts</title>
        <link>https://sow.pgsty.com/docs/start/concepts/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/start/concepts/</guid>
        <description>&lt;h2 id=&#34;plain-or-managed&#34;&gt;Plain or Managed&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The two execution paths are separate.&lt;/p&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Plain&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Managed&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Entry point&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;sow create DIR&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;init&lt;/code&gt;, &lt;code&gt;repo&lt;/code&gt;, &lt;code&gt;dist&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;State&lt;/td&gt;&#xA;      &lt;td&gt;package directory&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;sow.yml&lt;/code&gt; plus private SQLite/journals&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Public layout&lt;/td&gt;&#xA;      &lt;td&gt;flat RPM/DEB indexes&lt;/td&gt;&#xA;      &lt;td&gt;Repository &lt;code&gt;pool/ + dists/&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Formats&lt;/td&gt;&#xA;      &lt;td&gt;RPM and DEB may share one directory&lt;/td&gt;&#xA;      &lt;td&gt;one format per Dist&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Architecture views&lt;/td&gt;&#xA;      &lt;td&gt;no&lt;/td&gt;&#xA;      &lt;td&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Policy and audit&lt;/td&gt;&#xA;      &lt;td&gt;no&lt;/td&gt;&#xA;      &lt;td&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Metadata signing and publication targets&lt;/td&gt;&#xA;      &lt;td&gt;no&lt;/td&gt;&#xA;      &lt;td&gt;yes&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Choose Plain when directory contents already equal the desired repository. Choose Managed&#xA;when SOW must own membership, policy, generations, signing, audit, or publication.&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>
