Features
SOW has two isolated execution paths. Plain mode is a stateless rebuild of one directory; Managed mode records package membership and immutable repository generations in a workspace. Neither path silently adopts state from the other.
Capability matrix
| Capability | Plain | Managed |
|---|---|---|
| RPM and DEB metadata | yes | yes |
| Mixed RPM + DEB operation | one directory | one Repository, separate Dists |
| Persistent membership and generations | no | yes |
| Per-architecture views and neutral packages | no | yes |
exclude and version limit policy |
no | yes |
| Metadata signing | no | RPM and DEB |
| RPM package signing | --sign-with |
never, fill, always |
| Transaction journal and recovery | rerun create |
workspace, Repository, publication |
| Queryable operation log and JSONL export | no | yes |
| Publication targets | no | filesystem and R2 |
SOW parses packages and renders metadata in-process. It does not invoke
createrepo_c, dpkg-scanpackages, reprepro, or modifyrepo_c. RPM package signing
is the exception: it needs the host rpm command and GPG environment because it rewrites
package payloads.
Repository formats
| Surface | RPM/YUM | DEB/APT |
|---|---|---|
| Package facts | RPM header | DEB control archive |
| Identity | NEVRA + exact-byte SHA-256 | name=version:arch + exact-byte SHA-256 |
| Indexes | primary, filelists, other, repomd.xml |
Packages, Packages.gz, Release |
| Neutral architecture | noarch |
all |
| Immutable index paths | checksum-named rpm-md | by-hash/SHA256 |
| Managed metadata signatures | repomd.xml.asc |
InRelease, Release.gpg |
SOW intentionally omits SQLite rpm-md, zchunk, modulemd, source-package indexes, and MD5/SHA1 DEB manifests. It builds repository files; it does not run an HTTP server or CDN.
Read by question
| Question | Page |
|---|---|
What does sow create write and replace? |
Plain Flat Repositories |
| How do workspaces, repositories, Dists, and private state relate? | Managed Workspaces |
| How does one pool feed many metadata-only views? | Pool & Metadata Views |
| Why was a package excluded or limited? | Membership Policy |
| Which key signs which object? | Signing Model |
| What happens after interruption? | Transactions & Recovery |
| How do I inspect, verify, and audit a repository? | Observability & Audit |
For release targets, filesystem requirements, clients, and Providers, use Platforms & Integrations.
Plain Flat Repositories
The one-pass, overwrite-rebuild contract behind sow create, including deterministic output and the Pigsty completion marker.
Managed Workspaces
The Workspace to Repository to Dist model, the fixed on-disk layout, how sow.yml drives everything, and the discovery and selection rules.
Pool & Metadata Views
One package, one owner, metadata-only APT/RPM views: canonical pool addressing, neutral packages, relocation, and the explicit reposync export.
Membership Policy
How exclude and limit decide which packages stay in a Dist: rule fields, glob matching, version ordering, and why loosening a policy never resurrects a removed member.
Signing Model
Two independent trust chains, four key-reference forms, in-process versus external signing, and safe key changes.
Transactions & Recovery
Managed-mode journals, the two-level lock model, fixed commit order, and evidence-driven crash recovery.
Observability & Audit
Use status, check, changes, retention, and the operation log without confusing state with proof.