<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Porch on Porch Documentation</title><link>/</link><description>Recent content in Porch on Porch Documentation</description><generator>Hugo</generator><language>en-us</language><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>CLI Reference</title><link>/docs/7_cli_api/porchctl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/7_cli_api/porchctl/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>&lt;code>porchctl&lt;/code> is the command-line interface for interacting with Porch. It communicates with a Kubernetes API server that has Porch installed as an aggregated API server, allowing you to manage repository registrations and packages within those repositories.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>&lt;p>See 
&lt;a href="/docs/3_getting_started/installing-porchctl/">Installing porchctl&lt;/a> for installation instructions.&lt;/p>
&lt;h2 id="global-flags">Global Flags&lt;/h2>&lt;p>These flags are available for all porchctl commands:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--kubeconfig string&lt;/code>&lt;/td>
 &lt;td>Path to kubeconfig file. Only required if out-of-cluster. Can also be set via &lt;code>KUBECONFIG&lt;/code> environment variable.&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--log-flush-frequency duration&lt;/code>&lt;/td>
 &lt;td>Maximum seconds between log flushes&lt;/td>
 &lt;td>&lt;code>5s&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--truncate-output&lt;/code>&lt;/td>
 &lt;td>Enable output truncation&lt;/td>
 &lt;td>&lt;code>true&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>-v, --v Level&lt;/code>&lt;/td>
 &lt;td>Log level verbosity&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>-h, --help&lt;/code>&lt;/td>
 &lt;td>Help for porchctl&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="commands">Commands&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="#repo">repo&lt;/a> - Manage package repositories&lt;/li>
&lt;li>
&lt;a href="#rpkg">rpkg&lt;/a> - Manage packages&lt;/li>
&lt;li>
&lt;a href="#completion">completion&lt;/a> - Generate shell autocompletion&lt;/li>
&lt;li>
&lt;a href="#version">version&lt;/a> - Print version information&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="repo">repo&lt;/h2>&lt;p>Manage package repositories.&lt;/p></description></item><item><title>Development Environment</title><link>/docs/12_contributing/code-contribution/development-environment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/12_contributing/code-contribution/development-environment/</guid><description>&lt;p>This guide walks you through setting up a local Porch development environment with a kind cluster, enabling you to debug the Porch server and controllers in VS Code with various configurations.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="https://docs.docker.com/get-docker/" target="_blank">Docker&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start/#installation" target="_blank">kind&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://kubernetes.io/docs/tasks/tools/" target="_blank">kubectl&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://go.dev/doc/install" target="_blank">Go&lt;/a> (version specified 
&lt;a href="https://github.com/nephio-project/porch/blob/main/go.mod#L3" target="_blank">in Porch&amp;rsquo;s go.mod&lt;/a>)&lt;/li>
&lt;li>
&lt;a href="https://code.visualstudio.com/" target="_blank">VS Code&lt;/a> with 
&lt;a href="https://marketplace.visualstudio.com/items?itemName=golang.go" target="_blank">Go extension&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://www.gnu.org/software/make/" target="_blank">make&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="macos-users">MacOS Users&lt;/h3>&lt;p>The deployment scripts require bash 4.x or later. MacOS ships with bash 3.x:&lt;/p>
&lt;ol>
&lt;li>Install bash 4.x+ via Homebrew: &lt;code>brew install bash&lt;/code>&lt;/li>
&lt;li>Ensure &lt;code>/opt/homebrew/bin&lt;/code> appears before &lt;code>/bin&lt;/code> and &lt;code>/usr/bin&lt;/code> in your PATH&lt;/li>
&lt;/ol>


&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>

 This permanently changes your default bash version system-wide.

&lt;/div>

&lt;h2 id="automated-setup">Automated Setup&lt;/h2>&lt;p>The quickest way to set up your development environment - from the root directory of the Porch repository, run:&lt;/p></description></item><item><title>Function Evaluation</title><link>/docs/5_architecture_and_components/function-runner/functionality/function-evaluation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/function-runner/functionality/function-evaluation/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Function evaluation is the core responsibility of the Function Runner - executing KRM (Kubernetes Resource Model) functions through pluggable evaluator strategies. The system uses a strategy pattern where different evaluators handle function execution in different ways (pod-based, executable, or chained), all conforming to a common interface.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Function Evaluation System │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Evaluator │ │ Execution │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Interface │ ───&amp;gt; │ Strategies │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Common │ │ • Pod Evaluator │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Contract │ │ • Exec Evaluator│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Pluggable │ │ • Multi Eval │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Wrapper │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Server │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • gRPC Frontend │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Binary Exec │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Result Parse │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="evaluator-interface">Evaluator Interface&lt;/h2>&lt;p>All evaluators implement a common interface that defines the contract for function execution.&lt;/p></description></item><item><title>Git Authentication</title><link>/docs/6_configuration_and_deployments/configurations/components/porch-server-config/git-authentication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/components/porch-server-config/git-authentication/</guid><description>&lt;h2 id="authentication-methods">Authentication Methods&lt;/h2>&lt;p>The Porch Server handles interaction with Git repositories through Repository Custom Resources (CRs) that act as a link between the Porch Server and the Git repositories.&lt;/p>
&lt;p>Porch Server supports three authentication methods for Git repositories:&lt;/p>
&lt;ol>
&lt;li>
&lt;a href="#1-basic-authentication">Basic Authentication&lt;/a> - Username and password or Personal Access Token (post-deployment)&lt;/li>
&lt;li>
&lt;a href="#2-bearer-token-authentication">Bearer Token Authentication&lt;/a> - Token-based authentication (post-deployment)&lt;/li>
&lt;li>
&lt;a href="#3-httpstls-configuration">HTTPS/TLS Configuration&lt;/a> - Custom TLS certificates for self-hosted Git (&lt;strong>requires pre-deployment configuration&lt;/strong>)&lt;/li>
&lt;/ol>
&lt;h3 id="1-basic-authentication">1. Basic Authentication&lt;/h3>&lt;p>Uses username and password or Personal Access Token (PAT). The secret must:&lt;/p></description></item><item><title>Installing Porchctl CLI</title><link>/docs/3_getting_started/installing-porchctl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/3_getting_started/installing-porchctl/</guid><description>&lt;h2 id="download-the-latest-porchctl-binary">Download the latest porchctl binary&lt;/h2>




&lt;ul class="nav nav-tabs" id="tabs-0" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
 data-td-tp-persist="linux amd64" aria-controls="tabs-00-00" aria-selected="true">
 Linux AMD64
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
 data-td-tp-persist="linux arm64" aria-controls="tabs-00-01" aria-selected="false">
 Linux ARM64
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-02" role="tab"
 data-td-tp-persist="macos amd64" aria-controls="tabs-00-02" aria-selected="false">
 macOS AMD64
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-03" role="tab"
 data-td-tp-persist="macos arm64" aria-controls="tabs-00-03" aria-selected="false">
 macOS ARM64
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-0-content">
 &lt;div class="tab-pane fade show active"
 id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.9/porchctl_1.5.9_linux_amd64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-pane fade"
 id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.9/porchctl_1.5.9_linux_arm64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-pane fade"
 id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.9/porchctl_1.5.9_darwin_amd64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-pane fade"
 id="tabs-00-03" role="tabpanel" aria-labelled-by="tabs-00-03-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.9/porchctl_1.5.9_darwin_arm64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
&lt;/div>



&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note:&lt;/h4>

 &lt;p>To download a specific version of porch and its porchctl binary you can do so by replacing the version number and machine type its for in the curl link above.&lt;/p></description></item><item><title>Packages</title><link>/docs/2_concepts/package/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/package/</guid><description>&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Important!&lt;/h4>

 A &amp;ldquo;Porch package&amp;rdquo; is a collection of &lt;strong>package revisions on the same kpt package&lt;/strong>. Porch does not have the concept of a
&amp;ldquo;Package&amp;rdquo; internally - whenever an API request is received on a package, Porch composes the response from the package revisions
associated with the kpt package. When users say they are creating, editing, or upgrading &amp;ldquo;a package&amp;rdquo; in Porch, they are
manipulating a &lt;strong>PackageRevision&lt;/strong> resource and its paired &lt;strong>PackageRevisionResources&lt;/strong> resource. These are Porch&amp;rsquo;s Kubernetes
API interpretations of kpt package metadata and contents stored in Git repositories.

&lt;/div>

&lt;h2 id="what-is-a-package-in-porch">What is a Package in Porch?&lt;/h2>&lt;p>In Porch, a &lt;strong>package&lt;/strong> is represented, not as files you directly manipulate, but through Kubernetes API resources presenting
different views of the package&amp;rsquo;s file contents. When you work with a package in Porch, you interact with revisions of the
package, and each such &lt;strong>package revision&lt;/strong> has a pair of resources: a &lt;strong>PackageRevision&lt;/strong> resource and a &lt;strong>PackageRevisionResources&lt;/strong>
resource:&lt;/p></description></item><item><title>PackageVariant Reconciliation</title><link>/docs/5_architecture_and_components/controllers/packagevariants/functionality/packagevariant-reconciliation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/functionality/packagevariant-reconciliation/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The PackageVariant controller implements a continuous synchronization pattern between upstream and downstream packages. It monitors upstream PackageRevisions for changes, detects when downstream packages need updating, and creates appropriate drafts (clone, upgrade, or edit) to maintain synchronization while applying configured mutations.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ PackageVariant Reconciliation System │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ State Machine │ │ Upstream │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ──&amp;gt; │ Tracking │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • No Downstream │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Upstream Chg │ │ • UpstreamLock │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Mutation Chg │ │ • Comparison │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Up-to-date │ │ • Detection │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └───────────┬─────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Draft │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Management │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Clone │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Upgrade │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Edit │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="reconciliation-state-machine">Reconciliation State Machine&lt;/h2>&lt;p>The controller implements a state machine that determines actions based on current state:&lt;/p></description></item><item><title>Repository Sync</title><link>/docs/6_configuration_and_deployments/configurations/repository-sync/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/repository-sync/</guid><description>&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Documentation Location&lt;/h4>

 This documentation is currently located in the system configuration section but should be moved to a more logical location as it&amp;rsquo;s about configuring individual Repository resources, not system-wide settings. This may be relocated in future documentation updates.

&lt;/div>

&lt;h2 id="sync-configuration-fields">Sync Configuration Fields&lt;/h2>&lt;p>The &lt;code>spec.sync&lt;/code> field in a Repository CR controls synchronization behavior with the external repository. Repositories without sync configuration use the system default for periodic synchronization (default 1 hour, configurable via &lt;code>--repositories.full-sync-frequency&lt;/code> flag - see 
&lt;a href="/docs/6_configuration_and_deployments/configurations/components/porch-controllers-config/#repository-controller-configuration">Repository Controller Configuration&lt;/a>.&lt;/p></description></item><item><title>Repository Synchronization</title><link>/docs/5_architecture_and_components/package-cache/functionality/repository-synchronization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/package-cache/functionality/repository-synchronization/</guid><description>&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Moved&lt;/h4>

 &lt;p>Repository synchronization is now handled by the &lt;strong>Repository Controller&lt;/strong>.&lt;/p>
&lt;p>See:&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="/docs/5_architecture_and_components/controllers/repository-controller/">Repository Controller&lt;/a>&lt;/li>
&lt;li>
&lt;a href="/docs/5_architecture_and_components/controllers/repository-controller/functionality/sync-behavior/">Sync Behavior&lt;/a>&lt;/li>
&lt;li>
&lt;a href="/docs/5_architecture_and_components/package-cache/functionality/caching-behavior/#change-detection">Change Detection &amp;amp; Latest Revision Tracking&lt;/a>&lt;/li>
&lt;/ul>


&lt;/div></description></item><item><title>Sync Behavior</title><link>/docs/5_architecture_and_components/controllers/repository-controller/functionality/sync-behavior/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/repository-controller/functionality/sync-behavior/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Repository controller uses two types of sync operations to keep repositories up-to-date:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Health checks&lt;/strong>: Lightweight connectivity validation that runs frequently to detect failures quickly&lt;/li>
&lt;li>&lt;strong>Full syncs&lt;/strong>: Complete repository synchronization that runs less often to fetch content and discover packages&lt;/li>
&lt;/ul>
&lt;p>The controller intelligently decides which operation to perform based on repository state and configured scheduling.&lt;/p>
&lt;h2 id="sync-operations">Sync Operations&lt;/h2>&lt;h3 id="health-check">Health Check&lt;/h3>&lt;p>Health checks perform quick connectivity validation without fetching repository contents. They execute synchronously in the reconcile loop, validating only that the repository is reachable without the overhead of git operations.&lt;/p></description></item><item><title>API Reference</title><link>/docs/7_cli_api/api-ref/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/7_cli_api/api-ref/</guid><description>&lt;h2 id="packages">Packages&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="#porchkptdevv1alpha1">porch.kpt.dev/v1alpha1&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="porchkptdevv1alpha1">porch.kpt.dev/v1alpha1&lt;/h2>&lt;h4 id="condition">Condition&lt;/h4>&lt;p>&lt;em>Appears in:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="#packagerevisionstatus">PackageRevisionStatus&lt;/a>&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Validation&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>type&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>status&lt;/code> &lt;em>
&lt;a href="#conditionstatus">ConditionStatus&lt;/a>&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>reason&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>message&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h4 id="conditionstatus">ConditionStatus&lt;/h4>&lt;p>&lt;em>Appears in:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="#condition">Condition&lt;/a>&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>True&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>False&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Unknown&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h4 id="field">Field&lt;/h4>&lt;p>Field references a field in a resource&lt;/p>
&lt;p>&lt;em>Appears in:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="#resultitem">ResultItem&lt;/a>&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Validation&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>path&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>Path is the field path. This field is required.&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>currentValue&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>CurrentValue is the current field value&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>proposedValue&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>ProposedValue is the proposed value of the field to fix an issue.&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h4 id="file">File&lt;/h4>&lt;p>File references a file containing a resource&lt;/p></description></item><item><title>Cache Configuration</title><link>/docs/6_configuration_and_deployments/configurations/cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/cache/</guid><description>&lt;p>Porch supports two caching mechanisms for storing package metadata. Choose based on your deployment scale and infrastructure.&lt;/p>
&lt;h2 id="cache-types">Cache Types&lt;/h2>&lt;h3 id="cr-cache-default">CR Cache (Default)&lt;/h3>&lt;p>Uses Custom Resources for metadata tracking while package content is served through Porch&amp;rsquo;s aggregated API server. Suitable for development and smaller deployments.&lt;/p>
&lt;p>&lt;strong>Characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>No external database required&lt;/li>
&lt;li>Metadata stored in Kubernetes etcd via Custom Resources&lt;/li>
&lt;li>Package content served through aggregated API server&lt;/li>
&lt;li>Automatic backup with cluster backups&lt;/li>
&lt;li>Simple operational model&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Best For:&lt;/strong>&lt;/p></description></item><item><title>Cache Design</title><link>/docs/5_architecture_and_components/package-cache/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/package-cache/design/</guid><description>&lt;h2 id="cache-interface">Cache Interface&lt;/h2>&lt;p>The Package Cache provides a unified interface that abstracts the underlying storage mechanism. Both the CR Cache and DB Cache implementations conform to this common interface, allowing the CaDEngine to work with either implementation without knowing which is in use.&lt;/p>
&lt;p>&lt;strong>Repository Operations:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Open repository connections from Repository CR specifications&lt;/li>
&lt;li>Close repositories and clean up resources&lt;/li>
&lt;li>Retrieve list of all open repositories&lt;/li>
&lt;li>Get specific repository by key&lt;/li>
&lt;li>Update repository metadata&lt;/li>
&lt;li>Check repository connectivity&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Repository Interface Delegation:&lt;/strong>&lt;/p></description></item><item><title>Caching Behavior</title><link>/docs/5_architecture_and_components/package-cache/functionality/caching-behavior/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/package-cache/functionality/caching-behavior/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Package Cache optimizes performance by storing repository data in memory (CR Cache) or database (DB Cache) to avoid redundant Git operations. The caching system uses lazy loading, version-based refresh, and concurrency control to balance performance with data freshness.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Caching System │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────┐ ┌──────────────┐ ┌──────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Cache │ │ Version │ │ Git │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Population │ ───&amp;gt; │ Tracking │ ───&amp;gt; │ Repo │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Lazy Load │ │ • Compare │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Refresh │ │ • Refresh │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └──────────────┘ └──────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────┬───────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Cache Structure │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Maps │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Mutex │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Consistency │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-population">Cache Population&lt;/h2>&lt;p>The cache uses lazy loading and version-based refresh to minimize Git operations. While the cache provides the data storage and access interfaces, the 
&lt;a href="/docs/5_architecture_and_components/controllers/repository-controller/">Repository Controller&lt;/a> orchestrates background sync operations that populate and refresh the cache on configurable schedules.&lt;/p></description></item><item><title>Catalog Deployment</title><link>/docs/6_configuration_and_deployments/deployments/catalog-deployment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/deployments/catalog-deployment/</guid><description>&lt;p>This guide covers deploying Porch in production environments using the 
&lt;a href="https://github.com/nephio-project/catalog/tree/main/nephio/core/porch" target="_blank">Nephio catalog&lt;/a>.&lt;/p>
&lt;h2 id="configuration-planning">Configuration Planning&lt;/h2>&lt;p>Before deploying Porch, determine which features you need.&lt;/p>
&lt;h3 id="cache-mode-selection">Cache Mode Selection&lt;/h3>&lt;p>Choose your cache backend based on deployment scale and requirements:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>CR Cache&lt;/strong> (default): Development and small deployments (&amp;lt;100 repositories)&lt;/li>
&lt;li>&lt;strong>DB Cache&lt;/strong>: Production deployments requiring scale and reliability&lt;/li>
&lt;/ul>


&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Important&lt;/h4>

 If using &lt;strong>DB Cache&lt;/strong>, you must configure database settings for &lt;strong>both&lt;/strong> Porch Server and Repository Controller before deployment. See 
&lt;a href="/docs/6_configuration_and_deployments/configurations/cache/">Cache Configuration&lt;/a> for complete setup instructions including database initialization.

&lt;/div>

&lt;h3 id="optional-pre-deployment-configuration">Optional Pre-deployment Configuration&lt;/h3>&lt;p>These &lt;strong>optional&lt;/strong> features must be configured &lt;strong>before&lt;/strong> deployment if you need them:&lt;/p></description></item><item><title>Cert Manager Webhooks</title><link>/docs/6_configuration_and_deployments/configurations/components/porch-server-config/cert-manager-webhooks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/components/porch-server-config/cert-manager-webhooks/</guid><description>&lt;p>Porch includes validating webhooks that require TLS certificates. By default, Porch generates self-signed certificates, but you can configure it to use cert-manager for automatic certificate management.&lt;/p>
&lt;h2 id="porch-webhooks">Porch Webhooks&lt;/h2>&lt;p>Porch uses two validating webhooks:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>PackageRevision Deletion Webhook&lt;/strong> - Validates PackageRevision deletion requests&lt;/li>
&lt;li>&lt;strong>Repository Validation Webhook&lt;/strong> - Validates Repository creation and updates&lt;/li>
&lt;/ol>
&lt;h2 id="using-the-catalog-package">Using the Catalog Package&lt;/h2>&lt;p>The Nephio catalog provides a ready-to-use package for Porch with cert-manager integration:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Register the catalog repository (if not already done)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">porchctl repo register &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --namespace default &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://github.com/nephio-project/catalog.git &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name&lt;span class="o">=&lt;/span>catalog
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Clone the cert-manager webhook package&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">porchctl rpkg clone &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> catalog.nephio.optional.porch-cert-manager-webhook.main &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> porch-cert-manager &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --repository&lt;span class="o">=&lt;/span>deployment-repo &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --namespace&lt;span class="o">=&lt;/span>default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This package includes:&lt;/p></description></item><item><title>CRD Reference</title><link>/docs/7_cli_api/crd-ref/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/7_cli_api/crd-ref/</guid><description>&lt;iframe
 src="https://doc.crds.dev/github.com/nephio-project/porch@v1.5.9"
 width="100%"
 style="min-height:98vh; border:none;"/></description></item><item><title>Design</title><link>/docs/5_architecture_and_components/controllers/packagevariants/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/design/</guid><description>&lt;h2 id="architecture">Architecture&lt;/h2>&lt;p>The Controllers follow a 
&lt;a href="https://kubernetes.io/docs/concepts/architecture/controller/#controller-pattern" target="_blank">&lt;strong>standard Kubernetes controller pattern&lt;/strong>&lt;/a>
using the controller-runtime framework:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Controller Manager │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ PackageVariant │ │PackageVariantSet │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Reconciler │ │ Reconciler │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Watch/Reconcile │ │ Watch/Reconcile │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Loop │ │ Loop │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬─────────┘ └────────┬─────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └───────────┬───────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌─────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Shared Client │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ (Porch API) │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Key architectural patterns:&lt;/strong>&lt;/p></description></item><item><title>Design</title><link>/docs/5_architecture_and_components/porch-apiserver/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/porch-apiserver/design/</guid><description>&lt;h2 id="rest-storage-interface">REST Storage Interface&lt;/h2>&lt;p>See 
&lt;a href="/docs/5_architecture_and_components/porch-apiserver/functionality/#rest-storage-implementation">Functionality&lt;/a> for detailed CRUD operations and storage implementations.&lt;/p>
&lt;p>The Porch API Server implements Kubernetes&amp;rsquo; REST storage interface to provide custom storage backends for Porch resources. Unlike standard Kubernetes resources that store data in etcd, Porch resources delegate to the Engine which manages package data in Git repositories through the Cache.&lt;/p>
&lt;p>&lt;strong>Storage interface characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Implements standard Kubernetes storage.Interface&lt;/li>
&lt;li>Provides CRUD operations (Create, Get, List, Update, Delete)&lt;/li>
&lt;li>Supports Watch for real-time change notifications&lt;/li>
&lt;li>Delegates all operations to CaD Engine&lt;/li>
&lt;li>No direct etcd storage - packages stored in Git&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Storage implementations:&lt;/strong>&lt;/p></description></item><item><title>Design Decisions</title><link>/docs/5_architecture_and_components/controllers/repository-controller/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/repository-controller/design/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>This page explains the key architectural decisions that shaped the Repository Controller, focusing on the &amp;ldquo;why&amp;rdquo; rather than the &amp;ldquo;what.&amp;rdquo; Each decision represents a deliberate trade-off made to balance competing concerns like performance, reliability, and operational simplicity.&lt;/p>
&lt;p>These decisions address fundamental challenges in distributed systems: how to detect failures quickly without wasting resources, how to handle errors intelligently, and how to provide clear operational visibility. Understanding the rationale helps when troubleshooting issues or considering configuration changes.&lt;/p></description></item><item><title>Engine Design</title><link>/docs/5_architecture_and_components/engine/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/engine/design/</guid><description>&lt;h2 id="cad-engine-architecture">CaD Engine Architecture&lt;/h2>&lt;p>The Engine follows a &lt;strong>layered architecture&lt;/strong> with clear separation of concerns:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ CaDEngine Interface │ ← Public API
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─────────────────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ cadEngine Implementation │ ← Orchestration Logic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─────────────────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────┬──────────┬─────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Cache │ Task │ Watcher │ │ ← Dependencies
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ Handler │ Manager │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────┴──────────┴─────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Key architectural patterns:&lt;/strong>&lt;/p>
&lt;h3 id="dependency-injection-via-functional-options">Dependency Injection via Functional Options&lt;/h3>&lt;p>The engine is constructed using a &lt;strong>functional options pattern&lt;/strong> that allows flexible configuration of dependencies:&lt;/p></description></item><item><title>Error Handling</title><link>/docs/5_architecture_and_components/controllers/repository-controller/functionality/error-handling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/repository-controller/functionality/error-handling/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>When repository operations fail, the controller uses intelligent retry logic based on error type. Different errors require different retry strategies - transient network issues retry quickly, while authentication problems that need manual intervention retry less frequently to avoid wasting resources.&lt;/p>
&lt;p>For how errors affect sync scheduling behavior, see 
&lt;a href="/docs/5_architecture_and_components/controllers/repository-controller/functionality/sync-behavior/#sync-behavior-during-errors">Sync Behavior During Errors&lt;/a>.&lt;/p>
&lt;h2 id="error-specific-retry-intervals">Error-Specific Retry Intervals&lt;/h2>&lt;p>The controller analyzes error messages to determine appropriate retry timing:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Error Type&lt;/th>
 &lt;th>Retry Interval&lt;/th>
 &lt;th>Error Patterns&lt;/th>
 &lt;th>Rationale&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Network Issues&lt;/strong>&lt;/td>
 &lt;td>30 seconds&lt;/td>
 &lt;td>&amp;ldquo;no such host&amp;rdquo;, &amp;ldquo;connection refused&amp;rdquo;&lt;/td>
 &lt;td>Often transient, retry quickly&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Authentication&lt;/strong>&lt;/td>
 &lt;td>10 minutes&lt;/td>
 &lt;td>&amp;ldquo;authentication required&amp;rdquo;, &amp;ldquo;permission denied&amp;rdquo;&lt;/td>
 &lt;td>Needs manual fix, avoid spam&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Git Repo/Branch&lt;/strong>&lt;/td>
 &lt;td>2 minutes&lt;/td>
 &lt;td>&amp;ldquo;not found&amp;rdquo;, &amp;ldquo;invalid&amp;rdquo;, &amp;ldquo;branch&amp;rdquo;&lt;/td>
 &lt;td>May be transient (repo creation)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Timeouts&lt;/strong>&lt;/td>
 &lt;td>1 minute&lt;/td>
 &lt;td>&amp;ldquo;timeout&amp;rdquo;, &amp;ldquo;deadline exceeded&amp;rdquo;&lt;/td>
 &lt;td>Network congestion, moderate retry&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>TLS/SSL Issues&lt;/strong>&lt;/td>
 &lt;td>5 minutes&lt;/td>
 &lt;td>&amp;ldquo;certificate&amp;rdquo;, &amp;ldquo;tls&amp;rdquo;, &amp;ldquo;ssl&amp;rdquo;&lt;/td>
 &lt;td>Configuration issues, less frequent&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Rate Limiting&lt;/strong>&lt;/td>
 &lt;td>5 minutes&lt;/td>
 &lt;td>&amp;ldquo;rate limit&amp;rdquo;, &amp;ldquo;too many requests&amp;rdquo;&lt;/td>
 &lt;td>Need to back off from API&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Default&lt;/strong>&lt;/td>
 &lt;td>30 seconds&lt;/td>
 &lt;td>All other errors&lt;/td>
 &lt;td>Configurable fallback&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="recovery-behavior">Recovery Behavior&lt;/h2>&lt;p>When a repository enters an error state, the controller adjusts its behavior to focus on recovery:&lt;/p></description></item><item><title>Function Runner Design</title><link>/docs/5_architecture_and_components/function-runner/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/function-runner/design/</guid><description>&lt;h2 id="architectural-context">Architectural Context&lt;/h2>&lt;p>The Function Runner is &lt;strong>one of several function execution mechanisms&lt;/strong> in Porch. The Task Handler uses a &lt;strong>Function Runtime&lt;/strong> interface that can be implemented by:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Task Handler (in Porch)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Function Runtime
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────┴─────┬──────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Builtin gRPC Multi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Runtime Runtime Runtime
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">In-Process Function Chains
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Go Code Runner Runtimes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (External)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────┴─────────┬──────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Pod Executable Multi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Evaluator Evaluator Evaluator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Function Cached Fallback
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Pods Binaries Chain
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Function Runtime implementations:&lt;/strong>&lt;/p></description></item><item><title>Installing Porch</title><link>/docs/3_getting_started/installing-porch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/3_getting_started/installing-porch/</guid><description>&lt;h2 id="deploying-porch-on-a-cluster">Deploying Porch on a cluster&lt;/h2>&lt;p>Create a new directory for the kpt package and navigate into it:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir porch-1.5.9 &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> porch-1.5.9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Download the latest Porch kpt package blueprint:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.9/porch_blueprint.tar.gz&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Extract the Porch kpt package contents:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">tar -xzf porch_blueprint.tar.gz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Initialize and apply the Porch kpt package:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">kpt live init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> kpt live apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="verify-installation">Verify Installation&lt;/h2>&lt;p>Check that Porch components are running:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">kubectl get all -n porch-system
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A healthy Porch installation should show:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">NAME READY STATUS RESTARTS AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/function-runner-567ddc76d-7k8sj 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/function-runner-567ddc76d-x75lv 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/porch-controllers-d8dfccb4-8lc6j 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/porch-server-7dc5d7cd4f-smhf5 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME TYPE CLUSTER-IP EXTERNAL-IP PORT&lt;span class="o">(&lt;/span>S&lt;span class="o">)&lt;/span> AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service/api ClusterIP 10.96.108.221 &amp;lt;none&amp;gt; 443/TCP,8443/TCP 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service/function-runner ClusterIP 10.96.237.108 &amp;lt;none&amp;gt; 9445/TCP 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME READY UP-TO-DATE AVAILABLE AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deployment.apps/function-runner 2/2 &lt;span class="m">2&lt;/span> &lt;span class="m">2&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deployment.apps/porch-controllers 1/1 &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deployment.apps/porch-server 1/1 &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME DESIRED CURRENT READY AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replicaset.apps/function-runner-567ddc76d &lt;span class="m">2&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="m">2&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replicaset.apps/porch-controllers-d8dfccb4 &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replicaset.apps/porch-server-7dc5d7cd4f &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Verify the Porch API is accessible:&lt;/p></description></item><item><title>PackageVariant Controller</title><link>/docs/5_architecture_and_components/controllers/packagevariants/packagevariant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/packagevariant/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>PackageVariant Controller&lt;/strong> is a Kubernetes controller that manages individual package variants - maintaining a one-to-one relationship between an upstream package and a downstream package. It continuously synchronizes downstream PackageRevisions with upstream changes and applies configured mutations.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reconciliation-based&lt;/strong>: Uses standard Kubernetes controller-runtime reconciliation loop&lt;/li>
&lt;li>&lt;strong>Upstream tracking&lt;/strong>: Monitors upstream PackageRevisions for changes via UpstreamLock comparison&lt;/li>
&lt;li>&lt;strong>Draft-driven workflow&lt;/strong>: All changes create draft PackageRevisions that require approval&lt;/li>
&lt;li>&lt;strong>Policy-based ownership&lt;/strong>: Configurable adoption and deletion policies for existing packages&lt;/li>
&lt;li>&lt;strong>Mutation application&lt;/strong>: Applies package context, pipeline functions, and config injection&lt;/li>
&lt;li>&lt;strong>Finalizer-based cleanup&lt;/strong>: Ensures proper cleanup of owned PackageRevisions on deletion&lt;/li>
&lt;/ul>
&lt;h2 id="implementation-details">Implementation Details&lt;/h2>&lt;h3 id="reconciliation-state-machine">Reconciliation State Machine&lt;/h3>&lt;p>The PackageVariant controller implements a state machine that determines actions based on the current state of upstream and downstream packages:&lt;/p></description></item><item><title>PackageVariantSet Controller</title><link>/docs/5_architecture_and_components/controllers/packagevariants/packagevariantset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/packagevariantset/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>PackageVariantSet Controller&lt;/strong> manages bulk creation of PackageVariant CRs based on target selectors. It implements a declarative fan-out pattern where a single upstream package is automatically instantiated across multiple downstream targets using template-based generation with CEL expressions.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fan-out pattern&lt;/strong>: One upstream package → multiple PackageVariant CRs → multiple downstream packages&lt;/li>
&lt;li>&lt;strong>Target selection&lt;/strong>: Three mechanisms for identifying targets (repository list, repository selector, object selector)&lt;/li>
&lt;li>&lt;strong>Template-based generation&lt;/strong>: Single template generates multiple PackageVariants with per-target customization&lt;/li>
&lt;li>&lt;strong>CEL expression evaluation&lt;/strong>: Dynamic configuration using Common Expression Language&lt;/li>
&lt;li>&lt;strong>Set-based reconciliation&lt;/strong>: Desired state computed and reconciled against existing PackageVariants&lt;/li>
&lt;li>&lt;strong>Owner reference management&lt;/strong>: PackageVariantSet owns all generated PackageVariants&lt;/li>
&lt;/ul>
&lt;h2 id="reconciliation-overview">Reconciliation Overview&lt;/h2>&lt;p>The PackageVariantSet controller implements a declarative fan-out pattern where a single upstream package is automatically instantiated across multiple downstream targets using template-based generation with CEL expressions.&lt;/p></description></item><item><title>PackageVariantSet Reconciliation</title><link>/docs/5_architecture_and_components/controllers/packagevariants/functionality/packagevariantset-reconciliation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/functionality/packagevariantset-reconciliation/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The PackageVariantSet controller implements a declarative fan-out pattern where a single upstream package is automatically instantiated across multiple downstream targets using template-based generation with CEL expressions. It manages bulk creation of PackageVariant CRs based on target selectors and ensures the desired set of PackageVariants matches the actual set through set-based reconciliation.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ PackageVariantSet Reconciliation System │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Target │ │ Template │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Unrolling │ ──&amp;gt; │ Evaluation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Repository │ │ • CEL Exprs │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ List │ │ • Context │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Repository │ │ • Dynamic │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Selector │ │ Config │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Object │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Selector │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Set-Based │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Reconciliation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Desired Set │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Existing Set │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Create/Update │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Delete │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="reconciliation-flow">Reconciliation Flow&lt;/h2>&lt;p>The controller follows a structured reconciliation process:&lt;/p></description></item><item><title>Pod Lifecycle Management</title><link>/docs/5_architecture_and_components/function-runner/functionality/pod-lifecycle-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/function-runner/functionality/pod-lifecycle-management/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Pod lifecycle management orchestrates the complete lifecycle of function execution pods from creation through caching, reuse, and eventual garbage collection. The system maintains a pool of ready-to-use pods for frequently executed functions while automatically cleaning up unused pods based on time-to-live policies.&lt;/p>
&lt;p>The architecture consists of two primary components:&lt;/p>
&lt;p>&lt;strong>Pod Cache Manager&lt;/strong> - Central coordinator running in a single goroutine that manages the pod cache, handles evaluation requests, processes pod readiness notifications, and performs periodic garbage collection. Uses channels for all communication to eliminate mutex synchronization.&lt;/p></description></item><item><title>Pod Templates</title><link>/docs/6_configuration_and_deployments/configurations/components/function-runner-config/pod-templates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/components/function-runner-config/pod-templates/</guid><description>&lt;p>The Function Runner supports customizing the pod specifications used for KRM function evaluation through ConfigMap-based templates. This allows you to configure resource limits, security contexts, node selectors, tolerations, and other pod-level settings for function execution pods.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>By default, the Function Runner uses an inline pod template with sensible defaults. For advanced use cases requiring customization, you can provide a ConfigMap containing custom pod and service templates. The Function Runner will use these templates when creating function evaluator pods.&lt;/p></description></item><item><title>Porch Controllers</title><link>/docs/6_configuration_and_deployments/configurations/components/porch-controllers-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/components/porch-controllers-config/</guid><description>&lt;p>The Porch controllers manage Repository synchronization, PackageVariants, and PackageVariantSets.&lt;/p>
&lt;h2 id="enabling-controllers">Enabling Controllers&lt;/h2>&lt;h3 id="command-line-arguments">Command Line Arguments&lt;/h3>&lt;p>The controllers support these command line arguments:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">args:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --reconcilers&lt;span class="o">=&lt;/span>repositories,packagevariants,packagevariantsets &lt;span class="c1"># Comma-separated list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># OR use --reconcilers=* to enable all controllers&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="repository-controller-configuration">Repository Controller Configuration&lt;/h3>&lt;p>The Repository Controller supports these additional flags:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">args:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --reconcilers&lt;span class="o">=&lt;/span>repositories
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --repositories.max-concurrent-reconciles&lt;span class="o">=&lt;/span>&lt;span class="m">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --repositories.max-concurrent-syncs&lt;span class="o">=&lt;/span>&lt;span class="m">50&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --repositories.health-check-frequency&lt;span class="o">=&lt;/span>5m
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --repositories.full-sync-frequency&lt;span class="o">=&lt;/span>1h
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --repositories.cache-type&lt;span class="o">=&lt;/span>CR &lt;span class="c1"># or DB&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Configuration Parameters:&lt;/strong>&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Parameter&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>max-concurrent-reconciles&lt;/code>&lt;/td>
 &lt;td>100&lt;/td>
 &lt;td>Parallel reconcile loops&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>max-concurrent-syncs&lt;/code>&lt;/td>
 &lt;td>50&lt;/td>
 &lt;td>Parallel sync operations&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>health-check-frequency&lt;/code>&lt;/td>
 &lt;td>5m&lt;/td>
 &lt;td>Lightweight connectivity checks&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>full-sync-frequency&lt;/code>&lt;/td>
 &lt;td>1h&lt;/td>
 &lt;td>Complete repository sync&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>cache-type&lt;/code>&lt;/td>
 &lt;td>CR&lt;/td>
 &lt;td>Cache implementation (CR or DB) - see 
&lt;a href="/docs/6_configuration_and_deployments/configurations/cache/">Cache Configuration&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Cache Type:&lt;/strong>&lt;/p></description></item><item><title>Repositories</title><link>/docs/2_concepts/repositories/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/repositories/</guid><description>&lt;h2 id="what-is-a-repository-in-porch">What is a Repository in Porch?&lt;/h2>&lt;p>A &lt;strong>Repository&lt;/strong> is a Kubernetes resource that connects Porch to a Git repository where kpt packages are stored. When you
register a repository with Porch, you&amp;rsquo;re creating a Repository resource that tells Porch:&lt;/p>
&lt;ul>
&lt;li>Where the storage backend is located (Git URL)
&lt;ul>
&lt;li>including a particular branch within the repository - the deployment branch&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>How to authenticate (via references to a Kubernetes Secret containing the credentials)&lt;/li>
&lt;li>Whether it&amp;rsquo;s a deployment repository (packages ready for deployment)&lt;/li>
&lt;li>How often to sync/refresh the package revision cache&lt;/li>
&lt;/ul>
&lt;p>Repositories can be accessed using the short name &lt;code>repo&lt;/code> for convenience (e.g., &lt;code>kubectl get repo&lt;/code>).&lt;/p></description></item><item><title>Validation &amp; Business Rules</title><link>/docs/5_architecture_and_components/engine/functionality/validation-business-rules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/engine/functionality/validation-business-rules/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine enforces validation and business rules to ensure package revisions are created and modified correctly. These rules prevent invalid operations, enforce naming constraints, and maintain referential integrity across packages and revisions.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Validation &amp;amp; Business Rules │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Pre-Operation │ │ Constraint │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Validation │ ───&amp;gt; │ Enforcement │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Lifecycle │ │ • Uniqueness │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Tasks │ │ • Path Overlap │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Resources │ │ • Clone Rules │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Optimistic │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Locking │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Resource Ver │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Conflict Det │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="lifecycle-validation">Lifecycle Validation&lt;/h2>&lt;p>The Engine validates lifecycle values during package revision creation and updates:&lt;/p></description></item><item><title>Creating Package Revisions</title><link>/docs/4_tutorials_and_how-tos/working_with_package_revisions/creating-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_package_revisions/creating-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Initialize a new package revision&lt;/li>
&lt;li>Pull the package revision locally&lt;/li>
&lt;li>Modify the package revision contents&lt;/li>
&lt;li>Push changes back to Porch&lt;/li>
&lt;li>Propose the package revision for review&lt;/li>
&lt;li>Approve or reject the package revision&lt;/li>
&lt;/ol>
&lt;hr>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 The tutorial assumes a porch repository is initialized with the &amp;ldquo;porch-test&amp;rdquo; name.
We recommended to use this for simpler copy-pasting of commands otherwise replace any &amp;ldquo;porch-test&amp;rdquo; value with your repository&amp;rsquo;s name in the below commands.

&lt;/div>

&lt;h2 id="step-1-initialize-your-first-package-revision">Step 1: Initialize Your First Package Revision&lt;/h2>&lt;p>Create a new package revision in Porch using the &lt;code>init&lt;/code> command:&lt;/p></description></item><item><title>Custom Resource Cache</title><link>/docs/5_architecture_and_components/package-cache/cr-cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/package-cache/cr-cache/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>Custom Resource (CR) Cache&lt;/strong> is the default cache implementation in Porch. It stores package metadata using a Kubernetes Custom Resources while keeping repository data in memory. This implementation is designed for standard Porch deployments where Kubernetes &lt;code>etcd&lt;/code> provides sufficient storage and performance.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Default implementation&lt;/strong>: Used when no cache type is explicitly configured&lt;/li>
&lt;li>&lt;strong>Hybrid storage&lt;/strong>: In-memory repository cache + CR-based metadata storage&lt;/li>
&lt;li>&lt;strong>RDBMS-independent&lt;/strong>: No RDBMS (such as Posgres) required, leverages the Kubernetes API, &lt;code>etcd&lt;/code>, and Git for persistence&lt;/li>
&lt;li>&lt;strong>Suitable for&lt;/strong>: Small to medium deployments with moderate package counts&lt;/li>
&lt;li>&lt;strong>No external dependencies&lt;/strong>: Only requires a Kubernetes cluster&lt;/li>
&lt;li>&lt;strong>Git interaction&lt;/strong>: Interacts with Git at every stage of package revision lifecycle for presistence&lt;/li>
&lt;/ul>
&lt;h2 id="implementation-details">Implementation Details&lt;/h2>&lt;h3 id="storage-architecture">Storage Architecture&lt;/h3>&lt;p>The CR Cache uses a two-tier storage model:&lt;/p></description></item><item><title>Draft-Commit Workflow Orchestration</title><link>/docs/5_architecture_and_components/engine/functionality/draft-commit-orchestration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/engine/functionality/draft-commit-orchestration/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine orchestrates a draft-commit workflow for all package revision modifications. This pattern ensures atomicity - either all changes succeed and are persisted, or none are. The workflow uses mutable drafts for changes and immutable package revisions for storage.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Draft-Commit Workflow Orchestration │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Draft Phase │ │ Commit Phase │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ───&amp;gt; │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Open Draft │ │ • Close Draft │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Apply Changes │ │ • Persist │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Validate │ │ • Immutable │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Rollback │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Mechanism │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │• Trigger On Error│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │• Does Cleanup │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="draft-commit-pattern">Draft-Commit Pattern&lt;/h2>&lt;p>The Engine uses a two-phase workflow for all package revision modifications:&lt;/p></description></item><item><title>Functionality</title><link>/docs/5_architecture_and_components/porch-apiserver/functionality/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/porch-apiserver/functionality/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Porch API Server provides the Kubernetes API interface for Porch resources. It implements custom REST storage backends that delegate to the Engine, enforces validation and admission policies through strategies, and manages real-time watch streams for clients.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ API Server Functionality │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ REST Storage │ │ Strategies │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ───&amp;gt; │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • CRUD Ops │ │ • Validation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Watch Streams │ │ • Admission │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Engine Deleg │ │ • Table Conv │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Background │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Operations │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Cleanup │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="rest-storage-implementation">REST Storage Implementation&lt;/h2>&lt;p>See 
&lt;a href="/docs/5_architecture_and_components/porch-apiserver/design/#rest-storage-interface">Design&lt;/a> for the design rationale behind custom REST storage.&lt;/p></description></item><item><title>Getting Package Revisions</title><link>/docs/4_tutorials_and_how-tos/working_with_package_revisions/inspecting-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_package_revisions/inspecting-packages/</guid><description>&lt;hr>
&lt;h2 id="basic-operations">Basic Operations&lt;/h2>&lt;p>These operations cover the fundamental commands for viewing and inspecting package revisions in Porch.&lt;/p>
&lt;h3 id="getting-all-package-revisions">Getting All Package Revisions&lt;/h3>&lt;p>Get all package revisions across all repositories in a namespace:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl rpkg get --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This command queries Porch for all PackageRevisions in the specified namespace and displays a summary table with key information. It shows PackageRevisions from all registered repositories in that namespace.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;p>&lt;code>porchctl rpkg list&lt;/code> is an alias for &lt;code>porchctl rpkg get&lt;/code> and can be used interchangeably:&lt;/p></description></item><item><title>Image and Registry Management</title><link>/docs/5_architecture_and_components/function-runner/functionality/image-registry-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/function-runner/functionality/image-registry-management/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Function Runner manages container image metadata and registry authentication to optimize pod creation and support private registries. The system caches image metadata (digest and entrypoint) to avoid repeated registry calls, handles authentication for private registries using Docker config format, and supports TLS configuration for secure registry connections.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌──────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Image and Registry Management │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Image │ │ Registry │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Metadata │ ───&amp;gt; │ Authentication │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Caching │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ • Default │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Digest │ │ • Custom Auth │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Entrypoint │ │ • TLS Config │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • In-Memory │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌───────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Secret │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Management │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Creation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Synchronization│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Pod Injection │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └───────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└──────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="image-metadata-caching">Image Metadata Caching&lt;/h2>&lt;p>The pod manager caches image metadata to avoid repeated registry API calls during pod creation.&lt;/p></description></item><item><title>Jaeger Tracing</title><link>/docs/6_configuration_and_deployments/configurations/components/porch-server-config/jaeger-tracing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/components/porch-server-config/jaeger-tracing/</guid><description>&lt;p>Jaeger tracing provides distributed tracing capabilities for the Porch Server, allowing you to monitor and debug package operations. This is particularly useful for development and troubleshooting.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 Jaeger tracing is currently only supported for the Porch Server component. Function Runner and Porch Controllers do not support tracing.

&lt;/div>

&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Porch Server supports OpenTelemetry tracing that can be exported to Jaeger for visualization. When enabled, Porch Server will generate traces for:&lt;/p>
&lt;ul>
&lt;li>Package operations (create, update, delete)&lt;/li>
&lt;li>Git repository interactions&lt;/li>
&lt;li>Function execution requests&lt;/li>
&lt;li>API requests and responses&lt;/li>
&lt;/ul>
&lt;h2 id="deployment-setup">Deployment Setup&lt;/h2>&lt;h3 id="deploy-jaeger-to-kubernetes">Deploy Jaeger to Kubernetes&lt;/h3>&lt;p>Porch includes a ready-to-use Jaeger deployment:&lt;/p></description></item><item><title>Lifecycle Management</title><link>/docs/5_architecture_and_components/engine/functionality/lifecycle-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/engine/functionality/lifecycle-management/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine enforces a strict lifecycle state machine for package revisions that governs their mutability, visibility, and progression from draft to published state. The lifecycle system ensures that package revisions follow a controlled workflow from creation through approval to deployment, with appropriate constraints at each stage.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Lifecycle Management System │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ State Machine │ │ Validation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ───&amp;gt; │ &amp;amp; Enforcement │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Draft │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Proposed │ │ • Creation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Published │ │ • Transition │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Deletion │ │ • Mutation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ State-Based │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Constraints │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Mutability │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Operations │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Audit Trail │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="lifecycle-state-machine">Lifecycle State Machine&lt;/h2>&lt;p>The lifecycle state machine defines four states that a package revision can be in:&lt;/p></description></item><item><title>Local Development Environment</title><link>/docs/6_configuration_and_deployments/deployments/local-dev-env-deployment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/deployments/local-dev-env-deployment/</guid><description>&lt;p>This guide provides instructions for setting up a local development environment using Kind (Kubernetes in Docker) for developing, testing, and exploring Porch.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="https://docs.docker.com/get-docker/" target="_blank">Docker&lt;/a> - For running containers and Kind cluster&lt;/li>
&lt;li>
&lt;a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/" target="_blank">kubectl&lt;/a> - Kubernetes command-line tool&lt;/li>
&lt;li>
&lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start/#installation" target="_blank">kind&lt;/a> - Local Kubernetes clusters using Docker&lt;/li>
&lt;/ul>
&lt;h2 id="setup">Setup&lt;/h2>&lt;h3 id="1-create-kind-cluster">1. Create Kind Cluster&lt;/h3>&lt;p>From the Porch repository root directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./scripts/setup-dev-env.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This script:&lt;/p>
&lt;ul>
&lt;li>Creates a Kind cluster named &lt;code>porch-test&lt;/code>&lt;/li>
&lt;li>Installs MetalLB load balancer&lt;/li>
&lt;li>Deploys Gitea Git server&lt;/li>
&lt;li>Generates PKI resources for testing&lt;/li>
&lt;li>Builds the &lt;code>porchctl&lt;/code> CLI binary&lt;/li>
&lt;/ul>
&lt;h3 id="2-deploy-porch">2. Deploy Porch&lt;/h3>&lt;p>Choose your cache backend:&lt;/p></description></item><item><title>Mutation Application</title><link>/docs/5_architecture_and_components/controllers/packagevariants/functionality/mutation-application/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/functionality/mutation-application/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The PackageVariant controller applies mutations to downstream package revisions to customize them based on the PackageVariant specification. Mutations are systematic transformations applied to package resources after cloning or upgrading from upstream, enabling configuration injection, function pipeline modification, and dynamic resource generation.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Mutation Application System │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Package │ │ KRM │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Context │ ───&amp;gt; │ Functions │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • ConfigMap │ │ • Prepend │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Data │ │ • Naming │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Add/Remove │ │ • Pipeline │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Config │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Injection │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Annotation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Selector │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Field Copy │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="mutation-orchestration">Mutation Orchestration&lt;/h2>&lt;p>Mutations are applied in a specific order during package revision processing:&lt;/p></description></item><item><title>Package Revisions</title><link>/docs/2_concepts/package-revisions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/package-revisions/</guid><description>&lt;h2 id="what-is-a-package-revision">What is a Package Revision?&lt;/h2>&lt;p>A &lt;strong>package revision&lt;/strong> is the actual working unit in Porch. While users may often refer to &amp;ldquo;working with a package&amp;rdquo;, they
are actually working with a specific revision of that package.&lt;/p>
&lt;p>Think of it like Git commits:&lt;/p>
&lt;ul>
&lt;li>A Git repository contains a project&lt;/li>
&lt;li>Each commit is a specific version of that project&lt;/li>
&lt;li>You work with commits, not the abstract &amp;ldquo;project&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>Similarly in Porch:&lt;/p>
&lt;ul>
&lt;li>A Repository contains kpt packages&lt;/li>
&lt;li>Each package revision is a specific version of a kpt package&lt;/li>
&lt;li>You work with package revisions, not the abstract &amp;ldquo;package&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h2 id="published-package-revision-numbering">Published Package Revision Numbering&lt;/h2>&lt;p>Package revisions use simple integer sequence versioning (&lt;code>1&lt;/code>, &lt;code>2&lt;/code>, &lt;code>3&lt;/code>, etc.):&lt;/p></description></item><item><title>Registering Repositories</title><link>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-registration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-registration/</guid><description>&lt;p>Registering a repository connects Porch to your Git storage backend, allowing it to discover and manage packages. You can register repositories with various authentication methods and configuration options.&lt;/p>
&lt;h3 id="register-a-git-repository">Register a Git Repository&lt;/h3>&lt;p>Register a Git repository with Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo register https://github.com/example/porch-test.git &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --namespace default &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name&lt;span class="o">=&lt;/span>porch-test &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --description&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Blueprint packages&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --branch&lt;span class="o">=&lt;/span>main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This command registers the Git repository with Porch, creates a Repository resource in Kubernetes and begins synchronizing packages from the repository.&lt;/p></description></item><item><title>Status Management</title><link>/docs/5_architecture_and_components/controllers/repository-controller/functionality/status-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/repository-controller/functionality/status-management/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Repository controller maintains detailed status information to track sync operations, detect changes, and provide observability. The status includes both standard Kubernetes conditions and custom fields specific to repository synchronization.&lt;/p>
&lt;h2 id="status-fields">Status Fields&lt;/h2>&lt;h3 id="repository-information">Repository Information&lt;/h3>&lt;p>The &lt;code>packageCount&lt;/code> field shows how many package revisions were discovered during the last sync.&lt;/p>
&lt;h3 id="git-commit-tracking">Git Commit Tracking&lt;/h3>&lt;p>For git repositories, the &lt;code>gitCommitHash&lt;/code> field contains the commit hash of the configured branch, enabling GitOps workflows to track which version is currently synced.&lt;/p></description></item><item><title>Uninstalling Porch</title><link>/docs/3_getting_started/uninstalling-porch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/3_getting_started/uninstalling-porch/</guid><description>&lt;h2 id="uninstalling-porch-server">Uninstalling Porch Server&lt;/h2>&lt;p>Navigate to the directory where you installed Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> porch-1.5.9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Remove Porch components using kpt:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">kpt live destroy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will delete all Porch resources from your cluster, including:&lt;/p>
&lt;ul>
&lt;li>Porch server deployment&lt;/li>
&lt;li>Function runner deployment&lt;/li>
&lt;li>Porch controllers deployment&lt;/li>
&lt;li>Services, ConfigMaps, and Secrets&lt;/li>
&lt;li>Custom Resource Definitions (CRDs)&lt;/li>
&lt;/ul>


&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>

 Destroying Porch will &lt;strong>not&lt;/strong> delete your Git repositories or the packages stored in them. However, PackageRevision and Repository resources in your cluster will be removed.

&lt;/div>

&lt;h2 id="verify-uninstallation">Verify Uninstallation&lt;/h2>&lt;p>Check that Porch components are removed:&lt;/p></description></item><item><title>Component Interactions</title><link>/docs/5_architecture_and_components/controllers/repository-controller/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/repository-controller/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Repository Controller operates within the Porch ecosystem by watching Repository custom resources and interacting with the cache layer to keep package metadata synchronized. This page describes how the controller integrates with other Porch components.&lt;/p>
&lt;h3 id="architecture">Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Repository Controller │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌─────────────────────────────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Reconcile Loop │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Watch Repository CRs │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Sync Decision Logic │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Async Workers │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Status Updates │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─────────────────────────────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Cache Interface │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • OpenRepository│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Refresh │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • List Packages │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Kubernetes API
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Repository CRs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (CR/DB Cache)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="kubernetes-api-interactions">Kubernetes API Interactions&lt;/h2>&lt;p>The controller watches Repository custom resources using standard Kubernetes controller patterns. When repositories are created, updated, or deleted, the controller receives events and reconciles the desired state with actual state.&lt;/p></description></item><item><title>Copying Package Revisions</title><link>/docs/4_tutorials_and_how-tos/working_with_package_revisions/copying-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_package_revisions/copying-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Find a PackageRevision to copy&lt;/li>
&lt;li>Copy a PackageRevision to create a new revision&lt;/li>
&lt;li>Modify the copied PackageRevision&lt;/li>
&lt;li>Propose and approve the new revision&lt;/li>
&lt;/ol>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 The tutorial assumes a porch repository is initialized with the &amp;ldquo;porch-test&amp;rdquo; name.
We recommended to use this for simpler copy pasting of commands otherwise replace any &amp;ldquo;porch-test&amp;rdquo; value with your repository&amp;rsquo;s name in the below commands.

&lt;/div>

&lt;hr>
&lt;h2 id="key-concepts">Key Concepts&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Copy&lt;/strong>: Creates a new independent PackageRevision within the same repository&lt;/li>
&lt;li>&lt;strong>Source PackageRevision&lt;/strong>: The original PackageRevision being copied&lt;/li>
&lt;li>&lt;strong>Target PackageRevision&lt;/strong>: The new PackageRevision created by the copy operation&lt;/li>
&lt;li>&lt;strong>Workspace&lt;/strong>: Must be unique within the package for the target&lt;/li>
&lt;li>&lt;strong>Same-repository operation&lt;/strong>: Copy only works within a single repository&lt;/li>
&lt;li>&lt;strong>Immutability&lt;/strong>: Published PackageRevisions cannot be modified, only copied&lt;/li>
&lt;li>&lt;strong>Clone vs Copy&lt;/strong>: Use clone for cross-repository operations, copy for same-repository versions&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="understanding-copy-operations">Understanding Copy Operations&lt;/h2>&lt;p>Copying creates a new PackageRevision based on an existing one &lt;strong>within the same repository&lt;/strong>. The copied PackageRevision is completely &lt;strong>independent with no upstream link&lt;/strong> to the source.&lt;/p></description></item><item><title>Database Cache</title><link>/docs/5_architecture_and_components/package-cache/db-cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/package-cache/db-cache/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>Database (DB) Cache&lt;/strong> is an alternative cache implementation in Porch designed for larger deployments. It stores both package metadata and repository data in a PostgreSQL database rather than in memory or Kubernetes Custom Resources. This implementation provides better scalability and persistence characteristics for production environments with high package counts.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Alternative implementation&lt;/strong>: Used when explicitly configured with database connection details&lt;/li>
&lt;li>&lt;strong>Database-backed storage&lt;/strong>: All repository, package, and package revision data stored in PostgreSQL&lt;/li>
&lt;li>&lt;strong>External dependency&lt;/strong>: Requires PostgreSQL database instance&lt;/li>
&lt;li>&lt;strong>Suitable for&lt;/strong>: Large deployments with thousands of packages and package revisions&lt;/li>
&lt;li>&lt;strong>Better persistence&lt;/strong>: Survives Porch server restarts without re-fetching from Git&lt;/li>
&lt;li>&lt;strong>Git interaction&lt;/strong>: By default, interacts with Git only during approval/publish and sync operations. Configurable with &lt;code>--db-push-drafts-to-git&lt;/code> flag to push drafts&lt;/li>
&lt;/ul>
&lt;h2 id="implementation-details">Implementation Details&lt;/h2>&lt;h3 id="storage-architecture">Storage Architecture&lt;/h3>&lt;p>The DB Cache uses a database-centric storage model:&lt;/p></description></item><item><title>Engine Interactions</title><link>/docs/5_architecture_and_components/engine/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/engine/interactions/</guid><description>&lt;h2 id="overall-interaction-overview">Overall Interaction Overview&lt;/h2>&lt;p>&lt;img src="/images/porch/engine-component-interaction.drawio.svg" alt="Engine Interaction Architecture" />&lt;/p>
&lt;h2 id="cache-integration">Cache Integration&lt;/h2>&lt;p>The Engine relies heavily on the Package Cache as its primary interface to repositories:&lt;/p>
&lt;h3 id="opening-repositories">Opening Repositories&lt;/h3>&lt;p>All repository access goes through the cache:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Engine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OpenRepository(repositorySpec)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Package Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Repository Adapter (Git)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Process:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Engine receives a Repository CR specification&lt;/li>
&lt;li>Calls &lt;code>cache.OpenRepository(ctx, repositorySpec)&lt;/code>&lt;/li>
&lt;li>Cache returns a Repository interface implementation&lt;/li>
&lt;li>Engine uses the repository abstraction for all operations&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Benefits of cache-mediated access:&lt;/strong>&lt;/p></description></item><item><title>Function Runner Interactions</title><link>/docs/5_architecture_and_components/function-runner/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/function-runner/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Function Runner is a &lt;strong>separate gRPC service&lt;/strong> that interacts with multiple systems: the Task Handler (via gRPC), Kubernetes API (for pod management), container registries (for image metadata), and wrapper servers (for function execution). It operates independently from the Porch server, enabling isolated function execution.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Function Runner Service │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────┐ ┌──────────────┐ ┌──────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Task Handler │ ───&amp;gt; │ gRPC │ ───&amp;gt; │ Eval │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ (in Porch) │ │ Server │ │uators│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └──────────────┘ └──────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↑ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ↓ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ┌──────────────┐ ┌──────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────│ Kubernetes │ │Image │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ API │ │Cache │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └──────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────┐ ┌─────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Function Pods│ │Registry │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ + Services │ │ APIs │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └─────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="task-handler-integration">Task Handler Integration&lt;/h2>&lt;p>The Function Runner integrates with the Task Handler through the gRPC Runtime:&lt;/p></description></item><item><title>Interactions</title><link>/docs/5_architecture_and_components/porch-apiserver/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/porch-apiserver/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Porch API Server acts as the integration point between Kubernetes clients and Porch&amp;rsquo;s internal components. It translates Kubernetes API requests into Engine operations and manages watch streams for real-time event delivery.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Porch API Server │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────┐ ┌──────────────┐ ┌──────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Clients │ ───&amp;gt; │ REST │ ───&amp;gt; │Engine│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ (kubectl, │ │ Storage │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ kpt, etc) │ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └──────────────┘ └──────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↑ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ↓ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ┌──────────────┐ ┌──────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────│ Watcher │ │Cache │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Manager │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └──────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="engine-integration">Engine Integration&lt;/h2>&lt;p>The API Server delegates all package operations to the CaD Engine:&lt;/p></description></item><item><title>Interactions with Porch APIs</title><link>/docs/5_architecture_and_components/controllers/packagevariants/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Controllers are &lt;strong>clients&lt;/strong> of the Porch API, not part of the Porch server. They run as a separate microservice, interacting
with Porch through standard Kubernetes client-go mechanisms. The controllers watch Porch API resources (PackageRevisions,
Repositories) and create/update/upgrade PackageRevisions (PackageVariant controller) and PackageVariants (PackageVariantSet
controller) through the Porch API to automate creation and management of package revisions on two levels of templating.
PackageVariants allow multiple downstream package revisions, each with its own defined customisations, to be spun off a
single upstream package revision; PackageVariantSets enable the same behaviour for PackageVariants themselves.&lt;/p></description></item><item><title>OpenTelemetry Configuration</title><link>/docs/6_configuration_and_deployments/configurations/opentelemetry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/opentelemetry/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Porch supports OpenTelemetry observability through the 
&lt;a href="https://pkg.go.dev/go.opentelemetry.io/contrib/exporters/autoexport" target="_blank">autoexport package&lt;/a>, which provides automatic configuration of metrics and traces exporters via environment variables. This enables seamless integration with various observability backends including OTLP collectors, Prometheus, and Jaeger.&lt;/p>
&lt;p>All Porch components (porch-server, porch-controllers, function-runner, and wrapper-server) support OpenTelemetry configuration through standardized environment variables as defined by the 
&lt;a href="https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/" target="_blank">OpenTelemetry specification&lt;/a>.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;strong>Current Implementation Status&lt;/strong>: Porch currently implements metrics and traces export. Logs export is not supported.

&lt;/div>

&lt;h2 id="traces-configuration">Traces Configuration&lt;/h2>&lt;h3 id="otlp-trace-export">OTLP Trace Export&lt;/h3>&lt;p>Export traces to an OpenTelemetry Protocol (OTLP) collector using either HTTP or gRPC protocols.&lt;/p></description></item><item><title>Private Registries</title><link>/docs/6_configuration_and_deployments/configurations/components/function-runner-config/private-registries-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/6_configuration_and_deployments/configurations/components/function-runner-config/private-registries-config/</guid><description>&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 KPT functions and KRM functions are synonymous terms referring to the same containerized functions.

&lt;/div>

&lt;p>Configure the Function Runner to access private container registries for KRM functions.&lt;/p>
&lt;h2 id="use-cases">Use Cases&lt;/h2>&lt;p>Private registries are commonly used for:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Enterprise environments&lt;/strong> - Internal Harbor or JFrog registries&lt;/li>
&lt;li>&lt;strong>Cloud providers&lt;/strong> - GitHub Container Registry (GHCR), AWS ECR, Azure ACR&lt;/li>
&lt;li>&lt;strong>Custom functions&lt;/strong> - Organization-specific KRM functions&lt;/li>
&lt;/ul>
&lt;h2 id="default-public-registries">Default Public Registries&lt;/h2>&lt;p>By default, Function Runner uses public registries:&lt;/p>
&lt;ul>
&lt;li>&lt;code>ghcr.io/kptdev/krm-functions-catalog&lt;/code> - GitHub Container Registry for KRM functions&lt;/li>
&lt;li>Other public registries as configured&lt;/li>
&lt;/ul>
&lt;h2 id="private-registry-authentication">Private Registry Authentication&lt;/h2>&lt;p>To use private container registries for KRM functions, configure authentication in the Function Runner.&lt;/p></description></item><item><title>Repositories Basic Usage</title><link>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-basic-usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-basic-usage/</guid><description>&lt;h2 id="basic-operations">Basic Operations&lt;/h2>&lt;p>These operations cover the fundamental commands for viewing and managing registered repositories.&lt;/p>
&lt;h3 id="list-registered-repositories">List Registered Repositories&lt;/h3>&lt;p>View all repositories registered with Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo get --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This command queries Porch for all registered repositories in the specified namespace, displays the repository type, content type, sync schedule, and status and shows the repository address.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;p>&lt;code>porchctl repo list&lt;/code> is an alias for &lt;code>porchctl repo get&lt;/code> and can be used interchangeably:&lt;/p></description></item><item><title>Task Coordination</title><link>/docs/5_architecture_and_components/engine/functionality/task-coordination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/engine/functionality/task-coordination/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine coordinates task execution by delegating to the Task Handler. Tasks represent operations that transform package content (init, clone, edit, upgrade, render). The Engine orchestrates when and how tasks are executed, while the Task Handler implements the actual transformations.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Task Coordination System │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Engine │ │ Task Handler │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Orchestration │ ───&amp;gt; │ Execution │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • When to Run │ │ • Init │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Draft Mgmt │ │ • Clone │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Error Handle │ │ • Edit │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │ • Upgrade │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ • Render │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Function │ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Runtime │ &amp;lt;─── │ Builtin Funcs │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • gRPC │ │ • set-namespace │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Builtin │ │ • ensure-context│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ └──────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="task-handler-integration">Task Handler Integration&lt;/h2>&lt;p>The Engine integrates with the Task Handler through three main operations:&lt;/p></description></item><item><title>Workspace</title><link>/docs/2_concepts/workspace/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/workspace/</guid><description>&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Important&lt;/h4>

 &lt;p>&lt;strong>Workspace is merely a unique ID for a package revision!&lt;/strong>&lt;/p>
&lt;p>The content of this page will shortly be updated to reflect this fact and moved into the PackageRevision page!&lt;/p>


&lt;/div>

&lt;h2 id="what-is-a-workspace">What is a Workspace?&lt;/h2>&lt;p>A &lt;strong>workspace&lt;/strong> is a named, isolated environment for working on a package revision in Porch. Each Draft or Proposed
package revision has a unique workspace name that identifies the specific set of changes being made to a package.&lt;/p></description></item><item><title>Cloning Package Revisions</title><link>/docs/4_tutorials_and_how-tos/working_with_package_revisions/cloning-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_package_revisions/cloning-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Find a PackageRevision to clone&lt;/li>
&lt;li>Clone a PackageRevision to a different repository&lt;/li>
&lt;li>Modify the cloned PackageRevision&lt;/li>
&lt;li>Propose and approve the new revision&lt;/li>
&lt;/ol>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 Please note the tutorial assumes repositories are initialized with the &amp;ldquo;blueprints&amp;rdquo; and &amp;ldquo;deployments&amp;rdquo; names.
We recommended to use these for simpler copy pasting of commands otherwise replace these values with your repository names in the below commands.

&lt;/div>

&lt;hr>
&lt;h2 id="understanding-clone-operations">Understanding Clone Operations&lt;/h2>&lt;p>Cloning creates a new PackageRevision based on an existing one and works &lt;strong>across different repositories&lt;/strong>. The cloned PackageRevision maintains an &lt;strong>upstream reference&lt;/strong> to its source, allowing it to receive updates.&lt;/p></description></item><item><title>Package Revision Lifecycle</title><link>/docs/2_concepts/package-revision-lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/package-revision-lifecycle/</guid><description>&lt;h2 id="what-is-package-revision-lifecycle">What is Package Revision Lifecycle?&lt;/h2>&lt;p>The &lt;strong>lifecycle&lt;/strong> of a package revision refers to its current stage in Porch&amp;rsquo;s orchestration process. A package revision
moves through different stages from creation to publication, with approval gates between stages.&lt;/p>
&lt;h2 id="lifecycle-stages">Lifecycle Stages&lt;/h2>&lt;h3 id="draft">Draft&lt;/h3>&lt;p>A package revision in &lt;strong>Draft&lt;/strong> stage is work in progress. It is being actively edited and not ready for deployment. If
it is being cached by the 
&lt;a href="/docs/5_architecture_and_components/package-cache/cr-cache/">CR cache&lt;/a>,
its contents are stored in a temporary branch in the Git repository (e.g., &lt;code>drafts/package-name/workspace&lt;/code>). If it is
being cached by the 
&lt;a href="/docs/5_architecture_and_components/package-cache/db-cache/">DB cache&lt;/a>,
its contents are only stored in the database and do not appear in Git at all.&lt;/p></description></item><item><title>Synchronizing Repositories</title><link>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-synchronization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-synchronization/</guid><description>&lt;h2 id="repository-synchronization">Repository Synchronization&lt;/h2>&lt;p>Porch periodically synchronizes with registered repositories to discover new packages and updates. You can also trigger manual synchronization when you need immediate updates.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;strong>Sync Schedule Format:&lt;/strong> Cron expressions follow the format &lt;code>minute hour day month weekday&lt;/code>. For example, &lt;code>*/10 * * * *&lt;/code> means &amp;ldquo;every 10 minutes&amp;rdquo;.

&lt;/div>

&lt;h3 id="trigger-manual-sync">Trigger Manual Sync&lt;/h3>&lt;p>Force an immediate synchronization of a repository:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo sync porch-test --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This command schedules a one-time sync (minimum 1-minute delay), updates packages from the repository. This sync is independent of the periodic sync schedule.&lt;/p></description></item><item><title>API Reference Generation</title><link>/docs/12_contributing/docs-contribution/api-ref-generation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/12_contributing/docs-contribution/api-ref-generation/</guid><description>&lt;p>Porch uses &lt;code>crd-ref-docs&lt;/code> to generate API reference documentation from Go source code.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 Only regenerate documentation when API types in &lt;code>api/porch/v1alpha1&lt;/code> are modified.

&lt;/div>

&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>Go 1.25+ installed&lt;/li>
&lt;li>Access to the Porch repository&lt;/li>
&lt;/ul>
&lt;h2 id="generate-documentation">Generate Documentation&lt;/h2>&lt;p>From the &lt;code>docs/&lt;/code> directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">make generate-api-docs-markdown
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This runs &lt;code>scripts/generate-api-reference-md.sh&lt;/code> which:&lt;/p>
&lt;ul>
&lt;li>Installs &lt;code>crd-ref-docs&lt;/code> (v2.0.0) if not present&lt;/li>
&lt;li>Generates API reference from &lt;code>api/porch/v1alpha1&lt;/code>&lt;/li>
&lt;li>Outputs to &lt;code>docs/content/en/docs/7_cli_api/api-ref.md&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="configuration">Configuration&lt;/h2>&lt;p>&lt;strong>Config:&lt;/strong> &lt;code>docs/crd-ref-docs/config.yaml&lt;/code>&lt;/p>
&lt;ul>
&lt;li>Excludes OCI types (not supported)&lt;/li>
&lt;li>Excludes standard Kubernetes metadata fields&lt;/li>
&lt;li>Uses Kubernetes v1.34 for API links&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Templates:&lt;/strong> &lt;code>docs/crd-ref-docs/markdown-templates/&lt;/code>&lt;/p></description></item><item><title>Cache Interactions</title><link>/docs/5_architecture_and_components/package-cache/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/package-cache/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Package Cache acts as an intermediary layer that coordinates between the CaDEngine, Repository Adapters, and external Git repositories. It provides caching, synchronization, and change notification services while maintaining a clean separation of concerns.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Package Cache Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────┐ ┌──────────────┐ ┌──────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ CaDEngine │ ───&amp;gt; │ Cache │ ───&amp;gt; │ Repo │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Requests │ │ Operations │ │Adapt │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │ ers │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └──────────────┘ └──────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↑ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ↓ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ┌──────────────┐ ┌──────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────│ Watcher │ │ Git │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Notifier │ │Repos │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────┘ └──────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="repository-adapter-integration">Repository Adapter Integration&lt;/h2>&lt;p>The cache wraps repository adapters to provide caching and synchronization services:&lt;/p></description></item><item><title>Unregistering Repositories</title><link>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-unregistration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-unregistration/</guid><description>&lt;h2 id="unregistering-repositories">Unregistering Repositories&lt;/h2>&lt;p>When you no longer need Porch to manage packages from a repository, you can unregister it. This removes Porch&amp;rsquo;s connection to the repository without affecting the underlying Git storage.&lt;/p>
&lt;h3 id="unregister-a-repository">Unregister a Repository&lt;/h3>&lt;p>Remove a repository from Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo unregister porch-test --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This command removes the Repository resource from Kubernetes, it stops synchronizing packages from the repository, removes Porch&amp;rsquo;s cached metadata for the repository but &lt;strong>does not delete&lt;/strong> the underlying Git repository or its contents.&lt;/p></description></item><item><title>Upgrading Package Revisions</title><link>/docs/4_tutorials_and_how-tos/working_with_package_revisions/upgrading-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_package_revisions/upgrading-packages/</guid><description>&lt;p>The package upgrade feature in Porch is a powerful mechanism for keeping deployed packages (downstream) up-to-date with their source blueprints (upstream). This guide walks through the entire workflow, from creating packages to performing an upgrade, with a special focus on the different upgrade scenarios and merge strategies.&lt;/p>
&lt;p>For detailed command reference, see the 
&lt;a href="/docs/7_cli_api/porchctl/">porchctl CLI guide&lt;/a>.&lt;/p>
&lt;h2 id="key-concepts">Key Concepts&lt;/h2>&lt;p>To understand the upgrade process, it&amp;rsquo;s essential to be familiar with the three states of a package during a merge operation:&lt;/p></description></item><item><title>Upstream &amp; Downstream</title><link>/docs/2_concepts/upstream-downstream/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/upstream-downstream/</guid><description>&lt;h2 id="what-are-upstream-and-downstream-packages">What are Upstream and Downstream Packages?&lt;/h2>&lt;p>&lt;strong>Upstream&lt;/strong> and &lt;strong>downstream&lt;/strong> describe source-to-derivation relationship between packages and package revisions in Porch.
This relationship is fundamental to package reuse, customization, upgrade control, and lifecycle management.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Upstream package&lt;/strong>: The source or template package that provides the base content&lt;/li>
&lt;li>&lt;strong>Downstream package&lt;/strong>: A derived package created by cloning or copying from an upstream package&lt;/li>
&lt;/ul>
&lt;p>This relationship enables package reuse across teams and environments, centralized maintenance of template packages, tracking of package lineage and updates, and automated propagation of upstream changes to downstream packages.&lt;/p></description></item><item><title>Deleting Package Revisions</title><link>/docs/4_tutorials_and_how-tos/working_with_package_revisions/deleting-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/4_tutorials_and_how-tos/working_with_package_revisions/deleting-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Delete Draft and Proposed PackageRevisions directly&lt;/li>
&lt;li>Propose Published PackageRevisions for deletion&lt;/li>
&lt;li>Approve or reject deletion proposals&lt;/li>
&lt;li>Understand the deletion workflow and safety mechanisms&lt;/li>
&lt;/ol>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 This tutorial assumes a porch repository is initialized with the &amp;ldquo;porch-test&amp;rdquo; name.
Replace any &amp;ldquo;porch-test&amp;rdquo; value with your repository&amp;rsquo;s name in the commands below.

&lt;/div>

&lt;hr>
&lt;h2 id="understanding-packagerevision-deletion">Understanding PackageRevision Deletion&lt;/h2>&lt;p>PackageRevision deletion in Porch follows different workflows depending on the lifecycle state:&lt;/p>
&lt;p>&lt;strong>Direct Deletion:&lt;/strong>&lt;/p></description></item><item><title>KRM Functions</title><link>/docs/2_concepts/functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/functions/</guid><description>&lt;h2 id="what-are-functions-in-porch">What are Functions in Porch?&lt;/h2>&lt;p>&lt;strong>Functions&lt;/strong> in Porch are 
&lt;a href="https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md" target="_blank">KRM (Kubernetes Resource Model) functions&lt;/a> -
containerized programs that transform or validate Kubernetes resource manifests within a package&amp;rsquo;s files. Functions are
declared in a package&amp;rsquo;s Kptfile and executed by Porch when rendering the package.&lt;/p>
&lt;p>Functions enable:&lt;/p>
&lt;ul>
&lt;li>Automated resource generation and modification&lt;/li>
&lt;li>Policy enforcement and validation&lt;/li>
&lt;li>Configuration customization without manual editing&lt;/li>
&lt;li>Repeatable, auditable transformations&lt;/li>
&lt;/ul>
&lt;p>For details on how to declare and configure functions in the Kptfile pipeline, see the 
&lt;a href="https://kpt.dev/book/04-using-functions/" target="_blank">kpt functions documentation&lt;/a>.&lt;/p></description></item><item><title>Package Variants and Package Variant Sets</title><link>/docs/2_concepts/package-variant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/2_concepts/package-variant/</guid><description>&lt;h2 id="what-are-packagevariants">What are PackageVariants?&lt;/h2>&lt;p>A &lt;strong>PackageVariant&lt;/strong> is a Kubernetes custom resource that automates the creation and maintenance of downstream package
revisions based on an upstream package. It establishes a relationship between an upstream (source) package and one or
more downstream (target) packages, automatically keeping them synchronized.&lt;/p>
&lt;p>PackageVariants enable:&lt;/p>
&lt;ul>
&lt;li>Automatic cloning of package revisions from upstream to downstream repositories&lt;/li>
&lt;li>Continuous tracking of package revisions of the upstream package&lt;/li>
&lt;li>Automated creation of new downstream revisions when a new revision of the upstream is published&lt;/li>
&lt;li>Customization of downstream package revisions through injectors, functions, and package context&lt;/li>
&lt;/ul>
&lt;h2 id="how-packagevariants-work">How PackageVariants Work&lt;/h2>&lt;p>Porch&amp;rsquo;s PackageVariant controller watches for changes to:&lt;/p></description></item></channel></rss>