Package repository for software maintained by Dmitry Prudnikov and contributors. Hosts signed RPM and DEB packages for modern Linux distributions.
Site: repo.sw.foundation
Source projects provide a manifest.json describing their packages, platforms, and documentation. CI uploads these as a repo-meta-<project> artifact; the publish workflow copies them into packages/meta/<project>/ where build-docs.py discovers and renders them.
source-repo/ repo (during publish)
packaging/ packages/meta/<project>/
manifest.json ──CI artifact──→ manifest.json
docs/ docs/
setup-guide.md setup-guide.md
See manifests/strongswan/manifest.json for an example (also used as committed fallback).
The shared marketplace is .agents/plugins/marketplace.json, named sw-foundation.
Its plugin catalog shows only verified,
published releases. Add the source once with Codex CLI:
codex plugin marketplace add structured-world/repo --sparse .agents/pluginsThen use Install in Codex on a plugin card, or install its identifier from the
CLI, for example codex plugin add gitlab-mcp@sw-foundation after its first eligible
release. Installation links open the host's confirmation flow only for a known
marketplace. They do not import a ZIP or authorize an account. GitLab MCP requires
Node.js 24+ and supports configuring either a local GitLab connection or an existing
MCP server after installation, through its private connection panel.
To refresh the catalog, run codex plugin marketplace upgrade sw-foundation, then
review plugin updates in Codex. Plugin sources are pinned to verified commits.
Standalone ZIP downloads and their checksums remain in the source project's GitHub
release. Claude Desktop MCPB bundles and Claude Code configuration are separate.
GitLab MCP's release workflow sends refresh-gitlab-mcp-plugin to this repository
only after npm, release assets and its other publication steps succeed. The
Publish Plugin Marketplace workflow verifies that exact released tag, so a newer
unfinished release cannot hide the completed publication. Dispatch payloads cannot
select arbitrary source repositories or commits. Manual dispatch can specify a
tag or leave it empty to reconcile the latest stable release. The
release app must already be installed on both repositories with Contents write
permission. The existing RELEASER_APP_ID and RELEASER_APP_PRIVATE_KEY secrets
provide its identity; the catalog does not use package-signing secrets.
Before changing the entry, scripts/plugin-marketplace.py verifies the source
manifest and pinned npm launcher, the published npm binary, and the standalone
ZIP against its SHA-256 sidecar. It stores the verified public listing metadata
under manifests/plugins/ and commits it with the catalog and rendered page.
Incomplete, inconsistent or changed publications fail without replacing the live
catalog. Older releases cannot downgrade an existing entry. Repeating the workflow
is safe; use its manual dispatch to reconcile after a failed notification or a
concurrent branch update. It does not create or publish a source release.
The plugin publisher shares the package publisher's concurrency group. It invokes
scripts/build-docs.py --plugins-only, updating shared navigation while preserving
existing package and documentation content and sitemap metadata. Normal site generation also renders the plugin page.
Its sparse checkout does not download the APT/RPM package tree.
The initial catalog is empty until the configurable GitLab MCP release is available.
Validate changes with Python 3.11+:
python3 -B scripts/test-plugin-marketplace.py
python3 -B scripts/test-plugin-catalog.py
uv run --with 'markdown>=3.6,<4' python -B scripts/test-build-docs.py
python3 -B scripts/qualify-codex-marketplace.py --codex /path/to/codexCLI and fixture checks do not establish desktop UI qualification or public release availability. Verify those against the released package before advertising them.
Tetherloom Actions artifacts are temporary transfer files. After signing and pushing the repository output, the publisher deletes only the artifact IDs recorded for that release attempt. The download token stays read-only; cleanup uses a separate token restricted to Actions write access on Tetherloom. The release application must have that permission granted in its installation.
The same commit stores a minimal receipt under .publications/tetherloom/.
Repeated delivery of an already published attempt skips the artifact download
and resumes cleanup from current main, even if the source has started or failed
a newer attempt. A failed push does not authorize deletion, and a failed
deletion remains a visible workflow failure that can be retried. A new source
attempt is independent; artifacts uploaded after the recorded snapshot are
never swept into an older cleanup. Published signed packages and release assets
remain available; Actions retention is only a fallback for abandoned transfers.
Dispatches identify the source attempt explicitly. Older dispatches without an
attempt can be retried after the source run completes successfully; they cannot
admit an unfinished rerun based on an earlier attempt's notification.
sudo dnf config-manager --add-repo \
https://repo.sw.foundation/rpm/fc$(rpm -E %fedora)/sw.repo
sudo dnf install <package-name># Add GPG key
curl -fsSL https://repo.sw.foundation/keys/sw.gpg \
| sudo tee /etc/apt/keyrings/sw.gpg >/dev/null
# Add repository
echo "deb [signed-by=/etc/apt/keyrings/sw.gpg] \
https://repo.sw.foundation/deb $(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/sw.list
sudo apt update
sudo apt install <package-name>All packages are signed with our GPG key.
| Property | Value |
|---|---|
| Key ID | A187D55B5A043632 |
| Fingerprint | 4AC4 06DA 15C9 BE4D C1A0 2343 A187 D55B 5A04 3632 |
| Algorithm | Ed25519 |
curl -fsSL https://repo.sw.foundation/keys/sw.asc | gpg --import- Create
packaging/manifest.jsonin your source repo (see manifests/strongswan/manifest.json for the format) - Add optional
packaging/docs/*.mdfor documentation pages - Upload
manifest.jsonanddocs/as arepo-meta-<project>artifact in your CI workflow (the artifact root should containmanifest.jsondirectly, not apackaging/subdirectory) - Add a new workflow input and download step in
publish.ymlfor the project - Trigger the publish workflow —
build-docs.pyauto-discovers all manifests inpackages/meta/*/
Dmitry Prudnikov mail@polaz.com