Platforms & Integrations
SOW builds RPM and DEB repository files on Linux and macOS. Choose a supported local filesystem for the workspace, then configure HTTP or storage access for clients.
Platforms
| Operating system | amd64 |
arm64 |
Release formats |
|---|---|---|---|
| Linux | Yes | Yes | Archive, RPM, DEB |
| macOS | Yes | Yes | Archive |
| Windows | No | No | — |
Release binaries use CGO_ENABLED=0 and need no language runtime. Source builds require
Go 1.27.3 or later. Archives include the README, changelog, Apache-2.0 license, and
third-party notices; Linux packages include license and notice files with the binary.
Run sow version to inspect the binary version, platform, and build toolchain.
Workspace filesystem
Use a local POSIX filesystem with advisory locks, fsync, and atomic same-filesystem
rename. Network filesystems such as NFS are not supported workspace locations.
On macOS, use APFS; SOW rejects builds when required atomic directory exchange is unavailable.
Keep the workspace’s public tree and private staging on the same filesystem.
Serve only <workspace>/<repo>/. That complete pool/ + dists/ tree can be copied to
other storage without the private database or journal.
Full pool paths that differ only in case are rejected. Source-directory case aliases are also rejected on case-insensitive filesystems. A repository created on a case-sensitive volume can contain source directories that a case-insensitive destination cannot represent; filesystem publication checks this before starting. See Layout.
Repository formats and clients
| Output | Client entry point | Package locations |
|---|---|---|
| Plain RPM | repodata/repomd.xml |
Beside repodata/ |
| Plain DEB | Packages or Packages.gz |
Beside the indexes; flat APT source |
| Managed RPM | dists/<dist>/<arch>/repodata/repomd.xml |
Relative paths back to root pool/ |
| Managed DEB | dists/<dist>/Release or signed InRelease |
Root-relative pool/ paths |
Managed APT uses component main and SHA-256 by-hash indexes. Metadata signing produces
RPM repomd.xml.asc or APT InRelease and Release.gpg.
Publication times
New Managed operations record one publication time when they build metadata, except sow repo migrate.
APT Release dates, RPM repomd.xml data timestamps, and metadata signatures use that time.
RPM revision remains the Generation number.
Recovery reuses the recorded time. Older journals without a recorded publication time retain their previous timestamp behavior. No-op operations leave publication times unchanged.
XML and SQLite RPM metadata
SOW generates gzip-compressed primary, filelists, and other XML. It does not generate
SQLite primary_db, filelists_db, or other_db. These are distinct metadata formats;
a tool that only accepts primary_db needs an XML input path or a separate conversion.
Missing primary_db does not by itself prevent YUM from reading the repository. YUM’s
upstream loader falls back to XML and creates its local cache when a suitable SQLite
index is unavailable. See the YUM metadata loader.
SOW’s generated XML uses gzip, so zstd support is a separate question when comparing
other repositories or tools.
SOW does not generate zchunk, modulemd, or source-package indexes. If your clients need
module profiles or dnf module install, keep a tool that provides module metadata.
For ordinary RPM installation from modular packages, apply the appropriate client
module_hotfixes policy; see the migration guide.
dnf reposync
Default dnf reposync confines downloads to one repository directory, so it rejects the
parent-relative package locations in a canonical Managed RPM view. This follows its
documented safe-write path.
Use sow export rpm-leaf to generate a self-contained directory
for that workflow.
Existing EL7 caches
EL7 YUM compares metadata data timestamps with its cached repository. Plain
create --metadata-timestamp SECONDS lets you preserve and advance an existing publication
time. The default is 0.
Exported RPM leaves and RPM metadata generated during sow repo migrate use timestamp 0, with no timestamp override.
Later Managed builds use their recorded publication time.
For these outputs, use a new repository ID if the existing ID has cached a positive timestamp.
Alternatively, clear that ID’s metadata cache. Changing the base URL alone is insufficient.
To retain the old ID and cache, follow the timestamp procedure with Plain mode in
YUM migration.
RPM signatures
Package-signing workflows support RPM format v4. RPM format v6 signature tags are not supported. Metadata key-reference support is separate; see Signing.
Publication providers
| Provider | Publication | Target GC |
|---|---|---|
filesystem |
Writes below an existing canonical file:// endpoint |
Conditional deletion after cache grace, followed by public-absence verification |
r2 |
Writes through S3-compatible storage operations | Reports candidates; does not delete remote objects |
Both publish the complete repository under the configured prefix. Configure the HTTP
service, DNS, credentials, access policy, and cache behavior for that storage.
public_endpoint tells SOW where to verify public content; it does not create the service.
R2 public endpoints must use HTTP(S). Filesystem targets also accept file:// verification.
Automated coverage
The source tree contains these integration checks:
| Check | Environment | Scope |
|---|---|---|
| CLI clean-room workflow | Linux CI | Shipping binary, mixed Plain output, Managed initialization, RPM/DEB Dists, queries, build, and check |
| Plain APT client | pgsty/u22 Ubuntu 22.04 container |
HTTP update, discovery, version selection, download, and installation with an explicitly trusted unsigned source |
| RPM detached-signature transitions | AlmaLinux 8/9 and pgsty/el10 containers |
DNF behavior while repomd.xml and its detached signature change |
| S3-compatible transport | Pinned PGSTY Silo container | Bucket listing, HEAD, GET, conditional single-part PUT, replay, and object SHA-256 metadata |
| Release packaging | Linux CI | Four archives, two RPMs, two DEBs, checksums, package paths, and license files |
The DNF test checks signature transitions; the APT test uses unsigned Plain output. Complete signed Managed installation and hosted R2 conditional multipart completion require checks in the deployment environment.
Before switching clients, run sow check, publish to the intended target, then use the
actual client configuration to refresh indexes and install a package. See
Serving for client setup.