Skip to content

Ruohang Feng

Author of SOW and Pigsty; PostgreSQL infrastructure, package delivery, and the tooling in between.

Ruohang Feng (@Vonng) writes SOW and Pigsty, the PostgreSQL distribution it builds repositories for.

SOW started from a delivery problem rather than a packaging one. Pigsty ships hundreds of RPM and DEB packages across Enterprise Linux, Debian, and Ubuntu, and the honest answer to what exactly is in the repository right now, and who put it there was a directory listing and a shell history. Making membership, immutable generations, signing, and publication explicit turned that answer into state that a tool can show you — and turned a repository rebuild into an auditable release boundary instead of a batch of files that appeared overnight.

  • SOW v0.4.0

    By Vonng In Release 1070 words 6 min

    VonngReleasereleasemanagedsigningpublishmigration

    SOW v0.4.0

    SOW 0.4.0 is an integrity and recovery release for Managed repositories. It makes the deep checker’s I/O contract explicit, prevents RPM trust from being assembled across unrelated keys, adds an audited way to correct mutable publication-target …

    SOW 0.4.0 is an integrity and recovery release for Managed repositories. It makes the deep checker’s I/O contract explicit, prevents RPM trust from being assembled across unrelated keys, adds an audited way to correct mutable publication-target …

  • Coordinated Publication Decision

    By Vonng In Design 631 words 3 min

    VonngDesignpublishtransactionobject-storagedecision

    Coordinated Publication Decision

    Decision finalized for SOW 0.4.0 An earlier version of this record proposed an rclone executor, publish --dry-run, and a separate sow audit command. None of those surfaces shipped in 0.4.0. SOW has no rclone dependency, publish has no --dry-run, and …

    Decision finalized for SOW 0.4.0 An earlier version of this record proposed an rclone executor, publish --dry-run, and a separate sow audit command. None of those surfaces shipped in 0.4.0. SOW has no rclone dependency, publish has no --dry-run, and …

  • SOW Design Evolution: From Route Graphs to the Repository Core

    By Vonng In Design 893 words 5 min

    VonngDesignarchitecturerepositorymigrationdecision

    SOW Design Evolution: From Route Graphs to the Repository Core

    This record dates to the 2026-08-10 consolidation of SOW around its Repository core. It distills the useful decisions from the earlier planning, ADR, review, migration, and verification trees without turning every intermediate artifact into …

    This record dates to the 2026-08-10 consolidation of SOW around its Repository core. It distills the useful decisions from the earlier planning, ADR, review, migration, and verification trees without turning every intermediate artifact into …

  • SOW v0.3.0

    By Vonng In Release 766 words 4 min

    VonngReleasereleaseplainmanagedtransaction

    SOW v0.3.0

    SOW 0.3.0 is a performance, durability, and product-focus release. Plain repository generation completes with one package-content pass. Managed repositories avoid per-object membership queries, reuse authenticated package facts, and promote payloads …

    SOW 0.3.0 is a performance, durability, and product-focus release. Plain repository generation completes with one package-content pass. Managed repositories avoid per-object membership queries, reuse authenticated package facts, and promote payloads …

  • Design Principles

    By Vonng In Design 595 words 3 min

    VonngDesignplainmanagedrepository

    Design Principles

    SOW is not primarily a metadata generator. It is an ownership and state-transition system whose output happens to be APT and RPM repositories. The following principles keep that system small enough to reason about. One owner for every durable fact …

    SOW is not primarily a metadata generator. It is an ownership and state-transition system whose output happens to be APT and RPM repositories. The following principles keep that system small enough to reason about. One owner for every durable fact …

  • System Model

    By Vonng In Design 569 words 3 min

    VonngDesignrepositorydistpoolgeneration

    System Model

    The model is deliberately layered. Configuration expresses intent, the database records owned state, and the public tree is a deterministic projection. None of those layers may quietly become a substitute for another. Object hierarchy Workspace ├── …

    The model is deliberately layered. Configuration expresses intent, the database records owned state, and the public tree is a deterministic projection. None of those layers may quietly become a substitute for another. Object hierarchy Workspace ├── …

  • Publication & Recovery

    By Vonng In Design 778 words 4 min

    VonngDesignpublishtransactionobject-storage

    Publication & Recovery

    Building and publishing are separate state transitions. A build produces a target-neutral Generation. Publication applies that Generation to one provider prefix and records enough evidence to recover without guessing. Ownership split …

    Building and publishing are separate state transitions. A build produces a target-neutral Generation. Publication applies that Generation to one provider prefix and records enough evidence to recover without guessing. Ownership split …

  • SOW v0.2.0

    By Vonng In Release 277 words 2 min

    VonngReleasereleasemanagedsigningpublishgeneration

    SOW v0.2.0

    SOW 0.2.0 is a self-contained RPM and DEB repository manager from Pigsty. Release artifacts target Linux and macOS as single Go executables. Two operating modes Plain mode indexes RPM and DEB files already present at one directory’s top level: sow …

    SOW 0.2.0 is a self-contained RPM and DEB repository manager from Pigsty. Release artifacts target Linux and macOS as single Go executables. Two operating modes Plain mode indexes RPM and DEB files already present at one directory’s top level: sow …

  • Why SOW Uses One Payload Tree per Repository

    By Vonng In Design 738 words 4 min

    VonngDesignrepositorypoolrpmaptcompatibilitydecision

    Why SOW Uses One Payload Tree per Repository

    This decision was drafted on 2026-08-05 during the pre-v0.2 release design consolidation and shipped in SOW v0.2.0 on 2026-08-08. It remains the layout contract in v0.3 and v0.4. It records an architecture choice, not a blanket compatibility claim: …

    This decision was drafted on 2026-08-05 during the pre-v0.2 release design consolidation and shipped in SOW v0.2.0 on 2026-08-08. It remains the layout contract in v0.3 and v0.4. It records an architecture choice, not a blanket compatibility claim: …