#Calunga

Red Hat Trusted Libraries (RHTL) - Secure Python supply chain, from source to pip install

1,547+ packages manylinux_2_28 Python 3.12 SLSA provenance CycloneDX SBOM 6 security scans Source-built

Calunga is Red Hat's initiative for building, verifying, and distributing secure Python wheels. Seven repositories form a complete supply chain pipeline - plumbing provides build infrastructure, index manages the package catalog and triggers builds, supported by companion repos for npm packaging, source verification, CI analysis, prioritization, and wheel patching.

#Why Calunga?

#The Problem

  • PyPI wheels are pre-built binaries - you trust the uploader

  • No guarantee of source-to-binary correspondence

  • Supply chain attacks on popular packages (typosquatting, account takeover)

  • No embedded SBOM or provenance metadata

  • Enterprise compliance requires verifiable supply chains

#Calunga's Answer

  • Build from source - 17 C/C++ libs + Python compiled in trusted environments

  • SBOM in every wheel - CycloneDXSBOM standard. Fromager generates CycloneDX SBOMs embedded as redhat.spdx.json, listing all components and their provenance. redhat.spdx.json

  • 6 security scans per build (Clair, Snyk, ClamAV, Coverity, ShellCheck, Unicode)

  • Enterprise Contract PolicyKonflux policy framework. Validates that builds meet Red Hat compliance requirements (provenance, signatures, SBOM presence) before allowing releases. - Red Hat compliance enforcement

  • Attestation & signing - cosignSigstore tool for signing and verifying container images and artifacts. Used for attestation and provenance in the release pipeline. provenance

  • Hermetic builds - optional zero-network mode

#Getting Started

To install wheels from Red Hat Trusted Libraries, you need a service account from the terms-based registry and Python 3.12 installed on your system.

#pip Configuration

# pip.conf (venv/, ~/.config/pip/, or /etc/pip.conf)
[global]
index-url = https://<username>:<password>@packages.redhat.com/trusted-libraries/python/
# Install packages
python3.12 -m venv venv && source venv/bin/activate
pip install numpy
pip install --only-binary=:all: -r requirements.txt

#uv Configuration

# pyproject.toml
[[tool.uv.index]]
name = "trusted-libraries"
url = "https://packages.redhat.com/trusted-libraries/python"
default = true
# Export credentials
export UV_INDEX_INTERNAL_PROXY_USERNAME=<username>
export UV_INDEX_INTERNAL_PROXY_PASSWORD=<password>

#Viewing SBOMs

Every wheel contains an SBOM at <package>.dist-info/sboms/redhat.spdx.json:

pip download numpy==2.3.3
unzip numpy-2.3.3-0-cp312-cp312-manylinux_2_28_x86_64.whl -d extracted
cat extracted/numpy-2.3.3.dist-info/sboms/redhat.spdx.json
Provenance verification: Attestations can be verified using cosign. See verification scripts for examples.

#Seven Repos, One System

#calunga-project-plumbing

Build Infrastructure

  • Container images (builder, utils)
  • TektonKubernetes-native CI/CD framework. Pipelines defined as YAML CRDs (Tasks, Pipelines, PipelineRuns). Each step runs in its own container. Used here via Konflux. tasks & pipelines
  • Build scripts (FromagerPython wheel build orchestrator. Resolves full dependency graph from source distributions, builds each package in order, and embeds CycloneDX SBOMs. Ensures wheels are built from source - not downloaded pre-built from PyPI., auditwheelPost-build compliance tool. Inspects Linux wheels for shared library dependencies, bundles required .so files into the wheel, and relabels it with the correct manylinux platform tag.)
  • SBOM patching & artifact collection
builder/
├── Containerfile        # Multi-stage builder image
├── build_scripts/       # 37 build & install scripts
├── scripts/             # build-wheels entry point
└── tests/
tasks/                   # Tekton bundles
pipelines/               # integration tests

#calunga-project-index

Package Registry

  • 1,547 onboarded package JSONs
  • Version detection (12h cron)
  • Auto-PR creation & merge
  • KonfluxRed Hat's enterprise CI/CD platform built on Tekton. Adds Enterprise Contract Policy enforcement, release management, nudge-based auto-updates, and OCI Trusted Artifacts for secure data passing between tasks. release pipeline
onboarded_packages/
├── numpy.json
├── requests.json
└── ... (1,547 files)
hack/                   # check-for-updates.py
.tekton/                 # build-pipeline.yaml
plumbing builds the tools → index uses them to build wheels → wheels published to packages.redhat.com

#Companion Repositories

#npm-registry

npm Package Onboarding

  • npm package definitions (packages/)
  • Lint & identification scripts (hack/)
  • Tekton build pipeline (.tekton/)

#check-source-origin

Source Verification

  • Python CLI: verify published sdists match VCS source
  • Commands: resolve, download, diff, verify

#dfd (Dumpster Fire Diving)

CI Failure Analysis

  • AI-powered failure analysis (FastAPI + Claude)
  • React dashboard
  • KubeArchive collector

#bounty-board

Package Prioritization

  • Package prioritization tracker
  • Python scripts + GitHub Actions
  • Static HTML dashboard

#wheel-patcher

Wheel Post-Processing

  • Patch wheel files (add SBOM, license files)
  • Zero runtime dependencies

#Technology Stack

LayerTechnologyRole
LanguagesBash, Python 3.12, YAMLScripts, automation, pipeline definitions
Container BaseUBI8Universal Base Image. Red Hat's freely redistributable, minimal container base image. UBI8 provides a RHEL 8 userspace for the builder image. (builder), UBI10 (utils/index)Red Hat Universal Base Images
CI/CDTektonKubernetes-native CI/CD framework. Pipelines defined as YAML CRDs (Tasks, Pipelines, PipelineRuns). Each step runs in its own container. + KonfluxRed Hat's enterprise CI/CD platform built on Tekton. Adds Enterprise Contract Policy enforcement, release management, nudge-based auto-updates, and OCI Trusted Artifacts.Kubernetes-native pipelines with enterprise features
Container BuildBuildahDaemonless container image builder. Builds OCI/Docker images from Containerfiles without requiring a Docker daemon. Used by Tekton tasks to produce the builder and utils images.Daemonless OCI image builder
Wheel BuilderFromagerPython wheel build orchestrator. Resolves full dependency graph from source distributions, builds each package in order, and embeds CycloneDX SBOMs. (≥0.81.0)Source-only wheel build orchestrator
ComplianceauditwheelPost-build compliance tool. Inspects Linux wheels for shared library dependencies, bundles required .so files, and relabels with the correct manylinux platform tag.manylinuxPEP-defined platform compatibility standard for Linux Python wheels. Specifies maximum glibc version and allowed shared library dependencies. manylinux_2_28 targets glibc 2.28+ (RHEL 8+). repair & .so bundling
SecurityClair, Snyk, ClamAV, Coverity, ShellCheck6 scan types per build
SBOMCycloneDX / SPDXSBOM standards. Fromager generates CycloneDX SBOMs embedded in each wheel as redhat.spdx.json, listing all components and their provenance.Software Bill of Materials in every wheel
RegistriesQuay.io, packages.redhat.comImages & wheels
AutomationGitHub Actions, NudgeKonflux auto-update mechanism. When plumbing publishes a new image or task bundle digest, nudge creates PRs in downstream repos to update pinned SHA256 references.Version detection & dependency updates
Compilersgcc-toolset-14Red Hat's SCL-packaged GCC 14 compiler suite for UBI8/RHEL 8. Provides modern C/C++ compilation without replacing system GCC., clang 21.1.5, Rust 1.95.0Native extension compilation

#End-to-End Flow

flowchart TD PyPI[(PyPI)] --> Cron["check-for-updates.py (12h cron)"] Pulp[(Red Hat Pulp)] --> Cron Cron --> PRs["Auto-create PRs (one per package)"] PRs -->|auto-merge| Build["build-python-wheels (Fromager + auditwheel)"] Build --> Scan["Security Scans Clair | Snyk | ClamAV Coverity | ShellCheck"] Scan --> ECP["Enterprise Contract Policy check"] ECP --> Sign["Attestation (cosign signing)"] Sign --> Release["Auto-release (7-day grace)"] Release --> Registry["packages.redhat.com"] Registry --> Users["pip install / uv"] style PyPI fill:#1565c0,color:#fff style Pulp fill:#1565c0,color:#fff style Registry fill:#2e7d32,color:#fff style Users fill:#2e7d32,color:#fff style Scan fill:#c62828,color:#fff style ECP fill:#c62828,color:#fff

#Plumbing: Container Images

graph TD subgraph builder["plumbing-builder (UBI8)"] UBI8["UBI8 base"] --> Libs["17 source-built C/C++ libs"] Libs --> Python["CPython 3.12 + PyPy 3.11"] Python --> Tools["gcc-toolset-14 | clang 21.1.5 | Rust 1.95.0"] Tools --> Fromager["Fromager + auditwheel"] end subgraph utils["plumbing-utils (UBI10)"] Twine["Twine upload"] ~~~ PEP740["convert-dsse-to-pep740.py"] end subgraph bundle["task-build-python-wheels"] OCI["Tekton Bundle (OCI artifact)"] end builder -.->|runs inside| bundle style builder fill:#1a237e,color:#fff style utils fill:#004d40,color:#fff style bundle fill:#bf360c,color:#fff
393-line Containerfile with 28 intermediate stages. Builder image compiles everything from source for full supply chain control.

#Builder Image: Source-Built Libraries

Library Version Why
OpenSSL 3.5.4 TLS, cryptography wheels
curl 8.17.0 HTTP client for downloads
git 2.51.2 Source fetching
SQLite 3.51.0 Python stdlib module
OpenBLAS latest NumPy/SciPy linear algebra
libjpeg-turbo latest Pillow image processing
libxml2 / libxslt latest lxml XML parsing
libyaml latest PyYAML C extension
zlib / bzip2 / zstd latest Compression
libffi latest ctypes / cffi
mpdecimal latest Python decimal module
libomp latest OpenMP parallelism
libpng / libtiff latest Image format support
Tcl/Tk 8.6.17 CPython stdlib GUI module
libxcrypt 4.5.1 crypt() password hashing

#Build Details

  • Base: UBI8 (RHEL 8 userspace)
  • Python: CPython 3.12.12 from source
  • Alt runtime: PyPy 3.11
  • C/C++: gcc-toolset-14
  • C/C++ (static): clang 21.1.5
  • Rust: 1.95.0
  • Deps: pip-compileDependency resolver from pip-tools. Generates fully pinned requirements.txt with SHA256 hashes from a loose requirements.in, ensuring reproducible installs. --require-hashes

#Key Tools

  • FromagerPython wheel build orchestrator. Resolves full dependency graph from source distributions, builds each package in order, and embeds CycloneDX SBOMs. - orchestrates full dep graph builds
  • auditwheelPost-build compliance tool. Inspects Linux wheels for shared library deps, bundles required .so files, relabels with correct manylinux platform tag. - bundles .so, sets manylinux tag
  • pip-compile - hash-pinned requirements

#Key Scripts & Tekton Pipelines

#Scripts

ScriptPurpose
build-wheelsMain entry point: Fromager resolve → build → auditwheel → SBOM patch
collect-build-filesGathers SBOM + build artifacts from completed builds
patch-sbom-purlAdds file_name qualifier to PURLs, renames SBOM to redhat.spdx.json
check-for-updates.pyAsync PyPI/Pulp version checker (index repo)
identify-packagesDetects which package JSONs changed in PR
add_system_deps_to_sbom.pyAdds system dependency metadata to SBOM
test-add-system-depsTests for add_system_deps_to_sbom.py

#Build Pipeline (18 tasks)

flowchart LR init --> clone clone --> prefetch prefetch --> build["build-container"] build --> idx["build-image-index"] build --> bsi["build-source-image"] idx --> scans["Scans (parallel): Clair | Snyk | Coverity ShellCheck | Unicode ClamAV | RPM sig"] scans --> checks["deprecated-base-image-check ecosystem-cert-preflight-checks rpms-signature-scan"] checks --> tags["apply-tags"] tags --> push["push-dockerfile"]
Tekton Pipelines: Builder = 8 CPU, 12GB RAM, 3h timeout  |  Utils = defaults, 1h timeout  |  Task bundle = defaults

#Builder Image: Self-Tests

The builder image runs a comprehensive test suite (builder/tests/run_tests.sh) to validate every component before any wheel build occurs.

🐍
Interpreter Count
Verifies expected number of Python installations (CPython, PyPy, GraalPy) are present and functional.
🔒
SSL Validation
Every interpreter tested for correct OpenSSL configuration and cert verification.
📦
Module Check
CPython optional modules (sqlite3, ssl, ctypes, decimal, etc.) verified loadable.
⚙️
Wheel Build + Repair
C extension project (forty-two) built, repaired with auditwheel, installed and executed per interpreter.
🔍
Library Discovery
Source-built libs verified via pkg-config and ldconfig (libjpeg, libyaml, libxml2, etc.).
🏗️
Compile Tests
Autotools and CMake projects compiled against installed headers and libraries (SQLite, C++).
🛠️
Tool Presence
auditwheel, autoconf, automake, libtool, patchelf, git, git-lfs, cmake, swig, nox all verified.
💻
uv Integration
Wheels installed via both pip and uv to verify compatibility with modern tooling.
Tests run on every PR via GitHub Actions. Path filtering skips the full build when only non-builder files change.

#Index: Package Management

#1,547 Onboarded Packages

Each package has a JSON file in onboarded_packages/:

{
  "version": "2.4.6",
  "ignored_versions": ["0.9.6", "0.9.8", "2.4.3"]
}
One JSON file = one Python package. Simple contract between version detection and build pipeline.

#Package Lifecycle

1 check-for-updates.py queries PyPI + Pulp (every 12h)
2 Filters pre-releases and yanked versions
3 Creates PR per new version (updates JSON)
4 PR auto-merged (rebase strategy)
5 Merge triggers Tekton PipelineRun
6 identify-packages detects changed JSONs
7 Invokes build-python-wheels task
8 Wheels scanned → released → published

#Automated Version Detection

sequenceDiagram participant GH as GitHub Actions (12h cron) participant Script as check-for-updates.py participant PyPI as PyPI participant Pulp as Red Hat Pulp participant Repo as calunga-project-index GH->>Script: Trigger Script->>PyPI: Async query 1,547 packages Script->>Pulp: Async query published versions PyPI-->>Script: Available versions Pulp-->>Script: Already-published versions Script->>Script: Filter pre-releases, yanked, ignored Script->>Repo: Create PR per new version Repo->>Repo: Auto-merge (rebase) Repo->>Repo: Tekton pipeline triggered
Async queries - all 1,547 packages checked concurrently.
Smart filtering - pre-releases, yanked releases, and ignored_versions all excluded.
Labels: PRs tagged "automated build" for tracking.

#Index Build Pipeline

flowchart LR clone["clone-repository"] --> identify["identify-packages"] identify --> wheels["build-wheels"] wheels --> scans subgraph scans["Security Scans (parallel)"] direction TB snyk["sast-snyk-check-sdist"] coverity["sast-coverity-check"] covavail["coverity-availability-check"] shell["sast-shell-check"] unicode["sast-unicode-check"] clamav["clamav-scan"] end scans --> ecp["Enterprise Contract"] ecp --> release["Auto-release"] style scans fill:#400,color:#fff style release fill:#143,color:#fff

#Build Resources

  • Memory: 20GB for wheel builds
  • Task: build-python-wheels-oci-ta
  • Image: pinned by SHA256 digest

#Output

  • IMAGE_URL - built wheel OCI artifact
  • IMAGE_DIGEST - SHA256 of artifact
  • GIT_COMMIT - source commit hash

#Onboarding New Packages

Adding a new package to Calunga uses hack/onboard_package.py in the index repo:

1 Run python hack/onboard_package.py <package-name>
2 Script queries PyPI for all releases
3 Filters out yanked and non-semver versions
4 Sets latest stable as target, all others as ignored_versions
5 Creates onboarded_packages/<name>.json
6 Commit, PR, merge → first build triggered automatically

#Input

python hack/onboard_package.py flask

#Output: flask.json

{
    "version": "3.1.1",
    "ignored_versions": ["0.1", "0.2", ...]
}
Once onboarded, the 12-hour cron automatically detects new upstream releases and creates PRs. No manual version bumping needed after initial onboarding.

#How Repos Work Together

#Dependency Chain

flowchart LR A["plumbing-builder image"] -->|runs inside| B["build-python-wheels task (OCI bundle)"] B -->|invoked by| C["index Tekton pipeline"] C -->|publishes to| D["packages.redhat.com"] style A fill:#1a237e,color:#fff style B fill:#1a237e,color:#fff style C fill:#e65100,color:#fff style D fill:#1b5e20,color:#fff

#Update Propagation

sequenceDiagram participant P as Plumbing repo participant Q as Quay.io participant N as Konflux nudge participant I as Index repo participant R as RHTL registry P->>Q: Push new builder / task bundle Q->>N: New digest detected N->>I: Auto-PR updating pinned SHA256 I->>I: PR auto-merged Note over I: Subsequent builds use updated infrastructure I->>R: New wheels published

#Integration Testing

#Cross-OS Verification

Built wheels tested across 6 OS images:

1 UBI8 (RHEL 8)
2 UBI9 (RHEL 9)
3 UBI10 (RHEL 10)
4 Fedora 43
5 Ubuntu 24.04
6 Hummingbird

#Per-Wheel Test Steps

1 Classify wheel (skip empty/data-only)
2 Install wheel with pip/uv in fresh venv
3 Verify import succeeds
Pipeline: install-and-import-wheels.yaml
Spans both repos - plumbing defines it, index triggers it.

#Shared Infrastructure

ResourcePlumbingIndex
Quay.io tenantcalunga-tenant (images + bundles)calunga-tenant (release artifacts)
Konflux appcalunga-v2-plumbingcalunga-v2-index-main
Enterprise ContractEnforced on builder imagesEnforced on wheel releases
NudgeKonflux auto-update mechanism. When plumbing publishes a new image or task bundle digest, nudge creates PRs in downstream repos to update pinned SHA256 references. auto-updatesUpdates builder image refs in indexUpdates task bundle refs
Fully automated pipeline: upstream Python release → version detection → source build → security scan → compliance check → attestation → auto-release → packages.redhat.com

#Release Pipeline

After wheels pass security scans and Enterprise Contract checks, the release pipeline handles attestation, signing, and upload to the registry.

flowchart LR wheels["Built Wheels"] --> attest["Generate SLSA Provenance"] attest --> sign["cosign sign (key-based)"] sign --> pep740["Convert DSSE to PEP 740"] pep740 --> check["Check if wheel exists in Pulp"] check --> upload["Twine upload + attestation"] upload --> registry["packages.redhat.com"] style wheels fill:#1a237e,color:#fff style sign fill:#c62828,color:#fff style registry fill:#1b5e20,color:#fff

#Attestation Flow

  • SHA256 hash computed for each wheel
  • SLSA v0.2 provenance predicate generated
  • Signed with cosign (key from K8s secret)
  • DSSE envelope converted to PEP 740 format
  • Attestation uploaded alongside wheel

#Upload Logic

  • Skip if wheel already exists in Pulp
  • Skip if attestation file missing
  • Fail if any upload errors or missing attestations
  • Summary report: uploaded / skipped / failed counts
Auto-release: Configured with a 7-day grace period via Konflux ReleasePlan. Standing attribution enabled - releases proceed automatically unless blocked.

#Observability

#Log Forwarding

A separate GitHub Actions workflow (forward_logs.yml) triggers after every version-check run:

1 get_new_package_versions workflow completes
2 Log forwarder downloads full run log via gh run view --log
3 Logs POSTed to Splunk endpoint (token-authenticated)

#PR Tracking

  • Automated version PRs labeled "automated build"
  • Konflux nudge PRs labeled "konflux-nudge"
  • Branch naming: update-<package>==<version>
  • All PRs auto-merged with rebase strategy

#Build Artifacts

  • PR builds expire after 5 days
  • Push builds permanent (tagged by git revision)
  • All images referenced by SHA256 digest

#Supply Chain Security

🔒
Hash Pinning
All Python deps use --require-hashes. Container/task refs pinned by SHA256.
🏗️
Source Builds
17 C/C++ libs compiled from source with verified checksums. No pre-built binaries.
📋
SBOM Embedding
Every wheel contains redhat.spdx.json with supplier info and PURLs.
🔍
Security Scanning
6 scans per build: Clair, Snyk, ClamAV, Coverity, ShellCheck, Unicode.
📜
Enterprise Contract Policy
Red Hat compliance enforcement on every release.
✍️
Attestation
Provenance and signing via cosign (Sigstore).
🏠
Hermetic Builds
Optional fully isolated mode - zero network access during build.
📦
OCI Trusted ArtifactsKonflux pattern for passing data between Tekton tasks via OCI artifacts stored in a registry, instead of shared PersistentVolumeClaims. Provides immutability and auditability.
Data passes between tasks via OCI artifacts, not shared volumes.

#Support Matrix & Roadmap

#Python Versions

Version Status
Python 2.x Not supported
Python 3.9 – 3.10 Not supported
Python 3.12 Fully supported
Python 3.11, 3.13, 3.14 Planned

#Architectures

Arch Status
x86_64 Fully supported
aarch64 Planned

#Manylinux Target

Primary: manylinux_2_28 (glibc 2.28+, RHEL 8+). Some wheels also carry manylinux_2_27 compatibility.

#Alternative Python Runtimes

The builder image includes multiple Python runtimes beyond CPython, all SHA256-pinned:

RuntimeVersionsArchitectures
CPython3.12.12 (from source)x86_64, aarch64
PyPy3.11x86_64, aarch64
GraalPy3.11 (24.2.2), 3.12 (25.0.1)x86_64, aarch64
All interpreter downloads are pinned by SHA256 hash in python_versions.json for reproducibility.

#Technology Glossary

Fromager Python wheel build orchestrator. Resolves full dependency graph from source distributions, builds each package in order, embeds CycloneDX SBOMs. Ensures wheels built from source - not pre-built from PyPI.
auditwheel Post-build compliance tool. Inspects Linux wheels for shared library deps, bundles required .so files, relabels with correct manylinux platform tag (e.g., manylinux_2_28).
Tekton Kubernetes-native CI/CD. Pipelines defined as YAML CRDs (Tasks, Pipelines, PipelineRuns). Each step runs in its own container. Used here via Konflux.
Konflux Red Hat's enterprise CI/CD on Tekton. Adds Enterprise Contract Policy, release management, nudge-based auto-updates, and OCI Trusted Artifacts.
Buildah Daemonless container builder. Builds OCI/Docker images from Containerfiles without Docker daemon. Used by Tekton tasks for builder/utils images.
Twine Python package upload tool. Publishes wheels to PyPI-compatible registries (here: Red Hat's Pulp at packages.redhat.com).
UBI Universal Base Image. Red Hat's freely redistributable minimal container base. UBI8 = RHEL 8 userspace (builder), UBI10 = RHEL 10 (utils/index).
pip-compile Dependency resolver (pip-tools). Generates pinned requirements.txt with SHA256 hashes from loose requirements.in. Ensures reproducible installs.
OCI Trusted Artifacts Konflux pattern: pass data between Tekton tasks via OCI artifacts in a registry, not shared PVCs. Immutable and auditable.
cosign Sigstore tool for signing/verifying container images and artifacts. Used for attestation and provenance in the release pipeline.
Pulp Red Hat's repository management platform. Hosts the RHTL Python package index. Version-detection cron checks Pulp for already-published versions.
Enterprise Contract Policy (ECP) Konflux policy framework. Validates builds meet Red Hat compliance (provenance, signatures, SBOM) before allowing releases.
CycloneDX / SPDX SBOM standards. Fromager generates CycloneDX SBOMs embedded as redhat.spdx.json, listing components and provenance.
manylinux PEP-defined Linux wheel compatibility standard. Specifies max glibc version and allowed shared libs. manylinux_2_28 = glibc 2.28+ (RHEL 8+).
gcc-toolset-14 Red Hat's SCL-packaged GCC 14 for UBI8/RHEL 8. Modern C/C++ compilation without replacing system GCC.
Nudge Konflux auto-update mechanism. When plumbing publishes new image/task digest, nudge creates PRs in downstream repos to update pinned SHA256 refs.
GraalPy Oracle's Python implementation on GraalVM. Supports 3.11 and 3.12. Included in builder for alternative runtime wheel compatibility testing. SHA256-pinned downloads.
PEP 740 Python standard for digital attestations on packages. Defines how provenance metadata is attached to wheels for upload to PyPI-compatible registries. Calunga converts DSSE envelopes to PEP 740 format.

#Quick Reference

#Key Paths (Plumbing)

builder/Containerfile Main builder image (393 lines)
builder/scripts/build-wheels Wheel build entry point
builder/build_scripts/ 21 library build scripts
builder/requirements.txt Hash-pinned Fromager deps
tasks/build-python-wheels-oci-ta.yaml Tekton task definition
pipelines/wheel-integration-test.yaml Cross-OS test pipeline
utils/scripts/pulp-upload Pulp registry upload with attestation
utils/scripts/generate-and-sign-attestations cosign attestation + PEP 740 conversion
.tekton/ PipelineRun definitions

#Key Paths (Index)

onboarded_packages/*.json 1,547 package definitions
hack/check-for-updates.py Version detection script
hack/identify-packages Changed-package detector
hack/onboard_package.py New package onboarding script
hack/onboard.sh Package onboarding shell wrapper
hack/batch-onboard.sh Bulk package onboarding
hack/build-locally.sh Local development build
hack/debug-package.sh Package build debugging
hack/generate-available-packages.py Available packages list generator
hack/merge-bot Auto-merge eligible PRs
hack/rebase-version-prs Rebase version update PRs
hack/replace-package Replace existing package definition
hack/retry-onpush.sh Retry failed on-push builds
.tekton/build-pipeline.yaml Main build pipeline
konflux/ecp.yaml Enterprise Contract Policy

#User Configuration

# pip.conf
[global]
extra-index-url =
    https://packages.redhat.com/trusted-libraries/python/simple/
# pyproject.toml (uv)
[[tool.uv.index]]
url = "https://packages.redhat.com/trusted-libraries/python/simple/"
name = "rhtl"

#Key Numbers

Packages 1,547+
Source-built libs 17
Security scans 6 types
Test OS targets 6
Pipeline tasks 18
Version check interval 12 hours
Release grace period 7 days