Skip to content

Software Object Warehouse

Build package repositoriesPublish what changed

Build YUM and APT repositories from local RPM and DEB files. Index an existing directory with sow create. Use a Managed workspace to select packages, sign metadata, keep snapshots, and publish updates.

SOW 0.6.0 · Linux + macOS · RPM + DEB · Apache-2.0

Two ways to build

Choose Plain or Managed

Plain mode indexes the packages in a directory. Managed mode tracks package selection, builds, and publication.

01 / CREATE

Index a package directory

◇ Point SOW at a directory of packages

  • sow create indexes top-level RPM and DEB files in place
  • Produces rpm-md metadata and APT Packages indexes
  • Keeps current and previous RPM metadata after updates

Serve the resulting directory with a static HTTP server.

create.sh
$ sow create /srv/repo --jobs 8
$ python3 -m http.server 8080 --bind 127.0.0.1 --directory /srv/repo

03 / READY TO RUN

One executable

◇ The same CLI on macOS and Linux

  • Linux and macOS archives for amd64 and arm64
  • RPM and DEB installation packages for Linux
  • Built-in package parsing and metadata generation

Run SOW as a command. Managed state uses an embedded SQLite database.

04 / INCREMENTAL

Publish repository updates

◇ Publish to a filesystem or Cloudflare R2 target

  • sow changes lists file changes between local builds
  • Publication compares the current build with the target’s last publication
  • Uploads changed files and records the result

Configure a target in sow.yml, then run sow publish TARGET.

publish.sh
$ sow changes -r pgsql
$ sow publish prod
$ sow status -r pgsql

Operating model

Build, check, publish

Keep package selection, local builds, and remote publication separate.

01

Rebuild local indexes

Plain mode reads the directory each time. Run sow create again after adding or removing package files.

02

Inspect the current build

Managed mode records package selections and completed builds. Use sow status to see whether a build is needed.

03

Check before publication

Run sow check to validate a Managed repository. Use sow publish TARGET to update a configured target.

Common questions

Choose a workflow

Use the same SOW executable for both modes.

Should I start with Plain or Managed mode?

Use Plain mode to index an existing package directory. Use a Managed workspace to select packages per distribution, apply retention rules, sign metadata, and publish updates.

Can I replace an existing createrepo_c workflow?

Yes, for repositories that use RPM XML metadata. Preserve the publication timestamp with --metadata-timestamp and sign the final index if clients require it. See the YUM migration guide for the steps and supported metadata formats.

Does RPM signing also sign the repository index?

--sign-with signs unsigned RPM packages. In Plain mode, sign repomd.xml separately after the final metadata build. Managed mode provides configured metadata-signing policies. See Signing for both workflows.

Can SOW handle RPM and DEB packages together?

Yes. A Plain directory can contain both RPM and DEB packages. In Managed mode, each Dist has one format. One repository can contain multiple RPM and DEB Dists.

Does SOW need a daemon or database service?

No. SOW runs as a command and generates static files. Managed mode uses a local SQLite database. Serve the Repository root, which contains pool/ and dists/, with a static HTTP server.

Where can a Managed repository be published?

Publish to a local or mounted filesystem, or Cloudflare R2. Each target records its own checkpoint. sow publish uses that checkpoint to select the files for the next update.

Build your first repositoryAfter installation, run sow create DIR to index your package directory.