<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>apt on SOW</title>
    <link>https://sow.pgsty.com/tags/apt/</link>
    <description>Recent content in apt 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/apt/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
        <title>Why SOW Uses One Payload Tree per Repository</title>
        <link>https://sow.pgsty.com/blog/design/single-payload/</link>
        <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/blog/design/single-payload/</guid>
        <description>&lt;p&gt;This decision was drafted on 2026-08-05 during the pre-v0.2 release design consolidation&#xA;and shipped in SOW v0.2.0 on 2026-08-08. It remains the layout contract in v0.3 and v0.4.&#xA;It records an architecture choice, not a blanket compatibility claim: protocol closure,&#xA;ordinary package clients, mirror tools, static hosting, and object storage are verified as&#xA;separate evidence layers.&lt;/p&gt;&#xA;&lt;h2 id=&#34;decision&#34;&gt;Decision&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Each SOW Repository owns one public tree:&lt;/p&gt;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-d78f7449-fence-0&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;text&#34; data-td-line-count=&#34;5&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-d78f7449-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;&amp;lt;repository&amp;gt;/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  pool/                         # canonical package bytes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dists/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;lt;dist&amp;gt;/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;lt;architecture&amp;gt;/           # protocol metadata only&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;A Package Object has one canonical payload path inside one Repository. Adding the same&#xA;object to several Dists or architecture views adds membership and metadata references; it&#xA;does not create another canonical package file.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Build an APT Repository</title>
        <link>https://sow.pgsty.com/docs/tutorial/apt-repo/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/tutorial/apt-repo/</guid>
        <description>&lt;p&gt;This tutorial creates a new Managed DEB repository. You need a writable&#xA;directory, and one or more DEB files.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-create-the-workspace&#34;&gt;1. Create the workspace&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-35f1bee1-fence-0&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;5&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-35f1bee1-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/sow&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /srv/sow&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sow init .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sow repo new pigsty&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sow dist new trixie --format deb -r pigsty&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;The Dist name becomes the APT suite. It is an identifier chosen by you; SOW does not infer&#xA;distribution semantics from &lt;code&gt;trixie&lt;/code&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Tutorials</title>
        <link>https://sow.pgsty.com/docs/tutorial/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/tutorial/</guid>
        <description>&lt;p&gt;Each tutorial starts from a new workspace. Commands are intended to be run in order;&#xA;replace uppercase placeholders and package paths for your environment.&lt;/p&gt;&#xA;&lt;p&gt;If you have not installed SOW yet, start with &lt;a href=&#34;https://sow.pgsty.com/docs/start/install/&#34;&gt;Installation&lt;/a&gt; and&#xA;&lt;a href=&#34;https://sow.pgsty.com/docs/start/quickstart/&#34;&gt;Quick Start&lt;/a&gt;. The tutorials below cover the managed repository path.&lt;/p&gt;&#xA;&lt;div class=&#34;td-content-cards td-content-cards--auto&#34; id=&#34;td-cards-b3843302-0&#34;&gt;&#xA;&#xA;&lt;article id=&#34;td-card-b3843302-cards-0-0&#34; class=&#34;td-content-card&#34;&gt;&#xA;&lt;div class=&#34;td-content-card__body&#34;&gt;&#xA;&lt;div class=&#34;td-content-card__head&#34;&gt;&lt;a class=&#34;td-content-card__title&#34; href=&#34;https://sow.pgsty.com/docs/tutorial/yum-repo/&#34;&gt;Build a YUM Repository&lt;/a&gt;&lt;/div&gt;&#xA;&lt;div class=&#34;td-content-card__description&#34;&gt;&lt;p&gt;A managed RPM repository with per-architecture views, &lt;code&gt;noarch&lt;/code&gt; projection, debuginfo filtering,&#xA;version limits, and a working &lt;code&gt;dnf&lt;/code&gt; client configuration.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;/article&gt;&#xA;&lt;article id=&#34;td-card-b3843302-cards-0-1&#34; class=&#34;td-content-card&#34;&gt;&#xA;&lt;div class=&#34;td-content-card__body&#34;&gt;&#xA;&lt;div class=&#34;td-content-card__head&#34;&gt;&lt;a class=&#34;td-content-card__title&#34; href=&#34;https://sow.pgsty.com/docs/tutorial/apt-repo/&#34;&gt;Build an APT Repository&lt;/a&gt;&lt;/div&gt;&#xA;&lt;div class=&#34;td-content-card__description&#34;&gt;&lt;p&gt;A managed DEB repository with a Debian-style pool, &lt;code&gt;by-hash&lt;/code&gt; indexes, and a deb822 client&#xA;configuration.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Sign Your Repository</title>
        <link>https://sow.pgsty.com/docs/tutorial/signing/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/tutorial/signing/</guid>
        <description>&lt;p&gt;SOW has two independent signing paths:&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;Path&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Output&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Client control&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;RPM metadata&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;repodata/repomd.xml.asc&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;repo_gpgcheck=1&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;APT metadata&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;InRelease&lt;/code&gt; and &lt;code&gt;Release.gpg&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;Signed-By&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;RPM package body&lt;/td&gt;&#xA;      &lt;td&gt;embedded RPM signature&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;gpgcheck=1&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;APT trusts package hashes through the signed &lt;code&gt;Release&lt;/code&gt;; SOW does not re-sign DEB package&#xA;bodies. Start with metadata signing. Add RPM package signing only when you own the signing&#xA;policy for those package bytes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-create-a-dedicated-key&#34;&gt;1. Create a dedicated key&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The commands below create an unencrypted example key. Use a protected key and a&#xA;&lt;code&gt;passphrase&lt;/code&gt; reference for production; see the &lt;a href=&#34;https://sow.pgsty.com/docs/reference/config/#passphrase-references&#34;&gt;configuration reference&lt;/a&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Signing Model</title>
        <link>https://sow.pgsty.com/docs/feature/signing/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/feature/signing/</guid>
        <description>&lt;p&gt;There are two different questions a client can ask about a repository, and SOW answers them with two separate mechanisms. Confusing them is the most common source of &amp;ldquo;I signed it but &lt;code&gt;dnf&lt;/code&gt; still complains&amp;rdquo;, so this page starts by pulling them apart.&lt;/p&gt;&#xA;&lt;h2 id=&#34;two-independent-trust-chains&#34;&gt;Two independent trust chains&#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;&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Metadata signing&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;RPM package signing&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Question answered&lt;/td&gt;&#xA;      &lt;td&gt;&amp;ldquo;Is this index really from you, and unmodified?&amp;rdquo;&lt;/td&gt;&#xA;      &lt;td&gt;&amp;ldquo;Is this &lt;code&gt;.rpm&lt;/code&gt; file really from you?&amp;rdquo;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Configured by&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;signing.rpm.metadata&lt;/code&gt;, &lt;code&gt;signing.deb.metadata&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;signing.rpm.packages&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Produces&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;repodata/repomd.xml.asc&lt;/code&gt;, &lt;code&gt;InRelease&lt;/code&gt;, &lt;code&gt;Release.gpg&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;an OpenPGP signature embedded in the package&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Changes package bytes&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;Client setting&lt;/td&gt;&#xA;      &lt;td&gt;dnf &lt;code&gt;repo_gpgcheck=1&lt;/code&gt;, apt &lt;code&gt;Signed-By&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;dnf &lt;code&gt;gpgcheck=1&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Available in Plain mode&lt;/td&gt;&#xA;      &lt;td&gt;no&lt;/td&gt;&#xA;      &lt;td&gt;yes, via &lt;code&gt;create -S KEY&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;They are configured separately and can be used separately. Metadata signing alone is usually the right starting point: it authenticates the whole index in one place and requires no change to the packages you received from upstream.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Platforms &amp; Integrations</title>
        <link>https://sow.pgsty.com/docs/reference/compatibility/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://sow.pgsty.com/docs/reference/compatibility/</guid>
        <description>&lt;p&gt;This page defines the environments SOW ships for, the storage semantics it requires, and&#xA;the exact scope of its automated integrations. Repository generation happens inside the&#xA;SOW binary; a real package manager remains the final check for a deployed repository.&lt;/p&gt;&#xA;&lt;h2 id=&#34;release-targets&#34;&gt;Release targets&#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;Operating system&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34; style=&#34;text-align: right&#34;&gt;&lt;code&gt;amd64&lt;/code&gt;&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34; style=&#34;text-align: right&#34;&gt;&lt;code&gt;arm64&lt;/code&gt;&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Artifact&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Linux&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;td&gt;archive, RPM, DEB&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;macOS&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;td&gt;archive&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Windows&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;no&lt;/td&gt;&#xA;      &lt;td&gt;not supported&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Release binaries use &lt;code&gt;CGO_ENABLED=0&lt;/code&gt; and require no language runtime. The 0.4.0 artifacts were&#xA;built with Go 1.27.0; the source module requires Go 1.27.0 or newer. Archives include &lt;code&gt;README.md&lt;/code&gt;,&#xA;&lt;code&gt;CHANGELOG.md&lt;/code&gt;, and the Apache-2.0 &lt;code&gt;LICENSE&lt;/code&gt;;&#xA;Linux packages install the same license with the binary. Use &lt;a href=&#34;https://sow.pgsty.com/docs/command/&#34;&gt;&lt;code&gt;sow version&lt;/code&gt;&lt;/a&gt;&#xA;to print the product version, target OS/architecture, and build toolchain.&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>
