Your First Workspace
This example creates a Managed repository with two named package sets, called Dists:
el9 for RPMs and bookworm for DEBs. Use an empty, writable /srv/sow directory, or
substitute another path.
Initialize the workspace
init creates:
Edit sow.yml when you need to change configuration. SOW manages the private .sow/
directory. You can repeat init without resetting existing packages or state.
Create a Repository and two Dists
Each Dist has one package format. dist new creates empty indexes for x86_64 and
aarch64 by default. Both Dists share the Repository’s pool/ directory.
The public layout is now:
Add packages
Select the target Dist explicitly:
Replace the input paths with real package files. SOW reads package identity and architecture, stores each accepted file in local/pool/, updates membership, and builds the affected Dists. Later builds use the pool, so the original input files are no longer needed by SOW.
Inspect and verify
ls lists the packages in each Dist. status should report clean and
ready_to_copy=true. A successful check confirms that the files match the recorded build.
Serve the Repository
Publish the complete /srv/sow/local directory so clients can reach both indexes and package files. Keep the workspace configuration and .sow/ outside the server root.
Follow Serve Repositories to publish with Nginx. The YUM and APT tutorials show client configuration, including the trust settings for unsigned repositories.
Batch later updates
When you need to add several batches, use --skip and build once at the end:
While membership changes await a build, sow status reports dirty and ready_to_copy=false.
Selection rules
The commands above find the workspace from the current directory and select its only
Repository. From another directory, use -C /srv/sow. With multiple Repositories, add
-r local. Use -d NAME to select a Dist; repeat it to select several.
See selection rules for discovery and defaults.