diff --git a/.gitignore b/.gitignore
index fafc6168..3246f972 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,6 @@
 .envrc
 
 .DS_Store
-*.html
-search_index.json
-!google34cb7dffb22dd501.html
 
 blog/concourse.zip
 blog/assets/css/*
diff --git a/CNAME b/CNAME
new file mode 100644
index 00000000..44fd4291
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+concourse-ci.org
\ No newline at end of file
diff --git a/across-step.html b/across-step.html
new file mode 100644
index 00000000..03b1c313
--- /dev/null
+++ b/across-step.html
@@ -0,0 +1,703 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>across Step Modifier - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html"  class="self"><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="across-step.html#schema.across_var"><strong><code>across_var</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="across-step.html#schema.across_var.var"><code class="schema-attribute-name"><bold>across_var<wbr />.var</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="across-step.html#schema.across_var.values"><code class="schema-attribute-name"><bold>across_var<wbr />.values</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="across-step.html#schema.across_var.max_in_flight"><code class="schema-attribute-name"><bold>across_var<wbr />.max_in_flight</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="across-step.html#schema.across"><code class="schema-attribute-name"><bold>across</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="across-step.html#schema.fail_fast"><code class="schema-attribute-name"><bold>fail_fast</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.11.9.1.1</td>
+        <td class="title-cell"><a href="across-step.html#limitations" >Limitations</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_across-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="across-step" href="#across-step"></a><span class="section-number">1.11.9.1 </span><code>across</code> Step Modifier</h1>
+  
+
+  <p>Run a step multiple times with different combinations of variable values.</p><div class="warning">
+  <p>The <code>across</code> step is not enabled by default. To enable <code>across</code> for your deployment, you must set the feature flag <code>CONCOURSE_ENABLE_ACROSS_STEP</code>. The <code>across</code> step may be enabled by default in a future version of Concourse.</p>
+</div><p>The <code>across</code> step can be combined with the <a href="load-var-step.html"><code>load_var</code> step</a>, the <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>, and <a href="instanced-pipelines.html">instanced pipelines</a> to maintain a dynamically sized group of related pipelines.</p><p>More fields are also available for variable interpolation with the across step. See <a href="vars.html#dynamic-vars-across-step">Across Step &amp; Dynamic Vars</a> for details.</p><div class="warning">
+  <p>Outputs from steps ran within the across step are not available to steps outside of the across step.</p>
+</div><p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.across" type="checkbox" class="toggle" />
+  <label for="toggle-schema.across" class="toggle-title">
+    <a id="schema.across"></a>
+
+    <code><a class="attribute-name" href="#schema.across">across</a>: <span class="attribute-type">[<a href="across-step.html#schema.across_var"><strong>across_var</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Contains a list of <a href="across-step.html#schema.across_var"><strong><code>across_var</code></strong> schema</a>.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.across_var" href="#schema.across_var"></a><code>across_var</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.across_var.var" type="checkbox" class="toggle" />
+  <label for="toggle-schema.across_var.var" class="toggle-title">
+    <a id="schema.across_var.var"></a>
+
+    <code><a class="attribute-name" href="#schema.across_var.var">var</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of the variable that will be added to the <a href="vars.html#local-vars">&#34;<code>.</code>&#34; var source</a>. This variable will only be accessible in the scope of the step - each iteration of the step gets its own scope.</p><p>If a variable of the same name already exists in the parent scope, a warning will be printed.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.across_var.values" type="checkbox" class="toggle" />
+  <label for="toggle-schema.across_var.values" class="toggle-title">
+    <a id="schema.across_var.values"></a>
+
+    <code><a class="attribute-name" href="#schema.across_var.values">values</a>: <span class="attribute-type">[<a href="config-basics.html#schema.value"><strong>value</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The list of values that the <a href="across-step.html#schema.across_var.var">var</a> will iterate over when running the substep. If multiple <a href="across-step.html#schema.across_var">vars</a> are configured, all combinations of values across all vars will run.</p><p>The list of values may also be interpolated. For instance, you may use the <a href="load-var-step.html"><code>load_var</code> step</a> to first load a list of <a href="config-basics.html#schema.value"><strong><code>value</code></strong> schema</a> into a <a href="vars.html#local-vars">local var</a>, and then iterate across that dynamic list of values.</p><div class="toggleable example">
+  <input id="toggle-936706bced08ec604e8e6921c399b3a601c4d0d9" type="checkbox" class="toggle" />
+  <label for="toggle-936706bced08ec604e8e6921c399b3a601c4d0d9" class="toggle-title">Value combinations</label>
+  <div class="toggle-content">
+    <p>The following <a href="across-step.html#schema.across"><code class="schema-attribute-name"><bold>across</bold></code></a> will run the task <code>foo/build.yml</code> for each package defined in <code>foo/packages-to-build.json</code> with Go 1.15 and 1.16.</p><pre><code class="language-yaml">plan:
+- get: foo
+- load_var: packages
+  file: foo/packages-to-build.json
+- across:
+  - var: package
+    values: ((.:packages))
+  - var: go_version
+    values: [&#39;1.15&#39;, &#39;1.16&#39;]
+  task: build
+  file: foo/build.yml
+  vars:
+    go_version: ((.:go_version))
+    package: ((.:package))</code></pre><p>Supposing <code>foo/packages-to-build.json</code> had the following content: <pre><code class="language-json">[&#34;./cmd/first&#34;, &#34;./cmd/second&#34;, &#34;./cmd/third&#34;]</code></pre></p><p>...then the task <code>foo/build.yml</code> would be run with the following var combinations:</p><ul>
+
+  <li><p><code>{package: &#34;./cmd/first&#34;, go_version: &#34;1.15&#34;}</code></p></li>
+
+  <li><p><code>{package: &#34;./cmd/first&#34;, go_version: &#34;1.16&#34;}</code></p></li>
+
+  <li><p><code>{package: &#34;./cmd/second&#34;, go_version: &#34;1.15&#34;}</code></p></li>
+
+  <li><p><code>{package: &#34;./cmd/second&#34;, go_version: &#34;1.16&#34;}</code></p></li>
+
+  <li><p><code>{package: &#34;./cmd/third&#34;, go_version: &#34;1.15&#34;}</code></p></li>
+
+  <li><p><code>{package: &#34;./cmd/third&#34;, go_version: &#34;1.16&#34;}</code></p></li>
+
+</ul>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.across_var.max_in_flight" type="checkbox" class="toggle" />
+  <label for="toggle-schema.across_var.max_in_flight" class="toggle-title">
+    <a id="schema.across_var.max_in_flight"></a>
+
+    <code><a class="attribute-name" href="#schema.across_var.max_in_flight">max_in_flight</a>: <span class="attribute-type"><span class="schema-scalar">all</span> | <a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>1</code>.</em> If set to <code>all</code>, the substep will run with all combinations of the current var in parallel. If set to a <a href="config-basics.html#schema.number"><strong><code>number</code></strong> schema</a>, only that number of substeps may run in parallel.</p><div class="toggleable example">
+  <input id="toggle-275ef54947051d7ea02f6dccbf88a7cc147b82f0" type="checkbox" class="toggle" />
+  <label for="toggle-275ef54947051d7ea02f6dccbf88a7cc147b82f0" class="toggle-title">Multiple vars</label>
+  <div class="toggle-content">
+    <p>If multiple <a href="across-step.html#schema.across_var">vars</a> are configured, the effective <code>max_in_flight</code> is multiplicative. For instance:</p><pre><code class="language-yaml">plan:
+- across:
+  - var: var1
+    values: [a, b, c]
+    max_in_flight: all
+  - var: var2
+    values: [1, 2]
+  - var: var3
+    values: [foo, bar]
+    max_in_flight: 2</code></pre><p>Here, <strong>6 substeps</strong> will run in parallel, since all 3 of <code>var1</code>&#39;s values can run in parallel, and 2 of <code>var3</code>&#39;s values can run in parallel.</p>
+  </div>
+</div>
+  </div>
+</div>
+</div>
+  </div>
+</div> <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.fail_fast" type="checkbox" class="toggle" />
+  <label for="toggle-schema.fail_fast" class="toggle-title">
+    <a id="schema.fail_fast"></a>
+
+    <code><a class="attribute-name" href="#schema.fail_fast">fail_fast</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> When enabled, the <code>across</code> step will fail fast by returning as soon as any sub-step fails. This means that running steps will be interrupted and pending steps will no longer be scheduled.</p><div class="toggleable example">
+  <input id="toggle-21fd24ad847acd20775de29c186d71e4a2edf50c" type="checkbox" class="toggle" />
+  <label for="toggle-21fd24ad847acd20775de29c186d71e4a2edf50c" class="toggle-title">Fail fast</label>
+  <div class="toggle-content">
+    <p>The <code>fail_fast</code> key sits at the same level as the <code>across</code> key.</p><pre><code class="language-yaml">plan:
+- across:
+  - var: var1
+    values: [a, b, c]
+  - var: var2
+    values: [1, 2]
+  fail_fast: true</code></pre>
+  </div>
+</div>
+  </div>
+</div> <div class="toggleable example">
+  <input id="toggle-030293ed3bcc88c31dd4f2959b9c588a658626c1" type="checkbox" class="toggle" />
+  <label for="toggle-030293ed3bcc88c31dd4f2959b9c588a658626c1" class="toggle-title">Across with task step</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: job
+  plan:
+  - across:
+    - var: some-text
+      values: [&#34;hello-world&#34;, &#34;hello-concourse&#34;]
+    task: running-((.:some-text))
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source:
+          mirror_self: true
+      run:
+        path: echo
+        args: [&#34;((.:some-text))&#34;]</code></pre>
+  </div>
+</div> <div class="toggleable example">
+  <input id="toggle-177ce61ade96753d7d68445a637f39bc9ab8f8a2" type="checkbox" class="toggle" />
+  <label for="toggle-177ce61ade96753d7d68445a637f39bc9ab8f8a2" class="toggle-title">Across with input and output mapping</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+
+jobs:
+- name: job
+  plan:
+  - get: ci
+  - across:
+    - var: pipeline
+      values: [&#34;hello-world&#34;, &#34;time-triggered&#34;]
+    do:
+      - task: running-((.:pipeline))
+        input_mapping:
+          ((.:pipeline)): ci
+        output_mapping:
+          ((.:pipeline)): newci
+        config:
+          platform: linux
+          image_resource:
+            type: mock
+            source:
+              mirror_self: true
+          inputs:
+            - name: ((.:pipeline))
+          outputs:
+            - name: ((.:pipeline))
+          run:
+            path: cat
+            args: [&#34;((.:pipeline))/pipelines/((.:pipeline)).yml&#34;]
+      - task: newci-((.:pipeline))
+        config:
+          platform: linux
+          image_resource:
+            type: mock
+            source:
+              mirror_self: true
+          inputs:
+            - name: newci
+          run:
+            path: cat
+            args: [&#34;newci/pipelines/((.:pipeline)).yml&#34;]</code></pre>
+  </div>
+</div> <div class="toggleable example">
+  <input id="toggle-3ccc4eb9d4c3992f0d6af6ed12f18f1aaf98241b" type="checkbox" class="toggle" />
+  <label for="toggle-3ccc4eb9d4c3992f0d6af6ed12f18f1aaf98241b" class="toggle-title">Across with set_pipeline step</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+
+jobs:
+- name: job
+  plan:
+  - get: ci
+  - across:
+    - var: pipeline
+      values: [&#34;hello-world&#34;, &#34;time-triggered&#34;]
+    set_pipeline: ((.:pipeline))
+    file: ci/pipelines/((.:pipeline)).yml</code></pre>
+  </div>
+</div> <div class="toggleable example">
+  <input id="toggle-d18414970a19d6b5d7270c749362425cc873543b" type="checkbox" class="toggle" />
+  <label for="toggle-d18414970a19d6b5d7270c749362425cc873543b" class="toggle-title">Across with multiple steps</label>
+  <div class="toggle-content">
+    <p>Use the <a href="do-step.html"><code>do</code> step</a> to <code>across</code> over multiple steps. <pre><code class="language-yaml">jobs:
+- name: job
+  plan:
+  - across:
+    - var: name
+      values: [&#34;Kaladin&#34;, &#34;Jasnah&#34;]
+    do:  # takes a list of steps
+    - task: saying-hello
+      config:
+        platform: linux
+        image_resource:
+          type: mock
+          source:
+            mirror_self: true
+        run:
+          path: echo
+          args: [&#34;Hello ((.:name))!&#34;]
+    - task: saying-bye
+      config:
+        platform: linux
+        image_resource:
+          type: mock
+          source:
+            mirror_self: true
+        run:
+          path: echo
+          args: [&#34;Bye ((.:name))!&#34;]</code></pre></p>
+  </div>
+</div> <div class="toggleable example">
+  <input id="toggle-fe63c62ff2d01b195cb210e33ba22ca307198110" type="checkbox" class="toggle" />
+  <label for="toggle-fe63c62ff2d01b195cb210e33ba22ca307198110" class="toggle-title">Multi-branch workflows (instance pipelines)</label>
+  <div class="toggle-content">
+    <p>You can use the <code>across</code> step to set a pipeline for each branch in a git repository.</p><pre><code class="language-yaml">plan:
+- get: release-branches
+  trigger: true
+- get: ci
+- load_var: branches
+  file: release-branches/branches.json
+- across:
+  - var: branch
+    values: ((.:branches))
+  set_pipeline: release
+  file: ci/pipelines/release.yml
+  instance_vars: {branch: ((.:branch.name))}</code></pre><p>When a new branch is added, a new pipeline will be created. When a branch is deleted, the pipeline will be automatically archived as described in the <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>.</p><p>For a more complete example, refer to <a href="multi-branch-workflows.html">Multi-Branch Workflows</a>.</p>
+  </div>
+</div></p>
+
+  
+    
+      <div class="section" id="section_limitations">
+  
+  <h2 class="section-header"><a class="anchor-target" name="limitations" href="#limitations"></a>Limitations</h2>
+  
+
+  <p>The <code>across</code> step does not work with the <a href="get-step.html"><code>get</code> step</a> or <a href="put-step.html"><code>put</code> step</a>. The names of resouces are not interpolated within across steps. Trying to do the following will not work. <pre><code class="language-yaml">- across:
+  - var: version
+    values: [&#34;1.16&#34;, &#34;1.17&#34;]
+  do:
+    - get: go-((.:version))
+    # or this
+    - get: golang
+      resource: go-((.version))</code></pre></p><p>The main reason this does not work is that Concourse determines the inputs for a job before the job starts. Concourse has no way of determining inputs for a job while it&#39;s in the middle of running.</p><p>Current pipeline valdiation logic will also block you from setting the pipeline at all since Concourse validates the relationship between all resources and jobs by looking at get and put steps.</p><p>The above example will return an error like this when trying to set the pipeline: <pre><code class="language-">invalid jobs:
+  jobs.job.plan.do[0].across.get(go): unknown resource &#39;go-((.:version))&#39;</code></pre></p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9</span>
+              
+
+              <a href="modifier-and-hook-steps.html">Modifier And Hook Steps</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.2</span>
+              
+
+              <a href="timeout-step.html"><code>timeout</code> Step Modifier</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/administration.html b/administration.html
new file mode 100644
index 00000000..0c48aa31
--- /dev/null
+++ b/administration.html
@@ -0,0 +1,421 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Administration - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html"  class="self">Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.10</span><a href="administration.html"  class="self">Administration</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.10.1</td>
+            <td class="title-cell"><a href="administration.html#fly-workers" ><code>fly workers</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10.2</td>
+            <td class="title-cell"><a href="administration.html#fly-prune-worker" ><code>fly prune-worker</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10.3</td>
+            <td class="title-cell"><a href="administration.html#fly-land-worker" ><code>fly land-worker</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10.4</td>
+            <td class="title-cell"><a href="administration.html#fly-containers" ><code>fly containers</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10.5</td>
+            <td class="title-cell"><a href="administration.html#fly-volumes" ><code>fly volumes</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10.6</td>
+            <td class="title-cell"><a href="administration.html#fly-curl" ><code>fly curl</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_administration">
+  
+  <h1 class="section-header"><a class="anchor-target" name="administration" href="#administration"></a><span class="section-number">1.15.10 </span>Administration</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_fly-workers">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-workers" href="#fly-workers"></a><code>fly workers</code></h2>
+  
+
+  <p>To list the currently registered workers, including additional metadata, run:</p><pre><code class="language-bash">$ fly -t example workers</code></pre><p>This can be useful for monitoring the status of your workers, if you suspect that one keeps dropping out of the pool or getting tasked with too many containers, etc.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-prune-worker">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-prune-worker" href="#fly-prune-worker"></a><code>fly prune-worker</code></h2>
+  
+
+  <p>To remove a stalled, landing, landed, or retiring worker, run:</p><pre><code class="language-bash">$ fly -t example prune-worker --worker worker-name</code></pre><p>To prune <em>all</em> stalled workers, run:</p><pre><code class="language-bash">$ fly -t example prune-worker --all-stalled</code></pre><p>This is for those cases where you know a worker is not coming back. Note that running workers cannot be pruned, since they&#39;ll just re-register themselves anyway.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-land-worker">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-land-worker" href="#fly-land-worker"></a><code>fly land-worker</code></h2>
+  
+
+  <p>To initiate landing of a worker and eventually (after draining) cause it to exit, run:</p><pre><code class="language-bash">$ fly -t example land-worker --worker worker-name</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-containers">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-containers" href="#fly-containers"></a><code>fly containers</code></h2>
+  
+
+  <p>To list the active containers across all your workers, run:</p><pre><code class="language-bash">$ fly -t example containers</code></pre><p>This can be useful when discovering the containers available for <a href="builds.html#fly-intercept"><code>fly intercept</code></a>ing.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-volumes">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-volumes" href="#fly-volumes"></a><code>fly volumes</code></h2>
+  
+
+  <p>To list the active volumes across all your workers, run:</p><pre><code class="language-bash">$ fly -t example volumes</code></pre><p>This can be useful to observe the caches warming across your cluster, and could be a good indicator of disk use.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-curl">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-curl" href="#fly-curl"></a><code>fly curl</code></h2>
+  
+
+  <p>To execute an arbirary API request, you can run something like the following:</p><pre><code class="language-bash">$ fly -t example curl /api/v1/info</code></pre><p>This command is just a shim that runs <code>curl</code> under the hood. To pass flags to <code>curl</code>, pass a <code>--</code> argument after the path so that <code>fly</code> can distinguish them from its own flags:</p><pre><code class="language-bash">$ fly -t example curl /api/v1/builds -- \
+    -X PUT \
+    -H &#34;Content-type: application/json&#34; \
+    -d @plan.json</code></pre><p>Note: if you use this command the assumption is that you know what you&#39;re doing. If you find yourself using this command often, let us know - perhaps there&#39;s a missing command!</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.9</span>
+              
+
+              <a href="global-resources.html">Global Resources</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.16</span>
+              
+
+              <a href="observation.html">Observation</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/attempts-step.html b/attempts-step.html
new file mode 100644
index 00000000..1c07b74c
--- /dev/null
+++ b/attempts-step.html
@@ -0,0 +1,417 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>attempts Step Modifier - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html"  class="self"><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="attempts-step.html#schema.attempts"><code class="schema-attribute-name"><bold>attempts</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_attempts-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="attempts-step" href="#attempts-step"></a><span class="section-number">1.11.9.3 </span><code>attempts</code> Step Modifier</h1>
+  
+
+  <p>The total number of times a step should be tried before it should fail, e.g. <code>5</code> will run the step up to 5 times before giving up.</p><p>Attempts will retry on a Concourse error as well as build failure. When the number of attempts is reached and the step has still not succeeded then the step will fail.</p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.attempts" type="checkbox" class="toggle" />
+  <label for="toggle-schema.attempts" class="toggle-title">
+    <a id="schema.attempts"></a>
+
+    <code><a class="attribute-name" href="#schema.attempts">attempts</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-6a672e24ff94ce1912779b6edcc15add748dbe58" type="checkbox" class="toggle" />
+  <label for="toggle-6a672e24ff94ce1912779b6edcc15add748dbe58" class="toggle-title">Retrying a task</label>
+  <div class="toggle-content">
+    <p>The following will run the task and retry it up to 9 times (for a total of 10 attempts) if it fails:</p><pre><code class="language-yaml">plan:
+- get: foo
+- task: unit
+  file: foo/unit.yml
+  attempts: 10</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-1dedb210264ad4f8a387aaf1fdd1e4bce7141434" type="checkbox" class="toggle" />
+  <label for="toggle-1dedb210264ad4f8a387aaf1fdd1e4bce7141434" class="toggle-title">Retrying with a timeout</label>
+  <div class="toggle-content">
+    <p>When used in combination with <code>timeout</code>, the timeout applies to <em>each</em> step.</p><p>This semi-arbitary decision was made because often things either succeed in a reasonable amount of time or fail due to hanging/flakiness. In this case it seems more useful to allow each attempt the allotted timeout rather than have one very long attempt prevent more attempts.</p><pre><code class="language-yaml">plan:
+- get: flake
+- task: flaky-tests
+  file: flake/integration.yml
+  timeout: 10m
+  attempts: 3</code></pre>
+  </div>
+</div>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.2</span>
+              
+
+              <a href="timeout-step.html"><code>timeout</code> Step Modifier</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.4</span>
+              
+
+              <a href="tags-step.html"><code>tags</code> Step Modifier</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/auth.html b/auth.html
new file mode 100644
index 00000000..9889bbde
--- /dev/null
+++ b/auth.html
@@ -0,0 +1,570 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Auth &amp; Teams - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="self">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="self">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html" >Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="auth" href="#auth"></a><span class="section-number">1.3 </span>Auth &amp; Teams</h1>
+  
+
+  <p>A single Concourse installation can accomodate many projects and users.</p><p>Pipelines, builds, and all other user data are owned by <em>teams</em>. A team is just a conceptual owner and a separate namespace, tied to an authorization config. For example, a team may authorize all members of the <code>concourse</code> GitHub organization to be a <a href="user-roles.html#team-member-role">member</a>.</p><p>When a user authenticates, each team&#39;s authorization config is checked against the user to determine which <a href="user-roles.html">role</a>, if any, to grant for the team. This information is then stored in the user&#39;s token to determine access control for future requests.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.1</span>
+      <a href="main-team.html">The <code>main</code> team</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2</span>
+      <a href="configuring-auth.html">Configuring Auth</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.2.1</span>
+      <a href="local-auth.html">Local User auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.2</span>
+      <a href="github-auth.html">GitHub auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.3</span>
+      <a href="gitlab-auth.html">GitLab auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.4</span>
+      <a href="bitbucket-cloud-auth.html">BitBucket Cloud auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.5</span>
+      <a href="cf-uaa-auth.html">CF/UAA auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.6</span>
+      <a href="ldap-auth.html">LDAP auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.7</span>
+      <a href="microsoft-auth.html">Microsoft auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.8</span>
+      <a href="generic-oidc-auth.html">Generic OIDC auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.9</span>
+      <a href="generic-oauth.html">Generic oAuth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.10</span>
+      <a href="generic-saml-auth.html">Generic SAML auth</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3</span>
+      <a href="managing-teams.html">Managing Teams</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.3.1</span>
+      <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.3.1.1</span>
+      <a href="managing-teams.html#setting-roles">Setting User Roles</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.2</span>
+      <a href="managing-teams.html#fly-active-users"><code>fly active-users</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.3</span>
+      <a href="managing-teams.html#fly-teams"><code>fly teams</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.4</span>
+      <a href="managing-teams.html#fly-get-team"><code>fly get-team</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.5</span>
+      <a href="managing-teams.html#fly-rename-team"><code>fly rename-team</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.6</span>
+      <a href="managing-teams.html#fly-destroy-team"><code>fly destroy-team</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4</span>
+      <a href="user-roles.html">User Roles &amp; Permissions</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.4.1</span>
+      <a href="user-roles.html#concourse-admin">Concourse Admin</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.2</span>
+      <a href="user-roles.html#team-owner-role"><code>owner</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.3</span>
+      <a href="user-roles.html#team-member-role"><code>member</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.4</span>
+      <a href="user-roles.html#team-pipeline-operator-role"><code>pipeline-operator</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.5</span>
+      <a href="user-roles.html#team-viewer-role"><code>viewer</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.6</span>
+      <a href="user-roles.html#action-matrix">Action Matrix</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.7</span>
+      <a href="user-roles.html#configuring-rbac">Configuring RBAC</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.5</span>
+      <a href="exposing.html">Pipeline &amp; Build Visibility</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.6</span>
+      <a href="teams-caveats.html">Security Caveats</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.2</span>
+              
+
+              <a href="install.html">Install</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.1</span>
+              
+
+              <a href="main-team.html">The <code>main</code> team</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/aws-asm-credential-manager.html b/aws-asm-credential-manager.html
new file mode 100644
index 00000000..78c5c02f
--- /dev/null
+++ b/aws-asm-credential-manager.html
@@ -0,0 +1,635 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The AWS Secrets Manager credential manager - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html"  class="self">The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.15.4.4.1</td>
+        <td class="title-cell"><a href="aws-asm-credential-manager.html#configuration" >Configuration</a></td>
+      </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-access-key"><strong><code>aws-secretsmanager-access-key</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-secret-key"><strong><code>aws-secretsmanager-secret-key</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-session-token"><strong><code>aws-secretsmanager-session-token</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-region"><strong><code>aws-secretsmanager-region</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-pipeline-secret-template"><strong><code>aws-secretsmanager-pipeline-secret-template</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-team-secret-template"><strong><code>aws-secretsmanager-team-secret-template</code></strong></a></td>
+        </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.4.2</td>
+        <td class="title-cell"><a href="aws-asm-credential-manager.html#saving-credentials-in-aws" >Saving credentials in AWS</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.4.3</td>
+        <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-iam-permissions" >IAM Permissions</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.4.4</td>
+        <td class="title-cell"><a href="aws-asm-credential-manager.html#credential-lookup-rules" >Credential Lookup Rules</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.4.5</td>
+        <td class="title-cell"><a href="aws-asm-credential-manager.html#aws-secretsmanager-scaling" >Scaling</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_aws-asm-credential-manager">
+  
+  <h1 class="section-header"><a class="anchor-target" name="aws-asm-credential-manager" href="#aws-asm-credential-manager"></a><span class="section-number">1.15.4.4 </span>The AWS Secrets Manager credential manager</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Configuration</h2>
+  
+
+  <p>In order to integrate with AWS Secrets Manager for credential management, the web node must be configured with:</p><ul>
+
+  <li><p>an access key and secret key, or a session token</p></li>
+
+  <li><p>the AWS region that your parameters are stored within.</p></li>
+
+</ul><p>If no access key, secret key, or session token is provided, Concourse will attempt to use environment variables or the instance credentials assigned to the instance.</p><p>The web node&#39;s configuration specifies the following:</p><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-secretsmanager-access-key"></a>
+    <pre><a href="aws-asm-credential-manager.html#aws-secretsmanager-access-key"><strong>aws-secretsmanager-access-key</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A valid AWS access key.</p><p>Environment variable <code>CONCOURSE_AWS_SECRETSMANAGER_ACCESS_KEY</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-secretsmanager-secret-key"></a>
+    <pre><a href="aws-asm-credential-manager.html#aws-secretsmanager-secret-key"><strong>aws-secretsmanager-secret-key</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The secret key that corresponds to the access key defined above.</p><p>Environment variable <code>CONCOURSE_AWS_SECRETSMANAGER_SECRET_KEY</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-secretsmanager-session-token"></a>
+    <pre><a href="aws-asm-credential-manager.html#aws-secretsmanager-session-token"><strong>aws-secretsmanager-session-token</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A valid AWS session token.</p><p>Environment variable <code>CONCOURSE_AWS_SECRETSMANAGER_SESSION_TOKEN</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-secretsmanager-region"></a>
+    <pre><a href="aws-asm-credential-manager.html#aws-secretsmanager-region"><strong>aws-secretsmanager-region</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The AWS region that requests to Secrets Manager will be sent to.</p><p>Environment variable <code>CONCOURSE_AWS_SECRETSMANAGER_REGION</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-secretsmanager-pipeline-secret-template"></a>
+    <pre><a href="aws-asm-credential-manager.html#aws-secretsmanager-pipeline-secret-template"><strong>aws-secretsmanager-pipeline-secret-template</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The base path used when attempting to locate a pipeline-level secret.</p><p>Environment variable <code>CONCOURSE_AWS_SECRETSMANAGER_PIPELINE_SECRET_TEMPLATE</code>.</p><p>Example:</p><p>Default: <code>/concourse/{{.Team}}/{{.Pipeline}}/{{.Secret}}</code></p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-secretsmanager-team-secret-template"></a>
+    <pre><a href="aws-asm-credential-manager.html#aws-secretsmanager-team-secret-template"><strong>aws-secretsmanager-team-secret-template</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The base path used when attempting to locate a team-level secret.</p><p>Environment variable <code>CONCOURSE_AWS_SECRETSMANAGER_TEAM_SECRET_TEMPLATE</code>.</p><p>Example:</p><p>Default: <code>/concourse/{{.Team}}/{{.Secret}}</code></p>
+  </div>
+</div><p>For example, to launch the ATC and enable Secrets Manager, you may configure:</p><pre><code class="language-bash">concourse web ... \
+  --aws-secretsmanager-region us-east-1 \
+  --aws-secretsmanager-access-key AKIAIOSFODNN7EXAMPLE \
+  --aws-secretsmanager-secret-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+
+# or use env variables
+CONCOURSE_AWS_SECRETSMANAGER_REGION=&#34;us-east-1&#34; \
+CONCOURSE_AWS_SECRETSMANAGER_ACCESS_KEY=&#34;AKIAIOSFODNN7EXAMPLE&#34; \
+CONCOURSE_AWS_SECRETSMANAGER_SECRET_KEY=&#34;wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&#34; \
+concourse web ...</code></pre><p>A more secure method is to configure an <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html">IAM role</a> for your EC2 ATC instance so that credentials are fetched automatically from the EC2 metadata service.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_saving-credentials-in-aws">
+  
+  <h2 class="section-header"><a class="anchor-target" name="saving-credentials-in-aws" href="#saving-credentials-in-aws"></a>Saving credentials in AWS</h2>
+  
+
+  <p>It seems to be best to use the &#39;other type of secret&#39; option and the &#39;plaintext&#39; entry (otherwise your secrets will be interpolated as JSON) for best results. Make sure your secret locations match the lookup templates exactly; include the leading <code>/</code>, for example.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_aws-secretsmanager-iam-permissions">
+  
+  <h2 class="section-header"><a class="anchor-target" name="aws-secretsmanager-iam-permissions" href="#aws-secretsmanager-iam-permissions"></a>IAM Permissions</h2>
+  
+
+  <p>The following is an example of an IAM policy that can be used to grant permissions to an IAM user or instance role. Note that the <code>Resource</code> section can contain a wildcard to a secret or be restricted to an individual secret. In order for the health check to work properly (see <a href="aws-asm-credential-manager.html#aws-secretsmanager-scaling">Scaling</a>), Concourse needs to have access to the <code>__concourse-health-check</code> secret.</p><pre><code class="language-json">{
+    &#34;Version&#34;: &#34;2012-10-17&#34;,
+    &#34;Statement&#34;: [
+        {
+        &#34;Sid&#34;: &#34;AllowAccessToSecretManagerParameters&#34;,
+        &#34;Effect&#34;: &#34;Allow&#34;,
+        &#34;Action&#34;: [
+            &#34;secretsmanager:ListSecrets&#34;
+        ],
+          &#34;Resource&#34;: &#34;*&#34;
+        },
+        {
+            &#34;Sid&#34;: &#34;AllowAccessGetSecret&#34;,
+            &#34;Effect&#34;: &#34;Allow&#34;,
+            &#34;Action&#34;: [
+                &#34;secretsmanager:GetSecretValue&#34;,
+                &#34;secretsmanager:DescribeSecret&#34;
+            ],
+            &#34;Resource&#34;: [
+                &#34;arn:aws:secretsmanager:*:*:secret:/concourse/*&#34;,
+                &#34;arn:aws:secretsmanager:*:*:secret:__concourse-health-check-??????&#34;
+            ]
+        }
+    ]
+}</code></pre><p>If you wish to restrict concourse to only have access to secrets for a specific pipeline, you can replace <code>&#34;arn:aws:secretsmanager:*:*:secret:/concourse/*&#34;</code> in the example above with</p><pre><code class="language-json">&#34;arn:aws:secretsmanager:*:*:secret:/concourse/TEAM_NAME/*&#34;,
+&#34;arn:aws:secretsmanager:*:*:secret:/concourse/TEAM_NAME/PIPELINE_NAME/*&#34;,</code></pre><p>where <code>TEAM_NAME</code> and <code>PIPELINE_NAME</code> are replaced with the team and name of the pipeline in question.</p><p>For more information on how to use IAM roles to restrict access to Secrets Manager, review the <a href="https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_identity-based-policies.html">official documentation</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_credential-lookup-rules">
+  
+  <h2 class="section-header"><a class="anchor-target" name="credential-lookup-rules" href="#credential-lookup-rules"></a>Credential Lookup Rules</h2>
+  
+
+  <p>When resolving a parameter such as <code>((foo_param))</code>, Concourse will look in the following paths, in order:</p><ul>
+
+  <li><pre><code class="language-">/concourse/TEAM_NAME/PIPELINE_NAME/foo_param</code></pre></li>
+
+  <li><pre><code class="language-">/concourse/TEAM_NAME/foo_param</code></pre></li>
+
+</ul><p>The leading <code>/concourse</code> can be changed by specifying <code>--aws-secretsmanager-pipeline-secret-template</code> or <code>--aws-secretsmanager-team-secret-template</code> variables.</p><p>Note that if Concourse does not have <a href="aws-asm-credential-manager.html#aws-secretsmanager-iam-permissions">permission</a> to access the pipeline-scoped paths, then credential lookups will fail even for credentials which are stored at the team level.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_aws-secretsmanager-scaling">
+  
+  <h2 class="section-header"><a class="anchor-target" name="aws-secretsmanager-scaling" href="#aws-secretsmanager-scaling"></a>Scaling</h2>
+  
+
+  <p>If your cluster has a large workload, in particular if there are many resources, Concourse can generate a lot of traffic to AWS and subsequently get rate-limited.</p><p>As long as Concourse has permission to get the value of the <code>__concourse-health-check</code> secret, you should be able to measure an error rate by polling the <code>/api/v1/info/creds</code> endpoint when authenticated as a <a href="user-roles.html#concourse-admin">Concourse Admin</a>.</p><p>Depending on your workflow for updating secrets and your reliability requirements it may be worth <a href="creds-caching.html">Caching credentials</a> and/or <a href="creds-retry-logic.html">Retrying failed fetches</a> to mitigate rate-limit-related errors.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.3</span>
+              
+
+              <a href="aws-ssm-credential-manager.html">The AWS SSM credential manager</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.5</span>
+              
+
+              <a href="kubernetes-credential-manager.html">Kubernetes Credential Manager</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/aws-ssm-credential-manager.html b/aws-ssm-credential-manager.html
new file mode 100644
index 00000000..ba9ae31c
--- /dev/null
+++ b/aws-ssm-credential-manager.html
@@ -0,0 +1,593 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The AWS SSM credential manager - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html"  class="self">The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.15.4.3.1</td>
+        <td class="title-cell"><a href="aws-ssm-credential-manager.html#configuration" >Configuration</a></td>
+      </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-ssm-credential-manager.html#aws-ssm-access-key"><strong><code>aws-ssm-access-key</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-ssm-credential-manager.html#aws-ssm-secret-key"><strong><code>aws-ssm-secret-key</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-ssm-credential-manager.html#aws-ssm-session-token"><strong><code>aws-ssm-session-token</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-ssm-credential-manager.html#aws-ssm-region"><strong><code>aws-ssm-region</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-ssm-credential-manager.html#aws-ssm-pipeline-secret-template"><strong><code>aws-ssm-pipeline-secret-template</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="aws-ssm-credential-manager.html#aws-ssm-team-secret-template"><strong><code>aws-ssm-team-secret-template</code></strong></a></td>
+        </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.3.2</td>
+        <td class="title-cell"><a href="aws-ssm-credential-manager.html#iam-permissions" >IAM Permissions</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.3.3</td>
+        <td class="title-cell"><a href="aws-ssm-credential-manager.html#credential-lookup-rules" >Credential Lookup Rules</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_aws-ssm-credential-manager">
+  
+  <h1 class="section-header"><a class="anchor-target" name="aws-ssm-credential-manager" href="#aws-ssm-credential-manager"></a><span class="section-number">1.15.4.3 </span>The AWS SSM credential manager</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Configuration</h2>
+  
+
+  <p>The ATC is configured with an access key and secret key or session token and the AWS region that your parameters are stored within. If no access key, secret key, or session token is provided, Concourse will attempt to use environment variables or the instance credentials assigned to the instance.</p><p>The ATC&#39;s configuration specifies the following:</p><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-ssm-access-key"></a>
+    <pre><a href="aws-ssm-credential-manager.html#aws-ssm-access-key"><strong>aws-ssm-access-key</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A valid AWS access key.</p><p>Environment variable <code>CONCOURSE_AWS_SSM_ACCESS_KEY</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-ssm-secret-key"></a>
+    <pre><a href="aws-ssm-credential-manager.html#aws-ssm-secret-key"><strong>aws-ssm-secret-key</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The secret key that corresponds to the access key defined above.</p><p>Environment variable <code>CONCOURSE_AWS_SSM_SECRET_KEY</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-ssm-session-token"></a>
+    <pre><a href="aws-ssm-credential-manager.html#aws-ssm-session-token"><strong>aws-ssm-session-token</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A valid AWS session token.</p><p>Environment variable <code>CONCOURSE_AWS_SSM_SESSION_TOKEN</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-ssm-region"></a>
+    <pre><a href="aws-ssm-credential-manager.html#aws-ssm-region"><strong>aws-ssm-region</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The AWS region that requests to parameter store will be sent to.</p><p>Environment variable <code>CONCOURSE_AWS_SSM_REGION</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-ssm-pipeline-secret-template"></a>
+    <pre><a href="aws-ssm-credential-manager.html#aws-ssm-pipeline-secret-template"><strong>aws-ssm-pipeline-secret-template</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The base path used when attempting to locate a pipeline-level secret.</p><p>Environment variable <code>CONCOURSE_AWS_SSM_PIPELINE_SECRET_TEMPLATE</code>.</p><p>Example:</p><p>Default: <code>/concourse/{{.Team}}/{{.Pipeline}}/{{.Secret}}</code></p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="aws-ssm-team-secret-template"></a>
+    <pre><a href="aws-ssm-credential-manager.html#aws-ssm-team-secret-template"><strong>aws-ssm-team-secret-template</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The base path used when attempting to locate a team-level secret.</p><p>Environment variable <code>CONCOURSE_AWS_SSM_TEAM_SECRET_TEMPLATE</code>.</p><p>Example:</p><p>Default: <code>/concourse/{{.Team}}/{{.Secret}}</code></p>
+  </div>
+</div><p>For example, to launch the ATC and enable the parameter store, you may configure:</p><pre><code class="language-bash">concourse web ... \
+  --aws-ssm-region us-east-1 \
+  --aws-ssm-access-key AKIAIOSFODNN7EXAMPLE \
+  --aws-ssm-secret-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+
+# or use env variables
+CONCOURSE_AWS_SSM_REGION=&#34;us-east-1&#34; \
+CONCOURSE_AWS_SSM_ACCESS_KEY=&#34;AKIAIOSFODNN7EXAMPLE&#34; \
+CONCOURSE_AWS_SSM_SECRET_KEY=&#34;wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&#34; \
+concourse web ...</code></pre><p>A more secure method is to configure an <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html">IAM role</a> for your EC2 ATC instance so that credentials are fetched automatically from the EC2 metadata service.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_iam-permissions">
+  
+  <h2 class="section-header"><a class="anchor-target" name="iam-permissions" href="#iam-permissions"></a>IAM Permissions</h2>
+  
+
+  <p>The following is an example of an IAM policy that can be used to grant permissions to an IAM user or instance role. Note that the <code>Resource</code> section can contain a wildcard to a parameter or be restricted to an individual parameter.</p><pre><code class="language-json">{
+&#34;Version&#34;: &#34;2012-10-17&#34;,
+&#34;Statement&#34;: [
+    {
+        &#34;Sid&#34;: &#34;AllowAccessToSsmParameters&#34;,
+        &#34;Effect&#34;: &#34;Allow&#34;,
+        &#34;Action&#34;: [
+            &#34;ssm:GetParameter&#34;,
+            &#34;ssm:GetParametersByPath&#34;
+        ],
+        &#34;Resource&#34;: [
+            &#34;arn:aws:ssm:::parameter/concourse/*&#34;,
+            &#34;arn:aws:ssm:::parameter/concourse/TEAM_NAME/*&#34;,
+            &#34;arn:aws:ssm:::parameter/concourse/TEAM_NAME/PIPELINE_NAME/*&#34;
+        ]
+    },
+    {
+        &#34;Sid&#34;: &#34;AllowAccessToDecryptSsmParameters&#34;,
+        &#34;Effect&#34;: &#34;Allow&#34;,
+        &#34;Action&#34;: [
+            &#34;kms:Decrypt&#34;,
+            &#34;kms:DescribeKey&#34;
+        ],
+        &#34;Resource&#34;: &#34;arn:aws:kms:::key/KMS_KEY_ID&#34;
+    },
+    {
+        &#34;Sid&#34;: &#34;AllowListKeys&#34;,
+        &#34;Effect&#34;: &#34;Allow&#34;,
+        &#34;Action&#34;: [
+            &#34;kms:ListAliases&#34;,
+            &#34;kms:ListKeys&#34;
+        ],
+        &#34;Resource&#34;: &#34;*&#34;
+    }
+]
+}</code></pre><p>Note that the <code>TEAM_NAME</code>, <code>PIPELINE_NAME</code>, and <code>KMS_KEY_ID</code> text above should be replaced to fit your Concourse setup.</p><p>For more information on how to use IAM roles to restrict access to SSM parameters, review the <a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html">official documentation</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_credential-lookup-rules">
+  
+  <h2 class="section-header"><a class="anchor-target" name="credential-lookup-rules" href="#credential-lookup-rules"></a>Credential Lookup Rules</h2>
+  
+
+  <p>When resolving a parameter such as <code>((foo_param))</code>, Concourse will look in the following paths, in order:</p><ul>
+
+  <li><pre><code class="language-">/concourse/TEAM_NAME/PIPELINE_NAME/foo_param</code></pre></li>
+
+  <li><pre><code class="language-">/concourse/TEAM_NAME/foo_param</code></pre></li>
+
+</ul><p>The leading <code>/concourse</code> can be changed by specifying <code>--aws-ssm-pipeline-secret-template</code> or <code>--aws-ssm-team-secret-template</code> variables.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.2</span>
+              
+
+              <a href="credhub-credential-manager.html">The CredHub credential manager</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.4</span>
+              
+
+              <a href="aws-asm-credential-manager.html">The AWS Secrets Manager credential manager</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/basic-git-operations.html b/basic-git-operations.html
new file mode 100644
index 00000000..1fdaea8a
--- /dev/null
+++ b/basic-git-operations.html
@@ -0,0 +1,418 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Basic Git Operations - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html" >Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html"  class="active">Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.2</span><a href="git-guides.html"  class="active">Git Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.2.1</td>
+            <td class="title-cell"><a href="basic-git-operations.html"  class="self">Basic Git Operations</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2.2</td>
+            <td class="title-cell"><a href="multi-branch-workflows.html" >Multi-Branch Workflows</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_basic-git-operations">
+  
+  <h1 class="section-header"><a class="anchor-target" name="basic-git-operations" href="#basic-git-operations"></a><span class="section-number">1.14.2.1 </span>Basic Git Operations</h1>
+  
+
+  <p>All of these examples use the <a href="https://github.com/concourse/git-resource">concourse/git-resource</a> image. That image is probably the most popular git resource for Concourse since it is shipped in the <a href="https://hub.docker.com/r/concourse/concourse">concourse/concourse</a> image and in the tarball on the <a href="https://github.com/concourse/concourse/releases">GitHub release page</a>. It is not the only resource available for working with git-related resources. If you don&#39;t see your use-case on this page then there is probably another resource that you can use. For example, Pull Request workflows can be accomplished with the <a href="https://github.com/telia-oss/github-pr-resource">teliaoss/github-pr-resource</a>.</p><p>Check out the <a href="https://github.com/concourse/git-resource">docs</a> for the git resource for all configuration options.</p>
+
+  
+    
+      <div class="section" id="section_fetching-a-repository">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fetching-a-repository" href="#fetching-a-repository"></a>Fetching a Repository</h2>
+  
+
+  <p>Here is how you fetch the contents of a git repository and use it in a task.</p><pre><code class="language-yaml">resources:
+- name: concourse-examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples
+
+jobs:
+- name: read-the-readme
+  plan:
+  - get: concourse-examples
+  - task: cat-readme
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      inputs: # pass concourse-examples into this task step
+      - name: concourse-examples
+      run:
+        path: cat
+        args: [&#34;concourse-examples/README.md&#34;]</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_creating-commits-and-tags">
+  
+  <h2 class="section-header"><a class="anchor-target" name="creating-commits-and-tags" href="#creating-commits-and-tags"></a>Creating Commits and Tags</h2>
+  
+
+  <p>Here&#39;s a simple way to create a commit using a bash script.</p><pre><code class="language-yaml">resources:
+- name: repo-main
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/user/my-repo
+    branch: main
+
+jobs:
+- name: create-a-commit
+  plan:
+  - get: repo-main
+  - task: commit-and-tag
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: gitea/gitea # use any image that has the git cli
+      inputs:
+      - name: repo-main
+      outputs:
+      # to pass the commit to the following steps specify
+      # the &#34;repo-main&#34; as an output as well
+      - name: repo-main
+      run:
+        path: sh
+        args:
+        - -cx
+        # this is just a bash script
+        - |
+          cd repo-main
+          # edit a file / make a change
+          date &#43;%Y-%m-%d &gt; todays-date
+          git add ./todays-date
+          git commit -m &#34;Add todays date&#34;
+          git tag v0.1.6
+  # push commit and tag
+  - put: repo-main
+    params:
+      # specify the &#34;repo-main&#34; artifact as the location
+      repository: repo-main</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_merging-branches">
+  
+  <h2 class="section-header"><a class="anchor-target" name="merging-branches" href="#merging-branches"></a>Merging Branches</h2>
+  
+
+  <p>Here is how you can merge two branches. Common if you are using <a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow">gitflow</a> and need to merge a <code>dev</code> branch into <code>main</code> every so often.</p><pre><code class="language-yaml">resources:
+- name: repo-main
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/user/my-repo
+    branch: main
+
+- name: repo-dev
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/user/my-repo
+    branch: dev
+
+jobs:
+- name: merge-dev-into-main
+  plan:
+  - get: repo-dev
+  - put: repo-main
+    params:
+      repository: repo-dev
+      merge: true</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.2</span>
+              
+
+              <a href="git-guides.html">Git Guides</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.2.2</span>
+              
+
+              <a href="multi-branch-workflows.html">Multi-Branch Workflows</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/bitbucket-cloud-auth.html b/bitbucket-cloud-auth.html
new file mode 100644
index 00000000..2096666f
--- /dev/null
+++ b/bitbucket-cloud-auth.html
@@ -0,0 +1,420 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>BitBucket Cloud auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html"  class="self">BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_bitbucket-cloud-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="bitbucket-cloud-auth" href="#bitbucket-cloud-auth"></a><span class="section-number">1.3.2.4 </span>BitBucket Cloud auth</h1>
+  
+
+  <p>A Concourse server can authenticate against BitBucket Cloud to leverage its permission model.</p>
+
+  
+    
+      <div class="section" id="section_bitbucket-cloud-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="bitbucket-cloud-authentication" href="#bitbucket-cloud-authentication"></a>Authentication</h2>
+  
+
+  <p>First, you&#39;ll need to <a href="https://confluence.atlassian.com/display/BITBUCKET/OAuth&#43;on&#43;Bitbucket&#43;Cloud">create an OAuth consumer on Bitbucket Cloud</a>.</p><p>The consumer will need the following permissions:</p><ul>
+
+  <li><p>Account:</p><ul>
+
+  <li><p>Email</p></li>
+
+  <li><p>Read</p></li>
+
+</ul></li>
+
+  <li><p>Team membership:</p><ul>
+
+  <li><p>Read</p></li>
+
+</ul></li>
+
+</ul><p>The &#34;Callback URL&#34; must be the URL of your Concourse server with <code>/sky/issuer/callback</code> appended. This address must be reachable by BitBucket Cloud - it can&#39;t be <code>localhost</code>.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>You will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the <a href="concourse-web.html"><code>web</code> node</a> by setting the following env:</p><pre><code class="language-bash">CONCOURSE_BITBUCKET_CLOUD_CLIENT_ID=myclientid
+CONCOURSE_BITBUCKET_CLOUD_CLIENT_SECRET=myclientsecret</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_bitbucket-cloud-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="bitbucket-cloud-authorization" href="#bitbucket-cloud-authorization"></a>Authorization</h2>
+  
+
+  <p>BitBucket users and teams can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--bitbucket-cloud-user=LOGIN</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--bitbucket-cloud-team=TEAM_NAME</code></dt>
+    <dd><p>Authorize an entire organization&#39;s members.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --bitbucket-cloud-user my-bitbucket-login \
+    --bitbucket-cloud-team my-bitbucket-team</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  bitbucket-cloud:
+    users: [&#34;my-bitbucket-login&#34;]
+    teams: [&#34;my-bitbucket-team&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>BitBucket users and teams can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_BITBUCKET_CLOUD_USER=my-bitbucket-login
+CONCOURSE_MAIN_TEAM_BITBUCKET_CLOUD_TEAM=my-bitbucket-team</code></pre><p>Multiple teams and users may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.3</span>
+              
+
+              <a href="gitlab-auth.html">GitLab auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.5</span>
+              
+
+              <a href="cf-uaa-auth.html">CF/UAA auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/build-tracker.html b/build-tracker.html
new file mode 100644
index 00000000..18e89893
--- /dev/null
+++ b/build-tracker.html
@@ -0,0 +1,312 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Build Tracker - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html"  class="active">Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.17</span><a href="internals.html"  class="active">Internals</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.1</td>
+            <td class="title-cell"><a href="internals.html#basic-architecture" >Basic architecture</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2</td>
+            <td class="title-cell"><a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.3</td>
+            <td class="title-cell"><a href="internals.html#component-tsa" >TSA: worker registration &amp; forwarding</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.4</td>
+            <td class="title-cell"><a href="internals.html#architecture-worker" >Workers Architecture</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.2.1</td>
+            <td class="title-cell"><a href="checker.html" >Resource Checker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.2</td>
+            <td class="title-cell"><a href="scheduler.html" >Build Scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.3</td>
+            <td class="title-cell"><a href="build-tracker.html"  class="self">Build Tracker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.4</td>
+            <td class="title-cell"><a href="garbage-collector.html" >Garbage Collector</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_build-tracker">
+  
+  <h1 class="section-header"><a class="anchor-target" name="build-tracker" href="#build-tracker"></a><span class="section-number">1.17.2.3 </span>Build Tracker</h1>
+  
+
+  <p>The build tracker is the component that runs the execution of a build. It picks up any started builds, which can be orphaned builds (builds that an ATC started but did not finish) or builds that have just been scheduled. There is one build tracker per ATC, which runs on an interval that is defaulted to 10 seconds.</p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.17.2.2</span>
+              
+
+              <a href="scheduler.html">Build Scheduler</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.17.2.4</span>
+              
+
+              <a href="garbage-collector.html">Garbage Collector</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/building-an-image-and-using-it-in-a-task.html b/building-an-image-and-using-it-in-a-task.html
new file mode 100644
index 00000000..2c605e83
--- /dev/null
+++ b/building-an-image-and-using-it-in-a-task.html
@@ -0,0 +1,392 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Building an Image and Using it in a Task - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html" >Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html"  class="active">Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.3</span><a href="container-image-guides.html"  class="active">Container Image Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.3.1</td>
+            <td class="title-cell"><a href="building-and-pushing-an-image.html" >Building and Pushing an Image</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3.2</td>
+            <td class="title-cell"><a href="building-an-image-and-using-it-in-a-task.html"  class="self">Building an Image and Using it in a Task</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_building-an-image-and-using-it-in-a-task">
+  
+  <h1 class="section-header"><a class="anchor-target" name="building-an-image-and-using-it-in-a-task" href="#building-an-image-and-using-it-in-a-task"></a><span class="section-number">1.14.3.2 </span>Building an Image and Using it in a Task</h1>
+  
+
+  <p>This guide will show you how to build and use an image within one <a href="jobs.html">job</a> without pushing the image to an external image registry like Docker Hub.</p>
+
+  
+    
+      <div class="section" id="section_build-the-image">
+  
+  <h2 class="section-header"><a class="anchor-target" name="build-the-image" href="#build-the-image"></a>Build The Image</h2>
+  
+
+  <p>To avoid repeating ourselves we&#39;re going to use the pipeline made in the other guide <a href="building-and-pushing-an-image.html">Building and Pushing an Image</a>. We will start with the pipeline from the <a href="building-and-pushing-an-image.html#defining-the-build-context">Defining the Build Context</a> section.</p><p>We will add the <code>UNPACK_ROOTFS</code> parameter to the task. This paramter tells the <a href="https://github.com/concourse/oci-build-task">oci-build-task</a> to include the image in a special format that Concourse&#39;s container runtime uses. <em>In the future this may not be necessary if Concourse starts using the OCI image format.</em></p><p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-and-use-image.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources:
+# The repo with our Dockerfile
+- name: concourse-examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git
+    branch: master
+
+jobs:
+- name: build-and-run
+  plan:
+  - get: concourse-examples
+  - task: build-image
+    privileged: true # oci-build-task must run in a privileged container
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task
+      inputs:
+      - name: concourse-examples
+      outputs:
+      - name: image
+      params:
+        CONTEXT: concourse-examples/Dockerfiles/simple
+        UNPACK_ROOTFS: true #add this param
+      run: # binary used to build the image
+        path: build</code></pre>
+</div> <div style="margin: 0 2em 1em" class="inset"></div></p><p>The above pipeline will build a container image and also output it in Concourse&#39;s rootfs image format.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_use-the-image">
+  
+  <h2 class="section-header"><a class="anchor-target" name="use-the-image" href="#use-the-image"></a>Use the Image</h2>
+  
+
+  <p>Next we want to add a second task to this job which will use the image generated from the first task as its container image. To use the image from the previous step add the top-level <a href="task-step.html#schema.task.image">image</a> key to the <a href="task-step.html#schema.task.task">task step</a>.</p><p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-and-use-image.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources: ...  # omitting for brevity
+
+jobs:
+- name: build-and-run
+  plan:
+  - get: concourse-examples
+  - task: build-image
+    privileged: true
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task
+      inputs:
+      - name: concourse-examples
+      outputs:
+      - name: image
+      params:
+        CONTEXT: concourse-examples/Dockerfiles/simple
+        UNPACK_ROOTFS: true
+      run:
+        path: build
+  - task: use-built-image-in-task  # add a new task step
+    image: image  # using the image built in the previous step
+    config:
+      platform: linux
+      run:
+        path: cat
+        args: [&#34;/stranger&#34;]</code></pre>
+</div> <div style="margin: 0 2em 1em" class="inset"></div></p><p>You can set the pipeline with the following fly command.</p><pre><code class="language-bash">fly -t &lt;target&gt; set-pipeline -p build-and-use-image \
+  -c ./build-and-use-image.yml \</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.3.1</span>
+              
+
+              <a href="building-and-pushing-an-image.html">Building and Pushing an Image</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15</span>
+              
+
+              <a href="operation.html">Operation</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/building-and-pushing-an-image.html b/building-and-pushing-an-image.html
new file mode 100644
index 00000000..86a495a9
--- /dev/null
+++ b/building-and-pushing-an-image.html
@@ -0,0 +1,608 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Building and Pushing an Image - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html" >Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html"  class="active">Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.3</span><a href="container-image-guides.html"  class="active">Container Image Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.3.1</td>
+            <td class="title-cell"><a href="building-and-pushing-an-image.html"  class="self">Building and Pushing an Image</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3.2</td>
+            <td class="title-cell"><a href="building-an-image-and-using-it-in-a-task.html" >Building an Image and Using it in a Task</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_building-and-pushing-an-image">
+  
+  <h1 class="section-header"><a class="anchor-target" name="building-and-pushing-an-image" href="#building-and-pushing-an-image"></a><span class="section-number">1.14.3.1 </span>Building and Pushing an Image</h1>
+  
+
+  <p>In this guide we are going to show how to build and publish container images using the <a href="https://github.com/concourse/oci-build-task">oci-build task</a> and <a href="https://github.com/concourse/registry-image-resource">registry-image resource</a>. This guide assumes you understand how to build container images with <a href="https://docs.docker.com/engine/reference/builder/">Dockerfile&#39;s</a> and publish to <a href="https://hub.docker.com/">Docker Hub</a> or another image registry using the docker cli.</p><blockquote class="aside"><p>This is one way of building and pushing images. There are many other ways to accomplish this same task in Concourse.</p></blockquote><p>First we need a Dockerfile. You can store this in your own repo or reference the <a href="https://github.com/concourse/examples">github.com/concourse/examples</a> repo. The rest of this post assumes you use the examples repo. All files in this blog post can be found in the examples repo.</p>
+
+  
+    
+      <div class="section" id="section_the-dockerfile">
+  
+  <h2 class="section-header"><a class="anchor-target" name="the-dockerfile" href="#the-dockerfile"></a>The Dockerfile</h2>
+  
+
+  <div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>Dockerfile</code>
+  </div>
+
+  <pre><code class="language-dockerfile">FROM busybox
+
+RUN echo &#34;I&#39;m simple!&#34;
+COPY ./stranger /stranger
+RUN cat /stranger</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_defining-pipeline-resources">
+  
+  <h2 class="section-header"><a class="anchor-target" name="defining-pipeline-resources" href="#defining-pipeline-resources"></a>Defining Pipeline Resources</h2>
+  
+
+  <p>Now we can start building out our pipeline. Let&#39;s declare our <a href="resources.html">Resources</a> first. We will need one resource to pull in the repo where our Dockerfile is located, and a second resource pointing to where we want to push the built container image to.</p><em><p>There are some <a href="pipeline-vars-example.html#variables">Variables</a> in this file that we will fill out when setting the pipeline.</p></em><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources:
+# The repo with our Dockerfile
+- name: concourse-examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git
+    branch: master
+
+# Where we will push the image to
+- name: simple-image
+  type: registry-image
+  icon: docker
+  source:
+    repository: ((image-repo-name))/simple-image
+    tag: latest
+    username: ((registry-username))
+    password: ((registry-password))</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_create-the-job">
+  
+  <h2 class="section-header"><a class="anchor-target" name="create-the-job" href="#create-the-job"></a>Create the Job</h2>
+  
+
+  <p>Next we will create a <a href="jobs.html">job</a> that will build and push our container image.</p><p>To build the job we will need to pull in the repo where the <code>Dockerfile</code> is.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources: ... # omitting resource section from above
+
+jobs:
+- name: build-and-push
+  plan:
+  - get: concourse-examples</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_build-the-image">
+  
+  <h2 class="section-header"><a class="anchor-target" name="build-the-image" href="#build-the-image"></a>Build the Image</h2>
+  
+
+  <p>The second step in our job will build the container image.</p><p>To build the container image we are going to use the <a href="https://github.com/concourse/oci-build-task">oci-build-task</a>. The <a href="https://github.com/concourse/oci-build-task">oci-build-task</a> is a container image that is meant to be used in a Concourse <a href="tasks.html">task</a> to build other container images. Check out the <a href="https://github.com/concourse/oci-build-task/blob/master/README.md">README</a> in the repo for more details on how to configure and use the oci-build-task in more complex build scenarios.</p><p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources: ... # omitting resource section from above
+
+jobs:
+- name: build-and-push
+  plan:
+  - get: concourse-examples
+  - task: build-image
+    privileged: true # oci-build-task must run in a privileged container
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task</code></pre>
+</div> <div style="margin: 0 2em 1em" class="inset"></div></p><p>Next we will add <a href="https://github.com/concourse/examples">concourse-examples</a> as an <a href="tasks.html#schema.task-config.inputs">input</a> to the build task to ensure the artifact from the <a href="get-step.html">get step</a> (where our <code>Dockerfile</code> is fetched) is mounted in our <code>build-image</code> step.</p><p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources: ... # omitting resource section from above
+
+jobs:
+- name: build-and-push
+  plan:
+  - get: concourse-examples
+  - task: build-image
+    privileged: true # oci-build-task must run in a privileged container
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task
+      inputs:
+      - name: concourse-examples</code></pre>
+</div> <div style="margin: 0 2em 1em" class="inset"></div></p><p>The oci-build-task <a href="https://github.com/concourse/oci-build-task#outputs">outputs the built container image</a> in a directory called <code>image</code>. Let&#39;s add image as an output of our task so we can publish it in a later step.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources: ... # omitting resource section from above
+
+jobs:
+- name: build-and-push
+  plan:
+  - get: concourse-examples
+  - task: build-image
+    privileged: true # oci-build-task must run in a privileged container
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task
+      inputs:
+      - name: concourse-examples
+      outputs:
+      - name: image</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_defining-the-build-context">
+  
+  <h2 class="section-header"><a class="anchor-target" name="defining-the-build-context" href="#defining-the-build-context"></a>Defining the Build Context</h2>
+  
+
+  <p>Next we need to tell the <code>oci-build-task</code> what the <a href="https://docs.docker.com/engine/reference/commandline/build/">build context</a> of our <code>Dockerfile</code> is. The <a href="https://github.com/concourse/oci-build-task">README</a> goes over a few other methods of creating your build context. We are going to use the simplest use-case. By specifying <code>CONTEXT</code> the <code>oci-build-task</code> assumes a <code>Dockerfile</code> and its build context are in the same directory.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources: ... # omitting resource section from above
+
+jobs:
+- name: build-and-push
+  plan:
+  - get: concourse-examples
+  - task: build-image
+    privileged: true # oci-build-task must run in a privileged container
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task
+      inputs:
+      - name: concourse-examples
+      outputs:
+      - name: image
+      params:
+        CONTEXT: concourse-examples/Dockerfiles/simple
+      run: # binary used to build the image
+        path: build</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_publish-the-container-image">
+  
+  <h2 class="section-header"><a class="anchor-target" name="publish-the-container-image" href="#publish-the-container-image"></a>Publish the Container Image</h2>
+  
+
+  <p>To push the container image add a <a href="put-step.html">put step</a> to our job plan and tell the registry-image resource where the tarball of the container image is.</p><p>The put step will push the container image using the information defined previously in the resource&#39;s <a href="resources.html#schema.resource.source">source</a>.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources: ... # omitting resource section from above
+
+jobs:
+- name: build-and-push
+  plan:
+  - get: concourse-examples
+  - task: build-image
+    privileged: true # oci-build-task must run in a privileged container
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task
+      inputs:
+      - name: concourse-examples
+      outputs:
+      - name: image
+      params:
+        CONTEXT: concourse-examples/Dockerfiles/simple
+      run: # binary used to build the image
+        path: build
+  - put: simple-image
+    params:
+      image: image/image.tar</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_the-entire-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="the-entire-pipeline" href="#the-entire-pipeline"></a>The Entire Pipeline</h2>
+  
+
+  <p>Putting all the pieces together, here is our pipeline that builds and pushes a container image.</p><p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>build-push.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources:
+# The repo with our Dockerfile
+- name: concourse-examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git
+    branch: master
+
+# Where we will push the image
+- name: simple-image
+  type: registry-image
+  icon: docker
+  source:
+    repository: ((image-repo-name))/simple-image
+    tag: latest
+    username: ((registry-username))
+    password: ((registry-password))
+
+jobs:
+- name: build-and-push
+  plan:
+  - get: concourse-examples
+  - task: build-task-image
+    privileged: true
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: concourse/oci-build-task
+      inputs:
+      - name: concourse-examples
+      outputs:
+      - name: image
+      params:
+        CONTEXT: concourse-examples/Dockerfiles/simple
+      run:
+        path: build
+  - put: simple-image
+    params:
+      image: image/image.tar</code></pre>
+</div> <div style="margin: 0 2em 1em" class="inset"></div></p><p>You can set the pipeline with the following fly command, updating the variable values with real values the pipeline can use to run.</p><pre><code class="language-bash">fly -t &lt;target&gt; set-pipeline -p build-and-push-image \
+  -c ./examples/pipelines/build-and-push-simple-image.yml \
+  --var image-repo-name=&lt;repo-name&gt; \
+  --var registry-username=&lt;user&gt; \
+  --var registry-password=&lt;password&gt;</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_further-readings">
+  
+  <h2 class="section-header"><a class="anchor-target" name="further-readings" href="#further-readings"></a>Further Readings</h2>
+  
+
+  <p>Understanding what the build context is is important when building container images. You can read <a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#understand-build-context">Dockerfile Best Practices</a> for more details about build contexts.</p><p>The <a href="https://github.com/concourse/oci-build-task#inputs">inputs section</a> of the oci-build-task&#39;s <code>README</code> has examples on how to create a build context with multiple inputs and other complex build scenarios.</p><p>Read the <code>README</code>&#39;s in the <a href="https://github.com/concourse/oci-build-task">oci-build-task</a> and <a href="https://github.com/concourse/registry-image-resource/">registry-image resource</a> to learn more about their other configuration options.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.3</span>
+              
+
+              <a href="container-image-guides.html">Container Image Guides</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.3.2</span>
+              
+
+              <a href="building-an-image-and-using-it-in-a-task.html">Building an Image and Using it in a Task</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/builds.html b/builds.html
new file mode 100644
index 00000000..5d600aee
--- /dev/null
+++ b/builds.html
@@ -0,0 +1,420 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Builds - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html"  class="self">Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.13</span><a href="builds.html"  class="self">Builds</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.13.1</td>
+            <td class="title-cell"><a href="builds.html#build-rerunning" >Rerunning a Build</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13.2</td>
+            <td class="title-cell"><a href="builds.html#fly-builds" ><code>fly builds</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13.3</td>
+            <td class="title-cell"><a href="builds.html#fly-intercept" ><code>fly intercept</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13.4</td>
+            <td class="title-cell"><a href="builds.html#fly-abort-build" ><code>fly abort-build</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13.5</td>
+            <td class="title-cell"><a href="builds.html#fly-watch" ><code>fly watch</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_builds">
+  
+  <h1 class="section-header"><a class="anchor-target" name="builds" href="#builds"></a><span class="section-number">1.13 </span>Builds</h1>
+  
+
+  <p>A build is an execution of a <em>build plan</em>, which is either</p><ul>
+
+  <li><p>configured as a sequence of <a href="steps.html">steps</a> in a <a href="jobs.html">job</a></p></li>
+
+  <li><p>generated by the <a href="checker.html">Resource Checker</a> to run a <a href="implementing-resource-types.html#resource-check"><code>check</code></a></p></li>
+
+  <li><p>submitted directly to Concourse as a one-off build via <a href="tasks.html#running-tasks"><code>fly execute</code></a></p></li>
+
+</ul><p>Containers and volumes are created as <a href="get-step.html"><code>get</code> step</a>s, <a href="put-step.html"><code>put</code> step</a>s, and <a href="task-step.html"><code>task</code> step</a>s run. When a build completes successfully, these containers go away.</p><p>A failed build&#39;s containers and volumes are kept around so that you can debug the build via <a href="builds.html#fly-intercept"><code>fly intercept</code></a>. If the build belongs to a <a href="jobs.html">job</a>, the containers will go away when the next build starts. If the build is a one-off, its containers will be removed immediately, so make sure you intercept while it&#39;s running, if you want to debug.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.13.1</span>
+      <a href="builds.html#build-rerunning">Rerunning a Build</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.13.1.1</span>
+      <a href="builds.html#current-caveats-with-rerunning">Current caveats with rerunning</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.2</span>
+      <a href="builds.html#fly-builds"><code>fly builds</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.3</span>
+      <a href="builds.html#fly-intercept"><code>fly intercept</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.4</span>
+      <a href="builds.html#fly-abort-build"><code>fly abort-build</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.5</span>
+      <a href="builds.html#fly-watch"><code>fly watch</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_build-rerunning">
+  
+  <h2 class="section-header"><a class="anchor-target" name="build-rerunning" href="#build-rerunning"></a>Rerunning a Build</h2>
+  
+
+  <p>Concourse supports build rerunning, which means to run a new build using the exact same set of input versions as the original build. There are two ways to rerun a build: through the web UI on the builds page and through the <a href="jobs.html#fly-rerun-build"><code>fly rerun-build</code></a>.</p><p>When a build is rerun, it will create a new build using the name of the original build with the rerun number appended to it, e.g. <code>3.1</code> for the first rerun of build <code>3</code>.</p><p>Rerun builds are ordered chronologically after the original build, rather than becoming a new &#34;latest&#34; build. Similarly, when the scheduler is resolving <a href="get-step.html#schema.get.passed"><code>passed</code></a> constraints that reference a job with rerun builds, those rerun builds are processed in this same order. This ensures that the versions, which made it through a rerun build, do not become the new &#34;latest versions&#34;. Instead, they act as if the original build had succeeded at its point in the build history.</p><p>This may sound a little confusing, but the summary is that reruns should behave as if they replace the original failed build.</p>
+
+  
+    
+      <div class="section" id="section_current-caveats-with-rerunning">
+  
+  <h3 class="section-header"><a class="anchor-target" name="current-caveats-with-rerunning" href="#current-caveats-with-rerunning"></a>Current caveats with rerunning</h3>
+  
+
+  <p>The current implementation of rerunning is an early iteration with one key limitation: a rerun build will use the <strong>current state of the job config</strong>, instead of running the exact build plan the original build ran with.</p><p>This means that if the <a href="jobs.html#schema.job.plan"><code class="schema-attribute-name"><bold>job<wbr />.plan</bold></code></a> has changed in a way that is backwards-incompatible, the rerun build may error. For example, if a new input is added, its version will not be available as the original build did not use it.</p><p>There are future plans to have reruns execute the exact build plan from the original build. If you are interested in tracking the progress for the second pass at rerunning builds - or contributing yourself! - the project epic is called <a href="https://project.concourse-ci.org/projects/MDc6UHJvamVjdDM3NjI5MTk=">Build Lifecycle View</a>.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-builds">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-builds" href="#fly-builds"></a><code>fly builds</code></h2>
+  
+
+  <p>To list the most recent builds, run:</p><pre><code class="language-bash">$ fly -t example builds</code></pre><p>To list the builds of a job, run:</p><pre><code class="language-bash">$ fly -t example builds -j pipeline-name/job-name</code></pre><p>This can be useful for periodically monitoring the state of a job. The output also works well with tools like <code>awk</code> and <code>grep</code>.</p><p>By default the most recent 50 builds are shown. To see more builds, use the <code>-c</code> flag, like so:</p><pre><code class="language-bash">$ fly -t example builds -c 100</code></pre><p>To see builds within a certain time range, you can use <code>--since</code> and <code>--until</code>. You can use one or both flags to filter builds. The flags accept a time format of <code>yyyy-mm-dd HH:mm:ss</code>.</p><pre><code class="language-bash">$ fly -t example builds --since &#39;2006-02-06 00:00:00&#39;</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-intercept">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-intercept" href="#fly-intercept"></a><code>fly intercept</code></h2>
+  
+
+  <p>Sometimes it&#39;s helpful to connect to the machine where tasks run. This way you can either profile or inspect tasks, or see the state of the machine at the end of a run. Due to Concourse running tasks in containers on remote machines this would typically be hard to access.</p><p>To this end, there is a <code>fly intercept</code> command that will give you an interactive shell inside the specified container. Containers are identified by a few things, so you may need to specify a few flags to hone down the results. If there are multiple containers that the flags could refer to, an interactive prompt will show up allowing you to disambiguate.</p><p>For example, running the following will run a task and then enter the finished task&#39;s container:</p><pre><code class="language-bash">$ fly -t example execute
+$ fly -t example intercept --step build</code></pre><blockquote class="aside"><p>When intercepting a task running on a Windows worker, you will need to specifically tell fly to to run <code>powershell</code>:</p><pre><code class="language-bash">$ fly -t example intercept powershell</code></pre></blockquote><p>Containers are around for a short time after a build finishes in order to allow people to intercept them.</p><p>You can also intercept builds that were run in your pipeline. By using <code>--job</code>, <code>--build</code>, and <code>--step</code> you can intercept a specific step from a build of a job in your pipeline. These flags also have short forms, like so:</p><pre><code class="language-bash">$ fly -t example intercept -j some-pipeline/some-job -b some-build -s some-step</code></pre><p>Note that <code>--build</code> can be omitted, and will default to the most recent build of the job. One-off builds can be reached by passing in their build ID to <code>--build</code> which can be found on the build list page.</p><p>The <code>--step</code> flag can also be omitted; this will let you pick the step interactively, if you don&#39;t know the exact name.</p><p>Resource checking containers can also be intercepted with <code>--check</code> or <code>-c</code>:</p><pre><code class="language-bash">$ fly -t example intercept --check some-pipeline/some-resource</code></pre><p>A specific command can also be given, e.g. <code>fly intercept ps auxf</code> or <code>fly intercept htop</code>. This allows for patterns such as <code>watch fly intercept ps auxf</code>, which will continuously show the process tree of the current build&#39;s task, even as the &#34;current build&#34; changes.</p><p>The working directory and any relevant environment variables (e.g. those having come from <a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a>) used by the original process will also be used for the process run by intercept.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-abort-build">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-abort-build" href="#fly-abort-build"></a><code>fly abort-build</code></h2>
+  
+
+  <p>To abort a build of a job, run:</p><pre><code class="language-bash">$ fly -t example abort-build --job my-pipeline/my-job --build 3</code></pre><p>This will cancel build <code>3</code> of the <code>my-job</code> job in the <code>my-pipeline</code> pipeline.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-watch">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-watch" href="#fly-watch"></a><code>fly watch</code></h2>
+  
+
+  <p>Concourse emits streaming colored logs on the website, but it can be helpful to have the logs available to the command line (e.g. so that they can be processed by other commands).</p><p>The <code>watch</code> command can be used to do just this. You can also view builds that are running in your pipeline, or builds that have already finished.</p><p>Note that unlike <a href="tasks.html#running-tasks"><code>fly execute</code></a>, killing <code>fly watch</code> via <code>SIGINT</code> or <code>SIGTERM</code> will <em>not</em> abort the build.</p><p>To watch the most recent one-off build, just run <code>fly watch</code> with no arguments. To watch a specific build (one-off or no), pass <code>--build</code> with the ID of the build to watch. This ID is available at the start of <a href="tasks.html#running-tasks"><code>fly execute</code></a>&#39;s output or by browsing to the builds list in the web UI.</p><p>By using the <code>--job</code> and <code>--build</code> flags you can pick out a specific build of a job to watch. For example, the following command will either show the archived logs for an old build, if it has finished running, or it will stream the current logs, if the build is still in progress.</p><pre><code class="language-bash">$ fly -t example watch --job my-pipeline/tests --build 52</code></pre><p>If the <code>--job</code> flag is specified and <code>--build</code> is omitted, the most recent build of the specified job will be selected.</p><p>If there is a mismatch between the <code>fly</code> and <code>web</code> versions, it is possible to run into <code>failed to parse next event: unknown event type</code> error. The <code>--ignore-event-parsing-errors</code> flag can be passed to ignore such errors. </p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.12</span>
+              
+
+              <a href="tasks.html">Tasks</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14</span>
+              
+
+              <a href="how-to-guides.html">How-To Guides</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/cf-uaa-auth.html b/cf-uaa-auth.html
new file mode 100644
index 00000000..5aeb2bb6
--- /dev/null
+++ b/cf-uaa-auth.html
@@ -0,0 +1,438 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>CF/UAA auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html"  class="self">CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_cf-uaa-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="cf-uaa-auth" href="#cf-uaa-auth"></a><span class="section-number">1.3.2.5 </span>CF/UAA auth</h1>
+  
+
+  <p>Cloud Foundry (CF) auth can be used for operators who wish to authenticate their users configured against their Cloud Foundry instance via the UAA auth component.</p>
+
+  
+    
+      <div class="section" id="section_cf-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="cf-authentication" href="#cf-authentication"></a>Authentication</h2>
+  
+
+  <p>You&#39;ll need to configure your UAA with a <code>concourse</code> client by setting the following under <a href="http://bosh.io/jobs/uaa?source=github.com/cloudfoundry/uaa-release#p=uaa.clients"><code>uaa.clients</code></a>:</p><pre><code class="language-yaml">concourse:
+  id: myclientid
+  secret: myclientsecret
+  scope: openid,cloud_controller.read
+  authorized-grant-types: &#34;authorization_code,refresh_token&#34;
+  access-token-validity: 3600
+  refresh-token-validity: 3600
+  redirect-uri: https://concourse.example.com/sky/issuer/callback</code></pre><p>The value for <code>redirect-uri</code> must be the external URL of your Concourse server with <code>/sky/issuer/callback</code> appended.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>Next, you&#39;ll need to take the same client ID and secret and configure it on the <a href="concourse-web.html"><code>web</code> node</a> by setting the following env:</p><pre><code class="language-bash">CONCOURSE_CF_API_URL=http://mycf.example.com
+CONCOURSE_CF_CLIENT_ID=myclientid
+CONCOURSE_CF_CLIENT_SECRET=myclientsecret</code></pre><p>Note: if you&#39;re integrating with Cloud Foundry, you&#39;re <em>probably</em> also deploying Concourse via BOSH - in which case you&#39;ll want to set the <a href="https://bosh.io/jobs/atc?source=github.com/concourse/concourse-bosh-release#p=cf_auth.client_id"><code>cf_auth.*</code></a> properties in your manifest instead of setting the above env.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_cf-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="cf-authorization" href="#cf-authorization"></a>Authorization</h2>
+  
+
+  <p>CloudFoundry users and org/space members can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--cf-user=USERNAME</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--cf-org=ORG_NAME</code></dt>
+    <dd><p>Authorize an entire organization&#39;s members. Members will need to be part of a Space inside the organization.</p></dd>
+  
+  <dt><code>--cf-space=ORG_NAME:SPACE_NAME</code></dt>
+    <dd><p>Deprecated in favor of <code>--cf-space-with-developer-role</code>. Authorize the members with <code>developer</code> role of a space within an organization.</p></dd>
+  
+  <dt><code>--cf-space-with-any-role=ORG_NAME:SPACE_NAME</code></dt>
+    <dd><p>Authorize the members with any role of a space within an organization.</p></dd>
+  
+  <dt><code>--cf-space-with-developer-role=ORG_NAME:SPACE_NAME</code></dt>
+    <dd><p>Authorize the members with <code>developer</code> role of a space within an organization.</p></dd>
+  
+  <dt><code>--cf-space-with-auditor-role=ORG_NAME:SPACE_NAME</code></dt>
+    <dd><p>Authorize the members with <code>auditor</code> role of a space within an organization.</p></dd>
+  
+  <dt><code>--cf-space-with-manager-role=ORG_NAME:SPACE_NAME</code></dt>
+    <dd><p>Authorize the members with <code>manager</code> role of a space within an organization.</p></dd>
+  
+  <dt><code>--cf-space-guid=SPACE_GUID</code></dt>
+    <dd><p>Authorize the members with any role of a space within an organization by space GUID.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --cf-user my-username \
+    --cf-org my-org \
+    --cf-space my-other-org:my-space</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  cf:
+    users: [&#34;my-username&#34;]
+    orgs: [&#34;my-org&#34;]
+    spaces: [&#34;my-other-org:my-space&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_adding-cf-users-to-the-main-team">
+  
+  <h3 class="section-header"><a class="anchor-target" name="adding-cf-users-to-the-main-team" href="#adding-cf-users-to-the-main-team"></a>Adding CF Users to the <code>main</code> Team</h3>
+  
+
+  <p>CloudFoundry users and org/space members can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_CF_USER=username
+CONCOURSE_MAIN_TEAM_CF_ORG=org-name
+CONCOURSE_MAIN_TEAM_CF_SPACE=org-name:space-name
+CONCOURSE_MAIN_TEAM_CF_SPACE_WITH_ANY_ROLE=org-name:space-name
+CONCOURSE_MAIN_TEAM_CF_SPACE_WITH_DEVELOPER_ROLE=org-name:space-name
+CONCOURSE_MAIN_TEAM_CF_SPACE_WITH_AUDITOR_ROLE=org-name:space-name
+CONCOURSE_MAIN_TEAM_CF_SPACE_WITH_MANAGER_ROLE=org-name:space-name
+CONCOURSE_MAIN_TEAM_CF_SPACE_GUID=SPACE_GUID</code></pre><p>Multiple users, spaces, etc. may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.4</span>
+              
+
+              <a href="bitbucket-cloud-auth.html">BitBucket Cloud auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.6</span>
+              
+
+              <a href="ldap-auth.html">LDAP auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/checker.html b/checker.html
new file mode 100644
index 00000000..7ae00171
--- /dev/null
+++ b/checker.html
@@ -0,0 +1,334 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Resource Checker - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html"  class="active">Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.17</span><a href="internals.html"  class="active">Internals</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.1</td>
+            <td class="title-cell"><a href="internals.html#basic-architecture" >Basic architecture</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2</td>
+            <td class="title-cell"><a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.3</td>
+            <td class="title-cell"><a href="internals.html#component-tsa" >TSA: worker registration &amp; forwarding</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.4</td>
+            <td class="title-cell"><a href="internals.html#architecture-worker" >Workers Architecture</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.2.1</td>
+            <td class="title-cell"><a href="checker.html"  class="self">Resource Checker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.2</td>
+            <td class="title-cell"><a href="scheduler.html" >Build Scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.3</td>
+            <td class="title-cell"><a href="build-tracker.html" >Build Tracker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.4</td>
+            <td class="title-cell"><a href="garbage-collector.html" >Garbage Collector</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_checker">
+  
+  <h1 class="section-header"><a class="anchor-target" name="checker" href="#checker"></a><span class="section-number">1.17.2.1 </span>Resource Checker</h1>
+  
+
+  <p><a href="resources.html">Resources</a> represent external state such as a git repository, files in an S3 bucket, or anything else that changes over time. By modelling these as resources, it allows you to use this external state as inputs (or triggers) to your workloads.</p>
+
+  
+    
+      <div class="section" id="section_when-are-resources-checked">
+  
+  <h2 class="section-header"><a class="anchor-target" name="when-are-resources-checked" href="#when-are-resources-checked"></a>When are resources checked?</h2>
+  
+
+  <p>The component that schedules resource checks is called the <strong>resource checker</strong>. The rate at which these checks happen is called the check interval (configurable via <code>CONCOURSE_LIDAR_SCANNER_INTERVAL</code>).  There&#39;s an obvious tradeoff, whereby the more frequently you poll, the bigger the strain on Concourse (as well as the external source). However, if you want to pick up those new commits as quickly as possible, then you need to poll as often as possible.</p><p>The resource checker uses the <a href="resources.html#schema.resource.check_every"><code class="schema-attribute-name"><bold>resource<wbr />.check_every</bold></code></a> interval in order to figure out if a resource needs to be checked. A resource&#39;s <code>check_every</code> interval dictates how often it should be checked for new versions, with a default of 1 minute. If that seems like a lot of checking, it is, but it&#39;s how Concourse keeps everything snappy. You can configure this interval independently for each resource using <code>check_every</code>.</p><p>If your external service supports it, you can set <a href="resources.html#schema.resource.webhook_token"><code class="schema-attribute-name"><bold>resource<wbr />.webhook_token</bold></code></a> to eliminate the need for periodic checking altogether. If a <code>webhook_token</code> is configured, the external service can notify Concourse when to check for new versions. Note that configuring a <code>webhook_token</code> will not stop Concourse from periodically checking your resource. If you wish to rely solely on webhooks for detecting new versions, you can set <code>check_every</code> to <code>never</code>.</p><p>On every interval tick, the resource checker will see if there are any resources that need to be checked. It does this by first finding resources which are used as inputs to jobs, and then comparing the current time against the last time each resource was checked. If it has been longer than a resource&#39;s configured <code>check_every</code> interval, a new check will be scheduled. In practice this means that if a resource has a <code>check_every</code> of <code>1m</code>, it is not guaranteed to be checked precisely every 60 seconds. <code>check_every</code> simply sets a lower bound on the time between checks.</p><p>When the resource checker finds a resource to check (either because its <code>check_every</code> interval elapsed, or because its configured <code>webhook_token</code> was triggered), it schedules a new <a href="builds.html">build</a> that invokes the <a href="implementing-resource-types.html#resource-check"><code>check</code> script</a> of the resource&#39;s underlying <a href="resource-types.html">resource type</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_what-resources-produce">
+  
+  <h2 class="section-header"><a class="anchor-target" name="what-resources-produce" href="#what-resources-produce"></a>What do resource checks produce?</h2>
+  
+
+  <p>The whole point of running checks is to produce versions. Concourse&#39;s <a href="scheduler.html">Build Scheduler</a> is centered around the idea of resource versions. It&#39;s how Concourse determines that something is <em>new</em> and a new build needs to be triggered.</p><p>The versions produced by each resource are unique to the underlying <a href="resource-types.html">resource type</a>. For instance, the <code>git</code> resource type uses commit SHAs as versions. The <code>registry-image</code> resource uses the image digest and tag in the version.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+
+              <a href="internals.html#component-atc">ATC: web UI &amp; build scheduler</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.17.2.2</span>
+              
+
+              <a href="scheduler.html">Build Scheduler</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/common-pipeline-practices.html b/common-pipeline-practices.html
new file mode 100644
index 00000000..a3f76f35
--- /dev/null
+++ b/common-pipeline-practices.html
@@ -0,0 +1,459 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Common Pipeline Practices - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html"  class="active">Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.1</span><a href="pipeline-guides.html"  class="active">Pipeline Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1.1</td>
+            <td class="title-cell"><a href="common-pipeline-practices.html"  class="self">Common Pipeline Practices</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.2</td>
+            <td class="title-cell"><a href="exploring-task-input-and-output-scenarios.html" >Exploring Task Input and Output Scenarios</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.3</td>
+            <td class="title-cell"><a href="gated-pipeline-patterns.html" >Gated Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.4</td>
+            <td class="title-cell"><a href="time-triggered-pipeline-patterns.html" >Time Triggered Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.5</td>
+            <td class="title-cell"><a href="manual-approval-step.html" >Manual Approval Step</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_common-pipeline-practices">
+  
+  <h1 class="section-header"><a class="anchor-target" name="common-pipeline-practices" href="#common-pipeline-practices"></a><span class="section-number">1.14.1.1 </span>Common Pipeline Practices</h1>
+  
+
+  <p>The following are practices that we see a lot of people use in their pipelines. These are by no means &#34;Best&#34; practices, they are simply common and may or may not work for you and your team.</p>
+
+  
+    
+      <div class="section" id="section_parallelizing-get-steps-in-jobs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="parallelizing-get-steps-in-jobs" href="#parallelizing-get-steps-in-jobs"></a>Parallelizing Get Steps in Jobs</h2>
+  
+
+  <p>All jobs usually have <a href="get-step.html">get steps</a> as their first set of steps.</p><pre><code class="language-yaml">jobs:
+- name: awesome-job
+  plan:
+  - get: cool-code
+  - get: funny-binary
+  - get: the-weather
+  - task: business-stuff</code></pre><p>To reduce the waiting time to the length of the longest running get step, put all get steps under an <a href="in-parallel-step.html"><code>in_parallel</code> step</a>.</p><pre><code class="language-yaml">jobs:
+- name: awesome-job
+  plan:
+  - in_parallel:
+    - get: cool-code
+    - get: funny-binary
+    - get: the-weather
+  - task: business-stuff</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_specify-inputs-for-put-steps">
+  
+  <h2 class="section-header"><a class="anchor-target" name="specify-inputs-for-put-steps" href="#specify-inputs-for-put-steps"></a>Specify Inputs for Put Steps</h2>
+  
+
+  <p>By default <a href="put-step.html"><code>put</code> step</a>&#39;s have all artifacts from a job mounted in their resource container. This can result in long initialization times for put steps. It&#39;s likely that a <a href="put-step.html"><code>put</code> step</a> only needs a subset of all available artifacts generated throughout the job.</p><p>There are two ways to specify which artifacts to send to a <a href="put-step.html"><code>put</code> step</a>. You can specify <code>detect</code> as the <a href="put-step.html#schema.put.inputs"><code>put</code> step <strong><code>inputs</code></strong></a> or you can pass in an exact list of all artifacts the <a href="put-step.html"><code>put</code> step</a> needs.</p><p>Using <code>detect</code>: <pre><code class="language-yaml">jobs:
+- name: the-job
+  plan: # Get some artifacts
+  - in_parallel:
+    - get: apples
+    - get: apple-basket
+    - get: monkeys
+  # using detect will result in &#34;apples-location&#34; and &#34;basket&#34; being passed in
+  # &#34;monkeys&#34; will not be passed in
+  - put: apples-in-basket
+    inputs: detect
+    params:
+      apples-location: apples/location # matches the first get step
+      basket: apple-basket # matches the second get step</code></pre></p><p>Specifying the exact inputs needed for the <a href="put-step.html"><code>put</code> step</a>: <pre><code class="language-yaml">jobs:
+- name: the-job
+  plan: # Get some artifacts
+  - in_parallel:
+    - get: apples
+    - get: apple-basket
+    - get: monkeys
+  - put: apples-in-basket
+    inputs: [apples, apple-basket] # specify the exact inputs needed
+    params:
+      apples-location: apples/location
+      basket: apple-basket</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_putting-task-configs-in-files">
+  
+  <h2 class="section-header"><a class="anchor-target" name="putting-task-configs-in-files" href="#putting-task-configs-in-files"></a>Putting Task Configs in Files</h2>
+  
+
+  <p>A lot of the pipeline examples that you will find on this site and in resource repos will embed a <a href="task-step.html#schema.task.config"><code>task</code> step <strong><code>config</code></strong></a> directly in the pipeline. This is a nice way of clearly seeing what inputs/outputs the task uses. Tasks are usually designed to be used in multiple places, maybe with slightly different configuration. To support this scenario, most users store task configs in files instead of embedding the config directly in the pipeline.</p><p>Here&#39;s what this looks like in practice:</p><p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>print-date.yml, stored in some git repo under a folder named &#34;tasks&#34;</code>
+  </div>
+
+  <pre><code class="language-yaml">platform: linux
+
+image_resource: # define a default image for the task to use
+  type: registry-image
+  source:
+    repository: busybox
+
+run:
+  path: date
+  args: [&#34;&#43;%Y-%m-%d&#34;]</code></pre>
+</div> <div style="margin: 0 2em 1em" class="inset"></div></p><p>Using the task in a pipeline:</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>pipeline.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+
+jobs:
+- name: the-best-job
+  plan:
+  - get: ci
+  - task: today
+    file: ci/tasks/print-date.yml</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_get-images-for-tasks-instead-of-using-anonymous-image-resources">
+  
+  <h2 class="section-header"><a class="anchor-target" name="get-images-for-tasks-instead-of-using-anonymous-image-resources" href="#get-images-for-tasks-instead-of-using-anonymous-image-resources"></a><code>Get</code> Images for Tasks Instead of using Anonymous Image Resources</h2>
+  
+
+  <p>It is easy to let Concourse fetch images for tasks right when they are needed by using the <a href="tasks.html#schema.task-config.image_resource"><code class="schema-attribute-name"><bold>task-config<wbr />.image_resource</bold></code></a> field in a <a href="tasks.html">task config</a>. It&#39;s the easy out-of-the-box solution. Another way is to pass the image for a task as an input to the job by setting the <a href="task-step.html#schema.task.image"><code>task</code> step <strong><code>image</code></strong></a> field. This also allows you to track the version of the image being used by the task and also avoid getting rate-limited by configuring the resource with credentials.</p><p><strong>Before - Anonymous Image Fetching for Tasks</strong></p><pre><code class="language-yaml">jobs:
+- name: job
+  plan:
+  - task: simple-task
+    config:
+      platform: linux
+      image_resource: # anonymous image resource
+        type: registry-image
+        source:
+          repository: busybox
+      run:
+        path: echo
+        args: [&#34;Hello world!&#34;]</code></pre><p><div style="margin: 0 2em 1em" class="inset"></div></p><p><strong>After - Passing Task Image as Job Inputs</strong></p><pre><code class="language-yaml">resources:
+- name: busybox
+  type: registry-image
+  source:
+    repository: busybox
+    username: ((docker.user))
+    password: ((docker.password))
+
+jobs:
+- name: job
+  plan:
+  - get: busybox # pass image into job
+  - task: simple-task
+    image: busybox # use image for task. Overrides anonymous image
+    config:
+      platform: linux
+      run:
+        path: echo
+        args: [&#34;Hello world!&#34;]</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.1</span>
+              
+
+              <a href="pipeline-guides.html">Pipeline Guides</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.1.2</span>
+              
+
+              <a href="exploring-task-input-and-output-scenarios.html">Exploring Task Input and Output Scenarios</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/concourse-cli.html b/concourse-cli.html
new file mode 100644
index 00000000..f5eea19a
--- /dev/null
+++ b/concourse-cli.html
@@ -0,0 +1,297 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The concourse CLI - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html"  class="active">Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2</span><a href="install.html"  class="active">Install</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1</td>
+            <td class="title-cell"><a href="postgresql-node.html" >Running a PostgreSQL node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.2</td>
+            <td class="title-cell"><a href="concourse-cli.html"  class="self">The <code>concourse</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3</td>
+            <td class="title-cell"><a href="concourse-generate-key.html" >Generating Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4</td>
+            <td class="title-cell"><a href="concourse-web.html" >Running a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5</td>
+            <td class="title-cell"><a href="concourse-worker.html" >Running a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6</td>
+            <td class="title-cell"><a href="upgrading-concourse.html" >Upgrading Concourse</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_concourse-cli">
+  
+  <h1 class="section-header"><a class="anchor-target" name="concourse-cli" href="#concourse-cli"></a><span class="section-number">1.2.2 </span>The <code>concourse</code> CLI</h1>
+  
+
+  <p>The <code>concourse</code> CLI can be downloaded from the <a href="https://github.com/concourse/concourse/releases/latest">latest GitHub release</a> - make sure to grab the appropriate archive for your platform. Each <code>concourse-*</code> archive contains the following files:</p><pre><code class="language-sh">concourse/bin/concourse
+concourse/bin/gdn            # Linux only
+concourse/fly-assets/...
+concourse/resource-types/... # Linux only</code></pre><p>The Linux release is the largest among all the platforms because it is prepackaged with a <a href="concourse-worker.html#bundled-resource-types">bundle of resource types</a> like the <a href="https://github.com/concourse/git-resource">git</a>, <a href="https://github.com/concourse/time-resource/">time</a>, and <a href="https://github.com/concourse/registry-image-resource/">registry-image</a> resources. Resources only run on Linux workers, that&#39;s why the other platforms are not bundled with resources; resources don&#39;t currently exist for non-linux platforms.</p><p>When extracted, the <code>concourse</code> binary will auto-discover its sibling assets based on its file location, so you may extract it anywhere. On Linux a typical install location is <code>/usr/local/concourse</code>:</p><pre><code class="language-sh">tar -zxf concourse-*.tgz -C /usr/local</code></pre><p>From there, you can either add <code>/usr/local/concourse/bin</code> to your <code>$PATH</code>, or just execute <code>/usr/local/concourse/bin/concourse</code> directly.</p><h2>Configuring <code>concourse</code></h2><p>All Concourse <code>web</code> and <code>worker</code> node configuration is defined statically via flags. For a full list of flags, you can pass <code>--help</code> to any command.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>CLI Commands</code>
+  </div>
+
+  <pre><code class="language-bash">concourse web --help
+concourse worker --help
+concourse quickstart --help
+concourse migrate --help
+concourse generate-key --help
+concourse land-worker --help
+concourse retire-worker --help</code></pre>
+</div><p>Each flag can also be set via an environment variable. The env var for each flag is based on the flag name uppercased, preceded with <code>CONCOURSE_</code> and dashes (<code>-</code>) replaced with underscores (<code>_</code>). These are also shown in <code>--help</code>.</p><p>Various sections in documentation may refer to configuration via env vars rather than flags, but they are both equivalent and interchangeable. Env vars are simply easier to reference in isolation and are more useful to copy-paste.</p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.2.1</span>
+              
+
+              <a href="postgresql-node.html">Running a PostgreSQL node</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.2.3</span>
+              
+
+              <a href="concourse-generate-key.html">Generating Keys</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/concourse-generate-key.html b/concourse-generate-key.html
new file mode 100644
index 00000000..74172da7
--- /dev/null
+++ b/concourse-generate-key.html
@@ -0,0 +1,360 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Generating Keys - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html"  class="active">Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2</span><a href="install.html"  class="active">Install</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1</td>
+            <td class="title-cell"><a href="postgresql-node.html" >Running a PostgreSQL node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.2</td>
+            <td class="title-cell"><a href="concourse-cli.html" >The <code>concourse</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3</td>
+            <td class="title-cell"><a href="concourse-generate-key.html"  class="self">Generating Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4</td>
+            <td class="title-cell"><a href="concourse-web.html" >Running a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5</td>
+            <td class="title-cell"><a href="concourse-worker.html" >Running a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6</td>
+            <td class="title-cell"><a href="upgrading-concourse.html" >Upgrading Concourse</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2.3</span><a href="concourse-generate-key.html"  class="self">Generating Keys</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.3.1</td>
+            <td class="title-cell"><a href="concourse-generate-key.html#generating-the-keys" >Generating the Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3.2</td>
+            <td class="title-cell"><a href="concourse-generate-key.html#multiple-worker-keys" >Multiple Worker Keys</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_concourse-generate-key">
+  
+  <h1 class="section-header"><a class="anchor-target" name="concourse-generate-key" href="#concourse-generate-key"></a><span class="section-number">1.2.3 </span>Generating Keys</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_generating-the-keys">
+  
+  <h2 class="section-header"><a class="anchor-target" name="generating-the-keys" href="#generating-the-keys"></a>Generating the Keys</h2>
+  
+
+  <p>Concourse&#39;s various components use RSA keys to verify tokens and worker registration requests.</p><p>A minimal deployment will require the following keys:</p><dl>
+  
+  <dt><strong>Session Signing Key</strong></dt>
+    <dd><p>Used by the <a href="concourse-web.html"><code>web</code> node</a> for signing and verifying user session tokens.</p></dd>
+  
+  <dt><strong>TSA Host Key</strong></dt>
+    <dd><p>Used by the <a href="concourse-web.html"><code>web</code> node</a> for the SSH worker registration gateway server (&#34;TSA&#34;).</p><p>The public key is given to each <a href="concourse-worker.html"><code>worker</code> node</a> to verify the remote host when connecting via SSH.</p></dd>
+  
+  <dt><strong>Worker Key</strong></dt>
+    <dd><p>Each <a href="concourse-worker.html"><code>worker</code> node</a> verifies its registration with the <a href="concourse-web.html"><code>web</code> node</a> via a SSH key.</p><p>The public key must be listed in the <a href="concourse-web.html"><code>web</code> node</a>&#39;s <em>authorized worker keys</em> file in order for the worker to register.</p></dd>
+  
+</dl><p>To generate these keys, run:</p><pre><code class="language-bash">concourse generate-key -t rsa -f ./session_signing_key
+concourse generate-key -t ssh -f ./tsa_host_key
+concourse generate-key -t ssh -f ./worker_key</code></pre><p>or use <code>ssh-keygen</code>:</p><pre><code class="language-bash">ssh-keygen -t rsa -b 4096 -m PEM -f ./session_signing_key
+ssh-keygen -t rsa -b 4096 -m PEM -f ./tsa_host_key
+ssh-keygen -t rsa -b 4096 -m PEM -f ./worker_key</code></pre><p>At this point you should have the following files:</p><ul>
+
+  <li><p><code>session_signing_key</code></p></li>
+
+  <li><p><code>tsa_host_key</code></p></li>
+
+  <li><p><code>tsa_host_key.pub</code></p></li>
+
+  <li><p><code>worker_key</code></p></li>
+
+  <li><p><code>worker_key.pub</code></p></li>
+
+</ul><p>You can remove the <code>session_signing_key.pub</code> file if you have one, it is not needed by any process in Concourse.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_multiple-worker-keys">
+  
+  <h2 class="section-header"><a class="anchor-target" name="multiple-worker-keys" href="#multiple-worker-keys"></a>Multiple Worker Keys</h2>
+  
+
+  <p>Currently you have one <code>worker_key</code>. You can use this one key-pair with multiple <a href="concourse-worker.html"><code>worker</code> node</a>s. Another good strategy is to have each worker or group of workers use a key that&#39;s unique to that one worker or group of workers.</p><p>In the second case you will end up with multiple private and public worker keys. The <a href="concourse-web.html"><code>web</code> node</a> needs to know about all of the public worker keys.  To pass all public worker keys to the <a href="concourse-web.html"><code>web</code> node</a> create a file that contains all of the worker public keys. A common name for this file is <code>authorized_worker_keys.pub</code>. The file should look like this, with one public key per line.</p><pre><code class="language-bash">$ cat authorized_worker_keys.pub
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCgKtVnbGRJ7Y63QKoO&#43;loS...
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDU6lA4gSRYIc4MXzphJ2l5...
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDgNU7KBz/QQusPO52pNcea...</code></pre><p>You should now have all the necessary keys needed to deploy Web and Worker nodes.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.2.2</span>
+              
+
+              <a href="concourse-cli.html">The <code>concourse</code> CLI</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.2.4</span>
+              
+
+              <a href="concourse-web.html">Running a <code>web</code> node</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/concourse-web.html b/concourse-web.html
new file mode 100644
index 00000000..a53ce716
--- /dev/null
+++ b/concourse-web.html
@@ -0,0 +1,779 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Running a web node - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html"  class="active">Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2</span><a href="install.html"  class="active">Install</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1</td>
+            <td class="title-cell"><a href="postgresql-node.html" >Running a PostgreSQL node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.2</td>
+            <td class="title-cell"><a href="concourse-cli.html" >The <code>concourse</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3</td>
+            <td class="title-cell"><a href="concourse-generate-key.html" >Generating Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4</td>
+            <td class="title-cell"><a href="concourse-web.html"  class="self">Running a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5</td>
+            <td class="title-cell"><a href="concourse-worker.html" >Running a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6</td>
+            <td class="title-cell"><a href="upgrading-concourse.html" >Upgrading Concourse</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2.4</span><a href="concourse-web.html"  class="self">Running a <code>web</code> node</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.4.1</td>
+            <td class="title-cell"><a href="concourse-web.html#web-prerequisites" >Prerequisites</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4.2</td>
+            <td class="title-cell"><a href="concourse-web.html#web-running" >Running <code>concourse web</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4.3</td>
+            <td class="title-cell"><a href="concourse-web.html#web-operation" >Operating a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4.4</td>
+            <td class="title-cell"><a href="concourse-web.html#web-configuration" >Configuring the <code>web</code> node</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_concourse-web">
+  
+  <h1 class="section-header"><a class="anchor-target" name="concourse-web" href="#concourse-web"></a><span class="section-number">1.2.4 </span>Running a <code>web</code> node</h1>
+  
+
+  <p>The <code>web</code> node is responsible for running the web UI, API, and as well as performing all pipeline scheduling. It&#39;s basically the brain of Concourse.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.1</span>
+      <a href="concourse-web.html#web-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.2</span>
+      <a href="concourse-web.html#web-running">Running <code>concourse web</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.2.1</span>
+      <a href="concourse-web.html#web-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3</span>
+      <a href="concourse-web.html#web-operation">Operating a <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.3.1</span>
+      <a href="concourse-web.html#scaling">Scaling</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.3.1.1</span>
+      <a href="concourse-web.html#web-connection-pooling">Database connection pooling</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.2</span>
+      <a href="concourse-web.html#reloading-worker-authorized-key">Reloading worker authorized key</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.3</span>
+      <a href="concourse-web.html#restarting-and-upgrading">Restarting &amp; Upgrading</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.4</span>
+      <a href="concourse-web.html#downgrading">Downgrading</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4</span>
+      <a href="concourse-web.html#web-configuration">Configuring the <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.4.1</span>
+      <a href="concourse-web.html#giving-your-cluster-a-name">Giving your cluster a name</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.2</span>
+      <a href="concourse-web.html#web-ingress">Configuring ingress traffic</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.3</span>
+      <a href="concourse-web.html#lets-encrypt">TLS via Let&#39;s Encrypt</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.4</span>
+      <a href="concourse-web.html#build-log-retention">Build log retention</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.5</span>
+      <a href="concourse-web.html#audit-logs">Enabling audit logs</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.6</span>
+      <a href="concourse-web.html#resource-defaults">Configuring defaults for resource types</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_web-prerequisites">
+  
+  <h2 class="section-header"><a class="anchor-target" name="web-prerequisites" href="#web-prerequisites"></a>Prerequisites</h2>
+  
+
+  <p>Nothing special - the <code>web</code> node is a pretty simple Go application that can be run like a <a href="https://en.wikipedia.org/wiki/Twelve-Factor_App_methodology">12-factor app</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_web-running">
+  
+  <h2 class="section-header"><a class="anchor-target" name="web-running" href="#web-running"></a>Running <code>concourse web</code></h2>
+  
+
+  <p>The <code>concourse</code> CLI can run as a <code>web</code> node via the <code>web</code> subcommand.</p><p>Before running it, let&#39;s configure a local user so we can log in:</p><pre><code class="language-bash">CONCOURSE_ADD_LOCAL_USER=myuser:mypass
+CONCOURSE_MAIN_TEAM_LOCAL_USER=myuser</code></pre><p>This will configure a single user, <code>myuser</code>, with the password <code>mypass</code>. You&#39;ll probably want to change those to sensible values, and later you may want to configure a proper auth provider - check out <a href="auth.html">Auth &amp; Teams</a> whenever you&#39;re ready.</p><p>Next, you&#39;ll need to configure the session signing key, the SSH key for the worker gateway, and the authorized worker key. Check <a href="concourse-generate-key.html">Generating Keys</a> to learn what these are and how they are created.</p><pre><code class="language-bash">CONCOURSE_SESSION_SIGNING_KEY=path/to/session_signing_key
+CONCOURSE_TSA_HOST_KEY=path/to/tsa_host_key
+CONCOURSE_TSA_AUTHORIZED_KEYS=path/to/authorized_worker_keys.pub</code></pre><p>Finally, <code>web</code> needs to know how to reach your Postgres database. This can be set like so:</p><pre><code class="language-bash">CONCOURSE_POSTGRES_HOST=127.0.0.1 # default
+CONCOURSE_POSTGRES_PORT=5432      # default
+CONCOURSE_POSTGRES_DATABASE=atc   # default
+CONCOURSE_POSTGRES_USER=my-user
+CONCOURSE_POSTGRES_PASSWORD=my-password</code></pre><p>If you&#39;re running PostgreSQL locally, you can probably just point it to the socket and rely on the <code>peer</code> auth:</p><pre><code class="language-bash">CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql</code></pre><p>Now that everything&#39;s set, run:</p><pre><code class="language-bash">concourse web</code></pre><p>All logs will be emitted to <code>stdout</code>, with any panics or lower-level errors being emitted to <code>stderr</code>.</p>
+
+  
+    
+      <div class="section" id="section_web-resource-utilization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="web-resource-utilization" href="#web-resource-utilization"></a>Resource utilization</h3>
+  
+
+  <p>CPU usage: peaks during pipeline scheduling, primarily when scheduling <a href="jobs.html">Jobs</a>. Mitigated by adding more <code>web</code> nodes. In this regard, <code>web</code> nodes can be considered compute-heavy more than anything else at large scale.</p><p>Memory usage: not very well classified at the moment as it&#39;s not generally a concern. Give it a few gigabytes and keep an eye on it.</p><p>Disk usage: none</p><p>Bandwidth usage: aside from handling external traffic, the <code>web</code> node will at times have to stream bits out from one worker and into another while executing <a href="steps.html">Steps</a>.</p><p>Highly available: yes; <code>web</code> nodes can all be configured the same (aside from <code>--peer-address</code>) and placed behind a load balancer. Periodic tasks like garbage-collection will not be duplicated for each node.</p><p>Horizontally scalable: yes; they will coordinate workloads using the database, resulting in less work for each node and thus lower CPU usage.</p><p>Outbound traffic:</p><ul>
+
+  <li><p><code>db</code> on its configured port for persistence</p></li>
+
+  <li><p><code>db</code> on its configured port for locking and coordinating in a multi-<code>web</code> node deployment</p></li>
+
+  <li><p>other <code>web</code> nodes (possibly itself) on an <a href="https://en.wikipedia.org/wiki/Ephemeral_port">ephemeral port</a> when a worker is forwarded through the web node&#39;s TSA</p></li>
+
+</ul><p>Inbound traffic:</p><ul>
+
+  <li><p><code>worker</code> connects to the TSA on port <code>2222</code> for registration</p></li>
+
+  <li><p><code>worker</code> downloads inputs from the ATC during <a href="tasks.html#running-tasks"><code>fly execute</code></a> via its external URL</p></li>
+
+  <li><p>external traffic to the ATC API via the web UI and <a href="fly.html"><code>fly</code> CLI</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_web-operation">
+  
+  <h2 class="section-header"><a class="anchor-target" name="web-operation" href="#web-operation"></a>Operating a <code>web</code> node</h2>
+  
+
+  <p>The <code>web</code> nodes themselves are stateless - they don&#39;t store anything on disk, and coordinate entirely using the database.</p>
+
+  
+    
+      <div class="section" id="section_scaling">
+  
+  <h3 class="section-header"><a class="anchor-target" name="scaling" href="#scaling"></a>Scaling</h3>
+  
+
+  <p>The <a href="concourse-web.html"><code>web</code> node</a> can be scaled up for high availability. They&#39;ll also roughly share their scheduling workloads, using the database to synchronize. This is done by just running more <code>web</code> commands on different machines, and optionally putting them behind a load balancer.</p><p>To run a cluster of <a href="concourse-web.html"><code>web</code> node</a>s, you&#39;ll first need to ensure they&#39;re all pointing to the same PostgreSQL server.</p><p>Next, you&#39;ll need to configure a <em>peer address</em>. This is a DNS or IP address that can be used to reach this <code>web</code> node from other <code>web</code> nodes. Typically this uses a private IP, like so:</p><pre><code class="language-bash">CONCOURSE_PEER_ADDRESS=10.10.0.1</code></pre><p>This address will be used for forwarded worker connections, which listen on the <a href="https://en.wikipedia.org/wiki/Ephemeral_port">ephemeral port</a> range.</p><p>Finally, if all of these nodes are going to be accessed through a load balancer, you&#39;ll need to configure the external URL that will be used to reach your Concourse cluster:</p><pre><code class="language-bash">CONCOURSE_EXTERNAL_URL=https://ci.example.com</code></pre><p>Aside from the peer URL, all configuration must be consistent across all <code>web</code> nodes in the cluster to ensure consistent results.</p>
+
+  
+    
+      <div class="section" id="section_web-connection-pooling">
+  
+  <h4 class="section-header"><a class="anchor-target" name="web-connection-pooling" href="#web-connection-pooling"></a>Database connection pooling</h4>
+  
+
+  <p>You may wish to configure the max number of parallel database connections that each node makes. There are two pools to configure: one for serving API requests, and one used for all the backend work such as pipeline scheduling.</p><pre><code class="language-bash">CONCOURSE_API_MAX_CONNS=10     # default
+CONCOURSE_BACKEND_MAX_CONNS=50 # default</code></pre><p>There are some non-configurable connection pools. They take up the following number of connections per pool: <ul>
+
+  <li><p>Garbage Collection: 5</p></li>
+
+  <li><p>Lock: 1</p></li>
+
+  <li><p>Worker Registration: 1</p></li>
+
+</ul></p><p>The sum of these numbers across all <code>web</code> nodes should not be greater than the maximum number of simultaneous connections your Postgres server will allow. See <a href="postgresql-node.html#db-resource-utilization"><code>db</code> node resource utilization</a> for more information.</p><p>For example, if 3 <code>web</code> nodes are configured with the values shown above then your PostgreSQL server should be configured with a connection limit of at least 201: <code>(10 &#43; 50 &#43; 5 &#43; 1 &#43; 1) * 3 web nodes</code>.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_reloading-worker-authorized-key">
+  
+  <h3 class="section-header"><a class="anchor-target" name="reloading-worker-authorized-key" href="#reloading-worker-authorized-key"></a>Reloading worker authorized key</h3>
+  
+
+  <p>While <a href="concourse-web.html#web-running">Running <code>concourse web</code></a>, the authorized worker key file, which contains all public keys for the workers, is loaded at startup. During the lifecycle of a <a href="concourse-web.html"><code>web</code> node</a> new <code>worker</code> keys might be added or old ones removed. To perform a live reload of this file you can send a <code>SIGHUP</code> signal to the <code>concourse web</code> process. The process will remain running and Concourse will reload the authorized worker key file.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_restarting-and-upgrading">
+  
+  <h3 class="section-header"><a class="anchor-target" name="restarting-and-upgrading" href="#restarting-and-upgrading"></a>Restarting &amp; Upgrading</h3>
+  
+
+  <p>The <code>web</code> nodes can be killed and restarted willy-nilly. No draining is necessary; if the <code>web</code> node was orchestrating a build it will continue where it left off when it comes back, or the build will be picked up by one of the other <code>web</code> nodes.</p><p>To upgrade a <code>web</code> node, stop its process and start a new one using the newly installed <code>concourse</code>. Any database migrations will be run automatically on start. If <code>web</code> nodes are started in parallel, only one will run the migrations.</p><p>We don&#39;t currently guarantee a lack of funny-business if you&#39;re running mixed Concourse versions - database migrations can perform modifications that confuse other <code>web</code> nodes. So there may be some turbulence during a rolling upgrade, but everything should stabilize once all <code>web</code> nodes are running the latest version.</p><p>If you want more control over when the database migrations happen and know if they were successful you can use the <code>concourse migrate</code> command. The <code>migrate</code> command accepts the same <code>CONCOURSE_POSTGRES_*</code> env vars as the <code>concourse web</code> command.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_downgrading">
+  
+  <h3 class="section-header"><a class="anchor-target" name="downgrading" href="#downgrading"></a>Downgrading</h3>
+  
+
+  <p>If you&#39;re stuck in a pinch and need to downgrade from one version of Concourse to another, you can use the <code>concourse migrate</code> command.</p><p>First, grab the desired migration version by running the following:</p><pre><code class="language-bash"># make sure this is the *old* Concourse binary
+$ concourse migrate --supported-db-version
+1551110547</code></pre><p>That number (yours will be different) is the expected migration version for that version of Concourse.</p><p>Next, run the following with the <em>new</em> Concourse binary:</p><pre><code class="language-bash">$ concourse migrate --migrate-db-to-version=1551110547</code></pre><p>This will need the same <code>CONCOURSE_POSTGRES_*</code> configuration described in <a href="concourse-web.html#web-running">Running <code>concourse web</code></a>.</p><p>Once this completes, switch all <code>web</code> nodes back to the older <code>concourse</code> binary and you should be good to go.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_web-configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="web-configuration" href="#web-configuration"></a>Configuring the <code>web</code> node</h2>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_giving-your-cluster-a-name">
+  
+  <h3 class="section-header"><a class="anchor-target" name="giving-your-cluster-a-name" href="#giving-your-cluster-a-name"></a>Giving your cluster a name</h3>
+  
+
+  <p>If you&#39;ve got many Concourse clusters that you switch between, you can make it slightly easier to notice which one you&#39;re on by giving each cluster a name:</p><pre><code class="language-bash">CONCOURSE_CLUSTER_NAME=production</code></pre><p>When set, this name will be shown in the top bar when viewing the dashboard.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_web-ingress">
+  
+  <h3 class="section-header"><a class="anchor-target" name="web-ingress" href="#web-ingress"></a>Configuring ingress traffic</h3>
+  
+
+  <p>If your web nodes are going to be accessed multiple network layers, you will need to set <code>CONCOURSE_EXTERNAL_URL</code> to a URL accessible by your Concourse users. If you don&#39;t set this property, logging in will incorrectly redirect to its default value of <code>127.0.0.1</code>.</p><p>If your web node(s) will be behind a load balancer or reverse proxy then you will need to ensure connctions made by <a href="builds.html#fly-intercept"><code>fly intercept</code></a> are properly handled by upgrading the connection. Here is a sample nginx configuration that upgrades connections made by <a href="builds.html#fly-intercept"><code>fly intercept</code></a>.</p><pre><code class="language-">server {
+  server_name ci.example.com;
+
+  add_header Strict-Transport-Security &#34;max-age=31536000&#34; always;
+  ssl_stapling on;
+  ssl_stapling_verify on;
+
+  # Proxy main concourse traffic
+  location / {
+      proxy_pass http://concourse.local:8080/;
+      proxy_set_header Host $host;
+      proxy_set_header X-Real-IP $remote_addr;
+      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+      proxy_set_header X-Forwarded-Proto $scheme;
+      proxy_set_header X-Forwarded-Protocol $scheme;
+      proxy_set_header X-Forwarded-Host $http_host;
+  }
+
+  # Proxy fly intercept traffic
+  location ~ /hijack$ {
+      proxy_pass http://concourse.local:8080;
+      proxy_set_header Host $host;
+      proxy_set_header X-Real-IP $remote_addr;
+      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+      proxy_set_header X-Forwarded-Proto $scheme;
+      proxy_set_header X-Forwarded-Protocol $scheme;
+      proxy_set_header X-Forwarded-Host $http_host;
+      # Upgrade connection
+      proxy_set_header Upgrade $http_upgrade;
+      proxy_set_header Connection &#34;upgrade&#34;;
+  }
+}</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_lets-encrypt">
+  
+  <h3 class="section-header"><a class="anchor-target" name="lets-encrypt" href="#lets-encrypt"></a>TLS via Let&#39;s Encrypt</h3>
+  
+
+  <p>Concourse can be configured to automatically acquire a TLS certificate via <a href="https://letsencrypt.org">Let&#39;s Encrypt</a>:</p><pre><code class="language-bash"># Enable TLS
+CONCOURSE_TLS_BIND_PORT=443
+
+# Enable Let&#39;s Encrypt
+CONCOURSE_ENABLE_LETS_ENCRYPT=true</code></pre><div class="warning">
+  <p>Concourse&#39;s Let&#39;s Encrypt integration works by storing the TLS certificate and key in the database, so it is imperative that you enable <a href="encryption.html">database encryption</a> as well.</p>
+</div><p>By default, Concourse will reach out to <a href="https://acme-v02.api.letsencrypt.org/directory">Let&#39;s Encrypt&#39;s ACME CA directory</a>. An alernative URL can be configured like so:</p><pre><code class="language-bash">CONCOURSE_LETS_ENCRYPT_ACME_URL=https://acme.example.com/directory</code></pre><p>In order to negotiate the certificate, your <code>web</code> node must be reachable by the ACME server. There are intentionally <a href="https://letsencrypt.org/docs/faq/">no publicly listed IP addresses to whitelist</a>, so this typically means just making your <code>web</code> node publicly reachable.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_build-log-retention">
+  
+  <h3 class="section-header"><a class="anchor-target" name="build-log-retention" href="#build-log-retention"></a>Build log retention</h3>
+  
+
+  <p>Build logs are stored in the DB - if they are not cleanup up every once in a while, the storage usage for build logs will continue to grow as more builds run. While this is usually fine for small Concourse instances, as you scale up, you may run into storage concerns.</p><p>To clean up old build logs, you can configure Concourse to periodically scan for builds whose logs should be reaped based on a log retention policy, skipping over any paused pipelines and jobs. When a build&#39;s logs are reaped, they are no longer visible in the UI.</p><p>Concourse can be configured with a default build log retention policy for all jobs:</p><pre><code class="language-bash">CONCOURSE_DEFAULT_BUILD_LOGS_TO_RETAIN=50
+CONCOURSE_DEFAULT_DAYS_TO_RETAIN_BUILD_LOGS=14</code></pre><p>With these settings, Concource will keep the latest 50 builds for each job. If a job runs more than 50 builds in 14 days, all of those builds will be retained until 14 days after they ran.</p><p>Some jobs have differing retention requirements - you can configure <a href="jobs.html#schema.build_log_retention_policy"><strong><code>build_log_retention_policy</code></strong> schema</a> on a job-by-job basis.</p><p>You can also configure Concourse with maximum values for build log retention policies to prevent jobs from retaining their build logs for too long:</p><pre><code class="language-bash">CONCOURSE_MAX_BUILD_LOGS_TO_RETAIN=100
+CONCOURSE_MAX_DAYS_TO_RETAIN_BUILD_LOGS=30</code></pre><p>With these settings, <a href="jobs.html#schema.build_log_retention_policy.builds"><code class="schema-attribute-name"><bold>build_log_retention_policy<wbr />.builds</bold></code></a> is capped at 100, and <a href="jobs.html#schema.build_log_retention_policy.days"><code class="schema-attribute-name"><bold>build_log_retention_policy<wbr />.days</bold></code></a> is capped at 30.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_audit-logs">
+  
+  <h3 class="section-header"><a class="anchor-target" name="audit-logs" href="#audit-logs"></a>Enabling audit logs</h3>
+  
+
+  <p>A very simplistic form of audit logging can be enabled with the following vars:</p><pre><code class="language-bash"># Enable auditing for all api requests connected to builds.
+CONCOURSE_ENABLE_BUILD_AUDITING=true
+
+# Enable auditing for all api requests connected to containers.
+CONCOURSE_ENABLE_CONTAINER_AUDITING=true
+
+# Enable auditing for all api requests connected to jobs.
+CONCOURSE_ENABLE_JOB_AUDITING=true
+
+# Enable auditing for all api requests connected to pipelines.
+CONCOURSE_ENABLE_PIPELINE_AUDITING=true
+
+# Enable auditing for all api requests connected to resources.
+CONCOURSE_ENABLE_RESOURCE_AUDITING=true
+
+# Enable auditing for all api requests connected to system transactions.
+CONCOURSE_ENABLE_SYSTEM_AUDITING=true
+
+# Enable auditing for all api requests connected to teams.
+CONCOURSE_ENABLE_TEAM_AUDITING=true
+
+# Enable auditing for all api requests connected to workers.
+CONCOURSE_ENABLE_WORKER_AUDITING=true
+
+# Enable auditing for all api requests connected to volumes.
+CONCOURSE_ENABLE_VOLUME_AUDITING=true</code></pre><p>When enabled, API requests will result in an info-level log line like so:</p><pre><code class="language-json">{&#34;timestamp&#34;:&#34;2019-05-09T14:41:54.880381537Z&#34;,&#34;level&#34;:&#34;info&#34;,&#34;source&#34;:&#34;atc&#34;,&#34;message&#34;:&#34;atc.audit&#34;,&#34;data&#34;:{&#34;action&#34;:&#34;Info&#34;,&#34;parameters&#34;:{},&#34;user&#34;:&#34;test&#34;}}
+{&#34;timestamp&#34;:&#34;2019-05-09T14:42:36.704864093Z&#34;,&#34;level&#34;:&#34;info&#34;,&#34;source&#34;:&#34;atc&#34;,&#34;message&#34;:&#34;atc.audit&#34;,&#34;data&#34;:{&#34;action&#34;:&#34;GetPipeline&#34;,&#34;parameters&#34;:{&#34;:pipeline_name&#34;:[&#34;booklit&#34;],&#34;:team_name&#34;:[&#34;main&#34;]},&#34;user&#34;:&#34;test&#34;}}</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_resource-defaults">
+  
+  <h3 class="section-header"><a class="anchor-target" name="resource-defaults" href="#resource-defaults"></a>Configuring defaults for resource types</h3>
+  
+
+  <p>Defaults for the &#34;core&#34; resource types (<a href="https://github.com/concourse?q=-resource">those that show up under the Concourse org</a>) that comes with Concourse can be set cluster-wide by passing in a configuration file. The format of the file is the name of the resource type followed by an arbitrary configuration.</p><p>Documentation for each resource type&#39;s configuration is in each implementation&#39;s <code>README</code>.</p><pre><code class="language-bash">CONCOURSE_BASE_RESOURCE_TYPE_DEFAULTS=./defaults.yml</code></pre><p>For example, a <code>defaults.yml</code> that configures the entire cluster to use a registry mirror would have: <pre><code class="language-yaml">registry-image:
+  registry_mirror:
+    host: https://registry.mirror.example.com</code></pre></p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.2.3</span>
+              
+
+              <a href="concourse-generate-key.html">Generating Keys</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.2.5</span>
+              
+
+              <a href="concourse-worker.html">Running a <code>worker</code> node</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/concourse-worker.html b/concourse-worker.html
new file mode 100644
index 00000000..50829c59
--- /dev/null
+++ b/concourse-worker.html
@@ -0,0 +1,1249 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Running a worker node - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html"  class="active">Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2</span><a href="install.html"  class="active">Install</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1</td>
+            <td class="title-cell"><a href="postgresql-node.html" >Running a PostgreSQL node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.2</td>
+            <td class="title-cell"><a href="concourse-cli.html" >The <code>concourse</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3</td>
+            <td class="title-cell"><a href="concourse-generate-key.html" >Generating Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4</td>
+            <td class="title-cell"><a href="concourse-web.html" >Running a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5</td>
+            <td class="title-cell"><a href="concourse-worker.html"  class="self">Running a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6</td>
+            <td class="title-cell"><a href="upgrading-concourse.html" >Upgrading Concourse</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2.5</span><a href="concourse-worker.html"  class="self">Running a <code>worker</code> node</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.5.1</td>
+            <td class="title-cell"><a href="concourse-worker.html#worker-prerequisites" >Prerequisites</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5.2</td>
+            <td class="title-cell"><a href="concourse-worker.html#worker-running" >Running <code>concourse worker</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5.3</td>
+            <td class="title-cell"><a href="concourse-worker.html#worker-operation" >Operating a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5.4</td>
+            <td class="title-cell"><a href="concourse-worker.html#worker-configuration" >Configuring the <code>worker</code> node</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_concourse-worker">
+  
+  <h1 class="section-header"><a class="anchor-target" name="concourse-worker" href="#concourse-worker"></a><span class="section-number">1.2.5 </span>Running a <code>worker</code> node</h1>
+  
+
+  <p>The <code>worker</code> node registers with the <a href="concourse-web.html"><code>web</code> node</a> and is then used for executing builds and performing resource <code>check</code>s. It doesn&#39;t really decide much on its own.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.1</span>
+      <a href="concourse-worker.html#worker-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.2</span>
+      <a href="concourse-worker.html#worker-running">Running <code>concourse worker</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.2.1</span>
+      <a href="concourse-worker.html#worker-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3</span>
+      <a href="concourse-worker.html#worker-operation">Operating a <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.3.1</span>
+      <a href="concourse-worker.html#scaling-workers">Scaling Workers</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.3.1.1</span>
+      <a href="concourse-worker.html#horizontal-vs-vertical-scaling">Horizontal vs Vertical Scaling</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.2</span>
+      <a href="concourse-worker.html#worker-heartbeating-and-stalling">Worker Heartbeating &amp; Stalling</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.3</span>
+      <a href="concourse-worker.html#restarting-a-worker">Restarting a Worker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.4</span>
+      <a href="concourse-worker.html#gracefully-removing-a-worker">Gracefully Removing a Worker</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4</span>
+      <a href="concourse-worker.html#worker-configuration">Configuring the <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.1</span>
+      <a href="concourse-worker.html#tagging-workers">Tagging Workers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.2</span>
+      <a href="concourse-worker.html#team-workers">Team Workers</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.2.1</span>
+      <a href="concourse-worker.html#tags-and-team-workers">Tags and Team Workers</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.3</span>
+      <a href="concourse-worker.html#worker-healthcheck-endpoint">Healthcheck Endpoint</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.4</span>
+      <a href="concourse-worker.html#worker-resource-types">Resource Types</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.4.1</span>
+      <a href="concourse-worker.html#bundled-resource-types">Bundled Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.4.2</span>
+      <a href="concourse-worker.html#installing-or-upgrading-bundled-resource-types">Installing or Upgrading Bundled Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5</span>
+      <a href="concourse-worker.html#configuring-runtimes">Configuring Runtimes</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.1</span>
+      <a href="concourse-worker.html#containerd-runtime"><code>containerd</code> runtime</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.2</span>
+      <a href="concourse-worker.html#transitioning-from-guardian-to-containerd">Transitioning from Guardian to containerd</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.3</span>
+      <a href="concourse-worker.html#guardian-runtime"><code>Guardian</code> runtime</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4</span>
+      <a href="concourse-worker.html#troubleshooting-and-fixing-dns-resolution">Troubleshooting and fixing DNS resolution</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.1</span>
+      <a href="concourse-worker.html#pointing-to-external-dns-servers">Pointing to external DNS servers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.2</span>
+      <a href="concourse-worker.html#using-a-local-dns-server">Using a local DNS server</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.3</span>
+      <a href="concourse-worker.html#note-on-allow-host-access">A note on allowing host access and DNS proxy</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.6</span>
+      <a href="concourse-worker.html#configuring-peer-to-peer-volume-streaming">Configuring Peer-to-Peer Volume Streaming</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.6.1</span>
+      <a href="concourse-worker.html#p2p-worker-configuration">P2P Worker Configuration</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.6.2</span>
+      <a href="concourse-worker.html#p2p-web-configuration">P2P Web Configuration</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_worker-prerequisites">
+  
+  <h2 class="section-header"><a class="anchor-target" name="worker-prerequisites" href="#worker-prerequisites"></a>Prerequisites</h2>
+  
+
+  <ul>
+
+  <li><p>Linux: We test and support the following distributions. Minimum kernel version tested is 5.15.</p><ul>
+
+  <li><p>Ubuntu 22.04</p></li>
+
+  <li><p>Ubuntu 24.04</p></li>
+
+</ul><p>Other Requirements: <ul>
+
+  <li><p>User namespaces must be enabled.</p></li>
+
+  <li><p>To enforce memory limits on tasks, memory &#43; swap accounting must be enabled.</p></li>
+
+</ul></p></li>
+
+  <li><p>Windows/Darwin: no special requirements (that we know of).</p><blockquote class="aside"><p><strong>NOTE:</strong> Windows containers are currently not supported and Darwin does not have native containers. Steps will run inside a temporary directory on the Windows/Darwin worker. Any dependencies needed for your tasks (e.g. git, .NET, golang, ssh) should be pre-installed on the worker. Windows/Darwin workers do not come with any resource types.</p></blockquote></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_worker-running">
+  
+  <h2 class="section-header"><a class="anchor-target" name="worker-running" href="#worker-running"></a>Running <code>concourse worker</code></h2>
+  
+
+  <p>The <code>concourse</code> CLI can run as a <code>worker</code> node via the <code>worker</code> subcommand.</p><p>First, you&#39;ll need to configure a directory for the worker to store data:</p><pre><code class="language-bash">CONCOURSE_WORK_DIR=/opt/concourse/worker</code></pre><p>This is where all the builds run, and where all resources are fetched in to, so make sure it&#39;s backed by enough storage.</p><p>Next, point the worker at your <a href="concourse-web.html"><code>web</code> node</a> like so:</p><pre><code class="language-bash">CONCOURSE_TSA_HOST=10.0.2.15:2222
+CONCOURSE_TSA_PUBLIC_KEY=path/to/tsa_host_key.pub
+CONCOURSE_TSA_WORKER_PRIVATE_KEY=path/to/worker_key</code></pre><p>Finally start the worker:</p><pre><code class="language-bash"># run with -E to forward env config, or just set it all as root
+sudo -E concourse worker</code></pre><p>Note that the worker must be run as <code>root</code> because it orchestrates containers.</p><p>All logs will be emitted to <code>stdout</code>, with any panics or lower-level errors being emitted to <code>stderr</code>.</p>
+
+  
+    
+      <div class="section" id="section_worker-resource-utilization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="worker-resource-utilization" href="#worker-resource-utilization"></a>Resource utilization</h3>
+  
+
+  <p><strong>CPU usage</strong>: almost entirely subject to pipeline workloads. More resources configured will result in more checking, and in-flight builds will use as much CPU as they want.</p><p><strong>Memory usage</strong>: also subject to pipeline workloads. Expect usage to increase with the number of containers on the worker and spike as builds run.</p><p><strong>Bandwidth usage</strong>: again, almost entirely subject to pipeline workloads. Expect spikes from periodic checking, though the intervals should spread out over enough time. Resource fetching and pushing will also use arbitrary bandwidth.</p><p><strong>Disk usage</strong>: arbitrary data will be written as builds run, and resource caches will be kept and garbage collected on their own life cycle. We suggest going for a larger disk size if it&#39;s not too much trouble. All state on disk must not outlive the worker itself; it is all ephemeral. If the worker is re-created (i.e. fresh VM/container and all processes were killed), it should be brought back with an empty disk.</p><p><strong>Highly available</strong>: not applicable. Workers are inherently singletons, as they&#39;re being used as drivers running entirely different workloads.</p><p><strong>Horizontally scalable</strong>: yes; workers directly correlate to your capacity required by however many pipelines, resources, and in-flight builds you want to run. It makes sense to scale them up and down with demand.</p><p><strong>Outbound traffic</strong>: <ul>
+
+  <li><p>External traffic to arbitrary locations as a result of periodic resource checking and running builds</p></li>
+
+  <li><p>External traffic to the <code>web</code> node&#39;s configured external URL when downloading the inputs for a <a href="tasks.html#running-tasks"><code>fly execute</code></a></p></li>
+
+  <li><p>External traffic to the <code>web</code> node&#39;s TSA port (<code>2222</code>) for registering the worker</p></li>
+
+  <li><p>If P2P streaming is enabled there will be traffic to other workers.</p></li>
+
+</ul></p><p><strong>Inbound traffic</strong>: <ul>
+
+  <li><p>From the <a href="concourse-web.html"><code>web</code> node</a> on port <code>7777</code> (Garden) and <code>7788</code> (BaggageClaim). These ports do not need to be exposed, they are forwarded to the web node via the ssh connection on port 2222.</p></li>
+
+  <li><p>If P2P streaming is enabled there will be traffic to other workers.</p></li>
+
+</ul></p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_worker-operation">
+  
+  <h2 class="section-header"><a class="anchor-target" name="worker-operation" href="#worker-operation"></a>Operating a <code>worker</code> node</h2>
+  
+
+  <p>The <code>worker</code> nodes are designed to be stateless and as interchangeable as possible. <a href="tasks.html">Tasks</a> and <a href="resources.html">Resources</a> bring their own Docker images, so you should never have to install dependencies on the worker. Windows and Darwin workers are the exception to this. Any dependencies should be pre-installed on Windows and Darwin workers.</p><p>In Concourse, all important data is represented by <a href="resources.html">Resources</a>, so the workers themselves are dispensible. Any data in the work-dir is ephemeral and should go away when the worker machine is removed - it should not be persisted between worker VM or container re-creates.</p>
+
+  
+    
+      <div class="section" id="section_scaling-workers">
+  
+  <h3 class="section-header"><a class="anchor-target" name="scaling-workers" href="#scaling-workers"></a>Scaling Workers</h3>
+  
+
+  <p>More workers should be added to accommodate more pipelines. To know when this is necessary you should probably set up <a href="metrics.html">Metrics</a> and keep an eye on container counts. If average container count starts to approach 200 or so per worker, you should probably add another worker. Load average is another metric to keep an eye on.</p><p>To add a worker, just create another machine for the worker and follow the <a href="concourse-worker.html#worker-running">Running <code>concourse worker</code></a> instructions again.</p><blockquote class="aside"><p><strong>Note</strong>: it doesn&#39;t make sense to run multiple workers on one machine since they&#39;ll both be contending for the same physical resources. Workers should be given their own VMs or physical machines to maximize resource usage.</p></blockquote>
+
+  
+    
+      <div class="section" id="section_horizontal-vs-vertical-scaling">
+  
+  <h4 class="section-header"><a class="anchor-target" name="horizontal-vs-vertical-scaling" href="#horizontal-vs-vertical-scaling"></a>Horizontal vs Vertical Scaling</h4>
+  
+
+  <p>The answer to whether you should scale your workers horizontally or vertically depends heavily on what workloads your pipelines are running. Anecdotally though, we have seen that a lot of smaller workers (horizontal scaling) is usually better than a few large workers (vertical scaling).</p><p>Again, this is not an absolute answer! You will have to test this out against the workloads your pipelines demand and adjust based on the <a href="metrics.html">Metrics</a> that you are tracking.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_worker-heartbeating-and-stalling">
+  
+  <h3 class="section-header"><a class="anchor-target" name="worker-heartbeating-and-stalling" href="#worker-heartbeating-and-stalling"></a>Worker Heartbeating &amp; Stalling</h3>
+  
+
+  <p>Workers will continuously heartbeat to the Concourse cluster in order to remain registered and healthy. If a worker hasn&#39;t checked in after a while, possibly due to a network error, being overloaded, or having crashed, the web node will transition its state to <code>stalled</code> and new workloads will not be scheduled on that worker until it recovers.</p><p>If the worker remains in this state and cannot be recovered, it can be removed using the <a href="administration.html#fly-prune-worker"><code>fly prune-worker</code></a> command.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_restarting-a-worker">
+  
+  <h3 class="section-header"><a class="anchor-target" name="restarting-a-worker" href="#restarting-a-worker"></a>Restarting a Worker</h3>
+  
+
+  <p>Workers can be restarted in-place by sending <code>SIGTERM</code> to the worker process and starting it back up. Containers will remain running and Concourse will reattach to builds that were in flight.</p><p>This is a pretty aggressive way to restart a worker, and may result in errored builds - there are a few moving parts involved and we&#39;re still working on making this airtight.</p><p>A safer way to restart a worker is to <em>land</em> it by sending <code>SIGUSR1</code> to the <code>worker</code> process. This will switch the worker to the <code>landing</code> state and Concourse will stop scheduling new work on it. When all builds running on the worker have finished, the process will exit.</p><p>You may want to enforce a timeout for draining - that way a stuck build won&#39;t prevent your workers from being upgraded. This can be enforced by common tools like <code>start-stop-daemon</code>:</p><pre><code class="language-bash">start-stop-daemon \
+  --pidfile worker.pid \
+  --stop \
+  --retry USR1/300/TERM/15/KILL</code></pre><p>This will send <code>SIGUSR1</code>, wait up to 5 minutes, and then send <code>SIGTERM</code>. If it&#39;s <em>still</em> running, it will be killed after an additional 15 seconds.</p><p>Once the timeout is enforced, there&#39;s still a chance that builds that were running will continue when the worker comes back.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_gracefully-removing-a-worker">
+  
+  <h3 class="section-header"><a class="anchor-target" name="gracefully-removing-a-worker" href="#gracefully-removing-a-worker"></a>Gracefully Removing a Worker</h3>
+  
+
+  <p>When a worker machine is going away, it should be <em>retired</em>. This is similar to <em>landing</em>, except at the end the worker is completely unregistered, along with its volumes and containers. This should be done when a worker&#39;s VM or container is being destroyed.</p><p>To retire a worker, send <code>SIGUSR2</code> to the <code>worker</code> process. This will switch the worker to <code>retiring</code> state, and Concourse will stop scheduling new work on it. When all builds running on the worker have finished, the worker will be removed and the <code>worker</code> process will exit.</p><p>Just like with landing, you may want to enforce a timeout for draining - that way a stuck build won&#39;t prevent your workers from being upgraded. This can be enforced by common tools like <code>start-stop-daemon</code>:</p><pre><code class="language-bash">start-stop-daemon \
+  --pidfile worker.pid \
+  --stop \
+  --retry USR2/300/TERM/15/KILL</code></pre><p>This will send <code>SIGUSR2</code>, wait up to 5 minutes, and then send <code>SIGTERM</code>. If it&#39;s <em>still</em> running, it will be killed after an additional 15 seconds.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_worker-configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="worker-configuration" href="#worker-configuration"></a>Configuring the <code>worker</code> node</h2>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_tagging-workers">
+  
+  <h3 class="section-header"><a class="anchor-target" name="tagging-workers" href="#tagging-workers"></a>Tagging Workers</h3>
+  
+
+  <p>If there&#39;s something special about your worker and you&#39;d like to target builds at it specifically, you can configure tags like so:</p><pre><code class="language-bash">CONCOURSE_TAG=&#34;tag-1,tag-2&#34;</code></pre><p>A tagged worker is taken out of the default placement logic. Tagged workers will not be used for any untagged <a href="steps.html">Steps</a>.</p><p>To run build steps on a tagged worker, specify the <a href="tags-step.html#schema.tags"><code class="schema-attribute-name"><bold>tags</bold></code></a> on any particular step in your <a href="jobs.html">job</a>.</p><p>To perform resource <code>check</code>s on on a tagged worker, specify <a href="resources.html#schema.resource.tags"><code>tags</code></a> on the resource declaration.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_team-workers">
+  
+  <h3 class="section-header"><a class="anchor-target" name="team-workers" href="#team-workers"></a>Team Workers</h3>
+  
+
+  <p>If you want to isolate <a href="global-resources.html#complications-with-reusing-containers"><strong>all workloads</strong></a> for a <a href="managing-teams.html">team</a> then you can configure a worker to belong to a single team like so:</p><pre><code class="language-bash">CONCOURSE_TEAM=&#34;lightweavers&#34;</code></pre><p>Once an untagged team worker is registered Concourse will schedule all untagged builds for that team on its team worker(s). Builds for this team will no longer be scheduled on any untagged, non-team workers.</p><p>It is possible to have a Concourse cluster made up of only team workers and have zero non-team workers, though this is not a common setup because resource utilization across all workers ends up underutilized. It is useful though if you have a particular team with heavy workloads that usually bothers other teams pipelines.</p>
+
+  
+    
+      <div class="section" id="section_tags-and-team-workers">
+  
+  <h4 class="section-header"><a class="anchor-target" name="tags-and-team-workers" href="#tags-and-team-workers"></a>Tags and Team Workers</h4>
+  
+
+  <p>When you have a worker configured with tag(s) and a team like so:</p><pre><code class="language-bash">CONCOURSE_TAG=&#34;tag-1,tag-2&#34;
+CONCOURSE_TEAM=&#34;lightweavers&#34;</code></pre><p>Only steps that are tagged and from the specified team will be scheduled on such a worker. Any untagged work the team has will land on either:</p><ol>
+
+  <li><p>Untagged team workers belonging to the team, or</p></li>
+
+  <li><p>Untagged workers not configured to a specific team</p></li>
+
+</ol>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_worker-healthcheck-endpoint">
+  
+  <h3 class="section-header"><a class="anchor-target" name="worker-healthcheck-endpoint" href="#worker-healthcheck-endpoint"></a>Healthcheck Endpoint</h3>
+  
+
+  <p>The worker will automatically listen on port <code>8888</code> as its healthcheck endpoint. It will return a <code>HTTP 200</code> status code with an empty body on a successful check. A successful check means the worker can reach the <a href="internals.html#architecture-worker">Garden and BaggageClaim servers</a>.</p><p>The healthcheck endpoint is configurable through three variables: <pre><code class="language-">--healthcheck-bind-ip=
+IP address on which to listen for health checking requests. (default: 0.0.0.0)
+
+--healthcheck-bind-port
+Port on which to listen for health checking requests. (default: 8888)
+
+--healthcheck-timeout
+HTTP timeout for the full duration of health checking. (default: 5s)</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_worker-resource-types">
+  
+  <h3 class="section-header"><a class="anchor-target" name="worker-resource-types" href="#worker-resource-types"></a>Resource Types</h3>
+  
+
+  <blockquote class="aside"><p>The following section only applies to Linux workers. Resource types are simply Linux container images and therefore can&#39;t be run on Windows or Darwin workers.</p></blockquote>
+
+  
+    
+      <div class="section" id="section_bundled-resource-types">
+  
+  <h4 class="section-header"><a class="anchor-target" name="bundled-resource-types" href="#bundled-resource-types"></a>Bundled Resource Types</h4>
+  
+
+  <p>Workers come prepackaged with a bundle of resource types. They are included in the tarball from the <a href="https://github.com/concourse/concourse/releases">GitHub release page</a> and are part of the <a href="https://hub.docker.com/r/concourse/concourse">concourse/concourse image</a>.</p><p>To view the resource types available on a worker run:</p><pre><code class="language-bash">fly workers --details</code></pre><p>If you want more details, like the version number of each resource, you can run:</p><pre><code class="language-bash">fly curl api/v1/workers</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_installing-or-upgrading-bundled-resource-types">
+  
+  <h4 class="section-header"><a class="anchor-target" name="installing-or-upgrading-bundled-resource-types" href="#installing-or-upgrading-bundled-resource-types"></a>Installing or Upgrading Bundled Resource Types</h4>
+  
+
+  <p>You may want to upgrade the bundled resource types outside of Concourse upgrades or even install additional resource types on your workers to reduce the polling on some external image repository like <a href="https://hub.docker.com/">Docker Hub</a>.</p><p>We will use the <a href="https://github.com/concourse/git-resource">git resource</a> as our example. We will assume your Concourse installation is at <code>/usr/local/concourse</code>.</p><p>First, pull and create a container of the resource you&#39;re installing/upgrading. Grab the ID of the container that Docker creates.</p><pre><code class="language-bash">$ docker run -d concourse/git-resource
+b253417142565cd5eb43902e94a2cf355d5354b583fbc686488c9a153584c6ba</code></pre><p>Export the containers file system into a gzip compressed tar archive named <code>rootfs.tgz</code></p><pre><code class="language-bash">docker export b253417142 | gzip &gt; rootfs.tgz</code></pre><p>Create a file called <code>resource_metadata.json</code> and populate it with the following contents. Make sure the <code>type</code> does not conflict with an existing resource type when you&#39;re installing a new resource type. In our example here we&#39;re calling the type <code>gitv2</code> to avoid conflicting with the pre-existing <code>git</code> resource.</p><pre><code class="language-json">{
+  &#34;type&#34;: &#34;gitv2&#34;,
+  &#34;version&#34;: &#34;1.13.0&#34;,
+  &#34;privileged&#34;: false,
+  &#34;unique_version_history&#34;: false
+}</code></pre><p>At this point you should have two files: <code>rootfs.tgz</code> and <code>resource_metadata.json</code>.</p><p>Create a new directory under the <code>resource-types</code> folder in your Concourse installation directory. By convention it should be the same name as the <code>type</code>.</p><pre><code class="language-bash">mkdir /usr/local/concourse/resource-types/gitv2</code></pre><p>Place the <code>rootfs.tgz</code> and <code>resource_metadata.json</code> inside the folder. <a href="concourse-worker.html#restarting-a-worker">Restart your worker</a> and verify the new resource type is on there by running one of the following commands:</p><pre><code class="language-bash">fly workers --details
+# or
+fly curl api/v1/workers</code></pre><p>You can also verify that Concourse can create a container with the <code>rootfs.tgz</code> you made by running a simple pipeline:</p><pre><code class="language-yaml">resources:
+- name: some-resource
+  type: gitv2 #change to your resource type
+  source:
+    uri: https://github.com/concourse/git-resource.git
+
+jobs:
+- name: simple-job
+  plan:
+  - get: some-resource</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_configuring-runtimes">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-runtimes" href="#configuring-runtimes"></a>Configuring Runtimes</h3>
+  
+
+  <p>The worker can be run with multiple container runtimes - <a href="https://github.com/containerd/containerd/">containerd</a>, <a href="https://github.com/cloudfoundry/guardian">Guardian</a>, and <a href="https://github.com/vito/houdini">Houdini</a> (an experimental and the only runtime for Darwin and Windows). Only <code>containerd</code> and <code>Guardian</code> are meant for production use. <code>Guardian</code> is the default runtime for Concourse.</p><blockquote class="aside"><p><strong>Note about architecture</strong>: The web node (ATC) talks to all 3 runtimes via a single interface called the <a href="https://github.com/cloudfoundry/garden">Garden</a> server. While Guardian comes packaged with a Garden server and its flags in Concourse are unfortunately prefixed with <code>--garden-*</code>, Guardian (a runtime) and Garden (an interface and server) are two separate tools. An analogy for Garden would be the <a href="https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/">Container Runtime Interface (CRI)</a> used in Kubernetes. Kubernetes uses containerd via CRI. Concourse uses containerd via Garden.</p></blockquote>
+
+  
+    
+      <div class="section" id="section_containerd-runtime">
+  
+  <h4 class="section-header"><a class="anchor-target" name="containerd-runtime" href="#containerd-runtime"></a><code>containerd</code> runtime</h4>
+  
+
+  <p>To use the <code>containerd</code> runtime manually set the <code>--runtime</code> (<code>CONCOURSE_RUNTIME</code>) to <code>containerd</code> on the <code>concourse worker</code> command.</p><p>The following is a list of the <code>containerd</code> runtime specific flags for Concourse that can be set. They are all optional and have default values.</p><pre><code class="language-ini">Containerd Configuration:
+  --containerd-config=                               Path to a config file to use for the Containerd daemon. [$CONCOURSE_CONTAINERD_CONFIG]
+  --containerd-bin=                                  Path to a containerd executable (non-absolute names get resolved from $PATH). [$CONCOURSE_CONTAINERD_BIN]
+  --containerd-init-bin=                             Path to an init executable (non-absolute names get resolved from $PATH). (default: /usr/local/concourse/bin/init) [$CONCOURSE_CONTAINERD_INIT_BIN]
+  --containerd-cni-plugins-dir=                      Path to CNI network plugins. (default: /usr/local/concourse/bin) [$CONCOURSE_CONTAINERD_CNI_PLUGINS_DIR]
+  --containerd-request-timeout=                      How long to wait for requests to Containerd to complete. 0 means no timeout. (default: 5m) [$CONCOURSE_CONTAINERD_REQUEST_TIMEOUT]
+  --containerd-max-containers=                       Max container capacity. 0 means no limit. (default: 250) [$CONCOURSE_CONTAINERD_MAX_CONTAINERS]
+  --containerd-privileged-mode=                      How many privileges privileged containers get. full is equivalent to root on host. ignore means no extra privileges. fuse-only means enough to use fuse-overlayfs. (default: full) [$CONCOURSE_CONTAINERD_PRIVILEGED_MODE]
+
+Containerd Container Networking:
+  --containerd-external-ip=                          IP address to use to reach container&#39;s mapped ports. Autodetected if not specified. [$CONCOURSE_CONTAINERD_EXTERNAL_IP]
+  --containerd-dns-server=                           DNS server IP address to use instead of automatically determined servers. Can be specified multiple times. [$CONCOURSE_CONTAINERD_DNS_SERVER]
+  --containerd-restricted-network=                   Network ranges to which traffic from containers will be restricted. Can be specified multiple times. [$CONCOURSE_CONTAINERD_RESTRICTED_NETWORK]
+  --containerd-additional-hosts=                     Additional entries to add to /etc/hosts in containers. [$CONCOURSE_CONTAINERD_ADDITIONAL_HOSTS]
+  --containerd-network-pool=                         Network range to use for dynamically allocated container subnets. (default: 10.80.0.0/16) [$CONCOURSE_CONTAINERD_NETWORK_POOL]
+  --containerd-mtu=                                  MTU size for container network interfaces. Defaults to the MTU of the interface used for outbound access by the host. [$CONCOURSE_CONTAINERD_MTU]
+  --containerd-allow-host-access                     Allow containers to reach the host&#39;s network. This is turned off by default. [$CONCOURSE_CONTAINERD_ALLOW_HOST_ACCESS]
+
+DNS Proxy Configuration:
+  --containerd-dns-proxy-enable                      Enable proxy DNS server. Note: this will enable containers to access the host network. [$CONCOURSE_CONTAINERD_DNS_PROXY_ENABLE]</code></pre><div class="warning">
+  <p>Make sure to read <a href="concourse-worker.html#note-on-allow-host-access">A note on allowing host access and DNS proxy</a> to understand the implications of using <code>--containerd-allow-host-access</code> and <code>--containerd-dns-proxy-enable</code></p>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_transitioning-from-guardian-to-containerd">
+  
+  <h4 class="section-header"><a class="anchor-target" name="transitioning-from-guardian-to-containerd" href="#transitioning-from-guardian-to-containerd"></a>Transitioning from Guardian to containerd</h4>
+  
+
+  <p>If you are transitioning from <code>Guardian</code> to <code>containerd</code> you will need to convert any <code>--garden-*</code> (<code>CONCOURSE_GARDEN_*</code>) flags to their <code>containerd</code> (<code>CONCOURSE_CONTAINERD_*</code>) counterparts:</p><table>
+  
+  <tr>
+    
+    <td>Guardian Flags</td>
+    
+    <td>Containerd Flags</td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>--garden-request-timeout</code> <code>CONCOURSE_GARDEN_REQUEST_TIMEOUT</code></p></td>
+    
+    <td><p><code>--containerd-request-timeout</code> <code>CONCOURSE_CONTAINERD_REQUEST_TIMEOUT</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>--garden-dns-proxy-enable</code> <code>CONCOURSE_GARDEN_DNS_PROXY_ENABLE</code></p></td>
+    
+    <td><p><code>--containerd-dns-proxy-enable</code> <code>CONCOURSE_CONTAINERD_DNS_PROXY_ENABLE</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><em>No equivalent CLI flag</em> <code>CONCOURSE_GARDEN_ALLOW_HOST_ACCESS</code></p></td>
+    
+    <td><p><code>--containerd-allow-host-access</code> <code>CONCOURSE_CONTAINERD_ALLOW_HOST_ACCESS</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>--garden-network-pool</code> <code>CONCOURSE_GARDEN_NETWORK_POOL</code></p></td>
+    
+    <td><p><code>--containerd-network-pool</code> <code>CONCOURSE_CONTAINERD_NETWORK_POOL</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>--garden-max-containers</code> <code>CONCOURSE_GARDEN_MAX_CONTAINERS</code></p></td>
+    
+    <td><p><code>--containerd-max-containers</code> <code>CONCOURSE_CONTAINERD_MAX_CONTAINERS</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><em>No equivalent CLI flag</em> <code>CONCOURSE_GARDEN_DENY_NETWORKS</code></p></td>
+    
+    <td><p><code>--containerd-restricted-network</code> <code>CONCOURSE_CONTAINERD_RESTRICTED_NETWORK</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><em>No equivalent CLI flag or ENV option. Configured through garden</em><code>config.ini</code></p></td>
+    
+    <td><p><code>--containerd-additional-hosts</code> <code>CONCOURSE_CONTAINERD_ADDITIONAL_HOSTS</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><em>No equivalent CLI flag</em> <code>CONCOURSE_GARDEN_DNS_SERVER</code></p></td>
+    
+    <td><p><code>--containerd-dns-server</code> <code>CONCOURSE_CONTAINERD_DNS_SERVER</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><em>No equivalent CLI flag</em> <code>CONCOURSE_GARDEN_EXTERNAL_IP</code></p></td>
+    
+    <td><p><code>--containerd-external-ip</code> <code>CONCOURSE_CONTAINERD_EXTERNAL_IP</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><em>No equivalent CLI flag</em> <code>CONCOURSE_GARDEN_MTU</code></p></td>
+    
+    <td><p><code>--containerd-mtu</code> <code>CONCOURSE_CONTAINERD_MTU</code></p></td>
+    
+  </tr>
+  
+</table>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_guardian-runtime">
+  
+  <h4 class="section-header"><a class="anchor-target" name="guardian-runtime" href="#guardian-runtime"></a><code>Guardian</code> runtime</h4>
+  
+
+  <p>Guardian is currently the default runtime for Concourse. It can also be set by setting the <code>--runtime</code> flag to <code>guardian</code> on the <code>concourse worker</code> command.</p><p>The <code>concourse worker</code> command automatically configures and runs <code>Guardian</code> using the <code>gdn</code> binary, but depending on the environment you&#39;re running Concourse in, you may need to pop open the hood and configure a few things.</p><p>The <code>gdn</code> server can be configured in two ways:</p><ol>
+
+  <li><p>By creating a <code>config.ini</code> file and passing it as <code>--garden-config</code> (or <code>CONCOURSE_GARDEN_CONFIG</code>).</p><p>The <code>.ini</code> file should look something like this:</p><pre><code class="language-ini">[server]
+flag-name=flag-value</code></pre><p>To learn which flags can be set, consult <code>gdn server --help</code>. Each flag listed can be set under the <code>[server]</code> heading.</p></li>
+
+  <li><p>By setting <code>CONCOURSE_GARDEN_*</code> environment variables.</p><p>This is primarily supported for backwards compatibility, and these variables are not present in <code>concourse worker --help</code>. They are translated to flags passed to <code>gdn server</code> by lower-casing the <code>*</code> portion and replacing underscores with hyphens.</p></li>
+
+</ol>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_troubleshooting-and-fixing-dns-resolution">
+  
+  <h4 class="section-header"><a class="anchor-target" name="troubleshooting-and-fixing-dns-resolution" href="#troubleshooting-and-fixing-dns-resolution"></a>Troubleshooting and fixing DNS resolution</h4>
+  
+
+  <blockquote class="aside"><p><strong>Note</strong>: The Guardian runtime took care of a lot of container creation operations for Concourse in the past. It was very user-friendly for the project to use as a container runtime. While implementing the containerd runtime most reported bugs were actually a difference in containerd&#39;s default behaviour compared to Guardian&#39;s. Currently Concourse&#39;s containerd runtime <strong>mostly</strong> behaves like the Guardian runtime did. Most of the following DNS section should apply to both runtimes.</p></blockquote><p>By default, containers created by the Guardian or containerd (will refer to both as <em>runtime</em>) runtime will carry over the <code>/etc/resolv.conf</code> from the host into the container. This is often fine, but some Linux distributions configure a special <code>127.x.x.x</code> DNS resolver (e.g. <code>systemd-resolved</code>).</p><p>When the runtime copies the <code>resolv.conf</code> over, it removes these entries as they won&#39;t be reachable from the container&#39;s network namespace. As a result, your containers may not have any valid nameservers configured.</p><p>To diagnose this problem you can <a href="builds.html#fly-intercept"><code>fly intercept</code></a> into a failing container and check which nameservers are in <code>/etc/resolv.conf</code>:</p><pre><code class="language-bash">$ fly -t ci intercept -j concourse/concourse
+bash-5.0$ grep nameserver /etc/resolv.conf
+bash-5.0$</code></pre><p>In this case it is empty, as the host only listed a single <code>127.0.0.53</code> address which was then stripped out. To fix this you&#39;ll need to explicitly configure DNS instead of relying on the default runtime behavior.</p>
+
+  
+    
+      <div class="section" id="section_pointing-to-external-dns-servers">
+  
+  <h5 class="section-header"><a class="anchor-target" name="pointing-to-external-dns-servers" href="#pointing-to-external-dns-servers"></a>Pointing to external DNS servers</h5>
+  
+
+  <p>If you have no need for special DNS resolution within your Concourse containers, you can configure your containers to use specific DNS server addresses external to the VM.</p><p>The Guardian and containerd runtimes can have their DNS servers configured with flags or envs vars.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>DNS Servers via flags (containerd runtime only)</code>
+  </div>
+
+  <pre><code class="language-bash">concourse worker --containerd-dns-server=&#34;1.1.1.1&#34; --containerd-dns-server=&#34;8.8.8.8&#34;</code></pre>
+</div><p><div style="margin: 0 2em 1em" class="inset"></div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>DNS Servers via env vars</code>
+  </div>
+
+  <pre><code class="language-bash"># containerd runtime
+CONCOURSE_CONTAINERD_DNS_SERVER=&#34;1.1.1.1,8.8.8.8&#34;
+# Guardian runtime
+CONCOURSE_GARDEN_DNS_SERVER=&#34;1.1.1.1,8.8.8.8&#34;</code></pre>
+</div><p><div style="margin: 0 2em 1em" class="inset"></div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>config.ini (Guardian runtime only)</code>
+  </div>
+
+  <pre><code class="language-ini">[server]
+; configure Google DNS
+dns-server=8.8.8.8
+dns-server=8.8.4.4</code></pre>
+</div><p>To verify this solves your problem you can <a href="builds.html#fly-intercept"><code>fly intercept</code></a> into a container and check which nameservers are in <code>/etc/resolv.conf</code>:</p><pre><code class="language-bash">$ fly -t ci intercept -j my-pipeline/the-job
+bash-5.0$ cat /etc/resolv.conf
+nameserver 1.1.1.1
+nameserver 8.8.8.8
+bash-5.0$ ping google.com
+PING google.com (108.177.111.139): 56 data bytes
+64 bytes from 108.177.111.139: seq=0 ttl=47 time=2.672 ms
+64 bytes from 108.177.111.139: seq=1 ttl=47 time=0.911 ms</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_using-a-local-dns-server">
+  
+  <h5 class="section-header"><a class="anchor-target" name="using-a-local-dns-server" href="#using-a-local-dns-server"></a>Using a local DNS server</h5>
+  
+
+  <p>If you would like to use Consul, <code>dnsmasq</code>, or some other DNS server running on the worker VM, you&#39;ll have to configure the LAN address of the VM as the DNS server <em>and</em> allow the containers to reach the address, like so:</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>Local DNS Servers via flags (containerd runtime only)</code>
+  </div>
+
+  <pre><code class="language-bash">concourse worker --containerd-dns-server=&#34;10.0.1.3&#34; --containerd-allow-host-access=&#34;true&#34;</code></pre>
+</div><p><div style="margin: 0 2em 1em" class="inset"></div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>Local DNS Servers via env vars</code>
+  </div>
+
+  <pre><code class="language-bash"># containerd runtime
+CONCOURSE_CONTAINERD_DNS_SERVER=&#34;10.0.1.3&#34;
+CONCOURSE_CONTAINERD_ALLOW_HOST_ACCESS=&#34;true&#34;
+# Guardian runtime
+CONCOURSE_GARDEN_DNS_SERVER=&#34;10.0.1.3&#34;
+CONCOURSE_GARDEN_ALLOW_HOST_ACCESS=&#34;true&#34;</code></pre>
+</div><p><div style="margin: 0 2em 1em" class="inset"></div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>config.ini (Guardian runtime only)</code>
+  </div>
+
+  <pre><code class="language-ini">[server]
+; internal IP of the worker machine
+dns-server=10.0.1.3
+
+; allow containers to reach the above IP
+allow-host-access=true</code></pre>
+</div><p><div style="margin: 0 2em 1em" class="inset"></div></p><div class="warning">
+  <p>Make sure to read <a href="concourse-worker.html#note-on-allow-host-access">A note on allowing host access and DNS proxy</a> to understand the implications of using <code>allow-host-access</code></p>
+</div><p>To validate whether the changes have taken effect, you can <a href="builds.html#fly-intercept"><code>fly intercept</code></a> into any container and check <code>/etc/resolv.conf</code> once again:</p><pre><code class="language-bash">$ fly -t ci intercept -j my-pipeline/the-job
+bash-5.0$ cat /etc/resolv.conf
+nameserver 10.1.2.3
+bash-5.0$ nslookup concourse-ci.org
+Server:         10.1.2.3
+Address:        10.1.2.3#53
+
+Non-authoritative answer:
+Name:   concourse-ci.org
+Address: 185.199.108.153
+Name:   concourse-ci.org
+Address: 185.199.109.153
+Name:   concourse-ci.org
+Address: 185.199.110.153
+Name:   concourse-ci.org
+Address: 185.199.111.153</code></pre><p>If <code>nslookup</code> times out or fails, you may need to open up firewalls or security group configuration so that the worker VM can send UDP/TCP packets to itself.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_note-on-allow-host-access">
+  
+  <h5 class="section-header"><a class="anchor-target" name="note-on-allow-host-access" href="#note-on-allow-host-access"></a>A note on allowing host access and DNS proxy</h5>
+  
+
+  <p>Setting <code>allow-host-access</code> will, well, allow containers to access your host VM&#39;s network. If you don&#39;t trust your container workloads, you may not want to allow this.  With host network access, containers will be able to reach out to any other locally running network processes running on the worker including the garden and baggageclaim servers <strong>which would allow them to issue commands and manipulate other containers and volumes on the same worker</strong>.</p><p>Setting <code>dns-proxy-enable</code> will also enable <code>allow-host-access</code> (since the dns proxy will be run on the host, therefore requiring host access be enabled).</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_configuring-peer-to-peer-volume-streaming">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-peer-to-peer-volume-streaming" href="#configuring-peer-to-peer-volume-streaming"></a>Configuring Peer-to-Peer Volume Streaming</h3>
+  
+
+  <p>Peer-to-Peer (P2P) volume streaming enables the workers to stream volumes directly to each other instead of always streaming volumes through the web node(s). This can reduce the time it takes for individual steps in a job to start and reduce the amount of network traffic used by the Concourse cluster.</p><div class="warning">
+  <p>NOTE: This feature is experimental. It is not as robust as the default volume streaming setup which always goes through web nodes.</p>
+</div><p><strong>Pre-Requisites</strong></p><ul>
+
+  <li><p>All worker nodes need to be able to reach each other via IP address. This usually means they are on the same LAN. You can test this by trying to ping one worker from another worker. If even one worker does not meet this requirement then you cannot use P2P volume streaming.</p></li>
+
+  <li><p>The baggageclaim port (<code>7788</code> is the default) is open to traffic on all worker nodes. You can verify the port is open and reaching the baggageclaim API server by hitting the <code>/volumes</code> endpoint.</p><p><code>curl http://&lt;worker-IP-address&gt;:7788/volumes</code></p></li>
+
+</ul><p>To enable P2P volume streaming you need to configure some settings on the web and worker nodes. Configure the worker nodes first. Configure the web node(s) last.</p>
+
+  
+    
+      <div class="section" id="section_p2p-worker-configuration">
+  
+  <h4 class="section-header"><a class="anchor-target" name="p2p-worker-configuration" href="#p2p-worker-configuration"></a>P2P Worker Configuration</h4>
+  
+
+  <ul>
+
+  <li><p><code>CONCOURSE_BAGGAGECLAIM_BIND_IP=0.0.0.0</code> - <em>Required.</em> The worker needs to listen for traffic over <code>127.0.0.1</code> (to receive info from the web node) as well as its LAN IP in a P2P setup. Therefore we need to set the IP baggageclaim binds to to <code>0.0.0.0</code>.</p></li>
+
+  <li><p><code>CONCOURSE_BAGGAGECLAIM_P2P_INTERFACE_NAME_PATTERN=eth0</code> - <em>Optional.</em> Regular expression to match a network interface for P2P streaming. This is how a worker determines its own LAN IP address, by looking it up via the LAN interface specified by this flag.</p><p>You can determine the name of the LAN interface for any worker by listing all network interfaces and noting which interface has the LAN IP that you want the worker to use.</p><p>To view all available network interfaces on your worker: <ul>
+
+  <li><p>On Linux run <code>ip addr list</code></p></li>
+
+  <li><p>On MacOS run <code>ifconfig</code></p></li>
+
+  <li><p>On Windows run <code>ipconfig</code>. Windows network interface names are very different from Unix device names. Example network interface names for Windows include: <pre><code class="language-">Ethernet 4
+Local Area Connection* 2
+Local Area Connection* 12
+Wi-Fi 5
+Bluetooth Network Connection 2
+Loopback Pseudo-Interface 1</code></pre></p></li>
+
+</ul></p></li>
+
+  <li><p><code>CONCOURSE_BAGGAGECLAIM_P2P_INTERFACE_FAMILY=4</code> - <em>Optional.</em> Tells the worker to use IPv4 or IPv6. Defaults to <code>4</code> for IPv4. Set to <code>6</code> for IPv6.</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_p2p-web-configuration">
+  
+  <h4 class="section-header"><a class="anchor-target" name="p2p-web-configuration" href="#p2p-web-configuration"></a>P2P Web Configuration</h4>
+  
+
+  <p>You need to tell the web node(s) to use P2P volume streaming.</p><p><code>CONCOURSE_ENABLE_P2P_VOLUME_STREAMING=true</code></p><p>Once that flag is set and the web node is restarted, P2P volume streaming will start occurring in your Concourse cluster.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.2.4</span>
+              
+
+              <a href="concourse-web.html">Running a <code>web</code> node</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.2.6</span>
+              
+
+              <a href="upgrading-concourse.html">Upgrading Concourse</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/config-basics.html b/config-basics.html
new file mode 100644
index 00000000..ae7e78f9
--- /dev/null
+++ b/config-basics.html
@@ -0,0 +1,583 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Config Basics - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html"  class="self">Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.5</span><a href="config-basics.html"  class="self">Config Basics</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.5.1</td>
+            <td class="title-cell"><a href="config-basics.html#intro-to-yaml" >Intro to YAML</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5.2</td>
+            <td class="title-cell"><a href="config-basics.html#basic-schemas" >Basic Schemas</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.5.1</td>
+        <td class="title-cell"><a href="config-basics.html#intro-to-yaml" >Intro to YAML</a></td>
+      </tr>
+      
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.5.1.1</td>
+        <td class="title-cell"><a href="config-basics.html#yaml-tips-and-tricks" >YAML Tips &amp; Tricks</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.5.1.2</td>
+        <td class="title-cell"><a href="config-basics.html#yaml-quirks" >YAML Quirks</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.5.2</td>
+        <td class="title-cell"><a href="config-basics.html#basic-schemas" >Basic Schemas</a></td>
+      </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.number"><strong><code>number</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.string"><strong><code>string</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.config"><strong><code>config</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.vars"><strong><code>vars</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.env-vars"><strong><code>env-vars</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.boolean"><strong><code>boolean</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.value"><strong><code>value</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.identifier"><strong><code>identifier</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.dir-path"><strong><code>dir-path</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.file-path"><strong><code>file-path</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.duration"><strong><code>duration</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="config-basics.html#schema.version"><strong><code>version</code></strong> schema</a></td>
+        </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_config-basics">
+  
+  <h1 class="section-header"><a class="anchor-target" name="config-basics" href="#config-basics"></a><span class="section-number">1.5 </span>Config Basics</h1>
+  
+
+  <p>Concourse configuration for things like <a href="pipelines.html">Pipelines</a> and <a href="tasks.html">Tasks</a> is done through declarative <a href="https://en.wikipedia.org/wiki/YAML">YAML</a> files.</p><p>Concourse configuration supports basic variable substitution by way of <a href="vars.html"><code>((vars))</code></a>. There is no built-in support for fancier templating constructs, e.g. loops and conditionals; users are free to use whatever templating system they like.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.5.1</span>
+      <a href="config-basics.html#intro-to-yaml">Intro to YAML</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.5.1.1</span>
+      <a href="config-basics.html#yaml-tips-and-tricks">YAML Tips &amp; Tricks</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.5.1.2</span>
+      <a href="config-basics.html#yaml-quirks">YAML Quirks</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.5.2</span>
+      <a href="config-basics.html#basic-schemas">Basic Schemas</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_intro-to-yaml">
+  
+  <h2 class="section-header"><a class="anchor-target" name="intro-to-yaml" href="#intro-to-yaml"></a>Intro to YAML</h2>
+  
+
+  <p><a href="https://yaml.org">YAML</a> is a human-friendly syntax for writing structured documents. You can think of it as JSON without the sharp edges.</p><p>Here&#39;s a quick example demonstrating common YAML syntax:</p><pre><code class="language-yaml"># commented lines are prefixed with the &#39;#&#39; character
+
+# strings
+quoted_string: &#34;bar&#34;
+unquoted_string: hello world!
+multiline_string: |
+  hello, world!
+  this is one big string with a trailing linebreak!
+
+# arrays
+array: [hello, world]
+multiline_array:
+- hello
+- world
+
+# objects
+object: {one: uno, two: dos}
+multiline_object:
+  one: uno
+  two: dos
+
+# boolean values
+booleans: [true, false]
+
+# numeric values
+numeric: [1234, 12.34]</code></pre>
+
+  
+    
+      <div class="section" id="section_yaml-tips-and-tricks">
+  
+  <h3 class="section-header"><a class="anchor-target" name="yaml-tips-and-tricks" href="#yaml-tips-and-tricks"></a>YAML Tips &amp; Tricks</h3>
+  
+
+  <p>YAML anchor syntax can be used to avoid repetition within configuration.</p><p>For example, the following YAML document...:</p><pre><code class="language-yaml">large_value: &amp;my_anchor
+  do_the_thing: true
+  with_these_values: [1, 2, 3]
+
+duplicate_value: *my_anchor</code></pre><p>...is exactly equivalent to:</p><pre><code class="language-yaml">large_value:
+  do_the_thing: true
+  with_these_values: [1, 2, 3]
+
+duplicate_value:
+  do_the_thing: true
+  with_these_values: [1, 2, 3]</code></pre><p>If you find yourself repeating configuration throughout your pipeline, it may be a sign that Concourse is missing some kind of abstraction to make your pipeline less verbose. If you have the time and are interested in helping out with Concourse&#39;s design, feedback of this sort is welcome in <a href="https://github.com/concourse/concourse/discussions">GitHub Discussions</a>!</p><p>We do want to avoid implementing an entire YAML templating engine within Concourse. We encoruage you to reach for your favourite templating tool if you&#39;re eager about <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRYing</a> up your pipelines as much as possible.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_yaml-quirks">
+  
+  <h3 class="section-header"><a class="anchor-target" name="yaml-quirks" href="#yaml-quirks"></a>YAML Quirks</h3>
+  
+
+  <p>YAML has some weird parts. For example, all of the following terms are acceptable boolean values: <code>true</code>, <code>false</code>, <code>yes</code>, <code>no</code>, <code>on</code>, <code>off</code>.</p><p>YAML is also whitespace-sensitive. For the most part, this is really handy because it keeps you from having to count curly-braces in deeply nested parts of configuration such as <a href="jobs.html#schema.job.plan"><code class="schema-attribute-name"><bold>job<wbr />.plan</bold></code></a>. Sometimes, though, it can be hard to keep track of the correct indentation level.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_basic-schemas">
+  
+  <h2 class="section-header"><a class="anchor-target" name="basic-schemas" href="#basic-schemas"></a>Basic Schemas</h2>
+  
+
+  <p>Throughout the Concourse documentation you will come across schema definitions for each API.</p><p>The following are basic schema definitions that the other schemas refer to. You can probably skip past this and just make assumptions along the way; this is just here for completeness!</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.number" href="#schema.number"></a><code>number</code> schema</h2>
+
+  <p>Any integer, i.e. <code>1000</code>.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.string" href="#schema.string"></a><code>string</code> schema</h2>
+
+  <p>An arbitrary string value with no content restrictions.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.config" href="#schema.config"></a><code>config</code> schema</h2>
+
+  <p>An arbitrary object representing configuration that is not directly interpreted by Concourse - typically given to a <a href="resource-types.html">resource type</a>.</p><pre><code class="language-yaml">uri: https://github.com/vito/booklit
+branch: master</code></pre><p>All object keys must be strings, preferably <code>snake_cased</code>.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.vars" href="#schema.vars"></a><code>vars</code> schema</h2>
+
+  <p>An arbitrary object representing key-value definitions for <a href="vars.html"><code>((vars))</code></a>.</p><p>As with <a href="config-basics.html#schema.config"><strong><code>config</code></strong> schema</a>, all object keys must be strings, preferably <code>snake_cased</code>.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.env-vars" href="#schema.env-vars"></a><code>env-vars</code> schema</h2>
+
+  <p>An object containing string keys and string values. Each pair represents an environment variable to set to the given value.</p><pre><code class="language-yaml">SOME_SIMPLE_VAR: simple-var
+SOME_LONG_VAR: |
+  This is an example of using YAML multi-line string syntax to set a very
+  long environment variable value.
+SOME_NUMERIC_VALUE: &#34;1&#34;</code></pre><p>Note that in the last example we took special care to quote the number.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.boolean" href="#schema.boolean"></a><code>boolean</code> schema</h2>
+
+  <p><code>true</code> or <code>false</code>.</p><p>YAML also supports the alias <code>yes</code>, <code>no</code>, <code>on</code>, or <code>off</code>, but...please don&#39;t.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.value" href="#schema.value"></a><code>value</code> schema</h2>
+
+  <p>An arbitrary YAML value. May be a <a href="config-basics.html#schema.number"><strong><code>number</code></strong> schema</a>, <a href="config-basics.html#schema.string"><strong><code>string</code></strong> schema</a>, <a href="config-basics.html#schema.boolean"><strong><code>boolean</code></strong> schema</a>, <a href="config-basics.html#schema.config"><strong><code>config</code></strong> schema</a>, or a <code>[<a href="config-basics.html#schema.value"><strong><code>value</code></strong> schema</a>]</code>.</p><pre><code class="language-yaml">values:
+- 123
+- bar
+- true
+- key1: abc
+  key2: def
+- [hello, world]</code></pre>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.identifier" href="#schema.identifier"></a><code>identifier</code> schema</h2>
+
+  <p>An <em>identifier</em> is a string value. The following defines the allowed character set for an <em>identifier</em>:</p><ul>
+
+  <li><p>Unicode lowercase letters, while still supporting languages that don&#39;t have any casing (e.g. Japanese).</p></li>
+
+  <li><p>Decimal numbers.</p></li>
+
+  <li><p>Hyphens <code>-</code> and underscores <code>_</code> as word separators.</p></li>
+
+  <li><p>Periods <code>.</code> in order to support domain names and version numbers.</p></li>
+
+</ul><p>The validation rule is as follows:</p><pre><code class="language-regex">^[\p{Ll}\p{Lt}\p{Lm}\p{Lo}\d][\p{Ll}\p{Lt}\p{Lm}\p{Lo}\d\-_.]*$</code></pre><p>Where all <em>identifier</em> must start with a Unicode lowercase letter or number, followed by any number of allowed characters.</p><p>Currently, the validation will only show as warnings. For the sake of future-proofing, you may want to conform to it.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.dir-path" href="#schema.dir-path"></a><code>dir-path</code> schema</h2>
+
+  <p>A string value specifying a (typically relative) path of a directory.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.file-path" href="#schema.file-path"></a><code>file-path</code> schema</h2>
+
+  <p>A string value specifying a (typically relative) path of a file.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.duration" href="#schema.duration"></a><code>duration</code> schema</h2>
+
+  <p>A string value in <a href="https://golang.org/pkg/time/#ParseDuration">Go <code>time.ParseDuration</code> format</a>. <code>1h</code> for one hour, <code>5m</code> for 5 minutes.</p>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.version" href="#schema.version"></a><code>version</code> schema</h2>
+
+  <p>An object with string keys and string values.</p><p>The following is an array of versions:</p><pre><code class="language-yaml">- {&#34;ref&#34;: &#34;33042e15e930b6786fc9b0a9ea5dec78689c5e4b&#34;}
+- ref: v1.2.0,
+  sha: 33042e15e930b6786fc9b0a9ea5dec78689c5e4b
+- foo: &#34;0&#34;</code></pre><p>Note that in the last example we took special care to quote the number.</p><p>In many scenarios where a version can be specified, e.g. <a href="get-step.html#schema.get.version"><code>get</code> step <strong><code>version</code></strong></a>, only a subset of the full set of fields is necessary. The latest version matching the fields specified will be chosen.</p>
+</div>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.4</span>
+              
+
+              <a href="fly.html">The <code>fly</code> CLI</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.6</span>
+              
+
+              <a href="pipelines.html">Pipelines</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/configuring-auth.html b/configuring-auth.html
new file mode 100644
index 00000000..5810358c
--- /dev/null
+++ b/configuring-auth.html
@@ -0,0 +1,450 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Configuring Auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="self">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="self">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_configuring-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="configuring-auth" href="#configuring-auth"></a><span class="section-number">1.3.2 </span>Configuring Auth</h1>
+  
+
+  <p>The very first thing to configure with Concourse is how users will log in, and what those users should be able to do.</p><p>This is configured in two separate tiers:</p><ul>
+
+  <li><p><strong>Authentication</strong>, how users identify themselves, is configured on the <a href="concourse-web.html"><code>web</code> node</a>.</p></li>
+
+  <li><p><strong>Authorization</strong>, how user access is determined, is configured on each team.</p></li>
+
+</ul><p>Concourse currently supports the following auth methods:</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.2.1</span>
+      <a href="local-auth.html">Local User auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.2</span>
+      <a href="github-auth.html">GitHub auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.3</span>
+      <a href="gitlab-auth.html">GitLab auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.4</span>
+      <a href="bitbucket-cloud-auth.html">BitBucket Cloud auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.5</span>
+      <a href="cf-uaa-auth.html">CF/UAA auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.6</span>
+      <a href="ldap-auth.html">LDAP auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.7</span>
+      <a href="microsoft-auth.html">Microsoft auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.8</span>
+      <a href="generic-oidc-auth.html">Generic OIDC auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.9</span>
+      <a href="generic-oauth.html">Generic oAuth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.10</span>
+      <a href="generic-saml-auth.html">Generic SAML auth</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div><p>Any number of providers can be enabled at any one time. Users will be given a choice when logging in as to which one they would like to use.</p><p>Concourse uses a fork of <a href="https://github.com/dexidp/dex">Dex</a> for its authentication. You can find additional documentation on the supported auth providers in the <a href="https://github.com/dexidp/dex/tree/master/Documentation/connectors">Dex connectors documentation</a>.</p><p>Adding a new auth provider to Concourse is as simple as submitting a pull request to our <a href="https://github.com/concourse/dex">fork of Dex</a> and then adding a bit of configuration to the <a href="https://github.com/concourse/concourse/tree/master/skymarshal"><code>skymarshal</code> component</a>.</p>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.1</span>
+              
+
+              <a href="main-team.html">The <code>main</code> team</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.1</span>
+              
+
+              <a href="local-auth.html">Local User auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/conjur-credential-manager.html b/conjur-credential-manager.html
new file mode 100644
index 00000000..a85d257b
--- /dev/null
+++ b/conjur-credential-manager.html
@@ -0,0 +1,616 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The Conjur credential manager - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html"  class="self">The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.15.4.6.1</td>
+        <td class="title-cell"><a href="conjur-credential-manager.html#configuration" >Configuration</a></td>
+      </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-appliance-url"><strong><code>conjur-appliance-url</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-account"><strong><code>conjur-account</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-authn-login"><strong><code>conjur-authn-login</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-authn-api-key"><strong><code>conjur-authn-api-key</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-authn-token-file"><strong><code>conjur-authn-token-file</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-cert-file"><strong><code>conjur-cert-file</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-pipeline-secret-template"><strong><code>conjur-pipeline-secret-template</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-team-secret-template"><strong><code>conjur-team-secret-template</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="conjur-credential-manager.html#conjur-secret-template"><strong><code>conjur-secret-template</code></strong></a></td>
+        </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.6.2</td>
+        <td class="title-cell"><a href="conjur-credential-manager.html#conjur-permissions" >Conjur Permissions</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.15.4.6.3</td>
+        <td class="title-cell"><a href="conjur-credential-manager.html#credential-lookup-rules" >Credential Lookup Rules</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_conjur-credential-manager">
+  
+  <h1 class="section-header"><a class="anchor-target" name="conjur-credential-manager" href="#conjur-credential-manager"></a><span class="section-number">1.15.4.6 </span>The Conjur credential manager</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Configuration</h2>
+  
+
+  <p>Concourse can be configured to pull credentials from a <a href="https://conjur.org">Cyberark Conjur</a> instance.</p><p>The ATC is configured with a Conjur host username and api key or session token. If no host username, api key, or session token is provided,  Concourse will attempt to use environment variables.</p><p>The ATC&#39;s configuration specifies the following:</p><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-appliance-url"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-appliance-url"><strong>conjur-appliance-url</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>URL of the Conjur instance.</p><p>Environment variable <code>CONCOURSE_CONJUR_APPLIANCE_URL</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-account"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-account"><strong>conjur-account</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The Conjur account.</p><p>Environment variable <code>CONCOURSE_CONJUR_ACCOUNT</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-authn-login"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-authn-login"><strong>conjur-authn-login</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A valid Conjur host username.</p><p>Environment variable <code>CONCOURSE_CONJUR_AUTHN_LOGIN</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-authn-api-key"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-authn-api-key"><strong>conjur-authn-api-key</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The api key that corresponds to the Conjur host username.</p><p>Environment variable <code>CONCOURSE_CONJUR_AUTHN_API_KEY</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-authn-token-file"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-authn-token-file"><strong>conjur-authn-token-file</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>Token file used if Conjur instance is running in k8s or iam. </p><p>Environment variable <code>CONCOURSE_CONJUR_AUTHN_TOKEN_FILE</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-cert-file"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-cert-file"><strong>conjur-cert-file</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>Cert file used if conjur instance is using a self signed cert.</p><p>Environment variable <code>CONCOURSE_CONJUR_CERT_FILE</code>.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-pipeline-secret-template"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-pipeline-secret-template"><strong>conjur-pipeline-secret-template</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The base path used when attempting to locate a pipeline-level secret.</p><p>Environment variable <code>CONCOURSE_CONJUR_PIPELINE_SECRET_TEMPLATE</code>.</p><p>Example:</p><p>Default: <code>concourse/{{.Team}}/{{.Pipeline}}/{{.Secret}}</code></p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-team-secret-template"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-team-secret-template"><strong>conjur-team-secret-template</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The base path used when attempting to locate a team-level secret.</p><p>Environment variable <code>CONCOURSE_CONJUR_TEAM_SECRET_TEMPLATE</code>.</p><p>Example:</p><p>Default: <code>concourse/{{.Team}}/{{.Secret}}</code></p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="conjur-secret-template"></a>
+    <pre><a href="conjur-credential-manager.html#conjur-secret-template"><strong>conjur-secret-template</strong></a>: string</pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The base path used when attempting to locate a vault or safe level secret.</p><p>Environment variable <code>CONCOURSE_CONJUR_SECRET_TEMPLATE</code>.</p><p>Example:</p><p>Default: <code>vaultName/{{.Secret}}</code></p>
+  </div>
+</div><p>For example, to launch the ATC and enable Conjur, you may configure:</p><pre><code class="language-bash">concourse web ... \
+  --conjur-appliance-url https://conjur-master.local \
+  --conjur-account conjur \
+  --conjur-authn-login host/concourse/dev \
+  --conjur-authn-api-key 107eaqz167jkzm2q8wjv4mnyj0z12gfkws9wq9gzsjt29v2sn7yvy
+
+# or use env variables
+CONCOURSE_CONJUR_APPLIANCE_URL=&#34;https://conjur-master.local&#34; \
+CONCOURSE_CONJUR_ACCOUNT=&#34;conjur&#34; \
+CONCOURSE_CONJUR_AUTHN_LOGIN=&#34;host/concourse/dev&#34; \
+CONCOURSE_CONJUR_AUTHN_API_KEY=&#34;107eaqz167jkzm2q8wjv4mnyj0z12gfkws9wq9gzsjt29v2sn7yvy&#34; \
+concourse web ...</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_conjur-permissions">
+  
+  <h2 class="section-header"><a class="anchor-target" name="conjur-permissions" href="#conjur-permissions"></a>Conjur Permissions</h2>
+  
+
+  <p>The following is an example Conjur policy that can be used to grant permissions to a Conjur host. In this example <code>host/concourse</code>  will have permissions to read and update all of the secrets within  the TEAM_NAME and PIPELINE_NAME policies.</p><pre><code class="language-yaml">- !host concourse
+- !policy
+  id: concourse
+  owner: !host concourse
+  body:
+  - !policy 
+    id: TEAM_NAME
+    body:
+    - !variable team-secret-variable
+    - !policy
+      id: PIPELINE_NAME
+      body:
+      - !variable pipeline-secret-variable</code></pre><p>Note that the <code>TEAM_NAME</code> and <code>PIPELINE_NAME</code> text above should be replaced to fit your Concourse setup.</p><p>For more information on how to create and load Conjur policies, review the <a href="https://docs.conjur.org/Latest/en/Content/Operations/Policy/policy-overview.htm?tocpath=Fundamentals%7CPolicy%20Management%7C_____0">official documentation</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_credential-lookup-rules">
+  
+  <h2 class="section-header"><a class="anchor-target" name="credential-lookup-rules" href="#credential-lookup-rules"></a>Credential Lookup Rules</h2>
+  
+
+  <p>When resolving a parameter such as <code>((foo_param))</code>, Concourse will look in the following paths, in order:</p><ul>
+
+  <li><pre><code class="language-">concourse/TEAM_NAME/PIPELINE_NAME/foo_param</code></pre></li>
+
+  <li><pre><code class="language-">concourse/TEAM_NAME/foo_param</code></pre></li>
+
+  <li><pre><code class="language-">vaultName/foo_param</code></pre></li>
+
+</ul><p>The leading <code>concourse</code> can be changed by specifying <code>--conjur-pipeline-secret-template</code> or <code>--conjur-team-secret-template</code> variables.</p><p>The leading <code>vaultName</code> can be changed by specifying <code>--conjur-secret-template</code> variable.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.5</span>
+              
+
+              <a href="kubernetes-credential-manager.html">Kubernetes Credential Manager</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.7</span>
+              
+
+              <a href="idtoken-credential-manager.html">The IDToken credential manager</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/container-image-guides.html b/container-image-guides.html
new file mode 100644
index 00000000..96cff5af
--- /dev/null
+++ b/container-image-guides.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Container Image Guides - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html" >Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html"  class="self">Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.3</span><a href="container-image-guides.html"  class="self">Container Image Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.3.1</td>
+            <td class="title-cell"><a href="building-and-pushing-an-image.html" >Building and Pushing an Image</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3.2</td>
+            <td class="title-cell"><a href="building-an-image-and-using-it-in-a-task.html" >Building an Image and Using it in a Task</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_container-image-guides">
+  
+  <h1 class="section-header"><a class="anchor-target" name="container-image-guides" href="#container-image-guides"></a><span class="section-number">1.14.3 </span>Container Image Guides</h1>
+  
+
+  <div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.3.1</span>
+      <a href="building-and-pushing-an-image.html">Building and Pushing an Image</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.3.2</span>
+      <a href="building-an-image-and-using-it-in-a-task.html">Building an Image and Using it in a Task</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.2</span>
+              
+
+              <a href="git-guides.html">Git Guides</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.3.1</span>
+              
+
+              <a href="building-and-pushing-an-image.html">Building and Pushing an Image</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/container-placement.html b/container-placement.html
new file mode 100644
index 00000000..c0992d96
--- /dev/null
+++ b/container-placement.html
@@ -0,0 +1,455 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Container Placement - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html"  class="self">Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.6</span><a href="container-placement.html"  class="self">Container Placement</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.6.1</td>
+            <td class="title-cell"><a href="container-placement.html#volume-locality-strategy" >The <code>volume-locality</code> strategy</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6.2</td>
+            <td class="title-cell"><a href="container-placement.html#fewest-build-containers-strategy" >The <code>fewest-build-containers</code> strategy</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6.3</td>
+            <td class="title-cell"><a href="container-placement.html#random-strategy" >The <code>random</code> strategy</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6.4</td>
+            <td class="title-cell"><a href="container-placement.html#limit-active-tasks-strategy" >The <code>limit-active-tasks</code> strategy</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6.5</td>
+            <td class="title-cell"><a href="container-placement.html#limit-active-containers-strategy" >The <code>limit-active-containers</code> strategy</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6.6</td>
+            <td class="title-cell"><a href="container-placement.html#limit-active-volumes-strategy" >The <code>limit-active-volumes</code> strategy</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6.7</td>
+            <td class="title-cell"><a href="container-placement.html#chaining-placement-strategies" >Chaining Placement Strategies</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_container-placement">
+  
+  <h1 class="section-header"><a class="anchor-target" name="container-placement" href="#container-placement"></a><span class="section-number">1.15.6 </span>Container Placement</h1>
+  
+
+  <p>Each <a href="steps.html">step</a> in a build is executed inside a container. The <a href="concourse-web.html"><code>web</code> node</a> distributes containers across the worker cluster depending on the configured strategy. If no workers satisfies the configured strategy, the <a href="steps.html">step</a> will block until a worker becomes available.</p>
+
+  
+    
+      <div class="section" id="section_volume-locality-strategy">
+  
+  <h2 class="section-header"><a class="anchor-target" name="volume-locality-strategy" href="#volume-locality-strategy"></a>The <code>volume-locality</code> strategy</h2>
+  
+
+  <p>When using <code>volume-locality</code>, the <a href="concourse-web.html"><code>web</code> node</a> places <a href="task-step.html"><code>task</code> step</a> and <a href="put-step.html"><code>put</code> step</a> containers on workers where a majority of their inputs are already present. <strong>This is the default strategy.</strong></p><p>The advantage of this approach is that it reduces the likelihood that large artifacts will have to be streamed from one <a href="concourse-worker.html"><code>worker</code> node</a>, through the <a href="concourse-web.html"><code>web</code> node</a>, and to the target <a href="concourse-worker.html"><code>worker</code> node</a>. For large artifacts, this can result in quite a bit of overhead.</p><p>The disadvantage of this approach is that it can sometimes result in builds &#34;gravitating&#34; to a particular worker and overloading it, at least until the resource caches warm across the worker pool. This disadvantage can be partially mitigated using the (currently experimental) <a href="container-placement.html#limit-active-volumes-strategy"><code>limit-active-volumes</code> strategy</a> in conjunction with <a href="container-placement.html#chaining-placement-strategies">Chaining Placement Strategies</a>.</p><p>If your builds tend to be light on artifacts and heavy on task execution, you may want to try the <a href="container-placement.html#fewest-build-containers-strategy"><code>fewest-build-containers</code> strategy</a> or the (currently experimental) <a href="container-placement.html#limit-active-tasks-strategy"><code>limit-active-tasks</code> strategy</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fewest-build-containers-strategy">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fewest-build-containers-strategy" href="#fewest-build-containers-strategy"></a>The <code>fewest-build-containers</code> strategy</h2>
+  
+
+  <p>When using the <code>fewest-build-containers</code> strategy, step containers (<code>get</code>, <code>put</code>, <code>task</code>) are placed on the worker that has the fewest build containers (i.e. containers for other steps of other builds).</p><blockquote class="aside"><p>Containers used for resource checks are not counted because they are long-living containers that get re-used for multiple checks, and therefore consume very little resources on the worker.</p></blockquote><p>To use this strategy, set the following env var on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_CONTAINER_PLACEMENT_STRATEGY=fewest-build-containers</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_random-strategy">
+  
+  <h2 class="section-header"><a class="anchor-target" name="random-strategy" href="#random-strategy"></a>The <code>random</code> strategy</h2>
+  
+
+  <p>With the <code>random</code> strategy, the <a href="concourse-web.html"><code>web</code> node</a> places <code>get</code>, <code>put</code> and <code>task</code> containers on any worker, ignoring any affinity.</p><p>As this is truly random, this will be fine until one day it&#39;s not fine.</p><p>To use this strategy, set the following env var on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_CONTAINER_PLACEMENT_STRATEGY=random</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_limit-active-tasks-strategy">
+  
+  <h2 class="section-header"><a class="anchor-target" name="limit-active-tasks-strategy" href="#limit-active-tasks-strategy"></a>The <code>limit-active-tasks</code> strategy</h2>
+  
+
+  <p><div class="warning">
+  <code>limit-active-tasks</code> is an <strong>experimental</strong> feature.
+</div></p><p>When selecting the <code>limit-active-tasks</code> placement strategy, each <code>task</code> executed on a worker will increase the number of &#34;active tasks&#34; on that worker by one. When the task completes the number is decreased by one. The <a href="concourse-web.html"><code>web</code> node</a> then places <code>get</code>, <code>put</code> and <code>task</code> containers on the worker that currently has the <em>least amount of active tasks</em>.</p><p>Additionally <code>max-active-tasks-per-worker</code> can be set to an integer of 1 or more, in which case a worker will not execute more than that amount of <strong>tasks</strong>. A value of 0 means that there is no limit on the maximum number of active tasks on the workers. If no worker can be selected because all of them already have <code>max-active-tasks-per-worker</code> active tasks, then the task will wait for a free worker, periodically polling the pool. The metric <code>concourse_steps_waiting{type=&#34;task&#34;}</code> is emitted to monitor these events. Note that the parameter does not apply to <code>get</code> and <code>put</code> steps which will always be scheduled on the worker with the fewest active tasks.</p><p><pre><code class="language-bash">CONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-tasks</code></pre> and, optionally <pre><code class="language-bash">CONCOURSE_MAX_ACTIVE_TASKS_PER_WORKER=1</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_limit-active-containers-strategy">
+  
+  <h2 class="section-header"><a class="anchor-target" name="limit-active-containers-strategy" href="#limit-active-containers-strategy"></a>The <code>limit-active-containers</code> strategy</h2>
+  
+
+  <p><div class="warning">
+  <code>limit-active-containers</code> is an <strong>experimental</strong> feature.
+</div></p><p>The <code>limit-active-containers</code> placement strategy rejects workers that already have too many containers. It makes no effort to find the worker with the fewest number of containers present, and is therefore most useful when combined with other placement stragies by <a href="container-placement.html#chaining-placement-strategies">Chaining Placement Strategies</a>.</p><p><code>max-active-containers-per-worker</code> can be set to an integer of 1 or more, in which case a worker will not execute more than that amount of <strong>containers</strong>. If unset (or set to a value of 0), the <code>limit-active-containers</code> strategy has no effect - if this is your only placement strategy, workers will be chosen at random.</p><pre><code class="language-bash">CONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-containers
+CONCOURSE_MAX_ACTIVE_CONTAINERS_PER_WORKER=200</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_limit-active-volumes-strategy">
+  
+  <h2 class="section-header"><a class="anchor-target" name="limit-active-volumes-strategy" href="#limit-active-volumes-strategy"></a>The <code>limit-active-volumes</code> strategy</h2>
+  
+
+  <p><div class="warning">
+  <code>limit-active-volumes</code> is an <strong>experimental</strong> feature.
+</div></p><p>The <code>limit-active-volumes</code> placement strategy rejects workers that already have too many volumes. It makes no effort to find the worker with the fewest number of volumes present, and is therefore most useful when combined with other placement stragies by <a href="container-placement.html#chaining-placement-strategies">Chaining Placement Strategies</a>.</p><p><code>max-active-volumes-per-worker</code> can be set to be an integer of 1 or more, in which case a worker will not execute more than that amount of <strong>volumes</strong>. If unset (or set to a value of 0), the <code>limit-active-volumes</code> strategy has no effect - if this is your only placement strategy, workers will be chosen at random.</p><pre><code class="language-bash">CONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-volumes
+CONCOURSE_MAX_ACTIVE_VOLUMES_PER_WORKER=200</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_chaining-placement-strategies">
+  
+  <h2 class="section-header"><a class="anchor-target" name="chaining-placement-strategies" href="#chaining-placement-strategies"></a>Chaining Placement Strategies</h2>
+  
+
+  <p>Container placement strategies can be chained together to apply multiple strategies in sequence. The first strategy in the chain receives the entire set of workers, filtering the set down in some way, and passing that new set of workers to the next strategy in the chain. If the last strategy in the chain returns multiple workers, one will be chosen at random.</p><p>For instance, consider the following configuration:</p><pre><code class="language-bash">CONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-containers,limit-active-volumes,volume-locality,fewest-build-containers
+CONCOURSE_MAX_ACTIVE_CONTAINERS_PER_WORKER=200
+CONCOURSE_MAX_ACTIVE_VOLUMES_PER_WORKER=100</code></pre><p>This defines a chain of 4 placement strategies, plus the implicit <code>random</code> strategy. Let&#39;s look at what each strategy accomplishes:</p><ol>
+
+  <li><p><a href="container-placement.html#limit-active-containers-strategy"><code>limit-active-containers</code> strategy</a> removes all workers that already have more than 200 containers</p></li>
+
+  <li><p><a href="container-placement.html#limit-active-volumes-strategy"><code>limit-active-volumes</code> strategy</a> removes all remaining workers that already have more than 100 volumes</p></li>
+
+  <li><p><a href="container-placement.html#volume-locality-strategy"><code>volume-locality</code> strategy</a> keeps only the remaining worker(s) that have the most inputs locally. This can keep more than one worker in the case of a tie</p></li>
+
+  <li><p><a href="container-placement.html#fewest-build-containers-strategy"><code>fewest-build-containers</code> strategy</a> will attempt to break ties by selecting the worker with fewer build containers. If all the remaining workers have the exact same number of containers, one will be selected at random.</p></li>
+
+</ol>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.5</span>
+              
+
+              <a href="security-hardening.html">Security Hardening</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.7</span>
+              
+
+              <a href="opa.html">Open Policy Agent Integration</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/credhub-credential-manager.html b/credhub-credential-manager.html
new file mode 100644
index 00000000..536f5896
--- /dev/null
+++ b/credhub-credential-manager.html
@@ -0,0 +1,406 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The CredHub credential manager - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html"  class="self">The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_credhub-credential-manager">
+  
+  <h1 class="section-header"><a class="anchor-target" name="credhub-credential-manager" href="#credhub-credential-manager"></a><span class="section-number">1.15.4.2 </span>The CredHub credential manager</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Configuration</h2>
+  
+
+  <p>The ATC is statically configured with a Credhub server URL with TLS and client config.</p><p>For example, to point the ATC at an internal Credhub server with TLS signed by a local CA, using client id and secret, you may configure:</p><pre><code class="language-bash">concourse web ... \
+  --credhub-url https://10.2.0.3:9000 \
+  --credhub-ca-cert /etc/my-ca.cert \
+  --credhub-client-id =db02de05-fa39-4855-059b-67221c5c2f63 \
+  --credhub-client-secret 6a174c20-f6de-a53c-74d2-6018fcceff64</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_credential-lookup-rules">
+  
+  <h2 class="section-header"><a class="anchor-target" name="credential-lookup-rules" href="#credential-lookup-rules"></a>Credential Lookup Rules</h2>
+  
+
+  <p>When resolving a parameter such as <code>((foo_param))</code>, it will look in the following paths, in order:</p><ul>
+
+  <li><p><code>/concourse/TEAM_NAME/PIPELINE_NAME/foo_param</code></p></li>
+
+  <li><p><code>/concourse/TEAM_NAME/foo_param</code></p></li>
+
+</ul><p>The leading <code>/concourse</code> can be changed by specifying <code>--credhub-path-prefix</code>.</p><p>Credhub credentials actually have different types, which may contain multiple values. For example, the <code>user</code> type specifies both <code>username</code> and <code>password</code>. You can specified the field to grab via <code>.</code> syntax, e.g. <code>((foo_param.username))</code>.</p><p>If the action is being run in the context of a pipeline (e.g. a <code>check</code> or a step in a build of a job), the ATC will first look in the pipeline path. If it&#39;s not found there, it will look in the team path. This allows credentials to be scoped widely if they&#39;re common across many pipelines.</p><p>If an action is being run in a one-off build, the ATC will only look in the team path.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.1</span>
+              
+
+              <a href="vault-credential-manager.html">The Vault credential manager</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.3</span>
+              
+
+              <a href="aws-ssm-credential-manager.html">The AWS SSM credential manager</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/creds-caching.html b/creds-caching.html
new file mode 100644
index 00000000..2cb4c342
--- /dev/null
+++ b/creds-caching.html
@@ -0,0 +1,372 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Caching credentials - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html"  class="self">Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_creds-caching">
+  
+  <h1 class="section-header"><a class="anchor-target" name="creds-caching" href="#creds-caching"></a><span class="section-number">1.15.4.8 </span>Caching credentials</h1>
+  
+
+  <p>By default, credentials are fetched each time they&#39;re used. When many pipelines are configured this can result in a ton of requests to the credential server.</p><p>To reduce load on your credential server you may want to enable caching by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_SECRET_CACHE_ENABLED=true</code></pre><p>Enabling secret caching will cache secrets from both <a href="creds.html">credential managers</a> and from <a href="vars.html#var-sources">var sources</a>.</p><p>By default, credentials will be cached for one minute at a time. This value can be increased to further reduce load on the server like so:</p><pre><code class="language-bash">CONCOURSE_SECRET_CACHE_DURATION=5m # increase from 1m default</code></pre><p>Credential cache duration can also determined by the credential manager itself - for example, if Vault returns a lease duration for a credential, the shorter value between the configured cache duration and the credential&#39;s lease duration will be used.</p><p>By default, the <em>absence</em> of a credential is also cached for 10 seconds so that Concourse doesn&#39;t keep looking for a misconfigured credential. This duration can be configured like so:</p><pre><code class="language-bash">CONCOURSE_SECRET_CACHE_DURATION_NOTFOUND=1s # decrease from 10s default</code></pre>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.7</span>
+              
+
+              <a href="idtoken-credential-manager.html">The IDToken credential manager</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.9</span>
+              
+
+              <a href="creds-redacting.html">Redacting credentials</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/creds-redacting.html b/creds-redacting.html
new file mode 100644
index 00000000..cfaeb5c1
--- /dev/null
+++ b/creds-redacting.html
@@ -0,0 +1,382 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Redacting credentials - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html"  class="self">Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_creds-redacting">
+  
+  <h1 class="section-header"><a class="anchor-target" name="creds-redacting" href="#creds-redacting"></a><span class="section-number">1.15.4.9 </span>Redacting credentials</h1>
+  
+
+  <p>Concourse can be configured to automatically redact credentials from build output like so:</p><pre><code class="language-bash">CONCOURSE_ENABLE_REDACT_SECRETS=true</code></pre><p>This behavior is off by default as there is likely a CPU performance overhead on the <a href="concourse-web.html"><code>web</code> node</a>s involved with enabling it. It will be on by default once we&#39;ve confirmed that it performs well enough at large scale.</p><p>When enabled, Concourse will keep track of the credential values which were used in a build. When writing build logs to the database, it will replace any occurrence of these values with the text <code>((redacted))</code>.</p><p>Say you&#39;re running a task which runs the following script:</p><pre><code class="language-bash">set -e -u -x
+
+echo $SECRET &gt; some-file
+sha1sum some-file</code></pre><p>(Note the <code>set -x</code> - the root cause of many accidental credential leaks.)</p><p>Let&#39;s say you have a job which runs this task, providing the <code>$SECRET</code> parameter using a credential manager <code>((var))</code>:</p><pre><code class="language-yaml">plan:
+- task: use-secret
+  file: # ...
+  params: {SECRET: ((some-var))}</code></pre><p>With <code>hello</code> in <code>some-var</code>, this will result in the following build output:</p><pre><code class="language-bash">&#43; echo ((redacted))
+&#43; sha1sum some-file
+f572d396fae9206628714fb2ce00f72e94f2258f  some-file</code></pre><p>Going a step further, what happens when that var has multiple lines of output, like <code>&#34;hello\ngoodbye&#34;</code>?</p><pre><code class="language-bash">&#43; echo ((redacted)) ((redacted))
+&#43; sha1sum some-file
+638e5ebcd06a5208906960aa5fbe1d4ebd022771  some-file</code></pre><p>What happened here? Well, because we didn&#39;t quote the <code>$SECRET</code> var arg to <code>echo</code>, it squashed the lines together into arguments. This <em>could</em> have confused our redacting logic and resulted in leaking the credential, but because Concourse redacts secret values line-by-line, we&#39;re still OK. This will also help with JSON marshalled credential values, which get interspersed with <code>\n</code> in a string literal.</p><p>Although Concourse tries to be thorough in its redacting of credentials, the best way to prevent credential leakage is to not accidentally print them in the first place. Think of this as an airbag, not a seatbelt!</p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.8</span>
+              
+
+              <a href="creds-caching.html">Caching credentials</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.10</span>
+              
+
+              <a href="creds-retry-logic.html">Retrying failed fetches</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/creds-retry-logic.html b/creds-retry-logic.html
new file mode 100644
index 00000000..2b118ad5
--- /dev/null
+++ b/creds-retry-logic.html
@@ -0,0 +1,373 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Retrying failed fetches - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html"  class="self">Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_creds-retry-logic">
+  
+  <h1 class="section-header"><a class="anchor-target" name="creds-retry-logic" href="#creds-retry-logic"></a><span class="section-number">1.15.4.10 </span>Retrying failed fetches</h1>
+  
+
+  <p>When a request to the credential manager fails due to an intermittent error (e.g. a timeout or <code>connection refused</code>), Concourse will automatically try the request again up to 5 times before giving up. After all attempts fail, the error will be surfaced in the UI for the resource check or build step that initiated the request.</p><p>The retry logic can be configured by specifying the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_SECRET_RETRY_ATTEMPTS=5   # how many times to try
+CONCOURSE_SECRET_RETRY_INTERVAL=10s # how long to wait between attempts</code></pre><p>Note for Vault credential manager: as Vault API client already does retry which has covered the retry conditions of this general secret fetching retry, if a deployment uses Vault credential manager, <code>CONCOURSE_SECRET_RETRY_ATTEMPTS</code> can be set to 0 (or a small value, like 1 or 2) in order to avoid duplicate retries.</p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.9</span>
+              
+
+              <a href="creds-redacting.html">Redacting credentials</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.5</span>
+              
+
+              <a href="security-hardening.html">Security Hardening</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/creds.html b/creds.html
new file mode 100644
index 00000000..52c80ccd
--- /dev/null
+++ b/creds.html
@@ -0,0 +1,476 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Credential Management - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="self">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="self">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_creds">
+  
+  <h1 class="section-header"><a class="anchor-target" name="creds" href="#creds"></a><span class="section-number">1.15.4 </span>Credential Management</h1>
+  
+
+  <p>Going beyond <a href="encryption.html">Encryption</a>, explicit credential management will provide credentials to your builds for a brief amount of time, without being persisted anywhere. It also allows for credentials to be rotated and managed external to the pipeline or team, and prevents them from being revealed by <a href="managing-pipelines.html#fly-get-pipeline"><code>fly get-pipeline</code></a>.</p><p>Credential management works by replacing the credentials with <code>((vars))</code> in your pipeline or task config. When the Concourse is about to run the step or <code>check</code> that is configured with vars, it will resolve them by fetching the values from the credential manager. If the values are not present, the action will error.</p><p>The following configurations can be parameterized with a credential manager:</p><ul>
+
+  <li><p><a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a> under <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a></p></li>
+
+  <li><p><a href="resource-types.html#schema.resource_type.source"><code class="schema-attribute-name"><bold>resource_type<wbr />.source</bold></code></a> under <a href="pipelines.html#schema.pipeline.resource_types"><code class="schema-attribute-name"><bold>pipeline<wbr />.resource_types</bold></code></a></p></li>
+
+  <li><p><a href="resources.html#schema.resource.webhook_token"><code class="schema-attribute-name"><bold>resource<wbr />.webhook_token</bold></code></a> under <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a></p></li>
+
+  <li><p><a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a> on a task step in a pipeline</p></li>
+
+  <li><p><a href="tasks.html">Tasks</a> in their entirety - whether from <a href="task-step.html#schema.task.file"><code>task</code> step <strong><code>file</code></strong></a> or <a href="task-step.html#schema.task.config"><code>task</code> step <strong><code>config</code></strong></a> in a pipeline, or a config executed with <a href="tasks.html#running-tasks"><code>fly execute</code></a></p></li>
+
+</ul><p>Where these values are looked up and how the credential manager is configured depends on the backend. Consult the relevant section below for whichever backend you want to use.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.4.1</span>
+      <a href="vault-credential-manager.html">The Vault credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.2</span>
+      <a href="credhub-credential-manager.html">The CredHub credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.3</span>
+      <a href="aws-ssm-credential-manager.html">The AWS SSM credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.4</span>
+      <a href="aws-asm-credential-manager.html">The AWS Secrets Manager credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.5</span>
+      <a href="kubernetes-credential-manager.html">Kubernetes Credential Manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.6</span>
+      <a href="conjur-credential-manager.html">The Conjur credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.7</span>
+      <a href="idtoken-credential-manager.html">The IDToken credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.8</span>
+      <a href="creds-caching.html">Caching credentials</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.9</span>
+      <a href="creds-redacting.html">Redacting credentials</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.10</span>
+      <a href="creds-retry-logic.html">Retrying failed fetches</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.3</span>
+              
+
+              <a href="encryption.html">Encryption</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.1</span>
+              
+
+              <a href="vault-credential-manager.html">The Vault credential manager</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/do-step.html b/do-step.html
new file mode 100644
index 00000000..43278eaf
--- /dev/null
+++ b/do-step.html
@@ -0,0 +1,360 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>do step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html"  class="self"><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="do-step.html#schema.do.do"><code>do</code> step <strong><code>do</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="do-step.html#do"><code>do</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_do-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="do-step" href="#do-step"></a><span class="section-number">1.11.7 </span><code>do</code> step</h1>
+  
+
+  <div class="schema-group">
+  <a id="do"></a>
+  <p>Performs the given steps serially, with the same semantics as if they were at the top level step listing. Most commonly used with <a href="try-step.html"><code>try</code> step</a>, <a href="">across-step</a>, and <a href="">step-hooks</a>. <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.do.do" type="checkbox" class="toggle" />
+  <label for="toggle-schema.do.do" class="toggle-title">
+    <a id="schema.do.do"></a>
+
+    <code><a class="attribute-name" href="#schema.do.do">do</a>: <span class="attribute-type">[<a href="steps.html#schema.step"><strong>step</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-631c52a4f7110b2d66ac206107262bd5a8ffdfd5" type="checkbox" class="toggle" />
+  <label for="toggle-631c52a4f7110b2d66ac206107262bd5a8ffdfd5" class="toggle-title">Running multiple steps in a try</label>
+  <div class="toggle-content">
+    <p>This can be used to perform multiple steps serially in a <a href="try-step.html"><code>try</code> step</a>:</p><pre><code class="language-yaml">jobs:
+- name: with-do
+  plan:
+  - try:
+      do:
+      - get: black-ice
+      - get: control-node
+      - get: cyberdeck
+
+resources:
+- name: black-ice
+  type: mock
+- name: control-node
+  type: mock
+- name: cyberdeck
+  type: mock</code></pre>
+  </div>
+</div>
+  </div>
+</div></p>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.6</span>
+              
+
+              <a href="in-parallel-step.html"><code>in_parallel</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.8</span>
+              
+
+              <a href="try-step.html"><code>try</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs.html b/docs.html
new file mode 100644
index 00000000..aaeceb65
--- /dev/null
+++ b/docs.html
@@ -0,0 +1,3417 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Docs - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="self">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_docs">
+  
+  <h1 class="section-header"><a class="anchor-target" name="docs" href="#docs"></a><span class="section-number">1 </span>Docs</h1>
+  
+
+  <p>Concourse is a pipeline-based continuous thing-doer.</p><p>The term &#34;pipeline&#34; has become widespread in CI discussions, so being precise about what this means is important; Concourse&#39;s pipelines differ significantly from others.</p><p><a href="pipelines.html">Pipelines</a> are built around <a href="resources.html">Resources</a>, which represent all external state, and <a href="jobs.html">Jobs</a>, which interact with them. Concourse pipelines function as dependency flows, similar to distributed <code>Makefile</code>s. Pipelines are designed to be self-contained to minimize server-wide configuration. Maximizing portability also reduces risk, making it simpler for projects to recover from CI disruptions.</p><p><a href="resources.html">Resources</a> like the <a href="https://github.com/concourse/git-resource"><code>git</code> resource</a> and <a href="https://github.com/concourse/s3-resource"><code>s3</code> resource</a> are used to express source code, dependencies, deployments, and other external states. This interface also models more abstract concepts like scheduled or interval triggers, via the <a href="https://github.com/concourse/time-resource"><code>time</code> resource</a>.</p><p><a href="resource-types.html">Resource Types</a> are defined within the pipeline itself, making the pipelines more self-sufficient while keeping Concourse lean and versatile without needing a complex plugin system.</p><p><a href="jobs.html">Jobs</a> are sequences of <a href="get-step.html"><code>get</code></a>, <a href="put-step.html"><code>put</code></a>, and <a href="task-step.html"><code>task</code></a> steps to execute. These <a href="steps.html">steps</a> determine the job&#39;s inputs and outputs. Jobs are designed to be idempotent and loosely coupled, allowing the pipeline to evolve with project needs without requiring engineers to maintain too much context simultaneously.</p><p>Everything in Concourse runs in a container. Instead of modifying workers to install build tools, <a href="tasks.html">Tasks</a> define their own container image (typically using Docker images via the <a href="https://github.com/concourse/registry-image-resource"><code>registry-image</code> resource</a>).</p><h2>...What?</h2><p>Concourse admittedly has a steeper learning curve initially, and depending on your background it might seem like a lot to grasp. A key goal of this project is for that curve to flatten out shortly after and lead to greater productivity and reduced stress over time.</p><p>If this all sounds confusing, that&#39;s OK - you may want to simply continue onward, start experimenting a bit, and use the above as a quick reference of the &#34;big picture&#34; as your understanding develops.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1</span>
+      <a href="getting-started.html">Getting Started</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.1</span>
+      <a href="quick-start.html">Quick Start</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.1.1</span>
+      <a href="quick-start.html#docker-compose-concourse">Docker Compose Concourse</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.1.2</span>
+      <a href="quick-start.html#install-fly">Install Fly</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2</span>
+      <a href="tutorial-hello-world.html">Hello World Pipeline</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.2.1</span>
+      <a href="tutorial-hello-world.html#creating-a-pipeline">Creating a Pipeline</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.2</span>
+      <a href="tutorial-hello-world.html#add-a-job">Add a job</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.3</span>
+      <a href="tutorial-hello-world.html#add-a-step">Add a step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.4</span>
+      <a href="tutorial-hello-world.html#what-is-a-step">What is a step?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.5</span>
+      <a href="tutorial-hello-world.html#fill-in-the-task-config">Fill in the Task Config</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.6</span>
+      <a href="tutorial-hello-world.html#run-the-pipeline">Run the pipeline</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3</span>
+      <a href="tutorial-inputs-outputs.html">Inputs and Outputs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.3.1</span>
+      <a href="tutorial-inputs-outputs.html#overview">Overview</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3.2</span>
+      <a href="tutorial-inputs-outputs.html#what-are-inputs-and-outputs">What are inputs and outputs?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3.3</span>
+      <a href="tutorial-inputs-outputs.html#passing-outputs-to-another-task">Passing outputs to another task</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3.4</span>
+      <a href="tutorial-inputs-outputs.html#how-does-concourse-track-artifacts">How does Concourse track artifacts?</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4</span>
+      <a href="tutorial-resources.html">Resources</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.4.1</span>
+      <a href="tutorial-resources.html#the-heart-of-concourse">The Heart of Concourse</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.2</span>
+      <a href="tutorial-resources.html#versions">Versions</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.3</span>
+      <a href="tutorial-resources.html#resource-interface">Resource Interface</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.4</span>
+      <a href="tutorial-resources.html#get-steps">Get Steps</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.5</span>
+      <a href="tutorial-resources.html#get-steps-and-inputs">Get Steps and Inputs</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.6</span>
+      <a href="tutorial-resources.html#checks">Checks</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.7</span>
+      <a href="tutorial-resources.html#put-steps">Put Steps</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.8</span>
+      <a href="tutorial-resources.html#using-external-resource-types">Using External Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.9</span>
+      <a href="tutorial-resources.html#time-to-takeoff">Time For Takeoff ✈️</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2</span>
+      <a href="install.html">Install</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.1</span>
+      <a href="postgresql-node.html">Running a PostgreSQL node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.1.1</span>
+      <a href="postgresql-node.html#db-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.1.2</span>
+      <a href="postgresql-node.html#db-running">Running PostgreSQL</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.1.3</span>
+      <a href="postgresql-node.html#db-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.2</span>
+      <a href="concourse-cli.html">The <code>concourse</code> CLI</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.3</span>
+      <a href="concourse-generate-key.html">Generating Keys</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.3.1</span>
+      <a href="concourse-generate-key.html#generating-the-keys">Generating the Keys</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.3.2</span>
+      <a href="concourse-generate-key.html#multiple-worker-keys">Multiple Worker Keys</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4</span>
+      <a href="concourse-web.html">Running a <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.1</span>
+      <a href="concourse-web.html#web-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.2</span>
+      <a href="concourse-web.html#web-running">Running <code>concourse web</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.2.1</span>
+      <a href="concourse-web.html#web-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3</span>
+      <a href="concourse-web.html#web-operation">Operating a <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.3.1</span>
+      <a href="concourse-web.html#scaling">Scaling</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.3.1.1</span>
+      <a href="concourse-web.html#web-connection-pooling">Database connection pooling</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.2</span>
+      <a href="concourse-web.html#reloading-worker-authorized-key">Reloading worker authorized key</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.3</span>
+      <a href="concourse-web.html#restarting-and-upgrading">Restarting &amp; Upgrading</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.4</span>
+      <a href="concourse-web.html#downgrading">Downgrading</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4</span>
+      <a href="concourse-web.html#web-configuration">Configuring the <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.4.1</span>
+      <a href="concourse-web.html#giving-your-cluster-a-name">Giving your cluster a name</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.2</span>
+      <a href="concourse-web.html#web-ingress">Configuring ingress traffic</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.3</span>
+      <a href="concourse-web.html#lets-encrypt">TLS via Let&#39;s Encrypt</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.4</span>
+      <a href="concourse-web.html#build-log-retention">Build log retention</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.5</span>
+      <a href="concourse-web.html#audit-logs">Enabling audit logs</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.6</span>
+      <a href="concourse-web.html#resource-defaults">Configuring defaults for resource types</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5</span>
+      <a href="concourse-worker.html">Running a <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.1</span>
+      <a href="concourse-worker.html#worker-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.2</span>
+      <a href="concourse-worker.html#worker-running">Running <code>concourse worker</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.2.1</span>
+      <a href="concourse-worker.html#worker-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3</span>
+      <a href="concourse-worker.html#worker-operation">Operating a <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.3.1</span>
+      <a href="concourse-worker.html#scaling-workers">Scaling Workers</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.3.1.1</span>
+      <a href="concourse-worker.html#horizontal-vs-vertical-scaling">Horizontal vs Vertical Scaling</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.2</span>
+      <a href="concourse-worker.html#worker-heartbeating-and-stalling">Worker Heartbeating &amp; Stalling</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.3</span>
+      <a href="concourse-worker.html#restarting-a-worker">Restarting a Worker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.4</span>
+      <a href="concourse-worker.html#gracefully-removing-a-worker">Gracefully Removing a Worker</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4</span>
+      <a href="concourse-worker.html#worker-configuration">Configuring the <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.1</span>
+      <a href="concourse-worker.html#tagging-workers">Tagging Workers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.2</span>
+      <a href="concourse-worker.html#team-workers">Team Workers</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.2.1</span>
+      <a href="concourse-worker.html#tags-and-team-workers">Tags and Team Workers</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.3</span>
+      <a href="concourse-worker.html#worker-healthcheck-endpoint">Healthcheck Endpoint</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.4</span>
+      <a href="concourse-worker.html#worker-resource-types">Resource Types</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.4.1</span>
+      <a href="concourse-worker.html#bundled-resource-types">Bundled Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.4.2</span>
+      <a href="concourse-worker.html#installing-or-upgrading-bundled-resource-types">Installing or Upgrading Bundled Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5</span>
+      <a href="concourse-worker.html#configuring-runtimes">Configuring Runtimes</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.1</span>
+      <a href="concourse-worker.html#containerd-runtime"><code>containerd</code> runtime</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.2</span>
+      <a href="concourse-worker.html#transitioning-from-guardian-to-containerd">Transitioning from Guardian to containerd</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.3</span>
+      <a href="concourse-worker.html#guardian-runtime"><code>Guardian</code> runtime</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4</span>
+      <a href="concourse-worker.html#troubleshooting-and-fixing-dns-resolution">Troubleshooting and fixing DNS resolution</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.1</span>
+      <a href="concourse-worker.html#pointing-to-external-dns-servers">Pointing to external DNS servers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.2</span>
+      <a href="concourse-worker.html#using-a-local-dns-server">Using a local DNS server</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.3</span>
+      <a href="concourse-worker.html#note-on-allow-host-access">A note on allowing host access and DNS proxy</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.6</span>
+      <a href="concourse-worker.html#configuring-peer-to-peer-volume-streaming">Configuring Peer-to-Peer Volume Streaming</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.6.1</span>
+      <a href="concourse-worker.html#p2p-worker-configuration">P2P Worker Configuration</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.6.2</span>
+      <a href="concourse-worker.html#p2p-web-configuration">P2P Web Configuration</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.6</span>
+      <a href="upgrading-concourse.html">Upgrading Concourse</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.6.1</span>
+      <a href="upgrading-concourse.html#upgrading-the-web-node">Upgrading the Web Node</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.6.2</span>
+      <a href="upgrading-concourse.html#upgrading-the-worker-node">Upgrading the Worker Node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.6.2.1</span>
+      <a href="upgrading-concourse.html#linux-workers">Linux Workers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.6.2.2</span>
+      <a href="upgrading-concourse.html#darwin-and-windows-workers">Darwin and Windows Workers</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3</span>
+      <a href="auth.html">Auth &amp; Teams</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.1</span>
+      <a href="main-team.html">The <code>main</code> team</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2</span>
+      <a href="configuring-auth.html">Configuring Auth</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.2.1</span>
+      <a href="local-auth.html">Local User auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.2</span>
+      <a href="github-auth.html">GitHub auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.3</span>
+      <a href="gitlab-auth.html">GitLab auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.4</span>
+      <a href="bitbucket-cloud-auth.html">BitBucket Cloud auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.5</span>
+      <a href="cf-uaa-auth.html">CF/UAA auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.6</span>
+      <a href="ldap-auth.html">LDAP auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.7</span>
+      <a href="microsoft-auth.html">Microsoft auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.8</span>
+      <a href="generic-oidc-auth.html">Generic OIDC auth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.9</span>
+      <a href="generic-oauth.html">Generic oAuth</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.2.10</span>
+      <a href="generic-saml-auth.html">Generic SAML auth</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3</span>
+      <a href="managing-teams.html">Managing Teams</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.3.1</span>
+      <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.3.1.1</span>
+      <a href="managing-teams.html#setting-roles">Setting User Roles</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.2</span>
+      <a href="managing-teams.html#fly-active-users"><code>fly active-users</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.3</span>
+      <a href="managing-teams.html#fly-teams"><code>fly teams</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.4</span>
+      <a href="managing-teams.html#fly-get-team"><code>fly get-team</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.5</span>
+      <a href="managing-teams.html#fly-rename-team"><code>fly rename-team</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.3.6</span>
+      <a href="managing-teams.html#fly-destroy-team"><code>fly destroy-team</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4</span>
+      <a href="user-roles.html">User Roles &amp; Permissions</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.3.4.1</span>
+      <a href="user-roles.html#concourse-admin">Concourse Admin</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.2</span>
+      <a href="user-roles.html#team-owner-role"><code>owner</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.3</span>
+      <a href="user-roles.html#team-member-role"><code>member</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.4</span>
+      <a href="user-roles.html#team-pipeline-operator-role"><code>pipeline-operator</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.5</span>
+      <a href="user-roles.html#team-viewer-role"><code>viewer</code> role</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.6</span>
+      <a href="user-roles.html#action-matrix">Action Matrix</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.4.7</span>
+      <a href="user-roles.html#configuring-rbac">Configuring RBAC</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.5</span>
+      <a href="exposing.html">Pipeline &amp; Build Visibility</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.3.6</span>
+      <a href="teams-caveats.html">Security Caveats</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4</span>
+      <a href="fly.html">The <code>fly</code> CLI</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.4.1</span>
+      <a href="fly.html#fly-login"><code>fly login</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.2</span>
+      <a href="fly.html#fly-targets"><code>fly targets</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.3</span>
+      <a href="fly.html#fly-status"><code>fly status</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.4</span>
+      <a href="fly.html#fly-userinfo"><code>fly userinfo</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.5</span>
+      <a href="fly.html#fly-logout"><code>fly logout</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.6</span>
+      <a href="fly.html#fly-edit-target"><code>fly edit-target</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.7</span>
+      <a href="fly.html#fly-delete-target"><code>fly delete-target</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.8</span>
+      <a href="fly.html#fly-sync"><code>fly sync</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.9</span>
+      <a href="fly.html#fly-completion"><code>fly completion</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.5</span>
+      <a href="config-basics.html">Config Basics</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.5.1</span>
+      <a href="config-basics.html#intro-to-yaml">Intro to YAML</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.5.1.1</span>
+      <a href="config-basics.html#yaml-tips-and-tricks">YAML Tips &amp; Tricks</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.5.1.2</span>
+      <a href="config-basics.html#yaml-quirks">YAML Quirks</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.5.2</span>
+      <a href="config-basics.html#basic-schemas">Basic Schemas</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6</span>
+      <a href="pipelines.html">Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.1</span>
+      <a href="setting-pipelines.html">Setting Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.1.1</span>
+      <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.1.2</span>
+      <a href="setting-pipelines.html#fly-validate-pipeline"><code>fly validate-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.1.3</span>
+      <a href="setting-pipelines.html#fly-format-pipeline"><code>fly format-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2</span>
+      <a href="managing-pipelines.html">Managing Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.2.1</span>
+      <a href="managing-pipelines.html#fly-pipelines"><code>fly pipelines</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.2</span>
+      <a href="managing-pipelines.html#fly-rename-pipeline"><code>fly rename-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.3</span>
+      <a href="managing-pipelines.html#fly-pause-pipeline"><code>fly pause-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.4</span>
+      <a href="managing-pipelines.html#fly-unpause-pipeline"><code>fly unpause-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.5</span>
+      <a href="managing-pipelines.html#fly-expose-pipeline"><code>fly expose-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.6</span>
+      <a href="managing-pipelines.html#fly-hide-pipeline"><code>fly hide-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.7</span>
+      <a href="managing-pipelines.html#fly-get-pipeline"><code>fly get-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.8</span>
+      <a href="managing-pipelines.html#fly-destroy-pipeline"><code>fly destroy-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.9</span>
+      <a href="managing-pipelines.html#fly-order-pipelines"><code>fly order-pipelines</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.10</span>
+      <a href="managing-pipelines.html#fly-archive-pipeline"><code>fly archive-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.3</span>
+      <a href="instanced-pipelines.html">Grouping Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.3.1</span>
+      <a href="instanced-pipelines.html#managing-instanced-pipelines">Managing Instanced Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.3.1.1</span>
+      <a href="instanced-pipelines.html#fly-order-instanced-pipelines"><code>fly order-instanced-pipelines</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.3.1.2</span>
+      <a href="instanced-pipelines.html#jobs-and-resources-instanced-pipelines">Managing Jobs and Resources</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7</span>
+      <a href="vars.html">Vars</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.7.1</span>
+      <a href="vars.html#var-syntax"><code>((var))</code> syntax</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.2</span>
+      <a href="vars.html#local-vars">The &#34;<code>.</code>&#34; var source</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.3</span>
+      <a href="vars.html#var-interpolation">Interpolation</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.4</span>
+      <a href="vars.html#static-vars">Static vars</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.5</span>
+      <a href="vars.html#dynamic-vars">Dynamic vars</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.7.5.1</span>
+      <a href="vars.html#dynamic-vars-across-step">Across Step &amp; Dynamic Vars</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.5.2</span>
+      <a href="vars.html#var-sources">Var sources <span class="dim">(experimental)</span></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.5.3</span>
+      <a href="vars.html#cluster-wide-credential-manager">The cluster-wide credential manager</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8</span>
+      <a href="resources.html">Resources</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.1</span>
+      <a href="resource-versions.html">Resource Versions</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.1.1</span>
+      <a href="resource-versions.html#where-and-what-versions">Where do they come from and what are they used for?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.1.2</span>
+      <a href="resource-versions.html#version-pinning">Version Pinning</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.1.2.1</span>
+      <a href="resource-versions.html#version-unpinning">Unpinning</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.1.3</span>
+      <a href="resource-versions.html#disable-version">Disabling a Version</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2</span>
+      <a href="managing-resources.html">Managing Resources</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.2.1</span>
+      <a href="managing-resources.html#fly-check-resource"><code>fly check-resource</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.2</span>
+      <a href="managing-resources.html#fly-pin-resource"><code>fly pin-resource</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.3</span>
+      <a href="managing-resources.html#fly-enable-resource-version"><code>fly enable-resource-version</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.4</span>
+      <a href="managing-resources.html#fly-disable-resource-version"><code>fly disable-resource-version</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.5</span>
+      <a href="managing-resources.html#fly-clear-resource-cache"><code>fly clear-resource-cache</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9</span>
+      <a href="resource-types.html">Resource Types</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.9.1</span>
+      <a href="implementing-resource-types.html">Implementing a Resource Type</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.9.1.1</span>
+      <a href="implementing-resource-types.html#resource-check"><code>check</code>: Check for new versions.</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.2</span>
+      <a href="implementing-resource-types.html#resource-in"><code>in</code>: Fetch a given resource.</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.3</span>
+      <a href="implementing-resource-types.html#resource-out"><code>out</code>: Update a resource.</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.4</span>
+      <a href="implementing-resource-types.html#resource-metadata">Metadata</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.5</span>
+      <a href="implementing-resource-types.html#resource-certs">Certificate Propagation</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.6</span>
+      <a href="implementing-resource-types.html#test-resource-with-docker">Testing resources locally using docker</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.2</span>
+      <a href="managing-resource-types.html">Managing Resource Types</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.9.2.1</span>
+      <a href="managing-resource-types.html#fly-check-resource-type"><code>fly check-resource-type</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10</span>
+      <a href="jobs.html">Jobs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.10.1</span>
+      <a href="jobs.html#managing-jobs">Managing Jobs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.10.1.1</span>
+      <a href="jobs.html#fly-jobs"><code>fly jobs</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.2</span>
+      <a href="jobs.html#fly-trigger-job"><code>fly trigger-job</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.3</span>
+      <a href="jobs.html#fly-rerun-build"><code>fly rerun-build</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.4</span>
+      <a href="jobs.html#fly-pause-job"><code>fly pause-job</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.5</span>
+      <a href="jobs.html#fly-unpause-job"><code>fly unpause-job</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.6</span>
+      <a href="jobs.html#fly-clear-task-cache"><code>fly clear-task-cache</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11</span>
+      <a href="steps.html">Steps</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.11.1</span>
+      <a href="get-step.html"><code>get</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.2</span>
+      <a href="put-step.html"><code>put</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.3</span>
+      <a href="task-step.html"><code>task</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.4</span>
+      <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.5</span>
+      <a href="load-var-step.html"><code>load_var</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.6</span>
+      <a href="in-parallel-step.html"><code>in_parallel</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.7</span>
+      <a href="do-step.html"><code>do</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.8</span>
+      <a href="try-step.html"><code>try</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9</span>
+      <a href="modifier-and-hook-steps.html">Modifier And Hook Steps</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.11.9.1</span>
+      <a href="across-step.html"><code>across</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.2</span>
+      <a href="timeout-step.html"><code>timeout</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.3</span>
+      <a href="attempts-step.html"><code>attempts</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.4</span>
+      <a href="tags-step.html"><code>tags</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.5</span>
+      <a href="on-success-step.html"><code>on_success</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.6</span>
+      <a href="on-failure-hook.html"><code>on_failure</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.7</span>
+      <a href="on-abort-hook.html"><code>on_abort</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.8</span>
+      <a href="on-error-hook.html"><code>on_error</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.9</span>
+      <a href="ensure-hook.html"><code>ensure</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.12</span>
+      <a href="tasks.html">Tasks</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.12.1</span>
+      <a href="tasks.html#running-tasks">Running tasks with <code>fly execute</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.12.2</span>
+      <a href="tasks.html#task-environment">Task runtime environment</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13</span>
+      <a href="builds.html">Builds</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.13.1</span>
+      <a href="builds.html#build-rerunning">Rerunning a Build</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.13.1.1</span>
+      <a href="builds.html#current-caveats-with-rerunning">Current caveats with rerunning</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.2</span>
+      <a href="builds.html#fly-builds"><code>fly builds</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.3</span>
+      <a href="builds.html#fly-intercept"><code>fly intercept</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.4</span>
+      <a href="builds.html#fly-abort-build"><code>fly abort-build</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.13.5</span>
+      <a href="builds.html#fly-watch"><code>fly watch</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14</span>
+      <a href="how-to-guides.html">How-To Guides</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.1</span>
+      <a href="pipeline-guides.html">Pipeline Guides</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.1.1</span>
+      <a href="common-pipeline-practices.html">Common Pipeline Practices</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.2</span>
+      <a href="exploring-task-input-and-output-scenarios.html">Exploring Task Input and Output Scenarios</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.3</span>
+      <a href="gated-pipeline-patterns.html">Gated Pipeline Patterns</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.4</span>
+      <a href="time-triggered-pipeline-patterns.html">Time Triggered Pipeline Patterns</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.5</span>
+      <a href="manual-approval-step.html">Manual Approval Step</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.2</span>
+      <a href="git-guides.html">Git Guides</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.2.1</span>
+      <a href="basic-git-operations.html">Basic Git Operations</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.2.2</span>
+      <a href="multi-branch-workflows.html">Multi-Branch Workflows</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.3</span>
+      <a href="container-image-guides.html">Container Image Guides</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.3.1</span>
+      <a href="building-and-pushing-an-image.html">Building and Pushing an Image</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.3.2</span>
+      <a href="building-an-image-and-using-it-in-a-task.html">Building an Image and Using it in a Task</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15</span>
+      <a href="operation.html">Operation</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.1</span>
+      <a href="metrics.html">Metrics</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.1.1</span>
+      <a href="metrics.html#configuring-metrics">Configuring Metrics</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.1.2</span>
+      <a href="metrics.html#whats-emitted">What&#39;s emitted?</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.2</span>
+      <a href="tracing.html">Tracing</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.2.1</span>
+      <a href="tracing.html#configuring-tracing">Configuring Tracing</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.2.2</span>
+      <a href="tracing.html#trace-context-propagation">Trace context propagation</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.2.3</span>
+      <a href="tracing.html#whats-emitted">What&#39;s emitted?</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3</span>
+      <a href="encryption.html">Encryption</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.3.1</span>
+      <a href="encryption.html#whats-encrypted">What&#39;s encrypted?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3.2</span>
+      <a href="encryption.html#enabling-encryption">Enabling Encryption</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3.3</span>
+      <a href="encryption.html#rotating-the-encryption-key">Rotating the Encryption Key</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3.4</span>
+      <a href="encryption.html#disabling-encryption">Disabling Encryption</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4</span>
+      <a href="creds.html">Credential Management</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.4.1</span>
+      <a href="vault-credential-manager.html">The Vault credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.2</span>
+      <a href="credhub-credential-manager.html">The CredHub credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.3</span>
+      <a href="aws-ssm-credential-manager.html">The AWS SSM credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.4</span>
+      <a href="aws-asm-credential-manager.html">The AWS Secrets Manager credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.5</span>
+      <a href="kubernetes-credential-manager.html">Kubernetes Credential Manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.6</span>
+      <a href="conjur-credential-manager.html">The Conjur credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.7</span>
+      <a href="idtoken-credential-manager.html">The IDToken credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.8</span>
+      <a href="creds-caching.html">Caching credentials</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.9</span>
+      <a href="creds-redacting.html">Redacting credentials</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.10</span>
+      <a href="creds-retry-logic.html">Retrying failed fetches</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.5</span>
+      <a href="security-hardening.html">Security Hardening</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.5.1</span>
+      <a href="security-hardening.html#keeping-your-kernel-up-to-date">Keeping your kernel up-to-date</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.5.2</span>
+      <a href="security-hardening.html#locking-down-privileged-mode">Locking down privileged mode</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6</span>
+      <a href="container-placement.html">Container Placement</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.6.1</span>
+      <a href="container-placement.html#volume-locality-strategy">The <code>volume-locality</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.2</span>
+      <a href="container-placement.html#fewest-build-containers-strategy">The <code>fewest-build-containers</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.3</span>
+      <a href="container-placement.html#random-strategy">The <code>random</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.4</span>
+      <a href="container-placement.html#limit-active-tasks-strategy">The <code>limit-active-tasks</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.5</span>
+      <a href="container-placement.html#limit-active-containers-strategy">The <code>limit-active-containers</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.6</span>
+      <a href="container-placement.html#limit-active-volumes-strategy">The <code>limit-active-volumes</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.7</span>
+      <a href="container-placement.html#chaining-placement-strategies">Chaining Placement Strategies</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7</span>
+      <a href="opa.html">Open Policy Agent Integration</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.7.1</span>
+      <a href="opa.html#configure-opa">Configuring Concourse</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7.2</span>
+      <a href="opa.html#writing-opa-rules">Writing OPA Rules</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7.3</span>
+      <a href="opa.html#special-actions">Special Actions</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.7.3.1</span>
+      <a href="opa.html#useimage"><code>UseImage</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7.3.2</span>
+      <a href="opa.html#setpipeline"><code>SetPipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8</span>
+      <a href="performance-tuning.html">Performance Tuning</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.1</span>
+      <a href="performance-tuning.html#the-big-caveat">The Big Caveat</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2</span>
+      <a href="performance-tuning.html#build-logs">Build Logs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.2.1</span>
+      <a href="performance-tuning.html#concourse_default_build_logs_to_retain"><code>CONCOURSE_DEFAULT_BUILD_LOGS_TO_RETAIN</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.2</span>
+      <a href="performance-tuning.html#concourse_max_build_logs_to_retain"><code>CONCOURSE_MAX_BUILD_LOGS_TO_RETAIN</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.3</span>
+      <a href="performance-tuning.html#concourse_default_days_to_retain_build_logs"><code>CONCOURSE_DEFAULT_DAYS_TO_RETAIN_BUILD_LOGS</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.4</span>
+      <a href="performance-tuning.html#concourse_max_days_to_retain_build_logs"><code>CONCOURSE_MAX_DAYS_TO_RETAIN_BUILD_LOGS</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3</span>
+      <a href="performance-tuning.html#resource-checking">Resource Checking</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.3.1</span>
+      <a href="performance-tuning.html#concourse_resource_checking_interval"><code>CONCOURSE_RESOURCE_CHECKING_INTERVAL</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3.2</span>
+      <a href="performance-tuning.html#concourse_resource_with_webhook_checking_interval"><code>CONCOURSE_RESOURCE_WITH_WEBHOOK_CHECKING_INTERVAL</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3.3</span>
+      <a href="performance-tuning.html#concourse_max_checks_per_second"><code>CONCOURSE_MAX_CHECKS_PER_SECOND</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4</span>
+      <a href="performance-tuning.html#pipeline-management">Pipeline Management</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.4.1</span>
+      <a href="performance-tuning.html#concourse_pause_pipelines_after"><code>CONCOURSE_PAUSE_PIPELINES_AFTER</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4.2</span>
+      <a href="performance-tuning.html#concourse_default_task_cpumemory_limit"><code>CONCOURSE_DEFAULT_TASK_{CPU/MEMORY}_LIMIT</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4.3</span>
+      <a href="performance-tuning.html#concourse_default_getputtask_timeout"><code>CONCOURSE_DEFAULT_{GET/PUT/TASK}_TIMEOUT</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.5</span>
+      <a href="performance-tuning.html#optimize-containers-placement">Container Placement</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.6</span>
+      <a href="performance-tuning.html#garbage-collection">Garbage Collection</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.6.1</span>
+      <a href="performance-tuning.html#concourse_gc_failed_grace_period"><code>CONCOURSE_GC_FAILED_GRACE_PERIOD</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.6.2</span>
+      <a href="performance-tuning.html#other-gc-grace-periods">Other GC Grace Periods</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.7</span>
+      <a href="performance-tuning.html#web-to-worker-ratio">Web To Worker Ratio</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.9</span>
+      <a href="global-resources.html">Global Resources</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.9.1</span>
+      <a href="global-resources.html#benefits-of-global-resources">Benefits of Global Resources</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.9.2</span>
+      <a href="global-resources.html#risks-and-side-effects">Risks and Side Effects</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10</span>
+      <a href="administration.html">Administration</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.10.1</span>
+      <a href="administration.html#fly-workers"><code>fly workers</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.2</span>
+      <a href="administration.html#fly-prune-worker"><code>fly prune-worker</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.3</span>
+      <a href="administration.html#fly-land-worker"><code>fly land-worker</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.4</span>
+      <a href="administration.html#fly-containers"><code>fly containers</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.5</span>
+      <a href="administration.html#fly-volumes"><code>fly volumes</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.6</span>
+      <a href="administration.html#fly-curl"><code>fly curl</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.16</span>
+      <a href="observation.html">Observation</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.16.1</span>
+      <a href="observation.html#dashboard">The Dashboard</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.16.2</span>
+      <a href="observation.html#ccxml"><code>cc.xml</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.16.3</span>
+      <a href="observation.html#badges">Badges</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.16.4</span>
+      <a href="observation.html#pipeline-visibility">Pipeline Visibility</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17</span>
+      <a href="internals.html">Internals</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.17.1</span>
+      <a href="internals.html#basic-architecture">Basic architecture</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2</span>
+      <a href="internals.html#component-atc">ATC: web UI &amp; build scheduler</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.17.2.1</span>
+      <a href="checker.html">Resource Checker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.2</span>
+      <a href="scheduler.html">Build Scheduler</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.3</span>
+      <a href="build-tracker.html">Build Tracker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.4</span>
+      <a href="garbage-collector.html">Garbage Collector</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.3</span>
+      <a href="internals.html#component-tsa">TSA: worker registration &amp; forwarding</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.4</span>
+      <a href="internals.html#architecture-worker">Workers Architecture</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.17.4.1</span>
+      <a href="internals.html#worker-lifecycle">The worker lifecycle</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number"></span>
+              
+
+              <a href="index.html">Concourse</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.1</span>
+              
+
+              <a href="getting-started.html">Getting Started</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/ecosystem.html b/ecosystem.html
new file mode 100644
index 00000000..81d0ea59
--- /dev/null
+++ b/ecosystem.html
@@ -0,0 +1,290 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Ecosystem - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link active" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">4</span><a href="ecosystem.html"  class="self">Ecosystem</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">4.1</td>
+            <td class="title-cell"><a href="ecosystem.html#concourse-as-a-service" >Concourse-as-a-Service</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">4.2</td>
+            <td class="title-cell"><a href="ecosystem.html#service-providers" >3rd Party Service Providers</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">4.3</td>
+            <td class="title-cell"><a href="ecosystem.html#who-uses-concourse" >Who Uses Concourse?</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_ecosystem">
+  
+  <h1 class="section-header"><a class="anchor-target" name="ecosystem" href="#ecosystem"></a><span class="section-number">4 </span>Ecosystem</h1>
+  
+
+  <p>Concourse is utilized by a diverse array of businesses, government agencies, open source projects and non-profit organizations. The applications of Concourse are as varied as its user community, including CI/CD for applications, continuous delivery of infrastructure, release integration, test automation, and numerous other use cases!</p><p>If you use Concourse, or your organization offers Concourse-related services, we&#39;d appreciate hearing from you. Please <a href="https://github.com/concourse/docs/pulls">submit a pull request</a> adding your organization&#39;s name in alphabetical order to one of the lists below, and help us showcase how many people do things continuously with Concourse.</p>
+
+  
+    
+      <div class="section" id="section_concourse-as-a-service">
+  
+  <h2 class="section-header"><a class="anchor-target" name="concourse-as-a-service" href="#concourse-as-a-service"></a>Concourse-as-a-Service</h2>
+  
+
+  <p>The following organizations deliver Concourse as a fully-managed cloud solution, eliminating infrastructure overhead and providing dedicated support.</p><ul>
+
+  <li><p><a href="https://centralci.com">CentralCI</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_service-providers">
+  
+  <h2 class="section-header"><a class="anchor-target" name="service-providers" href="#service-providers"></a>3rd Party Service Providers</h2>
+  
+
+  <p>The following organizations provide various Concourse-related services, including training, consulting, support and managed solutions.</p><ul>
+
+  <li><p><a href="https://www.altoros.com">Altoros</a></p></li>
+
+  <li><p><a href="https://www.anynines.com">anynines</a></p></li>
+
+  <li><p><a href="https://www.cycloid.io">Cycloid</a></p></li>
+
+  <li><p><a href="https://www.gstack.io">Gstack</a></p></li>
+
+  <li><p><a href="https://www.superorbital.io">SuperOrbital</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_who-uses-concourse">
+  
+  <h2 class="section-header"><a class="anchor-target" name="who-uses-concourse" href="#who-uses-concourse"></a>Who Uses Concourse?</h2>
+  
+
+  <p>These organizations have either added themselves to this list, or whose use of Concourse is publicly known. There are many additional Concourse users who cannot publicly disclose information about their technology stack (typically financial institutions and security firms).</p><ol>
+
+  <li><p><a href="https://www.altoros.com">Altoros</a></p></li>
+
+  <li><p><a href="https://www.anynines.com">anynines</a></p></li>
+
+  <li><p><a href="https://www.aptomi.io">Aptomi</a></p></li>
+
+  <li><p><a href="https://www.armakuni.com">Armakuni</a></p></li>
+
+  <li><p><a href="https://www.boclips.com/">boclips</a></p></li>
+
+  <li><p><a href="https://www.cerner.com/">Cerner</a></p></li>
+
+  <li><p><a href="https://cloud.gov/">cloud.gov</a></p></li>
+
+  <li><p><a href="https://cloudfoundry.org/">Cloud Foundry Foundation</a></p></li>
+
+  <li><p><a href="https://corporate.comcast.com/">Comcast</a></p></li>
+
+  <li><p><a href="https://www.cycloid.io">Cycloid</a></p></li>
+
+  <li><p><a href="https://electricui.com">Electric UI</a></p></li>
+
+  <li><p><a href="https://www.engineerbetter.com">EngineerBetter</a></p></li>
+
+  <li><p><a href="https://www.express-scripts.com">Express Scripts</a></p></li>
+
+  <li><p><a href="https://www.fauna.com">Fauna</a></p></li>
+
+  <li><p><a href="https://www.fidelityinternational.com">Fidelity International</a></p></li>
+
+  <li><p><a href="https://gardener.cloud">Gardener</a></p></li>
+
+  <li><p>(United Kingdom) <a href="https://www.gov.uk/government/organisations/government-digital-service">Government Digital Services</a></p></li>
+
+  <li><p><a href="https://www.gstack.io">Gstack</a></p></li>
+
+  <li><p><a href="https://www.homedepot.com">The Home Depot</a></p></li>
+
+  <li><p><a href="https://www.ibm.com">IBM</a></p></li>
+
+  <li><p><a href="https://www.leapyear.io">LeapYear</a></p></li>
+
+  <li><p><a href="https://www.napoleongames.be">Napoleon Sports &amp; Casino</a></p></li>
+
+  <li><p><a href="https://nasdaq.com/">Nasdaq</a></p></li>
+
+  <li><p><a href="https://nokogiri.org/">Nokogiri</a></p></li>
+
+  <li><p><a href="https://www.rabbitmq.com">RabbitMQ</a></p></li>
+
+  <li><p><a href="https://www.rscale.io">Resilient Scale</a></p></li>
+
+  <li><p><a href="https://www.sap.com">SAP</a></p></li>
+
+  <li><p><a href="https://www.smarsh.com">Smarsh</a></p></li>
+
+  <li><p><a href="https://www.springernature.com">Springer Nature</a></p></li>
+
+  <li><p><a href="https://www.starkandwayne.com">Stark &amp; Wayne</a></p></li>
+
+  <li><p><a href="https://www.suse.com">SUSE</a></p></li>
+
+  <li><p><a href="https://www.superorbital.io">SuperOrbital</a></p></li>
+
+  <li><p><a href="https://unit2games.com/">Unit 2 Games</a></p></li>
+
+  <li><p><a href="https://kesselrun.af.mil/">United States Air Force - Kessel Run</a></p></li>
+
+  <li><p><a href="https://www.varian.com">Varian</a></p></li>
+
+  <li><p><a href="https://www.verizon.com">Verizon</a></p></li>
+
+  <li><p><a href="https://www.vmware.com">VMware</a></p></li>
+
+  <li><p><a href="https://www.webfleet.com">Webfleet Solutions</a></p></li>
+
+  <li><p><a href="https://www.yahoo.co.jp">Yahoo!</a></p></li>
+
+  <li><p><a href="https://zipcar.com/">Zipcar</a></p></li>
+
+</ol>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">3</span>
+              
+
+              <a href="project.html">Project</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">5</span>
+              
+
+              <a href="support.html">Support</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/encryption.html b/encryption.html
new file mode 100644
index 00000000..f4f0ceca
--- /dev/null
+++ b/encryption.html
@@ -0,0 +1,406 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Encryption - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html"  class="self">Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.3</span><a href="encryption.html"  class="self">Encryption</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.3.1</td>
+            <td class="title-cell"><a href="encryption.html#whats-encrypted" >What&#39;s encrypted?</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3.2</td>
+            <td class="title-cell"><a href="encryption.html#enabling-encryption" >Enabling Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3.3</td>
+            <td class="title-cell"><a href="encryption.html#rotating-the-encryption-key" >Rotating the Encryption Key</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3.4</td>
+            <td class="title-cell"><a href="encryption.html#disabling-encryption" >Disabling Encryption</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_encryption">
+  
+  <h1 class="section-header"><a class="anchor-target" name="encryption" href="#encryption"></a><span class="section-number">1.15.3 </span>Encryption</h1>
+  
+
+  <p>Automating everything means authorizing something to automate many things. This makes CI systems a high-risk target for security leaks.</p><p>Concourse pipelines are loaded with credentials: resources are configured with private keys, tasks are given credentials to servers they integrate via <a href="creds.html">credential manager variables</a>, <a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a>, or <a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a>, etc. If someone gets their hands on your config, they have access to everything.</p><p>To mitigate this, Concourse supports encrypting sensitive information before it reaches the database. This way the plaintext credentials only exist in memory for as long as they need to, and if someone gains access to your database, they can&#39;t so easily gain the keys to the kingdom.</p><p>We strongly encourage anyone running Concourse to configure encryption. Going further, it&#39;s best to have Concourse not store the credentials in the first place, in which case you may want to configure <a href="creds.html">credential management</a> as well.</p>
+
+  
+    
+      <div class="section" id="section_whats-encrypted">
+  
+  <h2 class="section-header"><a class="anchor-target" name="whats-encrypted" href="#whats-encrypted"></a>What&#39;s encrypted?</h2>
+  
+
+  <p>The following values are expected to contain credentials, and so will be encrypted:</p><ul>
+
+  <li><p>Resource <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a>s, as they often contain private keys and other credentials for writing to (or simply granting access to) the resource.</p></li>
+
+  <li><p>Resource type <a href="resource-types.html#schema.resource_type.source"><code class="schema-attribute-name"><bold>resource_type<wbr />.source</bold></code></a>s, for the same reason as above, though this is probably a less common use case.</p></li>
+
+  <li><p>Pipeline <a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a> and <a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a>, in case they contain sensitive information such as usernames and/or passwords.</p></li>
+
+  <li><p>Put step <a href="put-step.html#schema.put.params"><code>put</code> step <strong><code>params</code></strong></a> and get step <a href="get-step.html#schema.get.params"><code>get</code> step <strong><code>params</code></strong></a> are also encrypted, even though they rarely should contain credentials (they&#39;re usually in <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a>).</p></li>
+
+  <li><p>Team auth configurations, as they often contain things like GitHub or other oAuth client secrets.</p></li>
+
+</ul><p>Note that the actual implementation encrypts things in a more heavy-handed way than the above list implies. For example, pipeline configs are actually encrypted as one large blob.</p><p>Notably, the following things are NOT encrypted:</p><ul>
+
+  <li><p>Build logs. If your jobs are outputting credentials, encryption won&#39;t help you. We have chosen not to tackle this initially as it would introduce a performance burden for what is not as much of an obvious win.</p></li>
+
+  <li><p>Resource versions. These should never contain credentials, and are often meaningless on their own.</p></li>
+
+  <li><p>Resource metadata. These are visible to anyone if your pipeline is <a href="managing-pipelines.html#fly-expose-pipeline">exposed</a>, and should never contain credentials.</p></li>
+
+  <li><p>Pipeline names, job names, etc. - anything else that is not a high-risk target for <em>credential</em> leakage, as opposed to regular information leaks.</p><p>Resources and jobs in particular exist in their own tables, with their names in plaintext, and only their config encrypted. In this way, names are not protected, even though the pipeline config itself is also stored as one big encrypted blob.</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_enabling-encryption">
+  
+  <h2 class="section-header"><a class="anchor-target" name="enabling-encryption" href="#enabling-encryption"></a>Enabling Encryption</h2>
+  
+
+  <p>To enable encryption, you&#39;ll just need to come up with a 16 or 32-byte random character sequence and configure it as <code>--encryption-key</code> flag to the <code>web</code> command. For BOSH, this is the <a href="https://bosh.io/jobs/web?source=github.com/concourse/concourse-bosh-release#p=encryption_key"><code>encryption_key</code></a> property.</p><p>On startup, the <a href="concourse-web.html"><code>web</code> node</a> will encrypt all existing plaintext data, and any new data being written will be encrypted before it&#39;s sent over the network to the database.</p><p>The initial bulk encryption shouldn&#39;t take too long, but it will scale linearly with the amount of data that you have, and if another ATC is running it&#39;ll suddenly not be able to read the data until it&#39;s also given the key. So, expect some downtime.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_rotating-the-encryption-key">
+  
+  <h2 class="section-header"><a class="anchor-target" name="rotating-the-encryption-key" href="#rotating-the-encryption-key"></a>Rotating the Encryption Key</h2>
+  
+
+  <p>To swap out the encryption key, you&#39;ll need to pass the previous key as <code>--old-encryption-key</code> (or <a href="https://bosh.io/jobs/web?source=github.com/concourse/concourse-bosh-release#p=old_encryption_key"><code>old_encryption_key</code></a>), and the new key as <code>--encryption-key</code> (or <a href="https://bosh.io/jobs/web?source=github.com/concourse/concourse-bosh-release#p=encryption_key"><code>encryption_key</code></a>).</p><p>On startup, the <a href="concourse-web.html"><code>web</code> node</a> will decrypt all existing data and re-encrypt it with the new key, in one go. If it encounters a row which is already encrypted with the new key, it will continue on (as may be the case when restarting with the flags again, or if the ATC died in the middle of rotating).</p><p>If the ATC encounters a row which cannot be decrypted with neither the old key nor the new one, it will log loudly and fail to start, telling you which row it choked on. This data must be dealt with in some way, either by re-configuring the key the row was encrypted with as the old key, or manually performing database surgery to remove the offending row. Hopefully this doesn&#39;t happen to you!</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_disabling-encryption">
+  
+  <h2 class="section-header"><a class="anchor-target" name="disabling-encryption" href="#disabling-encryption"></a>Disabling Encryption</h2>
+  
+
+  <p>To opt out of encryption entirely (I&#39;m sure you have your reasons), simply pass <code>--old-encryption-key</code> (or <a href="https://bosh.io/jobs/web?source=github.com/concourse/concourse-bosh-release#p=old_encryption_key"><code>old_encryption_key</code></a>) alone. With no new encryption key, the <a href="concourse-web.html"><code>web</code> node</a> will decrypt all existing data on start.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.2</span>
+              
+
+              <a href="tracing.html">Tracing</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4</span>
+              
+
+              <a href="creds.html">Credential Management</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/ensure-hook.html b/ensure-hook.html
new file mode 100644
index 00000000..e6b9e134
--- /dev/null
+++ b/ensure-hook.html
@@ -0,0 +1,409 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>ensure Step Hook - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html"  class="self"><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="ensure-hook.html#schema.ensure"><code class="schema-attribute-name"><bold>ensure</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_ensure-hook">
+  
+  <h1 class="section-header"><a class="anchor-target" name="ensure-hook" href="#ensure-hook"></a><span class="section-number">1.11.9.9 </span><code>ensure</code> Step Hook</h1>
+  
+
+  <p>A hook step to execute after the parent step regardless of whether the parent step succeeds, fails, or errors. The step will also be executed if the build was aborted and its parent step was interrupted.</p><p>If the parent step succeeds and the ensured step fails, the overall step fails.</p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.ensure" type="checkbox" class="toggle" />
+  <label for="toggle-schema.ensure" class="toggle-title">
+    <a id="schema.ensure"></a>
+
+    <code><a class="attribute-name" href="#schema.ensure">ensure</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-d468dc2adc6e1910da3b15c70fdb00fc88b2ffef" type="checkbox" class="toggle" />
+  <label for="toggle-d468dc2adc6e1910da3b15c70fdb00fc88b2ffef" class="toggle-title">Releasing a lock</label>
+  <div class="toggle-content">
+    <p>The following build plan acquires a lock and then <code>ensure</code>s that the lock is released.</p><pre><code class="language-yaml">plan:
+- put: some-lock
+  params: {acquire: true}
+- task: integration
+  file: foo/integration.yml
+  ensure:
+    put: some-lock
+    params: {release: some-lock}</code></pre>
+  </div>
+</div>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.8</span>
+              
+
+              <a href="on-error-hook.html"><code>on_error</code> Step Hook</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.12</span>
+              
+
+              <a href="tasks.html">Tasks</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/examples.html b/examples.html
new file mode 100644
index 00000000..76c326d2
--- /dev/null
+++ b/examples.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Examples - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="self">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_examples">
+  
+  <h1 class="section-header"><a class="anchor-target" name="examples" href="#examples"></a><span class="section-number">2 </span>Examples</h1>
+  
+
+  <p>Setting up self-contained Concourse <a href="pipelines.html">pipelines</a> is an excellent way to experiment before exploring the more comprehensive documentation.</p><p>Each example presents a pipeline YAML snippet which can be copied to a local file and deployed to your instance via <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>. From there you can experiment and modify parts of the configuration to better understand how everything works. All configuration options are detailed in the <a href="docs.html">Docs</a>.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">2.1</span>
+      <a href="hello-world-example.html">Hello World pipeline</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.2</span>
+      <a href="serial-job-example.html">Serial job example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.3</span>
+      <a href="pipeline-vars-example.html">Pipeline <code>((vars))</code> example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.4</span>
+      <a href="set-pipelines-example.html">Set Pipelines Example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.5</span>
+      <a href="task-inputs-outputs-example.html">Task inputs and outputs example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.6</span>
+      <a href="time-trigger-example.html"><code>time</code>-triggered job example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.7</span>
+      <a href="git-trigger-example.html"><code>git</code>-triggered job example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.8</span>
+      <a href="manual-trigger-example.html">Manually triggered job example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.9</span>
+      <a href="hooks-example.html">Job &amp; task hooks example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.10</span>
+      <a href="golang-library-example.html">Golang library testing example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.11</span>
+      <a href="rails-example.html">Rails application testing example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.12</span>
+      <a href="java-example.html">Java application testing example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.13</span>
+      <a href="nodejs-example.html">Nodejs application testing example</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">2.14</span>
+      <a href="php-example.html">PHP application testing example</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div><p>For a practical real-world example, examine <a href="https://ci.concourse-ci.org/teams/main/pipelines/concourse">Concourse&#39;s own pipeline</a> (and its <a href="https://github.com/concourse/ci/blob/master/pipelines/concourse.yml">configuration</a>):</p><p><iframe class="frame" frameborder="0" width="100%" height="600px" src="https://ci.concourse-ci.org/teams/main/pipelines/concourse"></iframe></p>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1</span>
+              
+
+              <a href="docs.html">Docs</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.1</span>
+              
+
+              <a href="hello-world-example.html">Hello World pipeline</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/exploring-task-input-and-output-scenarios.html b/exploring-task-input-and-output-scenarios.html
new file mode 100644
index 00000000..c9eddb9a
--- /dev/null
+++ b/exploring-task-input-and-output-scenarios.html
@@ -0,0 +1,801 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Exploring Task Input and Output Scenarios - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html"  class="active">Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.1</span><a href="pipeline-guides.html"  class="active">Pipeline Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1.1</td>
+            <td class="title-cell"><a href="common-pipeline-practices.html" >Common Pipeline Practices</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.2</td>
+            <td class="title-cell"><a href="exploring-task-input-and-output-scenarios.html"  class="self">Exploring Task Input and Output Scenarios</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.3</td>
+            <td class="title-cell"><a href="gated-pipeline-patterns.html" >Gated Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.4</td>
+            <td class="title-cell"><a href="time-triggered-pipeline-patterns.html" >Time Triggered Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.5</td>
+            <td class="title-cell"><a href="manual-approval-step.html" >Manual Approval Step</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_exploring-task-input-and-output-scenarios">
+  
+  <h1 class="section-header"><a class="anchor-target" name="exploring-task-input-and-output-scenarios" href="#exploring-task-input-and-output-scenarios"></a><span class="section-number">1.14.1.2 </span>Exploring Task Input and Output Scenarios</h1>
+  
+
+  <p>Understanding how task inputs and outputs work in Concourse can be a little confusing initially. This guide will walk you through a few example pipelines to show you how inputs and outputs work within a single Concourse job. By the end you should understand how inputs and outputs work within the context of a single job.</p><p>To run the pipelines in the following examples yourself you can get your own Concourse running locally by following the <a href="quick-start.html">Quick Start</a> guide. Then use <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a> to see the pipelines in action.</p>
+
+  
+    
+      <div class="section" id="section_1---passing-inputs-between-tasks">
+  
+  <h2 class="section-header"><a class="anchor-target" name="1---passing-inputs-between-tasks" href="#1---passing-inputs-between-tasks"></a>#1 - Passing Inputs Between Tasks</h2>
+  
+
+  <p>This pipeline will show us how to create outputs and pass outputs as inputs to the next <a href="steps.html">step</a> in a <a href="jobs.html#schema.job.plan">job plan</a>.</p><p>This pipeline has two tasks. The first task outputs a file with the date. The second task reads and prints the contents of the file from the first task.</p><p>Here&#39;s a visualization of the job. <div class="diagram">
+  <img src="images/how-to-guides/pipelines/explore-task-inputs-outs-example-one-10.gif" alt="diagram" width="100%" />
+</div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>passing-artifacts.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">busybox: &amp;busybox #YAML anchor
+  type: registry-image
+  source:
+    repository: busybox
+
+jobs:
+- name: the-job
+  plan:
+  - task: create-one-output
+    config:
+      platform: linux
+      image_resource: *busybox
+      outputs:
+        # Concourse will make an empty dir with this name
+        # and save the contents for later steps
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            date &gt; ./the-output/file
+  - task: read-output-from-previous-step
+    config:
+      platform: linux
+      image_resource: *busybox
+      # You must explicitly name the inputs you expect
+      # this task to have.
+      # If you don&#39;t then outputs from previous steps
+      # will not appear in the step&#39;s container.
+      # The name must match the output from the previous step.
+      # Try removing or renaming the input to see what happens!
+      inputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            cat ./the-output/file</code></pre>
+</div><p>Set and run this pipeline to see the results yourself. Save the pipeline in a file called <code>passing-artifacts.yml</code>.</p><pre><code class="language-bash">fly -t tutorial set-pipeline -p passing-artifacts -c passing-artifacts.yml
+fly -t tutorial unpause-pipeline -p passing-artifacts
+fly -t tutorial trigger-job --job passing-artifacts/the-job --watch</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_2---two-tasks-with-the-same-output-who-wins">
+  
+  <h2 class="section-header"><a class="anchor-target" name="2---two-tasks-with-the-same-output-who-wins" href="#2---two-tasks-with-the-same-output-who-wins"></a>#2 - Two tasks with the same output, who wins?</h2>
+  
+
+  <p>This scenario is to satisfy the curiosity cat inside all of us. Never do this in real life because you&#39;re definitely going to hurt yourself!</p><p>There are two <a href="jobs.html">Jobs</a> in this pipeline. The first job, <code>writing-in-parallel</code>, has two <a href="steps.html">Steps</a>; both steps will produce an artifact named <code>the-output</code> in parallel. If you run the <code>writing-to-the-same-output-in-parallel</code> job multiple times you&#39;ll see the file in <code>the-output</code> folder changes depending on which of the parallel tasks finished last. Here&#39;s a visualization of the first job.</p><div class="diagram">
+  <img src="images/how-to-guides/pipelines/explore-task-inputs-outs-example-two-parallel.gif" alt="diagram" width="100%" />
+</div><p>The second job, <code>writing-to-the-same-output-serially</code>, is a serial version of the first job. In this job the second task always wins because it&#39;s the last task that outputs <code>the-output</code>, so only <code>file2</code> will be in <code>the-output</code> directory in the last step in the job plan.</p><div class="diagram">
+  <img src="images/how-to-guides/pipelines/explore-task-inputs-outs-example-two-serial.gif" alt="diagram" width="100%" />
+</div><p>The lesson to take away from this example is that <strong>last to write wins</strong> when it comes to the state of any particular artifact in your job.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>parallel-artifacts.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">busybox: &amp;busybox #YAML anchor
+  type: registry-image
+  source:
+    repository: busybox
+
+jobs:
+- name: writing-to-the-same-output-in-parallel
+  plan:
+  # running two tasks that output in parallel?!?
+  # who will win??
+  - in_parallel:
+    - task: create-the-output
+      config:
+        platform: linux
+        image_resource: *busybox
+        outputs:
+          - name: the-output
+        run:
+          path: /bin/sh
+          args:
+            - -cx
+            - |
+              ls -lah
+              date &gt; ./the-output/file1
+    - task: also-create-the-output
+      config:
+        platform: linux
+        image_resource: *busybox
+        outputs:
+          - name: the-output
+        run:
+          path: /bin/sh
+          args:
+            - -cx
+            - |
+              ls -lah
+              date &gt; ./the-output/file2
+  # run this job multiple times to see which
+  # previous task wins each time
+  - task: read-output-from-previous-step
+    config:
+      platform: linux
+      image_resource: *busybox
+      inputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah ./the-output
+            echo &#34;Get ready to error!&#34;
+            cat ./the-output/file1 ./the-output/file2
+
+- name: writing-to-the-same-output-serially
+  plan:
+  - task: create-the-output
+    config:
+      platform: linux
+      image_resource: *busybox
+      outputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            date &gt; ./the-output/file1
+  - task: also-create-the-output
+    config:
+      platform: linux
+      image_resource: *busybox
+      outputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            date &gt; ./the-output/file2
+  - task: read-output-from-previous-step
+    config:
+      platform: linux
+      image_resource: *busybox
+      inputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah ./the-output
+            echo &#34;Get ready to error! file1 will never exist&#34;
+            cat ./the-output/file1 ./the-output/file2</code></pre>
+</div><p>Set and run this pipeline to see the results yourself. Save the pipeline in a file called <code>parallel-artifacts.yml</code>.</p><pre><code class="language-bash">fly -t tutorial set-pipeline -p parallel-artifacts -c parallel-artifacts.yml
+fly -t tutorial unpause-pipeline -p parallel-artifacts
+fly -t tutorial trigger-job --job parallel-artifacts/writing-to-the-same-output-in-parallel --watch
+fly -t tutorial trigger-job --job parallel-artifacts/writing-to-the-same-output-serially --watch</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_3---mapping-the-names-of-inputs-and-outputs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="3---mapping-the-names-of-inputs-and-outputs" href="#3---mapping-the-names-of-inputs-and-outputs"></a>#3 - Mapping the Names of Inputs and Outputs</h2>
+  
+
+  <p>Sometimes the names of inputs and outputs don&#39;t match between multiple <a href="task-step.html#schema.task.config">task configs</a>, or they do match and you don&#39;t want them overwriting each other, like in the previous example. That&#39;s when <a href="task-step.html#schema.task.input_mapping"><code>input_mapping</code></a> and <a href="task-step.html#schema.task.output_mapping"><code>output_mapping</code></a> become helpful. Both of these features rename the inputs/outputs in the task&#39;s config to some other name in the job plan.</p><p>This pipeline has one job with four tasks.</p><p>The first task outputs a file with the date to the <code>the-output</code> directory.  <code>the-output</code> is mapped to the new name <code>demo-disk</code>. The artifact <code>demo-disk</code> is now available in the rest of the job plan for future steps to take as inputs.</p><p>The second task reads and prints the contents of the file under the new name <code>demo-disk</code>.</p><p>The third task reads and prints the contents of the file under another name, <code>generic-input</code>. The <code>demo-disk</code> artifact in the job plan is mapped to <code>generic-input</code>.</p><p>The fourth task tries to use the artifact named <code>the-output</code> as its input. This task fails to even start because there was no artifact with the name <code>the-output</code> available in the <a href="jobs.html#schema.job.plan">job plan</a>; it was remapped to <code>demo-disk</code>.</p><p>Here&#39;s a visualization of the job.</p><div class="diagram">
+  <img src="images/how-to-guides/pipelines/explore-task-inputs-outs-example-three-1.gif" alt="diagram" width="100%" />
+</div><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>mapping-artifacts.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">busybox: &amp;busybox #YAML anchor
+  type: registry-image
+  source:
+    repository: busybox
+
+jobs:
+- name: the-job
+  plan:
+  - task: create-one-output
+    # The task config has the artifact `the-output`
+    # output_mapping will rename `the-output` to `demo-disk`
+    # in the rest of the job&#39;s plan
+    output_mapping:
+      the-output: demo-disk
+    config:
+      platform: linux
+      image_resource: *busybox
+      outputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            date &gt; ./the-output/file
+  # this task expects the artifact `demo-disk` so no mapping is needed
+  - task: read-output-from-previous-step
+    config:
+      platform: linux
+      image_resource: *busybox
+      inputs:
+        - name: demo-disk
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            cat ./demo-disk/file
+  - task: rename-and-read-output
+    # This task expects the artifact `generic-input`.
+    # input_mapping will map the task&#39;s `generic-input` to
+    # the job plans `demo-disk` artifact.
+    # `demo-disk` is renamed to `generic-input`.
+    input_mapping:
+      generic-input: demo-disk
+    config:
+      platform: linux
+      image_resource: *busybox
+      inputs:
+        - name: generic-input
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            cat ./generic-input/file
+  - task: try-to-read-the-output
+    input_mapping:
+      generic-input: demo-disk
+    config:
+      platform: linux
+      image_resource: *busybox
+      # `the-output` is not available in the job plan
+      # so this task will error while initializing
+      # since there&#39;s no artiact named `the-output` in
+      # the job&#39;s plan
+      inputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            cat ./generic-input/file</code></pre>
+</div><p>Set and run this pipeline to see the results yourself. Save the pipeline in a file called <code>mapping-artifacts.yml</code>.</p><pre><code class="language-bash">fly -t tutorial set-pipeline -p mapping-artifacts -c mapping-artifacts.yml
+fly -t tutorial unpause-pipeline -p mapping-artifacts
+fly -t tutorial trigger-job --job mapping-artifacts/the-job --watch</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_4---adding-files-to-an-existing-artifact">
+  
+  <h2 class="section-header"><a class="anchor-target" name="4---adding-files-to-an-existing-artifact" href="#4---adding-files-to-an-existing-artifact"></a>#4 - Adding Files to an Existing Artifact</h2>
+  
+
+  <p>This pipeline will also have two jobs in order to illustrate this point. What happens if we add a file to an output? If you think back to example two you may already know the answer.</p><p>The first task will create <code>the-output</code> with <code>file1</code>. The second task will add <code>file2</code> to the <code>the-output</code>. The last task will read the contents of <code>file1</code> and <code>file2</code>.</p><p>As long as you re-declare the input as an output in the second task you can modify any of your outputs.</p><p>This means you can pass something between a bunch of tasks and have each task add or modify something in the artifact.</p><p>Here&#39;s a visualization of the job. <div class="diagram">
+  <img src="images/how-to-guides/pipelines/explore-task-inputs-outs-example-four.gif" alt="diagram" width="100%" />
+</div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>existing-artifact.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">jobs:
+- name: add-file-to-output
+  plan:
+  - task: create-one-output
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      outputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            date &gt; ./the-output/file1
+  - task: add-file-to-previous-output
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      # this task lists the same artifact as
+      # its input and output
+      inputs:
+        - name: the-output
+      outputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            date &gt; ./the-output/file2
+  - task: read-output-from-previous-step
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      inputs:
+        - name: the-output
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah ./the-output
+            cat ./the-output/file1 ./the-output/file2</code></pre>
+</div><p>Set and run this pipeline to see the results yourself. Save the pipeline in a file called <code>existing-artifact.yml</code>.</p><pre><code class="language-bash">fly -t tutorial set-pipeline -p existing-artifact -c existing-artifact.yml
+fly -t tutorial unpause-pipeline -p existing-artifact
+fly -t tutorial trigger-job --job existing-artifact/add-file-to-output --watch</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_5---task-with-multiple-inputs-and-outputs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="5---task-with-multiple-inputs-and-outputs" href="#5---task-with-multiple-inputs-and-outputs"></a>#5 - Task With Multiple Inputs and Outputs</h2>
+  
+
+  <p>What happens if you have a task that has multiple outputs and a second task that only lists one of the outputs? Does the second task get the extra outputs from the first task?</p><p>The answer is no. A task will only get the artifacts that match the name of the inputs listed in the task&#39;s config.</p><p>Here&#39;s a visualization of the job. <div class="diagram">
+  <img src="images/how-to-guides/pipelines/explore-task-inputs-outs-example-five.gif" alt="diagram" width="100%" />
+</div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>multiple-artifacts.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">jobs:
+- name: multiple-outputs
+  plan:
+  - task: create-three-outputs
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      outputs:
+        - name: the-output-1
+        - name: the-output-2
+        - name: the-output-3
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah
+            date &gt; ./the-output-1/file
+            date &gt; ./the-output-2/file
+            date &gt; ./the-output-3/file
+  - task: take-one-output
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      # only one of the three outputs are
+      # listed as inputs
+      inputs:
+        - name: the-output-1
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah ./
+            cat ./the-output-1/file
+  - task: take-two-outputs
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      # this task pulls in the other
+      # two outputs, just for fun!
+      inputs:
+        - name: the-output-2
+        - name: the-output-3
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah ./
+            cat ./the-output-2/file
+            cat ./the-output-3/file</code></pre>
+</div><p>Set and run this pipeline to see the results yourself. Save the pipeline in a file called <code>multiple-artifacts.yml</code>.</p><pre><code class="language-bash">fly -t tutorial set-pipeline -p multiple-artifacts -c multiple-artifacts.yml
+fly -t tutorial unpause-pipeline -p multiple-artifacts
+fly -t tutorial trigger-job --job multiple-artifacts/multiple-outputs --watch</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_6---get-steps-generate-artifacts">
+  
+  <h2 class="section-header"><a class="anchor-target" name="6---get-steps-generate-artifacts" href="#6---get-steps-generate-artifacts"></a>#6 - Get Steps Generate Artifacts</h2>
+  
+
+  <p>The majority of Concourse pipelines have at least one <a href="resources.html">resource</a>, which means they have at least one <a href="get-step.html">get step</a>. Using a <a href="get-step.html">get step</a> in a job makes an artifact with the name of the get step available for later steps in the job plan to consume as inputs.</p><p>Here&#39;s a visualization of the job. <div class="diagram">
+  <img src="images/how-to-guides/pipelines/explore-task-inputs-outs-example-six.gif" alt="diagram" width="100%" />
+</div></p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>get-artifact.yml</code>
+  </div>
+
+  <pre><code class="language-yaml">resources:
+- name: concourse-examples
+  type: git
+  source:
+    uri: &#34;https://github.com/concourse/examples&#34;
+
+jobs:
+- name: get-job
+  plan:
+  # there will be an artifact named
+  # &#34;concourse-examples&#34; available in the job plan
+  - get: concourse-examples
+  - task: take-one-output
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      inputs:
+        - name: concourse-examples
+      run:
+        path: /bin/sh
+        args:
+          - -cx
+          - |
+            ls -lah ./
+            cat ./concourse-examples/README.md</code></pre>
+</div><p>Set and run this pipeline to see the results yourself. Save the pipeline in a file called <code>get-artifact.yml</code>.</p><pre><code class="language-bash">fly -t tutorial set-pipeline -p get-artifact -c get-artifact.yml
+fly -t tutorial unpause-pipeline -p get-artifact
+fly -t tutorial trigger-job --job get-artifact/get-job --watch</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.1.1</span>
+              
+
+              <a href="common-pipeline-practices.html">Common Pipeline Practices</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.1.3</span>
+              
+
+              <a href="gated-pipeline-patterns.html">Gated Pipeline Patterns</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/exposing.html b/exposing.html
new file mode 100644
index 00000000..2c9b3e27
--- /dev/null
+++ b/exposing.html
@@ -0,0 +1,282 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Pipeline &amp; Build Visibility - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html" >Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html"  class="self">Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_exposing">
+  
+  <h1 class="section-header"><a class="anchor-target" name="exposing" href="#exposing"></a><span class="section-number">1.3.5 </span>Pipeline &amp; Build Visibility</h1>
+  
+
+  <p>Every newly configured pipeline is hidden to anyone but the pipeline&#39;s team. To make a pipeline publicly viewable, both by other teams and unauthenticated users, see <a href="managing-pipelines.html#fly-expose-pipeline"><code>fly expose-pipeline</code></a>.</p><p>Even with a pipeline exposed, all build logs are hidden by default. This is because CI jobs are prone to leaking credentials and other...unsavory information. After you&#39;ve determined that a job&#39;s builds should be safe for public consumption, you can set <a href="jobs.html#schema.job.public"><code>public: true</code></a> on the job in your pipeline.</p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.4</span>
+              
+
+              <a href="user-roles.html">User Roles &amp; Permissions</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.6</span>
+              
+
+              <a href="teams-caveats.html">Security Caveats</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/fly.html b/fly.html
new file mode 100644
index 00000000..2c0f820d
--- /dev/null
+++ b/fly.html
@@ -0,0 +1,496 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The fly CLI - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html"  class="self">The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.4</span><a href="fly.html"  class="self">The <code>fly</code> CLI</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.4.1</td>
+            <td class="title-cell"><a href="fly.html#fly-login" ><code>fly login</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.2</td>
+            <td class="title-cell"><a href="fly.html#fly-targets" ><code>fly targets</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.3</td>
+            <td class="title-cell"><a href="fly.html#fly-status" ><code>fly status</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.4</td>
+            <td class="title-cell"><a href="fly.html#fly-userinfo" ><code>fly userinfo</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.5</td>
+            <td class="title-cell"><a href="fly.html#fly-logout" ><code>fly logout</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.6</td>
+            <td class="title-cell"><a href="fly.html#fly-edit-target" ><code>fly edit-target</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.7</td>
+            <td class="title-cell"><a href="fly.html#fly-delete-target" ><code>fly delete-target</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.8</td>
+            <td class="title-cell"><a href="fly.html#fly-sync" ><code>fly sync</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4.9</td>
+            <td class="title-cell"><a href="fly.html#fly-completion" ><code>fly completion</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_fly">
+  
+  <h1 class="section-header"><a class="anchor-target" name="fly" href="#fly"></a><span class="section-number">1.4 </span>The <code>fly</code> CLI</h1>
+  
+
+  <p>The first step to getting started with Concourse is to install the <code>fly</code> CLI tool. You can download <code>fly</code> from any Concourse installation by clicking the download link in the bottom-right corner of the web UI.</p><p>Throughout the Concourse documentation we&#39;ll stick to the long-form name of every command and flag. Once you&#39;ve learned what the commands do, you may want to consult <code>fly -h</code> to learn the short forms.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.4.1</span>
+      <a href="fly.html#fly-login"><code>fly login</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.2</span>
+      <a href="fly.html#fly-targets"><code>fly targets</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.3</span>
+      <a href="fly.html#fly-status"><code>fly status</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.4</span>
+      <a href="fly.html#fly-userinfo"><code>fly userinfo</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.5</span>
+      <a href="fly.html#fly-logout"><code>fly logout</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.6</span>
+      <a href="fly.html#fly-edit-target"><code>fly edit-target</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.7</span>
+      <a href="fly.html#fly-delete-target"><code>fly delete-target</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.8</span>
+      <a href="fly.html#fly-sync"><code>fly sync</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.4.9</span>
+      <a href="fly.html#fly-completion"><code>fly completion</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_fly-login">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-login" href="#fly-login"></a><code>fly login</code></h2>
+  
+
+  <p>The first thing you&#39;ll want to do is authenticate with your target. This is done with the <a href="fly.html#fly-login"><code>fly login</code></a> command. This is also useful to save targets under a more convenient alias, so you don&#39;t have to type out the URL all the time:</p><p>The <code>login</code> command serves double duty: it authenticates with a given endpoint, and saves it under a more convenient name. The name and token are stored in <code>~/.flyrc</code> (though you shouldn&#39;t really edit the file manually).</p><p>Concourse deployments can be occupied by multiple <a href="auth.html">teams</a>. To specify the team to which to log in, specify the <code>--team-name</code> or <code>-n</code> flag. If not specified, this defaults to the <a href="main-team.html"><code>main</code> team</a>.</p><p>So, to log in to a team <code>my-team</code> an endpoint served at <code>https://ci.example.com</code> and save it as the more convenient name <code>example</code>, you would run:</p><pre><code class="language-bash">$ fly --target example login --team-name my-team \
+    --concourse-url https://ci.example.com</code></pre><p>The <code>login</code> command will see which authentication methods are available for the specified team and prompt you to choose one. For basic auth, it will ask your username and password and use them to acquire a token. For OAuth, it will give you a link to click, and after you&#39;ve gone through the OAuth flow it will print an OAuth token on the page that you can then copy and paste into the prompt.</p><p>Note that if no authentication methods are configured, <code>fly</code> will acquire a token without any prompting. You can then use the alias like normal.</p><p>In any case, a token is saved in your <code>~/.flyrc</code>, which will expire after one day.</p><p>If your Concourse uses SSL but does not have a certificate signed by a trusted CA, you can use the <code>--ca-cert</code> flag so that <code>fly</code> can trust the connection, like so:</p><pre><code class="language-bash">$ fly -t example login -c https://ci.example.com --ca-cert ./ca.crt</code></pre><p>This will read the value out of the file <code>./ca.crt</code> and save it into <code>~/.flyrc</code> so you don&#39;t have to pass it on every <code>login</code> invocation.</p><p>If your Concourse instance is protected by a proxy server requiring client certificates, you can use <code>--client-cert</code> and <code>--client-key</code> to point to where your certificate is stored. These paths will be stored in <code>.flyrc</code> and the certificate will by attached to every request made to that target.</p><pre><code class="language-bash">$ fly -t example login -c https://ci-example.com \
+    --client-cert ./client.pem \
+    --client-key ./client.key</code></pre><p>After you&#39;ve logged in you can use <code>--target example</code> (or <code>-t example</code> for short) to run a command against the saved target <code>example</code>. For example, <code>fly -t example builds</code> will list the last few builds on the <code>example</code> Concourse instance.</p><p>The <code>-t</code> flag is intentionally stateless and must be explicitly added to each command. This reduces the risk of accidentally running a command against the wrong environment when you have multiple targets defined.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-targets">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-targets" href="#fly-targets"></a><code>fly targets</code></h2>
+  
+
+  <p>To see what targets are currently known to <code>fly</code>, run:</p><pre><code class="language-bash">$ fly targets</code></pre><p>This will show each target&#39;s name, URL, and when its token expires.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-status">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-status" href="#fly-status"></a><code>fly status</code></h2>
+  
+
+  <p>To check your current authentication status with a given target, run:</p><pre><code class="language-bash">$ fly -t example status</code></pre><p>This will let you know if the token has expired.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-userinfo">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-userinfo" href="#fly-userinfo"></a><code>fly userinfo</code></h2>
+  
+
+  <p>To check what user you&#39;re logged in as, as well as which teams you are currently authenticated to and which roles within each team you have, run:</p><pre><code class="language-bash">$ fly -t example userinfo</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-logout">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-logout" href="#fly-logout"></a><code>fly logout</code></h2>
+  
+
+  <p>To clear out your token for a given target, run:</p><pre><code class="language-bash">$ fly -t example logout</code></pre><p>To clear out your token for <em>all</em> targets, run:</p><pre><code class="language-bash">$ fly logout -a</code></pre><p>Note: These two variations are mutually exclusive. If the target parameter <code>-t</code> and all parameter <code>-a</code> are both specified, an error will occur.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-edit-target">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-edit-target" href="#fly-edit-target"></a><code>fly edit-target</code></h2>
+  
+
+  <p>To modify a target&#39;s name, team, or URL, run:</p><pre><code class="language-bash">$ fly -t example edit-target \
+    --target-name new-name \
+    --concourse-url https://ci.example.com \
+    --team-name my-team</code></pre><p>Each flag is optional - only the specified flags will be changed.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-delete-target">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-delete-target" href="#fly-delete-target"></a><code>fly delete-target</code></h2>
+  
+
+  <p>When logging out just isn&#39;t enough, a target can be completely removed from <code>~/.flyrc</code> by running:</p><pre><code class="language-bash">$ fly -t example delete-target</code></pre><p>To delete <em>all</em> targets, run:</p><pre><code class="language-bash">$ fly delete-target -a</code></pre><p>Note: These two variations are mutually exclusive. If the target parameter <code>-t</code> and all parameter <code>-a</code> are both specified, an error will occur.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-sync">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-sync" href="#fly-sync"></a><code>fly sync</code></h2>
+  
+
+  <p>Occasionally we add additional features to <code>fly</code> or make changes to the communication between it and Concourse&#39;s API server. To make sure you&#39;re running the latest and greatest version that works with the Concourse you are targeting we provide a command called <code>sync</code> that will update your local <code>fly</code>. It can be used like so:</p><pre><code class="language-bash">$ fly -t example sync</code></pre><p>The <code>fly</code> command will also warn you if it notices that your CLI version is out of sync with the server.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-completion">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-completion" href="#fly-completion"></a><code>fly completion</code></h2>
+  
+
+  <p>Fly can output autocomplete configuration for some shells. For example, you can add an entry to your <code>.bashrc</code> like this:</p><pre><code class="language-bash">source &lt;(fly completion --shell bash)</code></pre><p>or, using the <code>/etc/bash_completion.d</code> directory:</p><pre><code class="language-bash">$ fly completion --shell bash &gt; /etc/bash_completion.d/fly</code></pre><p>Note that, unlike other fly commands, this command does not interact with a remote server so you do not need to provide the <code>-t</code> or <code>--target</code> flag.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3</span>
+              
+
+              <a href="auth.html">Auth &amp; Teams</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.5</span>
+              
+
+              <a href="config-basics.html">Config Basics</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/garbage-collector.html b/garbage-collector.html
new file mode 100644
index 00000000..9f2a33fe
--- /dev/null
+++ b/garbage-collector.html
@@ -0,0 +1,342 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Garbage Collector - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html"  class="active">Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.17</span><a href="internals.html"  class="active">Internals</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.1</td>
+            <td class="title-cell"><a href="internals.html#basic-architecture" >Basic architecture</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2</td>
+            <td class="title-cell"><a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.3</td>
+            <td class="title-cell"><a href="internals.html#component-tsa" >TSA: worker registration &amp; forwarding</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.4</td>
+            <td class="title-cell"><a href="internals.html#architecture-worker" >Workers Architecture</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.2.1</td>
+            <td class="title-cell"><a href="checker.html" >Resource Checker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.2</td>
+            <td class="title-cell"><a href="scheduler.html" >Build Scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.3</td>
+            <td class="title-cell"><a href="build-tracker.html" >Build Tracker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.4</td>
+            <td class="title-cell"><a href="garbage-collector.html"  class="self">Garbage Collector</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_garbage-collector">
+  
+  <h1 class="section-header"><a class="anchor-target" name="garbage-collector" href="#garbage-collector"></a><span class="section-number">1.17.2.4 </span>Garbage Collector</h1>
+  
+
+  <p>Concourse runs everything in isolated environments by creating fresh containers and volumes to ensure things can safely run in a repeatable environment, isolated from other workloads running on the same worker.</p><p>This introduces a new problem of knowing when Concourse should remove these containers and volumes. Safely identifying things for removal and then getting rid of them, releasing their resources, is the process of <em>garbage collection</em>.</p>
+
+  
+    
+      <div class="section" id="section_goals">
+  
+  <h2 class="section-header"><a class="anchor-target" name="goals" href="#goals"></a>Goals</h2>
+  
+
+  <p>Let&#39;s define our metrics for success:</p><ul>
+
+  <li><p><strong>Safe</strong>. There should never be a case where a build is running and a container or volume is removed out from under it, causing the build to fail. Resource checking should also never result in errors from check containers being removed. No one should even know garbage collection is happening.</p></li>
+
+  <li><p><strong>Airtight</strong>. Everything Concourse creates, whether it&#39;s a container or volume on a worker or an entry in the database, should never leak. Each object should have a fully defined lifecycle such that there is a clear end to its use. The ATC should be interruptible at any point in time and at the very least be able to remove any state it had created beforehand.</p></li>
+
+  <li><p><strong>Resilient</strong>. Garbage collection should never be outpaced by the workload. A single misbehaving worker should not prevent garbage collection from being performed on other workers. A slow delete of a volume should not prevent garbage collecting of other things on the same worker.</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_how-it-works">
+  
+  <h2 class="section-header"><a class="anchor-target" name="how-it-works" href="#how-it-works"></a>How it Works</h2>
+  
+
+  <p>The garbage collector is a batch operation that runs on an interval with a default of 30 seconds. It&#39;s important to note that the collector must be able to run frequently enough to not be outpaced by the workload producing things, and so the batch operation should be able to complete pretty quickly.</p><p>The batch operation first performs garbage collection within the database alone, removing rows that are no longer needed. The removal of rows from one stage will often result in removals in a later stage. There are individual collectors for each object, such as the volume collector or the container collector, and they are all run asynchronously.</p><p>After the initial pass of garbage collection in the database, there should now be a set of containers and volumes that meet criteria for garbage collection. These two are a bit more complicated to garbage-collect; they both require talking to a worker, and waiting on a potentially slow delete.</p><p>Containers and volumes are the costliest resources consumed by Concourse. There are also many of them created over time as builds execute and pipelines perform their resource checking. Therefore it is important to parallelize this aspect of garbage collection so that one slow delete or one slow worker does not cause them to pile up.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.17.2.3</span>
+              
+
+              <a href="build-tracker.html">Build Tracker</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+
+              <a href="internals.html#component-tsa">TSA: worker registration &amp; forwarding</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/gated-pipeline-patterns.html b/gated-pipeline-patterns.html
new file mode 100644
index 00000000..f795aacc
--- /dev/null
+++ b/gated-pipeline-patterns.html
@@ -0,0 +1,469 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Gated Pipeline Patterns - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html"  class="active">Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.1</span><a href="pipeline-guides.html"  class="active">Pipeline Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1.1</td>
+            <td class="title-cell"><a href="common-pipeline-practices.html" >Common Pipeline Practices</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.2</td>
+            <td class="title-cell"><a href="exploring-task-input-and-output-scenarios.html" >Exploring Task Input and Output Scenarios</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.3</td>
+            <td class="title-cell"><a href="gated-pipeline-patterns.html"  class="self">Gated Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.4</td>
+            <td class="title-cell"><a href="time-triggered-pipeline-patterns.html" >Time Triggered Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.5</td>
+            <td class="title-cell"><a href="manual-approval-step.html" >Manual Approval Step</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_gated-pipeline-patterns">
+  
+  <h1 class="section-header"><a class="anchor-target" name="gated-pipeline-patterns" href="#gated-pipeline-patterns"></a><span class="section-number">1.14.1.3 </span>Gated Pipeline Patterns</h1>
+  
+
+  <p>Gated pipelines provide control for administrators and release managers on when a given software release is deployed to a tightly protected environment (e.g. production).</p><p>The execution of jobs that perform certain tasks (e.g. deployment) targeting the downstream environment beyond the &#34;gate&#34; step is done only upon either an approval coming from an external Change Control system or an explicit manual trigger of such step.</p>
+
+  
+    
+      <div class="section" id="section_1---a-simple-gated-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="1---a-simple-gated-pipeline" href="#1---a-simple-gated-pipeline"></a>#1 - A Simple Gated Pipeline</h2>
+  
+
+  <p>By default all <a href="jobs.html">Jobs</a> only run when manually triggered. That means a user has to run <a href="jobs.html#fly-trigger-job"><code>fly trigger-job</code></a> or click the plus button in the web interface for a job to run. A job only runs automatically if one of its resources has the <a href="get-step.html#schema.get.trigger"><code>trigger: true</code></a> parameter set.</p><p>Therefore, in order to create a gated job in a pipeline you simply need to create a job that can only be manually triggered. That means not setting <code>trigger: true</code> for any of the jobs&#39; <a href="get-step.html">get steps</a>.</p><pre><code class="language-yaml">jobs:
+- name: run-automatically
+  plan:
+  - get: my-repo
+    trigger: true  # has trigger:true so automatically triggers
+  # can include more steps to run other things before hitting the gate
+
+- name: the-gate  # manually trigger this job
+  plan:
+  - get: my-repo
+    trigger: false  # redundant but guarantees the job won&#39;t run automatically
+    passed:
+      - run-automatically
+
+# runs immediately after the gate is triggered
+- name: do-more-stuff-after-the-gate
+  plan:
+  - get: my-repo
+    passed:
+      - the-gate
+    trigger: true
+  # can include more steps to run other things
+
+resources:
+- name: my-repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre><a href="images/how-to-guides/pipelines/simple-gated-pipeline.png"><div class="diagram">
+  <img src="images/how-to-guides/pipelines/simple-gated-pipeline.png" alt="diagram" width="100%" />
+</div></a>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_2---gated-pipeline-fanning-in-and-out">
+  
+  <h2 class="section-header"><a class="anchor-target" name="2---gated-pipeline-fanning-in-and-out" href="#2---gated-pipeline-fanning-in-and-out"></a>#2 - Gated Pipeline Fanning In and Out</h2>
+  
+
+  <p>You can also use a gate as way to fan-in from multiple jobs and/or fan-out to multiple jobs as well.</p><pre><code class="language-yaml">jobs:
+# three pre-gate jobs
+- name: job-a
+  plan:
+  - get: my-repo
+    trigger: true
+- name: job-b
+  plan:
+  - get: my-repo
+    trigger: true
+- name: job-c
+  plan:
+  - get: my-repo
+    trigger: true
+
+- name: the-gate  # manually trigger this job
+  plan:
+  - get: my-repo
+    trigger: false
+    passed:  # fan-in from the three pre-gate jobs
+      - job-a
+      - job-b
+      - job-c
+
+# fan-out to three post-gate jobs
+- name: post-gate-job-a
+  plan:
+  - get: my-repo
+    trigger: true
+    passed: [the-gate]
+- name: post-gate-job-b
+  plan:
+  - get: my-repo
+    trigger: true
+    passed: [the-gate]
+- name: post-gate-job-c
+  plan:
+  - get: my-repo
+    trigger: true
+    passed: [the-gate]
+
+resources:
+- name: my-repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre><a href="images/how-to-guides/pipelines/simple-gated-fan-in-fan-out.png"><div class="diagram">
+  <img src="images/how-to-guides/pipelines/simple-gated-fan-in-fan-out.png" alt="diagram" width="100%" />
+</div></a>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_3---a-gated-pipeline-with-notifications">
+  
+  <h2 class="section-header"><a class="anchor-target" name="3---a-gated-pipeline-with-notifications" href="#3---a-gated-pipeline-with-notifications"></a>#3 - A Gated Pipeline With Notifications</h2>
+  
+
+  <p>This pipeline shows you how you can send a notification, like an email, to notify someone that a new build of your application is ready to be shipped.</p><pre><code class="language-yaml">jobs:
+- name: build-it
+  plan:
+  - get: my-repo
+    trigger: true
+  # can add steps to build your app
+
+- name: test-it
+  plan:
+  - get: my-repo
+    trigger: true
+    passed: [build-it]
+  # can add steps to run tests
+  - put: email-release-manager
+    params:
+      subject: &#34;Ready to ship&#34;
+      body_text: |
+        A build is ready to be shipped!
+        Build to be shipped: ${ATC_EXTERNAL_URL}/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}
+        Link to pipeline: ${ATC_EXTERNAL_URL}/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}
+
+- name: ship-it
+  plan:
+  - get: my-repo
+    trigger: false
+    passed: [test-it]
+
+resources:
+- name: my-repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+- name: email-release-manager
+  type: email
+  source:
+    # other required fields for this resource have been omitted
+    from: pipeline@example.com
+    to: release-manager@example.com
+
+resource_types:
+- name: email
+  type: registry-image
+  source:
+    repository: pcfseceng/email-resource</code></pre><a href="images/how-to-guides/pipelines/gated-pipeline-with-notification.png"><div class="diagram">
+  <img src="images/how-to-guides/pipelines/gated-pipeline-with-notification.png" alt="diagram" width="100%" />
+</div></a>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.1.2</span>
+              
+
+              <a href="exploring-task-input-and-output-scenarios.html">Exploring Task Input and Output Scenarios</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.1.4</span>
+              
+
+              <a href="time-triggered-pipeline-patterns.html">Time Triggered Pipeline Patterns</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/generic-oauth.html b/generic-oauth.html
new file mode 100644
index 00000000..7b942395
--- /dev/null
+++ b/generic-oauth.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Generic oAuth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html"  class="self">Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_generic-oauth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="generic-oauth" href="#generic-oauth"></a><span class="section-number">1.3.2.9 </span>Generic oAuth</h1>
+  
+
+  <p>A Concourse server can authenticate against any valid OAuth auth provider, though it&#39;s a bit &#34;closer to the metal&#34; as you&#39;ll need to explicitly configure the auth, token, and user-info URLs. You may want to see if you can use <a href="generic-oidc-auth.html">Generic OIDC auth</a> if your auth provider is compatible with OIDC.</p>
+
+  
+    
+      <div class="section" id="section_generic-oauth-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="generic-oauth-authentication" href="#generic-oauth-authentication"></a>Authentication</h2>
+  
+
+  <p>First you&#39;ll need to create a client with your oAuth provider.</p><p>The callback URL must be the URL of your Concourse server with <code>/sky/issuer/callback</code> appended. This address must be reachable by your oAuth provider - it can&#39;t be <code>localhost</code>.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>The Generic oAuth provider has many values to set - for a full list consult <code>concourse web --help</code>.</p><p>A typical <a href="concourse-web.html"><code>web</code> node</a> env config may look something like this:</p><pre><code class="language-bash">CONCOURSE_OAUTH_DISPLAY_NAME=Acme
+CONCOURSE_OAUTH_CLIENT_ID=myclientid
+CONCOURSE_OAUTH_CLIENT_SECRET=myclientsecret
+CONCOURSE_OAUTH_AUTH_URL=https://oauth.example.com/oauth2/auth
+CONCOURSE_OAUTH_TOKEN_URL=https://oauth.example.com/oauth2/token
+CONCOURSE_OAUTH_USERINFO_URL=https://oauth.example.com/oauth2/userinfo</code></pre><p>Consult <code>concourse web --help</code> for a full list of flags with descriptions.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_generic-oauth-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="generic-oauth-authorization" href="#generic-oauth-authorization"></a>Authorization</h2>
+  
+
+  <p>OAuth users and groups can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--oauth-user=USERNAME</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--oauth-group=GROUP_NAME</code></dt>
+    <dd><p>Authorize anyone from the group.</p><p>You may only configure groups if the auth provider exposes this information in either the token itself, or in the contents of the userinfo endpoint.</p><p>You can configure which claim points to the groups information by specifying <code>CONCOURSE_OAUTH_GROUPS_KEY</code> on the <a href="concourse-web.html"><code>web</code> node</a>.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --oauth-user my-username \
+    --oauth-group my-group</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  oauth:
+    users: [&#34;my-username&#34;]
+    groups: [&#34;my-group&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>OAuth users and groups can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_OAUTH_USER=my-user
+CONCOURSE_MAIN_TEAM_OAUTH_GROUP=my-group</code></pre><p>Multiple users and groups may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.8</span>
+              
+
+              <a href="generic-oidc-auth.html">Generic OIDC auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.10</span>
+              
+
+              <a href="generic-saml-auth.html">Generic SAML auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/generic-oidc-auth.html b/generic-oidc-auth.html
new file mode 100644
index 00000000..983e1f66
--- /dev/null
+++ b/generic-oidc-auth.html
@@ -0,0 +1,432 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Generic OIDC auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html"  class="self">Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_generic-oidc-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="generic-oidc-auth" href="#generic-oidc-auth"></a><span class="section-number">1.3.2.8 </span>Generic OIDC auth</h1>
+  
+
+  <p>A Concourse server can authenticate against any valid OIDC auth provider. This provider is similar to <a href="generic-oauth.html">Generic oAuth</a> except it only requires an issuer URL rather than auth/token/userinfo URLs.</p>
+
+  
+    
+      <div class="section" id="section_generic-oidc-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="generic-oidc-authentication" href="#generic-oidc-authentication"></a>Authentication</h2>
+  
+
+  <p>First you&#39;ll need to create a client with your oAuth provider.</p><p>The callback URL must be the URL of your Concourse server with <code>/sky/issuer/callback</code> appended. This address must be reachable by your OIDC provider - it can&#39;t be <code>localhost</code>.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>A typical <a href="concourse-web.html"><code>web</code> node</a> env config may look something like this:</p><pre><code class="language-bash">CONCOURSE_OIDC_DISPLAY_NAME=Acme
+CONCOURSE_OIDC_CLIENT_ID=myclientid
+CONCOURSE_OIDC_CLIENT_SECRET=myclientsecret
+CONCOURSE_OIDC_ISSUER=https://oidc.example.com</code></pre><p>Consult <code>concourse web --help</code> for a full list of flags with descriptions.</p>
+
+  
+    
+      <div class="section" id="section_a-note-about-user-lookup">
+  
+  <h3 class="section-header"><a class="anchor-target" name="a-note-about-user-lookup" href="#a-note-about-user-lookup"></a>A note about user lookup</h3>
+  
+
+  <p>When determining the user identity, Concourse will first look at the <code>preferred_username</code> claim. If this claim is empty or missing, it will then look at the claim specified by <code>CONCOURSE_OIDC_USER_NAME_KEY</code> (which defaults to <code>username</code>).</p><p>Let&#39;s say that you want to tie each user to their email by using <code>CONCOURSE_OIDC_USER_NAME_KEY=email</code>.</p><p>If your OIDC provider returns the following claims, Concourse will still resolve the user to <code>Jane Doe</code>: <pre><code class="language-json">{
+ &#34;sub&#34;: &#34;248289761001&#34;,
+ &#34;username&#34;: &#34;j.doe&#34;,
+ &#34;preferred_username&#34;: &#34;Jane Doe&#34;,
+ &#34;email&#34;: &#34;janedoe@example.com&#34;,
+}</code></pre></p><p>However, if the <code>preferred_username</code> claim is empty or missing, Concourse will respect the key and resolve the user to <code>janedoe@example.com</code>: <pre><code class="language-json">{
+ &#34;sub&#34;: &#34;248289761001&#34;,
+ &#34;username&#34;: &#34;j.doe&#34;,
+ &#34;preferred_username&#34;: &#34;&#34;,
+ &#34;email&#34;: &#34;janedoe@example.com&#34;,
+}</code></pre></p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_generic-oidc-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="generic-oidc-authorization" href="#generic-oidc-authorization"></a>Authorization</h2>
+  
+
+  <p><div class="warning">
+  When authorizing individual users, it&#39;s up to you to ensure that the <code>preferred_username</code> claim and/or the claim specified by <code>CONCOURSE_OIDC_USER_NAME_KEY</code> is unique. If they&#39;re not, then it&#39;s possible for users to impersonate each other
+</div></p><p>OIDC users and groups can be authorized for a team by passing one or more of the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--oidc-user=USERNAME</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--oidc-group=GROUP_NAME</code></dt>
+    <dd><p>Authorize anyone from the group.</p><p>You may only configure groups if the auth provider exposes this information in either the token itself, or in the contents of the userinfo endpoint.</p><p>You can configure which claim points to the groups information by specifying <code>CONCOURSE_OIDC_GROUPS_KEY</code> on the <a href="concourse-web.html"><code>web</code> node</a>.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --oidc-user my-username \
+    --oidc-user another-username \
+    --oidc-group my-group \
+    --oidc-group my-other-group</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  oidc:
+    users: [&#34;my-username&#34;, &#34;another-username&#34;]
+    groups: [&#34;my-group&#34;, &#34;my-other-group&#34;]</code></pre><p>Both users and groups are optional. You may opt to only provide privileges based on membership to a group and not to any user explicitly and vice versa.</p>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>OIDC users and groups can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_OIDC_USER=my-user
+CONCOURSE_MAIN_TEAM_OIDC_GROUP=my-group</code></pre><p>Multiple users and groups may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.7</span>
+              
+
+              <a href="microsoft-auth.html">Microsoft auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.9</span>
+              
+
+              <a href="generic-oauth.html">Generic oAuth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/generic-saml-auth.html b/generic-saml-auth.html
new file mode 100644
index 00000000..930af512
--- /dev/null
+++ b/generic-saml-auth.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Generic SAML auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html"  class="self">Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_generic-saml-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="generic-saml-auth" href="#generic-saml-auth"></a><span class="section-number">1.3.2.10 </span>Generic SAML auth</h1>
+  
+
+  <p>A Concourse server can authenticate against any valid SAML auth provider.</p>
+
+  
+    
+      <div class="section" id="section_generic-saml-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="generic-saml-authentication" href="#generic-saml-authentication"></a>Authentication</h2>
+  
+
+  <p>First you&#39;ll need to create an application with your SAML provider. Note that the terminology used for configuring an application may vary between SAML providers - this document uses Okta&#39;s terminology.</p><p>SAML Assertion Consumer Service (ACS) URL must be the URL of your Concourse server with <code>/sky/issuer/callback</code> appended.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>Audience URI (SP Entity ID) must match <code>CONCOURSE_SAML_ENTITY_ISSUER</code>, which defaults to the URL of your Concourse server with <code>/sky/issuer/callback</code> appended.</p><p>Attribute statements that you define in the SAML provider can be remapped in Concourse:</p><pre><code class="language-bash">CONCOURSE_SAML_USERNAME_ATTR=name   # default
+CONCOURSE_SAML_EMAIL_ATTR=email     # default
+CONCOURSE_SAML_GROUPS_ATTR=groups   # default</code></pre><p>Finally, the SAML provider will generate a SSO URL, a CA certificate, and an Identity Provider Issuer. These values correspond with <code>CONCOURSE_SAML_SSO_URL</code>, <code>CONCOURSE_SAML_CA_CERT</code>, and <code>CONCOURSE_SAML_SSO_ISSUER</code> respectively.</p><p>A typical <a href="concourse-web.html"><code>web</code> node</a> env config may look something like this:</p><pre><code class="language-bash">CONCOURSE_SAML_DISPLAY_NAME=Okta
+CONCOURSE_SAML_SSO_URL=https://acme.okta.com/app/Y/Z/sso/saml
+CONCOURSE_SAML_CA_CERT=/path/to/ca_cert
+CONCOURSE_SAML_SSO_ISSUER=http://www.okta.com/X</code></pre><p>Consult <code>concourse web --help</code> for a full list of flags with descriptions.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_generic-saml-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="generic-saml-authorization" href="#generic-saml-authorization"></a>Authorization</h2>
+  
+
+  <p>SAML users and groups can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--saml-user=USERNAME</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--saml-group=GROUP_NAME</code></dt>
+    <dd><p>Authorize anyone from the group.</p><p>You may only configure groups if the auth provider exposes this information in either the token itself, or in the contents of the userinfo endpoint.</p><p>You can configure which attribute points to the groups information by specifying <code>CONCOURSE_SAML_GROUPS_ATTR</code> on the <a href="concourse-web.html"><code>web</code> node</a>.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --saml-user my-username \
+    --saml-group my-group</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  saml:
+    users: [&#34;my-username&#34;]
+    groups: [&#34;my-groups&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>SAML users and groups can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_SAML_USER=my-user
+CONCOURSE_MAIN_TEAM_SAML_GROUP=my-group</code></pre><p>Multiple users and groups may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.9</span>
+              
+
+              <a href="generic-oauth.html">Generic oAuth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.3</span>
+              
+
+              <a href="managing-teams.html">Managing Teams</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/get-step.html b/get-step.html
new file mode 100644
index 00000000..bcb88b2a
--- /dev/null
+++ b/get-step.html
@@ -0,0 +1,577 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>get step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html"  class="self"><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="get-step.html#schema.get.get"><code>get</code> step <strong><code>get</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="get-step.html#schema.get.resource"><code>get</code> step <strong><code>resource</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="get-step.html#schema.get.passed"><code>get</code> step <strong><code>passed</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="get-step.html#schema.get.params"><code>get</code> step <strong><code>params</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="get-step.html#schema.get.trigger"><code>get</code> step <strong><code>trigger</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="get-step.html#schema.get.version"><code>get</code> step <strong><code>version</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="get-step.html#get"><code>get</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_get-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="get-step" href="#get-step"></a><span class="section-number">1.11.1 </span><code>get</code> step</h1>
+  
+
+  <p>Fetches a version of a <a href="resources.html">resource</a>. Expand each section below for more details and examples.</p><div class="schema-group">
+  <a id="get"></a>
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.get.get" type="checkbox" class="toggle" />
+  <label for="toggle-schema.get.get" class="toggle-title">
+    <a id="schema.get.get"></a>
+
+    <code><a class="attribute-name" href="#schema.get.get">get</a>: <span class="attribute-type"><a href="resources.html#schema.resource.name"><strong>resource.name</strong></a> | <a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The fetched bits will be registered in the build&#39;s artifact namespace under the given identifier. Subsequent <a href="task-step.html"><code>task</code> step</a> and <a href="put-step.html"><code>put</code> step</a> which list the identifier as an input will have a copy of the bits in their working directory.</p><div class="toggleable example">
+  <input id="toggle-1678a82556aef96e3333cdd75009167e199ac2ee" type="checkbox" class="toggle" />
+  <label for="toggle-1678a82556aef96e3333cdd75009167e199ac2ee" class="toggle-title">Fetching a repo and passing it to a task</label>
+  <div class="toggle-content">
+    <p>Almost every simple job will look something like this: fetch my code with a <a href="get-step.html"><code>get</code> step</a> and do something (run tests) with it in a <a href="task-step.html"><code>task</code> step</a>.</p><pre><code class="language-yaml">jobs:
+- name: fetch-repo
+  plan:
+  - get: repo # fetches repo under artifact name &#34;repo&#34;
+  - task: ls-repo
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source: {mirror_self: true}
+      # pass the &#34;repo&#34; artifact into the task
+      inputs:
+      - name: repo
+      run:
+        path: ls
+        args: [&#34;-lah&#34;,&#34;repo&#34;]
+
+resources:
+- name: repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.get.resource" type="checkbox" class="toggle" />
+  <label for="toggle-schema.get.resource" class="toggle-title">
+    <a id="schema.get.resource"></a>
+
+    <code><a class="attribute-name" href="#schema.get.resource">resource</a>: <span class="attribute-type"><a href="resources.html#schema.resource.name"><strong>resource.name</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Defaults to the value of <code>get</code>.</em> The resource to fetch, as configured in <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a>.</p><p>Use this attribute to rename a resource from the overall pipeline context into the job-specific context.</p><div class="toggleable example">
+  <input id="toggle-7155e847480b395faca5c754e3da9673295fd036" type="checkbox" class="toggle" />
+  <label for="toggle-7155e847480b395faca5c754e3da9673295fd036" class="toggle-title">Re-labelling artifact</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: fetch-repo
+  plan:
+  - get: thecode # fetches &#34;repo&#34; under artifact name &#34;thecode&#34;
+    resource: repo
+  - task: ls-repo
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source: {mirror_self: true}
+      # pass the &#34;thecode&#34; artifact into the task
+      inputs:
+      - name: thecode
+      run:
+        path: ls
+        args: [&#34;-lah&#34;,&#34;thecode&#34;]
+
+resources:
+- name: repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.get.passed" type="checkbox" class="toggle" />
+  <label for="toggle-schema.get.passed" class="toggle-title">
+    <a id="schema.get.passed"></a>
+
+    <code><a class="attribute-name" href="#schema.get.passed">passed</a>: <span class="attribute-type">[<a href="jobs.html#schema.job.name"><strong>job.name</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>When specified, only the versions of the resource that made it through the given list of jobs (AND-ed together) will be considered when triggering and fetching.</p><div class="toggleable example">
+  <input id="toggle-b315522d24158012ce64ec4a3c62be6b9ce7f7c8" type="checkbox" class="toggle" />
+  <label for="toggle-b315522d24158012ce64ec4a3c62be6b9ce7f7c8" class="toggle-title">Fanning out and in</label>
+  <div class="toggle-content">
+    <p>If multiple <code>get</code>s are configured with <code>passed</code> constraints, all of the mentioned jobs are correlated.</p><pre><code class="language-yaml">jobs:
+- name: lvl-1-firewall
+  plan:
+  - in_parallel:
+    - get: black-ice
+    - get: control-node
+    - get: cyberdeck
+
+- name: lvl-2-unit
+  plan:
+  - in_parallel:
+    - get: black-ice
+      passed: [lvl-1-firewall]
+    - get: control-node
+      passed: [lvl-1-firewall]
+    - get: cyberdeck
+      passed: [lvl-1-firewall]
+
+- name: lvl-2-integration
+  plan:
+  - in_parallel:
+    - get: black-ice
+      passed: [lvl-1-firewall]
+    - get: control-node
+      passed: [lvl-1-firewall]
+    - get: cyberdeck
+      passed: [lvl-1-firewall]
+
+- name: lvl-3-production
+  plan:
+  - in_parallel:
+    - get: black-ice
+      passed: [lvl-2-unit,lvl-2-integration]
+    - get: control-node
+      passed: [lvl-2-unit,lvl-2-integration]
+    - get: cyberdeck
+      passed: [lvl-2-unit,lvl-2-integration]
+
+resources:
+- name: black-ice
+  type: mock
+  source:
+    initial_version: lvl4
+- name: control-node
+  type: mock
+  source:
+    initial_version: tower
+- name: cyberdeck
+  type: mock
+  source:
+    initial_version: mk3</code></pre><p>For the final job, <code>lvl-3-production</code>, only versions that have passed the previous two jobs (<code>lvl-2-unit</code> and <code>lvl-2-integration</code>) will be passed to <code>lvl-3-production</code>.</p><p>This is crucial to being able to implement safe &#34;fan-in&#34; semantics as things progress through a pipeline.</p>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.get.params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.get.params" class="toggle-title">
+    <a id="schema.get.params"></a>
+
+    <code><a class="attribute-name" href="#schema.get.params">params</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Arbitrary configuration to pass to the resource. Refer to the resource type&#39;s documentation to see what it supports.</p><div class="toggleable example">
+  <input id="toggle-bb83d0c8fbb30abb54b0d423ea49126a0ad1a0a2" type="checkbox" class="toggle" />
+  <label for="toggle-bb83d0c8fbb30abb54b0d423ea49126a0ad1a0a2" class="toggle-title">Fetching with <code>params</code></label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: resource-params
+  plan:
+  - get: cyberdeck
+    params:
+      create_files_via_params:
+        version_to_put.txt: &#34;made-via-params&#34;
+  - put: cyberdeck
+    params:
+      file: cyberdeck/version_to_put.txt
+
+
+resources:
+- name: cyberdeck
+  type: mock</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.get.trigger" type="checkbox" class="toggle" />
+  <label for="toggle-schema.get.trigger" class="toggle-title">
+    <a id="schema.get.trigger"></a>
+
+    <code><a class="attribute-name" href="#schema.get.trigger">trigger</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, new builds of the job will be automatically created when a new version for this input becomes available.</p><p>Note: if none of a job&#39;s <code>get</code> steps are set to <code>true</code>, the job can only be manually triggered.</p><div class="toggleable example">
+  <input id="toggle-629880867ed5abbd5b38d884d52928d84c74aeb6" type="checkbox" class="toggle" />
+  <label for="toggle-629880867ed5abbd5b38d884d52928d84c74aeb6" class="toggle-title">Automatically trigger job on new versions</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: fetch-repo
+  plan:
+  - get: repo
+    trigger: true # automatically runs the job
+  - task: ls-repo
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source: {mirror_self: true}
+      inputs:
+      - name: repo
+      run:
+        path: ls
+        args: [&#34;-lah&#34;,&#34;repo&#34;]
+
+resources:
+- name: repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.get.version" type="checkbox" class="toggle" />
+  <label for="toggle-schema.get.version" class="toggle-title">
+    <a id="schema.get.version"></a>
+
+    <code><a class="attribute-name" href="#schema.get.version">version</a>: <span class="attribute-type"><span class="schema-scalar">latest</span> | <span class="schema-scalar">every</span> | <a href="config-basics.html#schema.version"><strong>version</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>latest</code>.</em> The version of the resource to fetch.</p><p>If set to <code>latest</code>, scheduling will just find the latest available version of a resource and use it, allowing versions to be skipped.  This is usually what you want, e.g. if someone pushes 100 git commits.</p><p>If set to <code>every</code>, builds will walk through all available versions of the resource. Note that if <code>passed</code> is also configured, it will only step through the versions satisfying the constraints.</p><p>If set to a specific version (e.g. <code>{ref: abcdef123}</code>), only that version will be used. Note that the version must be available and detected by the resource, otherwise the input will never be satisfied. You may want to use <a href="managing-resources.html#fly-check-resource"><code>fly check-resource</code></a> to force detection of resource versions, if you need to use an older one that was never detected (as all newly configured resources start from the latest version).</p>
+  </div>
+</div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11</span>
+              
+
+              <a href="steps.html">Steps</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.2</span>
+              
+
+              <a href="put-step.html"><code>put</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/getting-started.html b/getting-started.html
new file mode 100644
index 00000000..d2bcea35
--- /dev/null
+++ b/getting-started.html
@@ -0,0 +1,521 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Getting Started - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html"  class="self">Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1</span><a href="getting-started.html"  class="self">Getting Started</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.1</td>
+            <td class="title-cell"><a href="quick-start.html" >Quick Start</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html" >Hello World Pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html" >Inputs and Outputs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4</td>
+            <td class="title-cell"><a href="tutorial-resources.html" >Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_getting-started">
+  
+  <h1 class="section-header"><a class="anchor-target" name="getting-started" href="#getting-started"></a><span class="section-number">1.1 </span>Getting Started</h1>
+  
+
+  <p>This tutorial will guide you through the basics of creating Concourse pipelines. You will use a local instance of Concourse running on your machine to run pipelines.</p><p>Before getting started you should have the following installed:</p><ul>
+
+  <li><p><a href="https://docs.docker.com/get-docker/">Docker</a></p></li>
+
+  <li><p><a href="https://docs.docker.com/compose/install/">Docker-compose</a></p></li>
+
+</ul><p>This tutorial assumes you understand what Linux containers are and how to work with them. If you know what a Dockerfile is and how to make your own then you&#39;re probably good to jump into this tutorial. If you&#39;re not familiar with Linux containers then you may want to <a href="https://docs.docker.com/get-started/">get started with Docker</a> first before diving into this tutorial.</p><p>It will also help if you know how to read YAML. We have a quick <a href="config-basics.html#intro-to-yaml">Intro to YAML</a> if you&#39;re not familiar with the syntax.</p><blockquote class="aside"><p>If you have any feedback for this tutorial please share it in <a href="https://github.com/concourse/concourse/discussions/7353">this GitHub discussion</a></p></blockquote><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.1</span>
+      <a href="quick-start.html">Quick Start</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.1.1</span>
+      <a href="quick-start.html#docker-compose-concourse">Docker Compose Concourse</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.1.2</span>
+      <a href="quick-start.html#install-fly">Install Fly</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2</span>
+      <a href="tutorial-hello-world.html">Hello World Pipeline</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.2.1</span>
+      <a href="tutorial-hello-world.html#creating-a-pipeline">Creating a Pipeline</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.2</span>
+      <a href="tutorial-hello-world.html#add-a-job">Add a job</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.3</span>
+      <a href="tutorial-hello-world.html#add-a-step">Add a step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.4</span>
+      <a href="tutorial-hello-world.html#what-is-a-step">What is a step?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.5</span>
+      <a href="tutorial-hello-world.html#fill-in-the-task-config">Fill in the Task Config</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.2.6</span>
+      <a href="tutorial-hello-world.html#run-the-pipeline">Run the pipeline</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3</span>
+      <a href="tutorial-inputs-outputs.html">Inputs and Outputs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.3.1</span>
+      <a href="tutorial-inputs-outputs.html#overview">Overview</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3.2</span>
+      <a href="tutorial-inputs-outputs.html#what-are-inputs-and-outputs">What are inputs and outputs?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3.3</span>
+      <a href="tutorial-inputs-outputs.html#passing-outputs-to-another-task">Passing outputs to another task</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.3.4</span>
+      <a href="tutorial-inputs-outputs.html#how-does-concourse-track-artifacts">How does Concourse track artifacts?</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4</span>
+      <a href="tutorial-resources.html">Resources</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.1.4.1</span>
+      <a href="tutorial-resources.html#the-heart-of-concourse">The Heart of Concourse</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.2</span>
+      <a href="tutorial-resources.html#versions">Versions</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.3</span>
+      <a href="tutorial-resources.html#resource-interface">Resource Interface</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.4</span>
+      <a href="tutorial-resources.html#get-steps">Get Steps</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.5</span>
+      <a href="tutorial-resources.html#get-steps-and-inputs">Get Steps and Inputs</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.6</span>
+      <a href="tutorial-resources.html#checks">Checks</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.7</span>
+      <a href="tutorial-resources.html#put-steps">Put Steps</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.8</span>
+      <a href="tutorial-resources.html#using-external-resource-types">Using External Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.1.4.9</span>
+      <a href="tutorial-resources.html#time-to-takeoff">Time For Takeoff ✈️</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1</span>
+              
+
+              <a href="docs.html">Docs</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.1.1</span>
+              
+
+              <a href="quick-start.html">Quick Start</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/git-guides.html b/git-guides.html
new file mode 100644
index 00000000..2312c11f
--- /dev/null
+++ b/git-guides.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Git Guides - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html" >Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html"  class="self">Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.2</span><a href="git-guides.html"  class="self">Git Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.2.1</td>
+            <td class="title-cell"><a href="basic-git-operations.html" >Basic Git Operations</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2.2</td>
+            <td class="title-cell"><a href="multi-branch-workflows.html" >Multi-Branch Workflows</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_git-guides">
+  
+  <h1 class="section-header"><a class="anchor-target" name="git-guides" href="#git-guides"></a><span class="section-number">1.14.2 </span>Git Guides</h1>
+  
+
+  <div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.2.1</span>
+      <a href="basic-git-operations.html">Basic Git Operations</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.2.2</span>
+      <a href="multi-branch-workflows.html">Multi-Branch Workflows</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.1</span>
+              
+
+              <a href="pipeline-guides.html">Pipeline Guides</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.2.1</span>
+              
+
+              <a href="basic-git-operations.html">Basic Git Operations</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/git-trigger-example.html b/git-trigger-example.html
new file mode 100644
index 00000000..d095ce92
--- /dev/null
+++ b/git-trigger-example.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>git-triggered job example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html"  class="self"><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_git-trigger-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="git-trigger-example" href="#git-trigger-example"></a><span class="section-number">2.7 </span><code>git</code>-triggered job example</h1>
+  
+
+  <p>The <a href="https://github.com/concourse/git-resource"><code>git</code> resource</a> can be used to trigger a job.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/git-triggered"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: concourse-docs-git
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/docs
+
+jobs:
+- name: job
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: concourse-docs-git
+    trigger: true
+  - task: list-files
+    config:
+      inputs:
+        - name: concourse-docs-git
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: ls
+        args: [&#34;-la&#34;, &#34;./concourse-docs-git&#34;]
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="resources.html">Resources</a></p></li>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.6</span>
+              
+
+              <a href="time-trigger-example.html"><code>time</code>-triggered job example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.8</span>
+              
+
+              <a href="manual-trigger-example.html">Manually triggered job example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/github-auth.html b/github-auth.html
new file mode 100644
index 00000000..5475e5e5
--- /dev/null
+++ b/github-auth.html
@@ -0,0 +1,411 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>GitHub auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html"  class="self">GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_github-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="github-auth" href="#github-auth"></a><span class="section-number">1.3.2.2 </span>GitHub auth</h1>
+  
+
+  <p>A Concourse server can authenticate against GitHub to leverage their permission model and other security improvements in their infrastructure.</p>
+
+  
+    
+      <div class="section" id="section_github-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="github-authentication" href="#github-authentication"></a>Authentication</h2>
+  
+
+  <p>First, you&#39;ll need to <a href="https://github.com/settings/applications/new">create an OAuth application on GitHub</a>.</p><p>The &#34;Authorization callback URL&#34; must be the URL of your Concourse server. This address must be reachable by GitHub - it can&#39;t be <code>localhost</code>.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>You will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the <a href="concourse-web.html"><code>web</code> node</a> by setting the following env:</p><pre><code class="language-bash">CONCOURSE_GITHUB_CLIENT_ID=myclientid
+CONCOURSE_GITHUB_CLIENT_SECRET=myclientsecret</code></pre><p>Note that the client must be created under an <em>organization</em> if you want to authorize users based on organization/team membership. In addition, the GitHub application must have at least read access on the organization&#39;s members. If the client is created under a personal account, only individual users can be authorized.</p><p>If you&#39;re configuring GitHub Enterprise, you&#39;ll also need to set the following env:</p><pre><code class="language-bash">CONCOURSE_GITHUB_HOST=github.example.com
+CONCOURSE_GITHUB_CA_CERT=/path/to/ca_cert</code></pre><p>The GitHub Enterprise host must not contain a scheme, or a trailing slash.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_github-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="github-authorization" href="#github-authorization"></a>Authorization</h2>
+  
+
+  <p>Users, teams, and entire organizations can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--github-user=LOGIN</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--github-org=ORG_NAME</code></dt>
+    <dd><p>Authorize an entire organization&#39;s members.</p></dd>
+  
+  <dt><code>--github-team=ORG_NAME:TEAM_NAME</code></dt>
+    <dd><p>Authorize a team&#39;s members within an organization.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --github-user my-github-login \
+    --github-org my-org \
+    --github-team my-other-org:my-team</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  github:
+    users: [&#34;my-github-login&#34;]
+    orgs: [&#34;my-org&#34;]
+    teams: [&#34;my-other-org:my-team&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>GitHub users, teams, and organizations can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_GITHUB_ORG=org-name
+CONCOURSE_MAIN_TEAM_GITHUB_TEAM=org-name:team-name
+CONCOURSE_MAIN_TEAM_GITHUB_USER=some-user</code></pre><p>Multiple orgs, teams, and users may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.1</span>
+              
+
+              <a href="local-auth.html">Local User auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.3</span>
+              
+
+              <a href="gitlab-auth.html">GitLab auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/gitlab-auth.html b/gitlab-auth.html
new file mode 100644
index 00000000..eb51a23b
--- /dev/null
+++ b/gitlab-auth.html
@@ -0,0 +1,410 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>GitLab auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html"  class="self">GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_gitlab-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="gitlab-auth" href="#gitlab-auth"></a><span class="section-number">1.3.2.3 </span>GitLab auth</h1>
+  
+
+  <p>A Concourse server can authenticate against GitLab to leverage their permission model.</p>
+
+  
+    
+      <div class="section" id="section_gitlab-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="gitlab-authentication" href="#gitlab-authentication"></a>Authentication</h2>
+  
+
+  <p>First you need to <a href="https://gitlab.com/-/user_settings/applications">create an OAuth application on GitLab</a> with the following scopes:</p><ul>
+
+  <li><p><code>read_user</code></p></li>
+
+  <li><p><code>openid</code></p></li>
+
+</ul><p>The &#34;Authorization callback URL&#34; must be the URL of your Concourse server with <code>/sky/issuer/callback</code> appended. This address must be reachable by GitLab - it can&#39;t be <code>localhost</code>.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>You will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the <a href="concourse-web.html"><code>web</code> node</a> by setting the following env:</p><pre><code class="language-bash">CONCOURSE_GITLAB_CLIENT_ID=myclientid
+CONCOURSE_GITLAB_CLIENT_SECRET=myclientsecret</code></pre><p>If you&#39;re configuring a self hosted GitLab instance, you&#39;ll also need to set the following flag:</p><pre><code class="language-bash">CONCOURSE_GITLAB_HOST=https://gitlab.example.com</code></pre><p>The GitLab host must contain a scheme and not a trailing slash.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_gitlab-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="gitlab-authorization" href="#gitlab-authorization"></a>Authorization</h2>
+  
+
+  <p>Users and groups can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--gitlab-user=USERNAME</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--gitlab-group=GROUP_NAME</code></dt>
+    <dd><p>Authorize an entire groups&#39;s members.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --gitlab-user my-gitlab-user \
+    --gitlab-group my-group</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  gitlab:
+    users: [&#34;my-gitlab-login&#34;]
+    groups: [&#34;my-gitlab-group&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>GitLab users and groups can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_GITLAB_GROUP=group-name
+CONCOURSE_MAIN_TEAM_GITLAB_USER=some-user</code></pre><p>Multiple groups and users may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.2</span>
+              
+
+              <a href="github-auth.html">GitHub auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.4</span>
+              
+
+              <a href="bitbucket-cloud-auth.html">BitBucket Cloud auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/global-resources.html b/global-resources.html
new file mode 100644
index 00000000..8cdf5601
--- /dev/null
+++ b/global-resources.html
@@ -0,0 +1,422 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Global Resources - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html"  class="self">Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.9</span><a href="global-resources.html"  class="self">Global Resources</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.9.1</td>
+            <td class="title-cell"><a href="global-resources.html#benefits-of-global-resources" >Benefits of Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9.2</td>
+            <td class="title-cell"><a href="global-resources.html#risks-and-side-effects" >Risks and Side Effects</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_global-resources">
+  
+  <h1 class="section-header"><a class="anchor-target" name="global-resources" href="#global-resources"></a><span class="section-number">1.15.9 </span>Global Resources</h1>
+  
+
+  <p>Concourse v5.0 contains an experimental feature known as &#34;global resources&#34;. It is enabled by passing the <code>--enable-global-resources</code> flag to the <code>concourse web</code> command.</p><p>The basic concept of global resources is to share detected resource versions between all resources that have the same <a href="resources.html#schema.resource.type"><code class="schema-attribute-name"><bold>resource<wbr />.type</bold></code></a> and <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a> configuration.</p><p>Before v5.0.0, each pipeline resource had its own version history, associated to the resource by name. This meant that multiple pipelines with the same resource configs would redundantly collect the same version and metadata information.</p><p>With v5.0.0&#39;s experimental &#39;global resources&#39; feature, resource versions are instead associated to an anonymous &#39;resource config&#39; i.e. its <a href="resources.html#schema.resource.type"><code class="schema-attribute-name"><bold>resource<wbr />.type</bold></code></a> and <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a>.</p>
+
+  
+    
+      <div class="section" id="section_benefits-of-global-resources">
+  
+  <h2 class="section-header"><a class="anchor-target" name="benefits-of-global-resources" href="#benefits-of-global-resources"></a>Benefits of Global Resources</h2>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_fewer-resource-checks-to-perform">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fewer-resource-checks-to-perform" href="#fewer-resource-checks-to-perform"></a>Fewer resource <code>check</code>s to perform</h3>
+  
+
+  <p>With global resources, all resources that have the same configuration will share the same version history and share only one checking interval. This reduces load on the worker and on the external services that the resources point to.</p><p>For example, prior to global resources if there were three resources with the same configuration between three team&#39;s pipelines it would result in three check containers performing three resource checks every minute to fetch the versions.</p><p>With global resources, this configuration will result in only one check container and one resource check every minute to fetch versions for all the resources.</p><p>Since there will be only one resource check for all resources that have the same configuration, the resource that has the shortest <a href="resources.html#schema.resource.check_every"><code class="schema-attribute-name"><bold>resource<wbr />.check_every</bold></code></a> configured will result in its pipeline running the checks for that resource configuration.</p>
+
+  
+    
+      <div class="section" id="section_complications-with-reusing-containers">
+  
+  <h4 class="section-header"><a class="anchor-target" name="complications-with-reusing-containers" href="#complications-with-reusing-containers"></a>Complications with reusing containers</h4>
+  
+
+  <p>There is an exception to sharing check containers within a deployment, which is workers belonging to a team and workers with tags.</p><p>If a resource has <a href="resources.html#schema.resource.tags"><code class="schema-attribute-name"><bold>resource<wbr />.tags</bold></code></a> configured, <em>and</em> the resource&#39;s check interval ends up acquiring the checking lock, if a check container already exists with the same resource config elsewhere, it will reuse the container, otherwise a container will be created on a worker matching the appropriate tags.</p><p>Similarly, if a team has its own workers, and their check interval ended up acquiring the lock, it will try to re-use a container with the same resource config from the shared worker pool, rather than creating a new container on the team&#39;s workers.</p><p>This is a bit complicated to reason about and we plan to stop re-using <code>check</code> containers to simplify all of this. See <a href="https://github.com/concourse/concourse/issues/3079">concourse/concourse#3079</a> for more information.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_reducing-redundant-data">
+  
+  <h3 class="section-header"><a class="anchor-target" name="reducing-redundant-data" href="#reducing-redundant-data"></a>Reducing redundant data</h3>
+  
+
+  <p>The majority of Concourse resources will benefit from having versions shared globally because most resource versions have an external source of truth.</p><p>For example, a <code>check</code> for the <a href="https://github.com/concourse/git-resource"><code>git</code> resource</a> that pulls in the <code>concourse/concourse</code> repository will always return the same set of versions as an equivalent resource pointing to the same repository. By consolidating the <code>check</code>s and the versions, there will essentially only be one set of versions collected from the repository and saved into the database.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_reliable-resource-version-history">
+  
+  <h3 class="section-header"><a class="anchor-target" name="reliable-resource-version-history" href="#reliable-resource-version-history"></a>Reliable Resource Version History</h3>
+  
+
+  <p>Prior to global resources, a resource&#39;s version history was directly associated to the resource name. This meant that any changes to a resource&#39;s configuration without changing its name would basically append the versions from the new configuration after the old versions, which are no longer accurate to the current configuration.</p><p>Global resources instead associates the resource versions to the resource&#39;s <a href="resources.html#schema.resource.type"><code class="schema-attribute-name"><bold>resource<wbr />.type</bold></code></a> and <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a>. Therefore, whenever a resource definition changes, the versions will &#34;reset&#34; and change along with it, resulting in truthful and reliable version histories.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_risks-and-side-effects">
+  
+  <h2 class="section-header"><a class="anchor-target" name="risks-and-side-effects" href="#risks-and-side-effects"></a>Risks and Side Effects</h2>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_sharing-versions-doesnt-work-well-for-all-resource-types">
+  
+  <h3 class="section-header"><a class="anchor-target" name="sharing-versions-doesnt-work-well-for-all-resource-types" href="#sharing-versions-doesnt-work-well-for-all-resource-types"></a>Sharing versions doesn&#39;t work well for all resource types</h3>
+  
+
+  <p>Sharing versions isn&#39;t always a good idea. For example, the <a href="https://github.com/concourse/time-resource"><code>time</code> resource</a> is often used to generate versions on an interval so that jobs can fire periodically. If version history were to be shared for all users with e.g. a 10 minute interval, that would lead to a thundering herd of builds storming your workers, leading to load spikes and a lot of unhappy builds.</p><p>We are working toward a solution to the <a href="https://github.com/concourse/time-resource"><code>time</code> resource</a>&#39;s thundering herd problem - namely, to not model time as a resource, and instead model it as a <a href="pipelines.html#schema.pipeline.var_sources"><code>var_source</code></a>. We are tracking progress toward this goal in <a href="https://github.com/concourse/concourse/issues/5815">concourse/concourse#5815</a>.</p><p>Another case where version history shouldn&#39;t be shared is when resources &#34;automagically&#34; learn their auth credentials using things like IAM roles. In these cases, the credentials aren&#39;t in the <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a>. If version history were to be shared, anyone could configure the same <code>source:</code>, not specifying any credentials, and see the version history discovered by some other pipeline that ran its checks on workers that had access via IAM roles.</p><p>For this reason, any resource types that acquire credentials outside of <code>source:</code> should not share version history. Granted, the user won&#39;t be able to <em>fetch</em> these versions, but it&#39;s still an information leak.</p><p>IAM roles are a bit of a thorn in our side when it comes to designing features like this. We&#39;re planning on introducing support for them in a way that doesn&#39;t have this problem in <a href="https://github.com/concourse/concourse/issues/3023">concourse/concourse#3023</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_intercept-admin-only">
+  
+  <h3 class="section-header"><a class="anchor-target" name="intercept-admin-only" href="#intercept-admin-only"></a>Intercepting <code>check</code> containers is no longer safe</h3>
+  
+
+  <p>Now that <code>check</code> containers are shared across teams, it would be dangerous to allow anyone to <a href="builds.html#fly-intercept"><code>fly intercept</code></a> to <code>check</code> containers. For this reason, this capability is limited to <a href="user-roles.html#concourse-admin">admin users</a>.</p><p>We recognize that this will make it a bit more difficult for end users to debug things like failing checks. We plan to improve this by introducing a way to provision a <em>new</em> <code>check</code> container to facilitate debugging. See <a href="https://github.com/concourse/concourse/issues/3344">concourse/concourse#3344</a> for more information.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.8</span>
+              
+
+              <a href="performance-tuning.html">Performance Tuning</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.10</span>
+              
+
+              <a href="administration.html">Administration</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/golang-library-example.html b/golang-library-example.html
new file mode 100644
index 00000000..7388f071
--- /dev/null
+++ b/golang-library-example.html
@@ -0,0 +1,319 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Golang library testing example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html"  class="self">Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_golang-library-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="golang-library-example" href="#golang-library-example"></a><span class="section-number">2.10 </span>Golang library testing example</h1>
+  
+
+  <p>You can run the tests for a Golang library across any specified versions.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/golang-lib"></iframe></p><p>This example shows how to have multiple versions of a language, environment, or dependency fetched and integrated in to a <a href="pipelines.html">Pipeline</a>.</p><p>For these Docker images, defining them as <a href="resources.html">Resources</a> has two advantages for this use case. First, this enables the pipeline to be triggered when there are new versions of those images available. Second, referencing them in the task&#39;s <a href="task-step.html#schema.task.image"><code>task</code> step <strong><code>image</code></strong></a> param is helpful as it will ensure consistency between the image versions fetched by the <a href="resources.html">Resource</a> and the image version running in the job.</p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: golang-1.20.x-image
+  type: registry-image
+  icon: docker
+  source:
+    repository: golang
+    tag: 1.20-alpine
+
+- name: golang-1.21.x-image
+  type: registry-image
+  icon: docker
+  source:
+    repository: golang
+    tag: 1.21-alpine
+
+- name: golang-1.22.x-image
+  type: registry-image
+  icon: docker
+  source:
+    repository: golang
+    tag: 1.22-alpine
+
+task-config: &amp;task-config
+  platform: linux
+  run:
+    path: /bin/sh
+    args:
+      - -c
+      - |
+        GOPATH=$PWD/go
+
+        go version
+
+jobs:
+- name: golang-1.20
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+    - get: golang-1.20.x-image
+      trigger: true
+    - task: run-tests
+      image: golang-1.20.x-image
+      config:
+        &lt;&lt; : *task-config
+
+- name: golang-1.21
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+    - get: golang-1.21.x-image
+      trigger: true
+    - task: run-tests
+      image: golang-1.21.x-image
+      config:
+        &lt;&lt; : *task-config
+
+- name: golang-1.22
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+    - get: golang-1.22.x-image
+      trigger: true
+    - task: run-tests
+      image: golang-1.22.x-image
+      config:
+        &lt;&lt; : *task-config
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.9</span>
+              
+
+              <a href="hooks-example.html">Job &amp; task hooks example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.11</span>
+              
+
+              <a href="rails-example.html">Rails application testing example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/hello-world-example.html b/hello-world-example.html
new file mode 100644
index 00000000..50bf2e79
--- /dev/null
+++ b/hello-world-example.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Hello World pipeline - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html"  class="self">Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_hello-world-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="hello-world-example" href="#hello-world-example"></a><span class="section-number">2.1 </span>Hello World pipeline</h1>
+  
+
+  <p>A single job is the simplest form of pipeline.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/job"></iframe></p><p>While this is less of an example pipeline, this is a simple introduction to a critical primitive to form pipelines.</p><p>Also, due to the fact that there are minimal external factors (<a href="resources.html">Resources</a>) for the system to check and resolve, this is often used to test overall system health.</p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+jobs:
+- name: job
+  public: true
+  plan:
+  - task: simple-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: echo
+        args: [&#34;Hello world!&#34;]
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2</span>
+              
+
+              <a href="examples.html">Examples</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.2</span>
+              
+
+              <a href="serial-job-example.html">Serial job example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/hooks-example.html b/hooks-example.html
new file mode 100644
index 00000000..d5e5866b
--- /dev/null
+++ b/hooks-example.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Job &amp; task hooks example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html"  class="self">Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_hooks-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="hooks-example" href="#hooks-example"></a><span class="section-number">2.9 </span>Job &amp; task hooks example</h1>
+  
+
+  <p>Job hooks like <a href="jobs.html#schema.job.on_success"><code class="schema-attribute-name"><bold>job<wbr />.on_success</bold></code></a> and Step hooks like <a href="on-success-step.html#schema.on_success"><code class="schema-attribute-name"><bold>on_success</bold></code></a> are available to perform actions based on the success, failure, or abortion of a job.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/hooks"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+task-config: &amp;task-config
+  platform: linux
+  image_resource:
+    type: registry-image
+    source: { repository: busybox }
+
+jobs:
+- name: job
+  public: true
+  plan:
+    - task: successful-task
+      config:
+        &lt;&lt; : *task-config
+        run:
+          path: sh
+          args: [&#34;-lc&#34;, &#34;exit 0&#34;]
+      on_success:
+        task: task-success
+        config:
+          &lt;&lt; : *task-config
+          run:
+            path: echo
+            args: [&#34;This task succeeded!&#34;]
+      on_abort:
+        task: task-aborted
+        config:
+          &lt;&lt; : *task-config
+          run:
+            path: echo
+            args: [&#34;This task was aborted!&#34;]
+    - task: failing-task
+      config:
+        &lt;&lt; : *task-config
+        run:
+          path: sh
+          args: [&#34;-lc&#34;, &#34;exit 1&#34;]
+      on_failure:
+        task: task-failure
+        config:
+          &lt;&lt; : *task-config
+          run:
+            path: echo
+            args: [&#34;This task failed!&#34;]
+  on_success:
+    task: job-success
+    config:
+      &lt;&lt; : *task-config
+      run:
+        path: echo
+        args: [&#34;This job succeeded!&#34;]
+  on_failure:
+    task: job-failure
+    config:
+      &lt;&lt; : *task-config
+      run:
+        path: echo
+        args: [&#34;This job failed!&#34;]
+  on_abort:
+    task: job-aborted
+    config:
+      &lt;&lt; : *task-config
+      run:
+        path: echo
+        args: [&#34;This job was aborted!&#34;]
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html#schema.job.on_success"><code class="schema-attribute-name"><bold>job<wbr />.on_success</bold></code></a></p></li>
+
+  <li><p><a href="jobs.html#schema.job.on_failure"><code class="schema-attribute-name"><bold>job<wbr />.on_failure</bold></code></a></p></li>
+
+  <li><p><a href="jobs.html#schema.job.on_abort"><code class="schema-attribute-name"><bold>job<wbr />.on_abort</bold></code></a></p></li>
+
+  <li><p><a href="on-success-step.html#schema.on_success"><code class="schema-attribute-name"><bold>on_success</bold></code></a></p></li>
+
+  <li><p><a href="on-failure-hook.html#schema.on_failure"><code class="schema-attribute-name"><bold>on_failure</bold></code></a></p></li>
+
+  <li><p><a href="on-abort-hook.html#schema.on_abort"><code class="schema-attribute-name"><bold>on_abort</bold></code></a></p></li>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.8</span>
+              
+
+              <a href="manual-trigger-example.html">Manually triggered job example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.10</span>
+              
+
+              <a href="golang-library-example.html">Golang library testing example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/how-to-guides.html b/how-to-guides.html
new file mode 100644
index 00000000..0b7f6c6c
--- /dev/null
+++ b/how-to-guides.html
@@ -0,0 +1,389 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>How-To Guides - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="self">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="self">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html" >Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_how-to-guides">
+  
+  <h1 class="section-header"><a class="anchor-target" name="how-to-guides" href="#how-to-guides"></a><span class="section-number">1.14 </span>How-To Guides</h1>
+  
+
+  <p>The following pages are guides that show how to accomplish certain workflows within Concourse. Most of the guides will use specific images but you are in no way limited to or forced to use these images to accomplish the same task. There are many ways to accomplish the same thing in Concourse, so don&#39;t let these guides limit you in what you think is possible with Concourse.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.1</span>
+      <a href="pipeline-guides.html">Pipeline Guides</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.1.1</span>
+      <a href="common-pipeline-practices.html">Common Pipeline Practices</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.2</span>
+      <a href="exploring-task-input-and-output-scenarios.html">Exploring Task Input and Output Scenarios</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.3</span>
+      <a href="gated-pipeline-patterns.html">Gated Pipeline Patterns</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.4</span>
+      <a href="time-triggered-pipeline-patterns.html">Time Triggered Pipeline Patterns</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.5</span>
+      <a href="manual-approval-step.html">Manual Approval Step</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.2</span>
+      <a href="git-guides.html">Git Guides</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.2.1</span>
+      <a href="basic-git-operations.html">Basic Git Operations</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.2.2</span>
+      <a href="multi-branch-workflows.html">Multi-Branch Workflows</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.3</span>
+      <a href="container-image-guides.html">Container Image Guides</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.3.1</span>
+      <a href="building-and-pushing-an-image.html">Building and Pushing an Image</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.3.2</span>
+      <a href="building-an-image-and-using-it-in-a-task.html">Building an Image and Using it in a Task</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.13</span>
+              
+
+              <a href="builds.html">Builds</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.1</span>
+              
+
+              <a href="pipeline-guides.html">Pipeline Guides</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/idtoken-credential-manager.html b/idtoken-credential-manager.html
new file mode 100644
index 00000000..3e0c1156
--- /dev/null
+++ b/idtoken-credential-manager.html
@@ -0,0 +1,674 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The IDToken credential manager - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html"  class="self">The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_idtoken-credential-manager">
+  
+  <h1 class="section-header"><a class="anchor-target" name="idtoken-credential-manager" href="#idtoken-credential-manager"></a><span class="section-number">1.15.4.7 </span>The IDToken credential manager</h1>
+  
+
+  <p>This idtoken credential manager is a bit special. It doesn&#39;t load any credentials from an external source but instead generates <a href="https://datatracker.ietf.org/doc/html/rfc7519">JWTs</a> which are signed by concourse and contain information about the pipeline/job that is currently running. It can NOT be used as a cluster-wide credential manager, but must instead be used as a <a href="vars.html#var-sources">var source</a>.</p><p>These JWTs can be used to authenticate with external services via &#34;identity federation&#34; with the identity of the pipeline.</p><p>Examples for services that support authentication via JWTs are:</p><ul>
+
+  <li><p><a href="https://vaultproject.io">Vault</a></p></li>
+
+  <li><p><a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html">AWS</a></p></li>
+
+  <li><p><a href="https://learn.microsoft.com/en-us/graph/api/resources/federatedidentitycredentials-overview?view=graph-rest-1.0">Azure</a></p></li>
+
+</ul><p>External services can verify if JWTs are actually issued by your Concourse, by checking the signatures on the JWTs against the public keys published by your Concourse.</p><p>The public keys for verification are published as <a href="https://datatracker.ietf.org/doc/html/rfc7517">JWKS</a> at: <pre><code class="language-bash">https://your-concourse-server.com/.well-known/jwks.json</code></pre></p><p>Concourse also offers a <a href="https://openid.net/specs/openid-connect-discovery-1_0.html">OIDC Discovery Endpoint</a>, which allows external services to auto-discover the JWKS-URL.</p>
+
+  
+    
+      <div class="section" id="section_usage">
+  
+  <h2 class="section-header"><a class="anchor-target" name="usage" href="#usage"></a>Usage</h2>
+  
+
+  <p>You create a <a href="vars.html#var-sources">var source</a> of type <code>idtoken</code> with the configuration you want (see <a href="idtoken-credential-manager.html#idtoken-credential-manager-config">Configuration</a>) in your pipeline. That var source then exposes a single variable with a single field, <code>token</code>, which contains the JWT and can be used in any step of your pipeline.</p><p>You can also have multiple <code>idtoken</code> var sources in the same pipeline, each with different audiences, lifetimes etc.</p><pre><code class="language-bash">var_sources:
+- name: myidtoken
+  type: idtoken
+  config:
+    audience: [&#34;sts.amazonaws.com&#34;]
+
+jobs:
+- name: print-creds
+  plan:
+  - task: print
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source: {mirror_self: true}
+      run:
+        path: bash
+        args:
+        - -c
+        - |
+          echo myidtoken: ((myidtoken:token))</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_idtoken-credential-manager-config">
+  
+  <h2 class="section-header"><a class="anchor-target" name="idtoken-credential-manager-config" href="#idtoken-credential-manager-config"></a>Configuration</h2>
+  
+
+  <p>You can pass several config options to the <code>idtoken</code> var source to customize the generated JWTs. For example, you can configure the <code>aud</code> claim, token expiration, or granularity of the <code>sub</code> claim. See <a href="vars.html#idtoken-var-source"><code>idtoken</code> var source</a> for all config options.</p>
+
+  
+    
+      <div class="section" id="section_idtoken-subject-scope">
+  
+  <h3 class="section-header"><a class="anchor-target" name="idtoken-subject-scope" href="#idtoken-subject-scope"></a>Subject Scope</h3>
+  
+
+  <p>Some external services (like AWS) only perform exact-matches on a token&#39;s sub-claim and ignore most other claims. To enable use-cases like <em>&#34;all pipelines of a team should be able to assume an AWS-Role&#34;</em>, Concourse offers the option to configure how granular the <code>sub</code> claim&#39;s value should be.</p><p>This is configured via the <code>subject_scope</code> setting of the <a href="vars.html#idtoken-var-source"><code>idtoken</code> var source</a>.</p><p>Depending on the value of <code>subject_scope</code>, the content of the JWT&#39;s <code>sub</code> claim will differ:</p><table>
+  
+  <tr>
+    
+    <td><code>subject_scope</code></td>
+    
+    <td><code>sub</code> Value in JWT</td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>team</code></p></td>
+    
+    <td><p><code>&lt;team_name&gt;</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>pipeline</code></p></td>
+    
+    <td><p><code>&lt;team_name&gt;/&lt;pipeline_name&gt;</code></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>instance</code></p></td>
+    
+    <td><p><code>&lt;team_name&gt;/&lt;pipeline_name&gt;/&lt;instance_vars&gt;</code> <sup>1</sup></p></td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td><p><code>job</code></p></td>
+    
+    <td><p><code>&lt;team_name&gt;/&lt;pipeline_name&gt;/&lt;instance_vars&gt;/&lt;job_name&gt;</code> <sup>2</sup></p></td>
+    
+  </tr>
+  
+</table><ul>
+
+  <li><p><span style="font-size: 80%">[1]: Instance vars are rendered as comma-separated key-value pairs. E.g. <code>my-var:my-value,hello:world</code> </span></p></li>
+
+  <li><p><span style="font-size: 80%">[2]: If a path element is empty (for example because you chose <code>job</code> on a pipeline with no instance-vars), the empty element is still added. E.g. <code>my-team/my-pipeline//my-job</code>. Note the double forward-slashes between the pipeline and job name, where instance vars would go. </span></p></li>
+
+</ul><p>This way all your pipelines can simply get a token with <code>subject_scope: team</code> and use this token to assume an AWS-Role that matches on <code>sub: &#34;your_team_name&#34;</code>.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_example-jwt">
+  
+  <h2 class="section-header"><a class="anchor-target" name="example-jwt" href="#example-jwt"></a>Example JWT</h2>
+  
+
+  <p>The generated tokens usually look something like this: <pre><p>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItY29uY291cnNlLmV4YW1wbGUuY29tIiwiZXhwIjoxNzUxMDE1NzM0LCJhdWQiOlsiYXBpOi8vQXp1cmVBRFRva2VuRXhjaGFuZ2UiXSwic3ViIjoibWFpbi9leGFtcGxlLXBpcGVsaW5lIiwidGVhbSI6Im1haW4iLCJwaXBlbGluZSI6ImV4YW1wbGUtcGlwZWxpbmUiLCJqb2IiOiJleGFtcGxlLWpvYiJ9.my7l44tH0wfz8vc6z3fMmzTMxZ8_orhjcsOti3BKSNo</p></pre></p><p>And after decoding, looks like this: <pre><code class="language-bash">{
+  &#34;aud&#34;: &#34;sts.amazonaws.com&#34;,
+  &#34;exp&#34;: 1751282764,
+  &#34;iat&#34;: 1751279164,
+  &#34;iss&#34;: &#34;https://your-concourse-server.com&#34;,
+  &#34;job&#34;: &#34;print-creds&#34;,
+  &#34;pipeline&#34;: &#34;mypipeline&#34;,
+  &#34;sub&#34;: &#34;main/mypipeline&#34;,
+  &#34;team&#34;: &#34;main&#34;
+}</code></pre></p><p>Here is a short explanation of the different claims:</p><ul>
+
+  <li><p><code>iss</code>: Who issued the token (always contains the external URL of your Concourse)</p></li>
+
+  <li><p><code>exp</code>: When the token will expire</p></li>
+
+  <li><p><code>aud</code>: Who the token is intended for. (In the above example it&#39;s for Azure&#39;s Identity Federation API)</p></li>
+
+  <li><p><code>team</code>: The team of the pipeline this token was generated for</p></li>
+
+  <li><p><code>pipeline</code>: The pipeline this token was generated for</p></li>
+
+  <li><p><code>job</code>: The name of the job (inside the pipeline) this token was generated for</p></li>
+
+  <li><p><code>instance_vars</code>: Any instance vars for the pipeline (if it is an instanced pipeline). Will be a comma-separated list of key-value pairs. E.g. <code>hello:world,my-var:my-value</code></p></li>
+
+  <li><p><code>sub</code>: A combination of team &#43; pipeline &#43; instance_vars &#43; job. Which parts are used here is configurable, see <a href="idtoken-credential-manager.html#idtoken-subject-scope">Subject Scope</a>.</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_idtoken-key-rotation">
+  
+  <h2 class="section-header"><a class="anchor-target" name="idtoken-key-rotation" href="#idtoken-key-rotation"></a>Automatic Key Rotation</h2>
+  
+
+  <p>Concourse will automatically rotate the signing keys used for creating the JWTs. The default rotation period is <code>7 days</code>. The previously used keys are being kept around for a while (by default <code>24h</code>) so that verification of currently existing JWTs doesn&#39;t fail during key rotation.</p><p>This behavior can be configured via the following ATC flags:</p><ul>
+
+  <li><p><code>CONCOURSE_SIGNING_KEY_ROTATION_PERIOD</code>: How often to rotate the signing keys. Default: <code>7d</code>. A value of <code>0</code> means don&#39;t rotate at all.</p></li>
+
+  <li><p><code>CONCOURSE_SIGNING_KEY_GRACE_PERIOD</code>: How long to keep previously used signing keys published in the JWKs after they have been rotated. Default: <code>24h</code>.</p></li>
+
+  <li><p><code>CONCOURSE_SIGNING_KEY_CHECK_INTERVAL</code>: How often to check if new keys are needed or if old ones should be removed. Default: <code>10m</code></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.6</span>
+              
+
+              <a href="conjur-credential-manager.html">The Conjur credential manager</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.8</span>
+              
+
+              <a href="creds-caching.html">Caching credentials</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside">
+          <div class="page-partial">
+            <div class="content">
+  <h2>Examples</h2>
+
+  <div class="example">
+  <h3>Vault</h3>
+
+  <p>You can use JWTs to authenticate with <a href="https://developer.hashicorp.com/vault/docs/auth/jwt#jwt-authentication">HashiCorp Vault</a>. This way your pipelines can directly communicate with Vault and use all of it&#39;s features, beyond what Concourse&#39;s native Vault-integration offers.</p><p>First enable the JWT auth method in your Vault Server: <pre><code class="language-bash">vault auth enable jwt</code></pre></p><p>Now configure the JWT auth method to accept JWTs issued by your Concourse: <pre><code class="language-bash">vault write auth/jwt/config \
+  oidc_discovery_url=&#34;https://&lt;external_url_of_your_concourse&gt;&#34; \
+  default_role=&#34;demo&#34;</code></pre></p><p>Lastly, configure a role for JWT auth. Make sure to use the same value in your pipeline that you used for <em>bound_audiences</em> (the best would be the URL of your Vault). <em>bound_subject</em> must be the sub-claim value of your JWT, if you use the <em>subject_scope</em> setting to change the contents of your sub-claim, adapt this accordingly! <pre><code class="language-bash">vault write auth/jwt/role/demo \
+role_type=&#34;jwt&#34;\
+user_claim=&#34;sub&#34; \
+bound_subject=&#34;main/your-pipeline&#34; \
+bound_audiences=&#34;my-vault-server.com&#34; \
+policies=webapps \
+ttl=1h</code></pre></p><p>This role will allow the holder of a JWT with <code>aud: &#34;my-vault-server.com&#34;</code> and <code>sub: &#34;main/your-pipeline&#34;</code> to get a Vault token with the Vault-policy <code>webapps</code>. If the policy you want to assign has a different name, simply change it in the above example. Make sure to adapt the value for <code>bound_subject</code> according to your team and pipeline name.</p><p>Pipelines can now do the following: <pre><code class="language-yaml">var_sources:
+- name: vaulttoken
+  type: idtoken
+  config:
+    audience: [&#34;my-vault-server.com&#34;]
+
+jobs:
+- name: vault-login
+  plan:
+  - task: login
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: hashicorp/vault }
+      run:
+        path: sh
+        args:
+        - -e
+        - -c
+        - |
+          export VAULT_ADDR=https://my-vault-server.com
+          vault write auth/jwt/login \
+            role=demo \
+            jwt=((vaulttoken:token)) \
+            --format=json &gt; vault-response.json
+          echo &#34;Now do something with the token in vault-response.json&#34;</code></pre></p><p>You don&#39;t have to create a role and a policy for every single of your pipelines! You can use claims from the JWT with Vault&#39;s <a href="https://developer.hashicorp.com/vault/tutorials/policies/policy-templating">policy templating</a> feature. This way you can define a policy that allows a pipeline read to all the secrets it would usually have access to using Concourse&#39;s native Vault-integration:</p><p><pre><code class="language-bash">path &#34;concourse/metadata/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.team }}&#34; {
+  capabilities = [&#34;list&#34;]
+}
+
+path &#34;concourse/data/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.team }}/&#43;&#34; {
+  capabilities = [&#34;read&#34;]
+}
+
+path &#34;concourse/metadata/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.team }}/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.pipeline }}&#34; {
+  capabilities = [&#34;list&#34;]
+}
+
+path &#34;concourse/metadata/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.team }}/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.pipeline }}/*&#34; {
+  capabilities = [&#34;read&#34;, &#34;list&#34;]
+}
+
+path &#34;concourse/data/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.team }}/{{ identity.entity.aliases.&lt;JWT_ACCESSOR&gt;.metadata.pipeline }}/*&#34; {
+  capabilities = [&#34;read&#34;, &#34;list&#34;]
+}</code></pre> <span style="font-size: 80%">Make sure to set <code>&lt;JWT_ACCESSOR&gt;</code> to the actual mount-accessor value of your JWT Auth method! You can use <code>vault auth list --format=json | jq -r &#39;.&#34;jwt/&#34;.accessor&#39;</code> to get the accessor for your jwt auth method. </span></p><p>With a policy like this you don&#39;t need to configure <code>bound_subject</code> in your JWT auth role. Every single pipeline can simply use the same role and the policy will take care that they can only access secrets meant for them. However you need to explicitly configure claim to metadata mapping:</p><pre><code class="language-bash">vault write auth/jwt/role/demo \
+  role_type=&#34;jwt&#34;\
+  user_claim=&#34;sub&#34; \
+  bound_subject= \
+  bound_audiences=&#34;my-vault-server.com&#34; \
+  policies=pipeline-new \
+  claim_mappings=&#39;team=team&#39; \
+  claim_mappings=&#39;pipeline=pipeline&#39; \
+  ttl=1h</code></pre>
+</div><div class="example">
+  <h3>AWS</h3>
+
+  <p>AWS supports <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html">federation with external identity providers</a>. Using this, you can allow identities managed by an external identity provider to perform actions in your AWS account.</p><p>In this scenario the external identity provider is Concourse and the identities are teams/pipelines/jobs. This means you are able to grant a specific pipeline or job permission to perform actions in AWS (like deploying something), all without managing IAM users or dealing with long-lived credentials.</p><p>First you need to <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html">create an OpenID Connect identity provider</a> in your AWS Account. Set <em>Provider URL</em> to the external URL of your Concourse server. For <em>Audience</em>, you can choose any string you like, but using a value like <code>sts.amazonaws.com</code> is recommended. You have to use the same string later in the configuration of your <a href="vars.html#idtoken-var-source"><code>idtoken</code> var source</a>.</p><p>Next you will need to <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html#idp_oidc_Create">create an IAM-Role that can be assumed using your JWT</a>. Set <em>Identity Provider</em> to the value you previously set <em>Audience</em> to. Add a condition on the sub-claim with type <code>StringEquals</code> and value <code>yourteam/yourpipeline</code>. This will allow ONLY that specific pipeline (and any instanced versions of it) to assume that IAM Role using a JWT. If you use the <code>subject_scope</code> setting to change the contents of your sub-claim, adapt this condition accordingly! In the next step you will be able to choose which AWS permissions your role will get.</p><p>Now you can use the AWS <a href="https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html">AssumeRoleWithWebIdentity API operation</a> to assume your role via a JWT issued by Concourse. The easiest way is to do this is via the <a href="https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html">assume-role-with-web-identity AWS CLI command</a>:</p><pre><code class="language-yaml">var_sources:
+- name: awstoken
+  type: idtoken
+  config:
+    audience: [&#34;sts.amazonaws.com&#34;]
+
+jobs:
+- name: aws-login
+  plan:
+  - task: print
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: amazon/aws-cli }
+      run:
+        path: bash
+        args:
+        - -e
+        - -c
+        - |
+          aws sts assume-role-with-web-identity \
+            --role-session-name Concourse \
+            --role-arn arn:aws:iam::&lt;your_account&gt;:role/&lt;your_role&gt; \
+            --web-identity-token ((awstoken:token)) &gt; creds.json
+          echo &#34;Now do something with the temporary credentials in creds.json&#34;</code></pre>
+</div><div class="example">
+  <h3>Azure</h3>
+
+  <p>Azure also supports a way to grant the holder of a JWT permissions in the Cloud. This is done via a feature called <a href="https://learn.microsoft.com/en-us/graph/api/resources/federatedidentitycredentials-overview?view=graph-rest-1.0">Federated Credentials</a>.</p><p>First, <a href="https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app">create an EntraID App Registration</a>. This app registration will be the service principal used by your pipeline.</p><p>Now <a href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation-create-trust?pivots=identity-wif-apps-methods-azp#other-identity-providers">create a federated credential</a> for the app registration you just created.</p><p>For <em>Scenario</em> select &#34;Other&#34;. For <em>Issuer</em> set it to the external URL of your Concourse server. For <em>Type</em> select &#34;Explicit subject identifier&#34; and set <em>Value</em> to <code>&lt;teamname&gt;/&lt;pipelinename&gt;</code> of the pipeline that should be able to use the identity. If you use the <code>subject_scope</code> setting to change the contents of your sub-claim, change this setting here accordingly.</p><p>You can now assign IAM permissions to the identity of the app registration, which define what the identity is allowed to do in your Azure subscription.</p><p>Your pipeline can now use the <code>az</code> cli to login to Azure using a JWT generated by Concourse: <pre><code class="language-yaml">var_sources:
+- name: azuretoken
+  type: idtoken
+  config:
+    audience: [&#34;api://AzureADTokenExchange&#34;]
+
+jobs:
+- name: azure-deploy
+  plan:
+  - task: login
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: mcr.microsoft.com/azure-cli }
+      run:
+        path: bash
+        args:
+        - -e
+        - -c
+        - |
+          echo ((azuretoken:token))
+          az login --service-principal \
+            -u &lt;client_id of your app registration&gt; \
+            --tenant &lt;tenant_id of your app registration&gt; \
+            --federated-token ((azuretoken:token))
+          echo &#34;You are now authenticated with Azure. Do something with it!&#34;</code></pre></p>
+</div>
+</div>
+          </div>
+          </div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/implementing-resource-types.html b/implementing-resource-types.html
new file mode 100644
index 00000000..b03521ac
--- /dev/null
+++ b/implementing-resource-types.html
@@ -0,0 +1,500 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Implementing a Resource Type - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html"  class="active">Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.9</span><a href="resource-types.html"  class="active">Resource Types</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.9.1</td>
+            <td class="title-cell"><a href="implementing-resource-types.html"  class="self">Implementing a Resource Type</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.2</td>
+            <td class="title-cell"><a href="managing-resource-types.html" >Managing Resource Types</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.9.1</span><a href="implementing-resource-types.html"  class="self">Implementing a Resource Type</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.9.1.1</td>
+            <td class="title-cell"><a href="implementing-resource-types.html#resource-check" ><code>check</code>: Check for new versions.</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.1.2</td>
+            <td class="title-cell"><a href="implementing-resource-types.html#resource-in" ><code>in</code>: Fetch a given resource.</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.1.3</td>
+            <td class="title-cell"><a href="implementing-resource-types.html#resource-out" ><code>out</code>: Update a resource.</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.1.4</td>
+            <td class="title-cell"><a href="implementing-resource-types.html#resource-metadata" >Metadata</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.1.5</td>
+            <td class="title-cell"><a href="implementing-resource-types.html#resource-certs" >Certificate Propagation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.1.6</td>
+            <td class="title-cell"><a href="implementing-resource-types.html#test-resource-with-docker" >Testing resources locally using docker</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_implementing-resource-types">
+  
+  <h1 class="section-header"><a class="anchor-target" name="implementing-resource-types" href="#implementing-resource-types"></a><span class="section-number">1.9.1 </span>Implementing a Resource Type</h1>
+  
+
+  <p>A resource type is implemented by a container image with three scripts:</p><ul>
+
+  <li><p><code>/opt/resource/check</code> for checking for new versions of the resource</p></li>
+
+  <li><p><code>/opt/resource/in</code> for pulling a version of the resource down</p></li>
+
+  <li><p><code>/opt/resource/out</code> for idempotently pushing a version up</p></li>
+
+</ul><p>Distributing resource types as containers allows them to package their own dependencies. For example, the <code>git</code> resource comes with the <code>git</code> binary pre-installed.</p><p>All resources must implement all three actions, though the actions can just be no-ops (which still must be correctly implemented as detailed below).</p><p>Resources can emit logs to the user by writing to <code>stderr</code>. ANSI escape codes (coloring, cursor movement, etc.) will be interpreted properly by the web UI, so you should make your output pretty.</p>
+
+  
+    
+      <div class="section" id="section_resource-check">
+  
+  <h2 class="section-header"><a class="anchor-target" name="resource-check" href="#resource-check"></a><code>check</code>: Check for new versions.</h2>
+  
+
+  <p>A resource type&#39;s <code>check</code> script is invoked to detect new versions of the resource. It is given the configured source and current version on <code>stdin</code>, and must print the array of new versions, in chronological order (oldest first), to <code>stdout</code>, including the requested version if it&#39;s still valid.</p><p>The request body will have the following fields:</p><ul>
+
+  <li><p><code>source</code> is an arbitrary JSON object which specifies the location of the resource, including any credentials. This is passed verbatim from the <a href="resources.html">resource configuration</a>.</p><p>For the <code>git</code> resource this would be the repo URI, the branch, and the private key, if necessary.</p></li>
+
+  <li><p><code>version</code> is a JSON object with <code>string</code> fields, used to uniquely identify an instance of the resource. For <code>git</code> this would be the commit&#39;s SHA.</p><p>This will be omitted from the first request, in which case the resource should return the current version (<em>not</em> every version since the resource&#39;s inception).</p></li>
+
+</ul><p>For example, here&#39;s what the input for the <code>git</code> resource may look like:</p><pre><code class="language-json">{
+  &#34;source&#34;: {
+    &#34;uri&#34;: &#34;git://some-uri&#34;,
+    &#34;branch&#34;: &#34;develop&#34;,
+    &#34;private_key&#34;: &#34;...&#34;
+  },
+  &#34;version&#34;: { &#34;ref&#34;: &#34;61cbef&#34; }
+}</code></pre><p>Upon receiving this payload the <code>git</code> resource would probably do something like:</p><pre><code class="language-bash">[ -d /tmp/repo ] || git clone git://some-uri /tmp/repo
+cd /tmp/repo
+git pull &amp;&amp; git log 61cbef..HEAD</code></pre><p>Note that it conditionally clones; the container for checking versions is reused between checks, so that it can efficiently pull rather than cloning every time.</p><p>And the output, assuming <code>d74e01</code> is the commit immediately after <code>61cbef</code>:</p><pre><code class="language-json">[
+  { &#34;ref&#34;: &#34;61cbef&#34; },
+  { &#34;ref&#34;: &#34;d74e01&#34; },
+  { &#34;ref&#34;: &#34;7154fe&#34; }
+]</code></pre><p>The list may be empty, if there are no versions available at the source. If the given version is already the latest, an array with that version as the sole entry should be listed.</p><p>If your resource is unable to determine which versions are newer than the given version (e.g. if it&#39;s a git commit that was <code>push -f</code>ed over), then the current version of your resource should be returned (i.e. the new <code>HEAD</code>).</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_resource-in">
+  
+  <h2 class="section-header"><a class="anchor-target" name="resource-in" href="#resource-in"></a><code>in</code>: Fetch a given resource.</h2>
+  
+
+  <p>The <code>in</code> script is passed a destination directory as command line argument <code>$1</code>, and is given on <code>stdin</code> the configured source and a precise version of the resource to fetch.</p><p>The script must fetch the resource and place it in the given directory.</p><p>If the desired resource version is unavailable (for example, if it was deleted), the script must exit with error.</p><p>The script must emit the fetched version, and may emit metadata as a list of key-value pairs. This data is intended for public consumption and will make it upstream, intended to be shown on the build&#39;s page.</p><p>The request will contain the following fields:</p><ul>
+
+  <li><p><code>source</code> is the same value as passed to <a href="implementing-resource-types.html#resource-check"><code>check</code></a>.</p></li>
+
+  <li><p><code>version</code> is the same type of value passed to <a href="implementing-resource-types.html#resource-check"><code>check</code></a>, and specifies the version to fetch.</p></li>
+
+  <li><p><code>params</code> is an arbitrary JSON object passed along verbatim from <a href="get-step.html#schema.get.params"><code>get</code> step <strong><code>params</code></strong></a> on a <a href="get-step.html"><code>get</code> step</a>.</p></li>
+
+</ul><p>Example request, in this case for the <code>git</code> resource:</p><pre><code class="language-json">{
+  &#34;source&#34;: {
+    &#34;uri&#34;: &#34;git://some-uri&#34;,
+    &#34;branch&#34;: &#34;develop&#34;,
+    &#34;private_key&#34;: &#34;...&#34;
+  },
+  &#34;version&#34;: { &#34;ref&#34;: &#34;61cebf&#34; }
+}</code></pre><p>Upon receiving this payload the <code>git</code> resource would probably do something like:</p><pre><code class="language-bash">git clone --branch develop git://some-uri $1
+cd $1
+git checkout 61cebf</code></pre><p>And output:</p><pre><code class="language-json">{
+  &#34;version&#34;: { &#34;ref&#34;: &#34;61cebf&#34; },
+  &#34;metadata&#34;: [
+    { &#34;name&#34;: &#34;commit&#34;, &#34;value&#34;: &#34;61cebf&#34; },
+    { &#34;name&#34;: &#34;author&#34;, &#34;value&#34;: &#34;Hulk Hogan&#34; }
+  ]
+}</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_resource-out">
+  
+  <h2 class="section-header"><a class="anchor-target" name="resource-out" href="#resource-out"></a><code>out</code>: Update a resource.</h2>
+  
+
+  <p>The <code>out</code> script is passed a path to the directory containing the build&#39;s full set of sources as command line argument <code>$1</code>, and is given on <code>stdin</code> the configured params and the resource&#39;s source configuration.  </p><p>The script must emit the resulting version of the resource. For example, the <code>git</code> resource emits the SHA of the commit that it has just pushed.</p><p>Additionally, the script may emit metadata as a list of key-value pairs. This data is intended for public consumption and will make it upstream, intended to be shown on the build&#39;s page.</p><p>The request will contain the following fields:</p><ul>
+
+  <li><p><code>source</code> is the same value as passed to <a href="implementing-resource-types.html#resource-check"><code>check</code></a>.</p></li>
+
+  <li><p><code>params</code> is an arbitrary JSON object passed along verbatim from <a href="get-step.html#schema.get.params"><code>get</code> step <strong><code>params</code></strong></a> on a <a href="put-step.html"><code>put</code> step</a>.</p></li>
+
+</ul><p>Example request, in this case for the <code>git</code> resource:</p><pre><code class="language-json">{
+  &#34;params&#34;: {
+    &#34;branch&#34;: &#34;develop&#34;,
+    &#34;repo&#34;: &#34;some-repo&#34;
+  },
+  &#34;source&#34;: {
+    &#34;uri&#34;: &#34;git@...&#34;,
+    &#34;private_key&#34;: &#34;...&#34;
+  }
+}</code></pre><p>Upon receiving this payload the <code>git</code> resource would probably do something like:</p><pre><code class="language-bash">cd $1/some-repo
+git push origin develop</code></pre><p>And output:</p><pre><code class="language-json">{
+  &#34;version&#34;: { &#34;ref&#34;: &#34;61cebf&#34; },
+  &#34;metadata&#34;: [
+    { &#34;name&#34;: &#34;commit&#34;, &#34;value&#34;: &#34;61cebf&#34; },
+    { &#34;name&#34;: &#34;author&#34;, &#34;value&#34;: &#34;Mick Foley&#34; }
+  ]
+}</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_resource-metadata">
+  
+  <h2 class="section-header"><a class="anchor-target" name="resource-metadata" href="#resource-metadata"></a>Metadata</h2>
+  
+
+  <p>When used in a <a href="get-step.html"><code>get</code> step</a> or a <a href="put-step.html"><code>put</code> step</a>, metadata about the running build is made available via the following environment variables:</p><dl>
+  
+  <dt><code>$BUILD_ID</code></dt>
+    <dd><p>The internal identifier for the build. Right now this is numeric, but it may become a UUID in the future. Treat it as an absolute reference to the build.</p></dd>
+  
+  <dt><code>$BUILD_NAME</code></dt>
+    <dd><p>The build number within the build&#39;s job.</p></dd>
+  
+  <dt><code>$BUILD_JOB_NAME</code></dt>
+    <dd><p>The name of the build&#39;s job.</p></dd>
+  
+  <dt><code>$BUILD_PIPELINE_NAME</code></dt>
+    <dd><p>The name of the pipeline that the build&#39;s job lives in.</p></dd>
+  
+  <dt><code>$BUILD_PIPELINE_INSTANCE_VARS</code></dt>
+    <dd><p>The instance vars of the instanced pipeline that the build&#39;s job lives in, serialized as JSON. See <a href="instanced-pipelines.html">Grouping Pipelines</a> for a definition of instanced pipelines.</p></dd>
+  
+  <dt><code>$BUILD_TEAM_NAME</code></dt>
+    <dd><p>The team that the build belongs to.</p></dd>
+  
+  <dt><code>$BUILD_CREATED_BY</code></dt>
+    <dd><p>The username that created the build. By default it is not available. See <a href="resources.html#schema.resource.expose_build_created_by"><code>expose_build_created_by</code></a> for how to opt in. This metadata field is not made available to the <a href="get-step.html"><code>get</code> step</a>.</p></dd>
+  
+  <dt><code>$ATC_EXTERNAL_URL</code></dt>
+    <dd><p>The public URL for your ATC; useful for debugging.</p></dd>
+  
+</dl><p>If the build is a one-off, <code>$BUILD_NAME</code>, <code>$BUILD_JOB_NAME</code>, <code>$BUILD_PIPELINE_NAME</code>, and <code>$BUILD_PIPELINE_INSTANCE_VARS</code> will not be set.</p><p>Additionally, <code>$BUILD_PIPELINE_INSTANCE_VARS</code> will not be set if the build&#39;s pipeline has no instance vars (i.e. is not an instanced pipeline).</p><p>None of these variables are available to <a href="implementing-resource-types.html#resource-check"><code>check</code></a>.</p><p>These variables should be used solely for annotating things with metadata for traceability, i.e. for linking to the build in an alert or annotating an automated commit to facilitate its origin discovery.</p><p>They should <em>not</em> be used to emulate versioning (e.g. by using the increasing build number). They are not provided to <a href="task-step.html"><code>task</code> step</a>s to avoid this anti-pattern.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_resource-certs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="resource-certs" href="#resource-certs"></a>Certificate Propagation</h2>
+  
+
+  <p>Certificates can be automatically propagated into each resource container, if the worker is configured to do so. The BOSH release configures this automatically, while the <code>concourse</code> binary must be given a <code>--certs-dir</code> flag pointing to the path containing the CA certificate bundle.</p><p>The worker&#39;s certificate directory will then be always mounted at <code>/etc/ssl/certs</code>, read-only, in each resource container created on the worker. There&#39;s no single standard path for this, so we picked one that would work out of the box in most cases.</p><p>This approach to certificate configuration is similar in mindset to the propagation of <code>http_proxy</code>/<code>https_proxy</code> - certs are kind of a baseline assumption when deploying software, so Concourse should do its best to respect it out-of-the-box, especially as they&#39;re often used in tandem with a man-in-the-middle corporate SSL proxy. (In this way it doesn&#39;t feel too much like the anti-pattern of hand-tuning workers.)</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_test-resource-with-docker">
+  
+  <h2 class="section-header"><a class="anchor-target" name="test-resource-with-docker" href="#test-resource-with-docker"></a>Testing resources locally using docker</h2>
+  
+
+  <p>To test an already packaged resource (a docker image) outside concourse, you need to: <ol>
+
+  <li><p>If, for instance, you are testing the <code>out</code> behaviour of the <code>git</code> resource, create a json file with <code>source</code> configuration of the resource and the <code>params</code> the <code>put</code> step expects. Such a file for the <code>git</code> resource would contain the following (or similar): <pre><code class="language-json">{
+  &#34;source&#34;: {
+    &#34;uri&#34;: &#34;git://some-uri&#34;,
+    &#34;branch&#34;: &#34;develop&#34;,
+    &#34;private_key&#34;: &#34;...&#34;
+  },
+  &#34;params&#34;: {
+    &#34;repository&#34;: &#34;.&#34;,
+    &#34;rebase&#34;: true
+  }
+}</code></pre> Save this file to <code>out-config.json</code> in your working directory.</p></li>
+
+  <li><p>Then run the <code>/opt/resource/out</code> script with its inputs provided via <code>stdin</code> like so (using the <code>docker</code> cli as an example): <pre><code class="language-bash">docker run --rm -i -v &#34;${PWD}:${PWD}&#34; -w &#34;${PWD}&#34; concourse/git-resource /opt/resource/out . &lt; out-config.json</code></pre></p></li>
+
+</ol> <div class="warning">
+  This example needs modification depending on the resource you are testing and your local environment. See the notes below for details.
+</div> <ol>
+
+  <li><p>If you use the exact configuration in this example, the git resource will print an error about the format of the private key being invalid. Adjust the content <code>out-config.json</code> as necessary to get it working with your resource.</p></li>
+
+  <li><p>If the resource you are testing uses <a href="implementing-resource-types.html#resource-metadata">Metadata</a>, you will need to provide the required metadata as environment variables to your <code>docker run</code> command like so: <pre><code class="language-bash">docker run --rm -i -e ATC_EXTERNAL_URL=&#34;https://concourse.example.com&#34; -e BUILD_NAME=620 -v &#34;${PWD}:${PWD}&#34; -w &#34;${PWD}&#34; concourse/git-resource /opt/resource/out . &lt; out-config.json</code></pre></p></li>
+
+</ol></p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.9</span>
+              
+
+              <a href="resource-types.html">Resource Types</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.9.2</span>
+              
+
+              <a href="managing-resource-types.html">Managing Resource Types</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/in-parallel-step.html b/in-parallel-step.html
new file mode 100644
index 00000000..c9a923f0
--- /dev/null
+++ b/in-parallel-step.html
@@ -0,0 +1,483 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>in_parallel step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html"  class="self"><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="in-parallel-step.html#schema.in_parallel_config"><strong><code>in_parallel_config</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="in-parallel-step.html#schema.in-parallel.in_parallel"><code>in_parallel</code> step <strong><code>in_parallel</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="in-parallel-step.html#schema.in_parallel_config.steps"><code>in_parallel</code> step <strong><code>steps</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="in-parallel-step.html#schema.in_parallel_config.limit"><code>in_parallel</code> step <strong><code>limit</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="in-parallel-step.html#schema.in_parallel_config.fail_fast"><code>in_parallel</code> step <strong><code>fail_fast</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="in-parallel-step.html#in-parallel"><code>in_parallel</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_in-parallel-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="in-parallel-step" href="#in-parallel-step"></a><span class="section-number">1.11.6 </span><code>in_parallel</code> step</h1>
+  
+
+  <div class="schema-group">
+  <a id="in-parallel"></a>
+  <p>Performs the given steps in parallel. If any sub-steps in a <code>parallel</code> result in a failure or error, the parallel step as a whole is considered to have failed or errored. Expand each section below for more details and examples. <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.in-parallel.in_parallel" type="checkbox" class="toggle" />
+  <label for="toggle-schema.in-parallel.in_parallel" class="toggle-title">
+    <a id="schema.in-parallel.in_parallel"></a>
+
+    <code><a class="attribute-name" href="#schema.in-parallel.in_parallel">in_parallel</a>: <span class="attribute-type">[<a href="steps.html#schema.step"><strong>step</strong></a>] | <a href="in-parallel-step.html#schema.in_parallel_config"><strong>in_parallel_config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Steps are either configured as a array or within an <a href="in-parallel-step.html#schema.in_parallel_config"><strong><code>in_parallel_config</code></strong> schema</a>.</p><div class="toggleable example">
+  <input id="toggle-d6f57e0d7f1f1e7302d67e099d9d1fb665e27f9d" type="checkbox" class="toggle" />
+  <label for="toggle-d6f57e0d7f1f1e7302d67e099d9d1fb665e27f9d" class="toggle-title">Fetching artifacts in parallel</label>
+  <div class="toggle-content">
+    <p>Using the <code>in_parallel</code> step where possible is the easiest way to speeding up a builds.</p><p>It is often used to fetch all dependent resources together at the start of a build plan:</p><pre><code class="language-yaml">jobs:
+- name: get-in-parallel
+  plan:
+  - in_parallel:
+    - get: ci
+    - get: repo
+    - get: code
+
+
+resources:
+- name: repo
+  type: mock
+- name: code
+  type: mock
+- name: ci
+  type: mock</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-7de39581510339e5ade6ad95f28778b0b1155210" type="checkbox" class="toggle" />
+  <label for="toggle-7de39581510339e5ade6ad95f28778b0b1155210" class="toggle-title">Running a build matrix</label>
+  <div class="toggle-content">
+    <p>If any step in the <code>in_parallel</code> fails, the build will fail, making it useful for build matrices:</p><pre><code class="language-yaml">plan:
+- get: some-repo
+- in_parallel:
+  - task: unit-windows
+    file: some-repo/ci/windows.yml
+  - task: unit-linux
+    file: some-repo/ci/linux.yml
+  - task: unit-darwin
+    file: some-repo/ci/darwin.yml</code></pre>
+  </div>
+</div>
+  </div>
+</div> <div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.in_parallel_config" href="#schema.in_parallel_config"></a><code>in_parallel_config</code> schema</h2>
+
+  <p>Instead of passing in a list of steps to <code>in_parallel</code> you can pass in the following fields. The list of steps will fall under the <code>steps</code> field. <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.in_parallel_config.steps" type="checkbox" class="toggle" />
+  <label for="toggle-schema.in_parallel_config.steps" class="toggle-title">
+    <a id="schema.in_parallel_config.steps"></a>
+
+    <code><a class="attribute-name" href="#schema.in_parallel_config.steps">steps</a>: <span class="attribute-type">[<a href="steps.html#schema.step"><strong>step</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The steps to perform in parallel. <div class="toggleable example">
+  <input id="toggle-509051e6aa588e5508ed973c630763d021be84e4" type="checkbox" class="toggle" />
+  <label for="toggle-509051e6aa588e5508ed973c630763d021be84e4" class="toggle-title">Fetching artifacts in parallel</label>
+  <div class="toggle-content">
+    <p>Using the <code>in_parallel</code> step where possible is the easiest way to speeding up a builds.</p><p>It is often used to fetch all dependent resources together at the start of a build plan:</p><pre><code class="language-yaml">jobs:
+- name: get-in-parallel
+  plan:
+  - in_parallel:
+      limit: 2
+      fail_fast: false
+      steps:
+      - get: ci
+      - get: repo
+      - get: code
+
+
+resources:
+- name: repo
+  type: mock
+- name: code
+  type: mock
+- name: ci
+  type: mock</code></pre>
+  </div>
+</div></p>
+  </div>
+</div></p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.in_parallel_config.limit" type="checkbox" class="toggle" />
+  <label for="toggle-schema.in_parallel_config.limit" class="toggle-title">
+    <a id="schema.in_parallel_config.limit"></a>
+
+    <code><a class="attribute-name" href="#schema.in_parallel_config.limit">limit</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default unlimited.</em> A sempahore which limits the parallelism when executing the steps in a <code>in_parallel</code> step. When set, the number of running steps will not exceed the limit.</p><p>When not specified, <code>in_parallel</code> will execute all steps immediately. <div class="toggleable example">
+  <input id="toggle-cd7a65379db446c9067777cf4aaa94ce288009ef" type="checkbox" class="toggle" />
+  <label for="toggle-cd7a65379db446c9067777cf4aaa94ce288009ef" class="toggle-title">Limiting parallelism</label>
+  <div class="toggle-content">
+    <p>Using <code>limit</code> is useful for performing parallel execution of a growing number of tasks without overloading your workers. In the example below, two tasks will be run in parallel and in order until all steps have been executed:</p><pre><code class="language-yaml">jobs:
+- name: limit-in-parallel
+  plan:
+  - get: examples
+  - in_parallel:
+      limit: 2
+      steps:
+      - task: print-date
+        file: examples/tasks/print-date.yml
+      - task: hello-world
+        file: examples/tasks/hello-world.yml
+      - task: print-var
+        file: examples/tasks/print-var.yml
+        vars:
+          my-var: hello
+          second-var: good-bye
+
+
+resources:
+- name: examples
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div></p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.in_parallel_config.fail_fast" type="checkbox" class="toggle" />
+  <label for="toggle-schema.in_parallel_config.fail_fast" class="toggle-title">
+    <a id="schema.in_parallel_config.fail_fast"></a>
+
+    <code><a class="attribute-name" href="#schema.in_parallel_config.fail_fast">fail_fast</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> When enabled the parallel step will fail fast by returning as soon as any sub-step fails. This means that running steps will be interrupted and pending steps will no longer be scheduled.</p>
+  </div>
+</div>
+</div></p>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.5</span>
+              
+
+              <a href="load-var-step.html"><code>load_var</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.7</span>
+              
+
+              <a href="do-step.html"><code>do</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..dcd0e5ca
--- /dev/null
+++ b/index.html
@@ -0,0 +1,551 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body class="index">
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+    <div class="section" id="section_index">
+  
+
+  <div class="splash">
+  <div class="splash-content">
+    <div class="side-by-side">
+      <div class="segment splash-intro">
+        <h2>Concourse is an open-source continuous thing-doer.</h2><p>Centered around the simple mechanics of <a href="resources.html">resources</a>, <a href="tasks.html">tasks</a>, and <a href="jobs.html">jobs</a>, Concourse delivers a versatile approach to automation that excels at <a href="https://en.wikipedia.org/wiki/Continuous_integration">CI</a>/<a href="https://en.wikipedia.org/wiki/Continuous_delivery">CD</a>.</p><p><span class="button"><a href="quick-start.html">Quick Start</a></span></p>
+      </div>
+
+      <div class="segment splash-downloads">
+        <div class="splash-split">
+  <div class="split-header">
+    <h3>Download the latest release:</h3>
+    <a class="icon-button release-link" href="https://github.com/concourse/concourse/releases/tag/v7.14.0">v7.14.0</a>
+  </div>
+
+  <ul class="download-info">
+    <li>
+      <span class="label">
+        <code>concourse</code> server:
+      </span>
+
+      <ul class="download-links">
+        <li><a href="https://github.com/concourse/concourse/releases/download/v7.14.0/concourse-7.14.0-linux-arm64.tgz"><svg class="icon" width="25px" height="30px" viewBox="0 0 25 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    
+    <title>linux_logo</title>
+    <desc>Created with Sketch Beta.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dashboard_empty_state_member1_no-pipelines" transform="translate(-902.000000, -508.000000)">
+            <g id="linux_logo" transform="translate(899.000000, 507.000000)">
+                <g id="Group-18">
+                    <polygon id="Shape" points="0 0 31.8857143 0 31.8857143 32 0 32"></polygon>
+                    <path d="M27.0899806,25.0401974 C26.3343407,24.7275781 25.7129071,24.2425798 25.75667,23.3018001 C25.8004329,22.3668638 25.0885559,21.7474685 25.0885559,21.7474685 C25.0885559,21.7474685 25.7129071,19.6993735 25.1323188,18.0077231 C24.5546481,16.3131509 22.6436668,13.6018355 21.1761498,11.5537406 C19.7144679,9.50564564 20.9573352,7.14785304 19.6240245,4.12099661 C18.2877964,1.09998353 14.8217722,1.27528409 12.9545538,2.56666493 C11.0844179,3.85512408 11.6620886,7.06020275 11.752532,8.57655264 C11.8400578,10.0870592 11.7933774,11.1651577 11.6212432,11.5566623 C11.4432739,11.9481669 10.2441696,13.3827098 9.44476671,14.5835187 C8.64536383,15.7843276 8.06769314,18.2765173 7.48710492,19.2991039 C6.90943422,20.3246122 7.30913566,21.2566269 7.30913566,21.2566269 C7.30913566,21.2566269 6.90943422,21.3881023 6.59725865,22.0600878 C6.28508307,22.7233083 5.66656697,23.0359276 4.55498852,23.2550533 C3.44341006,23.4771007 3.44341006,24.1929113 3.70890518,24.9963723 C3.97731782,25.7939898 3.70890518,26.243928 3.3967296,27.2665146 C3.08455403,28.2891012 4.63959685,28.6017206 6.15087675,28.7770211 C7.66215664,28.958165 9.35140579,29.9369265 10.7751598,30.1122271 C12.1959963,30.2904493 12.6423782,29.1334656 12.6423782,29.1334656 C12.6423782,29.1334656 14.241184,28.7770211 15.9275156,28.733196 C17.6167648,28.6864492 19.212653,29.0867188 19.212653,29.0867188 C19.212653,29.0867188 19.5248286,29.7996078 20.1024993,30.1093054 C20.6830875,30.4219248 21.9259547,30.4657499 22.7253576,29.6213855 C23.5247605,28.7740995 25.6603915,27.7076877 26.8565783,27.0415455 C28.0673528,26.36956 27.8456206,25.3469734 27.0899806,25.0401974 Z M16.6889906,5.41237744 C17.4533831,5.41237744 18.0660642,6.16909154 18.0660642,7.10110622 C18.0660642,7.76432669 17.7568061,8.33405353 17.3045892,8.61161276 C17.1908056,8.55902259 17.0711869,8.51227577 16.9428156,8.45384225 C17.2141458,8.31944515 17.4067027,7.97176569 17.4067027,7.56857439 C17.4067027,7.0426727 17.0799395,6.61610799 16.680238,6.61610799 C16.2834541,6.61610799 15.9566909,7.04559437 15.9566909,7.56857439 C15.9566909,7.76432669 16.0033714,7.94839228 16.0821446,8.10324112 C15.8458248,8.00974748 15.6270101,7.91917552 15.4548759,7.85782033 C15.3644326,7.63285127 15.3089995,7.37282209 15.3089995,7.09818454 C15.311917,6.16909154 15.9275156,5.41237744 16.6889906,5.41237744 Z M16.5897946,8.97682227 C16.9690734,9.10829769 17.3950326,9.35664016 17.3512696,9.60206095 C17.3045892,9.84748174 17.1061972,9.84748174 16.5897946,10.1659444 C16.073392,10.4785638 14.9559785,11.1739227 14.5971225,11.2177478 C14.2382665,11.2644946 14.036957,11.0599773 13.6576782,10.8145565 C13.2783995,10.5691357 12.5606874,9.98187884 12.7415742,9.6692595 C12.7415742,9.6692595 13.2988222,9.23977312 13.5438946,9.01772573 C13.788967,8.79275667 14.4191532,8.25516827 14.798432,8.3252885 C15.1777107,8.38956537 16.2105159,8.84242517 16.5897946,8.97682227 Z M13.1558633,5.68117164 C13.7568742,5.68117164 14.2441015,6.39698228 14.2441015,7.28225014 C14.2441015,7.445864 14.2265963,7.59486948 14.1974211,7.74095328 C14.0515446,7.79354345 13.9027507,7.87242871 13.7568742,7.99221743 C13.683936,8.05357262 13.6197504,8.10908447 13.5555647,8.16459631 C13.6489256,7.98637407 13.6897711,7.73218825 13.6460081,7.46339405 C13.5672348,6.97839582 13.2433892,6.62779469 12.9253785,6.68038486 C12.6073679,6.73589671 12.4177285,7.16830477 12.4965018,7.65622467 C12.5781926,8.14414458 12.8991208,8.49474571 13.2171314,8.43923387 C13.2346366,8.43631219 13.2521417,8.43046884 13.2725644,8.42462549 C13.1179354,8.57363097 12.9749765,8.70218472 12.8291001,8.81028673 C12.3885532,8.6057694 12.0647075,7.99806078 12.0647075,7.27932846 C12.0705426,6.39698228 12.5548524,5.68117164 13.1558633,5.68117164 Z M11.9830167,28.1663908 C11.8400578,28.8033162 11.0931705,29.2678627 11.0931705,29.2678627 C10.4163038,29.4782234 8.53449774,28.6630758 7.68549687,28.3066313 C6.83357848,27.9531085 4.66877214,27.8420848 4.38285432,27.5265438 C4.09985403,27.2022377 4.52581323,26.4922704 4.63376179,25.8202849 C4.73879283,25.1424561 4.42369972,24.718813 4.52581323,24.2542665 C4.63376179,23.7926417 6.01667042,23.7926417 6.54766066,23.474179 C7.08156842,23.1527947 7.18659946,22.229545 7.61255865,21.9812025 C8.03851785,21.7299384 8.81749803,22.6181279 9.13842619,23.1206562 C9.45935436,23.6144195 10.6642937,25.7501647 11.1602736,26.2819097 C11.6650061,26.8136548 12.1230581,27.5294654 11.9830167,28.1663908 Z M19.8428392,21.9665942 C19.7144679,22.5947545 19.7144679,24.8590535 19.7144679,24.8590535 C19.7144679,24.8590535 18.3373944,26.7698297 16.2017633,27.082449 C14.0690498,27.3950683 13.0012343,27.1700993 13.0012343,27.1700993 L11.8021299,25.7910682 C11.8021299,25.7910682 12.7328216,25.6566711 12.6015328,24.7217347 C12.4673265,23.78972 9.75694229,22.4954175 9.26971499,21.3384338 C8.78248768,20.1814501 9.18218912,18.2210054 9.80362275,17.2422439 C10.4250564,16.2634824 10.8247578,14.1277372 11.4461914,13.4148482 C12.0705426,12.704881 12.5548524,11.1914527 12.3360377,10.5253106 C12.3360377,10.5253106 13.6693483,12.1293108 14.6029576,11.8605166 C15.5336492,11.5917224 17.6255173,10.034469 17.9347754,10.3032632 C18.246951,10.5720574 20.9135722,16.4446264 21.1761498,18.3144991 C21.4445625,20.1843717 20.9981806,21.6043063 20.9981806,21.6043063 C20.9981806,21.6043063 19.974128,21.3413555 19.8428392,21.9665942 Z M26.6640214,26.1591994 C26.2497323,26.5390172 23.9390496,27.4768753 23.2475953,28.2014509 C22.5590585,28.9260266 21.6575421,29.5132835 21.1061291,29.3409046 C20.5517987,29.1656041 20.0674889,28.4088899 20.3125613,27.298653 C20.5517987,26.1942595 20.7618608,24.9846856 20.7268504,24.2922483 C20.6918401,23.5998111 20.5517987,22.6648747 20.7268504,22.527556 C20.8989846,22.3931589 21.1732323,22.4603574 21.1732323,22.4603574 C21.1732323,22.4603574 21.039026,23.77219 21.8296763,24.1198694 C22.6203266,24.4646272 23.7610803,23.9825507 24.1082662,23.6319495 C24.4554522,23.2871918 24.697607,22.7700551 24.697607,22.7700551 C24.697607,22.7700551 25.0418754,22.9453557 25.0097826,23.4975524 C24.9747723,24.0497492 25.24902,24.8473668 25.7712576,25.1220043 C26.2818252,25.3966419 27.0783105,25.7764598 26.6640214,26.1591994 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg> Linux</a></li>
+        <li><a href="https://github.com/concourse/concourse/releases/download/v7.14.0/concourse-7.14.0-darwin-arm64.tgz"><svg class="icon" width="21px" height="24px" viewBox="0 0 21 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    
+    <title>apple_logo_legend_d_ic</title>
+    <desc>Created with Sketch Beta.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dashboard_empty_state_member1_no-pipelines" transform="translate(-823.000000, -510.000000)">
+            <g id="apple_logo_legend_d_ic" transform="translate(817.000000, 507.000000)">
+                <g id="Group-10">
+                    <polygon id="Shape" points="0 0 31.8857143 0 31.8857143 32 0 32"></polygon>
+                    <path d="M26.4292054,21.7434664 C26.067642,22.5672441 25.6395213,23.325527 25.1438105,24.0226817 C24.4679082,24.9729369 23.9144948,25.6309402 23.4878499,25.9964006 C22.8268529,26.5958953 22.1184837,26.9029927 21.3597908,26.9206035 C20.8153796,26.9206035 20.1585147,26.767637 19.3942139,26.4577743 C18.6272566,26.149076 17.9222817,25.9964006 17.2778133,25.9964006 C16.6019111,25.9964006 15.8771608,26.149076 15.1016441,26.4577743 C14.3250944,26.767637 13.6995159,26.9291906 13.2212191,26.9453459 C12.4938125,26.9759101 11.7687671,26.6600801 11.0450499,25.9964006 C10.5831341,25.5990661 10.0053705,24.9179213 9.31323478,23.9528207 C8.57062774,22.9223708 7.96010204,21.7276021 7.48180526,20.3653125 C6.96956579,18.8938651 6.71278195,17.4689917 6.71278195,16.0895279 C6.71278195,14.5093593 7.0589974,13.1464875 7.75246132,12.0044056 C8.29746287,11.0870433 9.02250826,10.3633997 9.92995871,9.832165 C10.8374092,9.30093028 11.8179102,9.03021888 12.873823,9.01289918 C13.4515866,9.01289918 14.2092465,9.18915267 15.1507872,9.53554682 C16.0896716,9.88310532 16.6925233,10.0593588 16.9569811,10.0593588 C17.154439,10.0593588 17.8242906,9.85326885 18.9594523,9.44239881 C20.0329268,9.06136525 20.9391966,8.90359581 21.6815085,8.965743 C23.6929818,9.12584113 25.2041694,9.90784776 26.2091682,11.3167114 C24.4102056,12.3916976 23.5203168,13.8973478 23.5378785,15.828859 C23.5542595,17.3333449 24.107673,18.5851668 25.1951673,19.5793762 C25.6880741,20.0407499 26.238536,20.3973321 26.8511278,20.6505783 C26.7184562,21.0303019 26.5782581,21.3941613 26.4292054,21.7434664 Z M21.8158035,3.84012838 C21.8158035,5.01932393 21.3791234,6.12036248 20.5084196,7.13945989 C19.4576719,8.35096615 18.1867395,9.05103164 16.8085187,8.94056393 C16.7909571,8.79909539 16.7807743,8.65020412 16.7807743,8.49374458 C16.7807743,7.36170521 17.2804697,6.15019895 18.1678497,5.15962811 C18.6108756,4.65808432 19.1741767,4.2409559 19.8574578,3.9083884 C20.5392632,3.5807694 21.1841743,3.39942187 21.7907154,3.36842105 C21.8087198,3.52604495 21.8158035,3.68366884 21.8158035,3.84012838 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg> OS X</a></li>
+        <li><a href="https://github.com/concourse/concourse/releases/download/v7.14.0/concourse-7.14.0-windows-amd64.zip"><svg class="icon" width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    
+    <title>windows_logo</title>
+    <desc>Created with Sketch Beta.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dashboard_empty_state_member1_no-pipelines" transform="translate(-862.000000, -511.000000)">
+            <g id="windows_logo" transform="translate(858.000000, 507.000000)">
+                <polygon id="Shape-Copy" points="0 0 31.8857143 0 31.8857143 32 0 32"></polygon>
+                <path d="M4,7.39800217 L13.8080392,6.06636452 L13.8123266,15.4978618 L4.00895962,15.553517 L4,7.39800217 Z M13.803367,16.5845539 L13.8109799,26.0242708 L4.00761293,24.6806051 L4.00706326,16.5212352 L13.803367,16.5845539 Z M14.992331,5.89216279 L27.9969768,4 L27.9969768,15.3779097 L14.992331,15.4808334 L14.992331,5.89216279 Z M28,16.6733261 L27.9969493,28 L14.9923035,26.1701969 L14.9740819,16.6521194 L28,16.6733261 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
+            </g>
+        </g>
+    </g>
+</svg> Windows</a></li>
+      </ul>
+    </li>
+
+    <li>
+      <span class="label">
+        <code>fly</code> CLI:
+      </span>
+
+      <ul class="download-links">
+        <li><a href="https://github.com/concourse/concourse/releases/download/v7.14.0/fly-7.14.0-linux-arm64.tgz"><svg class="icon" width="25px" height="30px" viewBox="0 0 25 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    
+    <title>linux_logo</title>
+    <desc>Created with Sketch Beta.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dashboard_empty_state_member1_no-pipelines" transform="translate(-902.000000, -508.000000)">
+            <g id="linux_logo" transform="translate(899.000000, 507.000000)">
+                <g id="Group-18">
+                    <polygon id="Shape" points="0 0 31.8857143 0 31.8857143 32 0 32"></polygon>
+                    <path d="M27.0899806,25.0401974 C26.3343407,24.7275781 25.7129071,24.2425798 25.75667,23.3018001 C25.8004329,22.3668638 25.0885559,21.7474685 25.0885559,21.7474685 C25.0885559,21.7474685 25.7129071,19.6993735 25.1323188,18.0077231 C24.5546481,16.3131509 22.6436668,13.6018355 21.1761498,11.5537406 C19.7144679,9.50564564 20.9573352,7.14785304 19.6240245,4.12099661 C18.2877964,1.09998353 14.8217722,1.27528409 12.9545538,2.56666493 C11.0844179,3.85512408 11.6620886,7.06020275 11.752532,8.57655264 C11.8400578,10.0870592 11.7933774,11.1651577 11.6212432,11.5566623 C11.4432739,11.9481669 10.2441696,13.3827098 9.44476671,14.5835187 C8.64536383,15.7843276 8.06769314,18.2765173 7.48710492,19.2991039 C6.90943422,20.3246122 7.30913566,21.2566269 7.30913566,21.2566269 C7.30913566,21.2566269 6.90943422,21.3881023 6.59725865,22.0600878 C6.28508307,22.7233083 5.66656697,23.0359276 4.55498852,23.2550533 C3.44341006,23.4771007 3.44341006,24.1929113 3.70890518,24.9963723 C3.97731782,25.7939898 3.70890518,26.243928 3.3967296,27.2665146 C3.08455403,28.2891012 4.63959685,28.6017206 6.15087675,28.7770211 C7.66215664,28.958165 9.35140579,29.9369265 10.7751598,30.1122271 C12.1959963,30.2904493 12.6423782,29.1334656 12.6423782,29.1334656 C12.6423782,29.1334656 14.241184,28.7770211 15.9275156,28.733196 C17.6167648,28.6864492 19.212653,29.0867188 19.212653,29.0867188 C19.212653,29.0867188 19.5248286,29.7996078 20.1024993,30.1093054 C20.6830875,30.4219248 21.9259547,30.4657499 22.7253576,29.6213855 C23.5247605,28.7740995 25.6603915,27.7076877 26.8565783,27.0415455 C28.0673528,26.36956 27.8456206,25.3469734 27.0899806,25.0401974 Z M16.6889906,5.41237744 C17.4533831,5.41237744 18.0660642,6.16909154 18.0660642,7.10110622 C18.0660642,7.76432669 17.7568061,8.33405353 17.3045892,8.61161276 C17.1908056,8.55902259 17.0711869,8.51227577 16.9428156,8.45384225 C17.2141458,8.31944515 17.4067027,7.97176569 17.4067027,7.56857439 C17.4067027,7.0426727 17.0799395,6.61610799 16.680238,6.61610799 C16.2834541,6.61610799 15.9566909,7.04559437 15.9566909,7.56857439 C15.9566909,7.76432669 16.0033714,7.94839228 16.0821446,8.10324112 C15.8458248,8.00974748 15.6270101,7.91917552 15.4548759,7.85782033 C15.3644326,7.63285127 15.3089995,7.37282209 15.3089995,7.09818454 C15.311917,6.16909154 15.9275156,5.41237744 16.6889906,5.41237744 Z M16.5897946,8.97682227 C16.9690734,9.10829769 17.3950326,9.35664016 17.3512696,9.60206095 C17.3045892,9.84748174 17.1061972,9.84748174 16.5897946,10.1659444 C16.073392,10.4785638 14.9559785,11.1739227 14.5971225,11.2177478 C14.2382665,11.2644946 14.036957,11.0599773 13.6576782,10.8145565 C13.2783995,10.5691357 12.5606874,9.98187884 12.7415742,9.6692595 C12.7415742,9.6692595 13.2988222,9.23977312 13.5438946,9.01772573 C13.788967,8.79275667 14.4191532,8.25516827 14.798432,8.3252885 C15.1777107,8.38956537 16.2105159,8.84242517 16.5897946,8.97682227 Z M13.1558633,5.68117164 C13.7568742,5.68117164 14.2441015,6.39698228 14.2441015,7.28225014 C14.2441015,7.445864 14.2265963,7.59486948 14.1974211,7.74095328 C14.0515446,7.79354345 13.9027507,7.87242871 13.7568742,7.99221743 C13.683936,8.05357262 13.6197504,8.10908447 13.5555647,8.16459631 C13.6489256,7.98637407 13.6897711,7.73218825 13.6460081,7.46339405 C13.5672348,6.97839582 13.2433892,6.62779469 12.9253785,6.68038486 C12.6073679,6.73589671 12.4177285,7.16830477 12.4965018,7.65622467 C12.5781926,8.14414458 12.8991208,8.49474571 13.2171314,8.43923387 C13.2346366,8.43631219 13.2521417,8.43046884 13.2725644,8.42462549 C13.1179354,8.57363097 12.9749765,8.70218472 12.8291001,8.81028673 C12.3885532,8.6057694 12.0647075,7.99806078 12.0647075,7.27932846 C12.0705426,6.39698228 12.5548524,5.68117164 13.1558633,5.68117164 Z M11.9830167,28.1663908 C11.8400578,28.8033162 11.0931705,29.2678627 11.0931705,29.2678627 C10.4163038,29.4782234 8.53449774,28.6630758 7.68549687,28.3066313 C6.83357848,27.9531085 4.66877214,27.8420848 4.38285432,27.5265438 C4.09985403,27.2022377 4.52581323,26.4922704 4.63376179,25.8202849 C4.73879283,25.1424561 4.42369972,24.718813 4.52581323,24.2542665 C4.63376179,23.7926417 6.01667042,23.7926417 6.54766066,23.474179 C7.08156842,23.1527947 7.18659946,22.229545 7.61255865,21.9812025 C8.03851785,21.7299384 8.81749803,22.6181279 9.13842619,23.1206562 C9.45935436,23.6144195 10.6642937,25.7501647 11.1602736,26.2819097 C11.6650061,26.8136548 12.1230581,27.5294654 11.9830167,28.1663908 Z M19.8428392,21.9665942 C19.7144679,22.5947545 19.7144679,24.8590535 19.7144679,24.8590535 C19.7144679,24.8590535 18.3373944,26.7698297 16.2017633,27.082449 C14.0690498,27.3950683 13.0012343,27.1700993 13.0012343,27.1700993 L11.8021299,25.7910682 C11.8021299,25.7910682 12.7328216,25.6566711 12.6015328,24.7217347 C12.4673265,23.78972 9.75694229,22.4954175 9.26971499,21.3384338 C8.78248768,20.1814501 9.18218912,18.2210054 9.80362275,17.2422439 C10.4250564,16.2634824 10.8247578,14.1277372 11.4461914,13.4148482 C12.0705426,12.704881 12.5548524,11.1914527 12.3360377,10.5253106 C12.3360377,10.5253106 13.6693483,12.1293108 14.6029576,11.8605166 C15.5336492,11.5917224 17.6255173,10.034469 17.9347754,10.3032632 C18.246951,10.5720574 20.9135722,16.4446264 21.1761498,18.3144991 C21.4445625,20.1843717 20.9981806,21.6043063 20.9981806,21.6043063 C20.9981806,21.6043063 19.974128,21.3413555 19.8428392,21.9665942 Z M26.6640214,26.1591994 C26.2497323,26.5390172 23.9390496,27.4768753 23.2475953,28.2014509 C22.5590585,28.9260266 21.6575421,29.5132835 21.1061291,29.3409046 C20.5517987,29.1656041 20.0674889,28.4088899 20.3125613,27.298653 C20.5517987,26.1942595 20.7618608,24.9846856 20.7268504,24.2922483 C20.6918401,23.5998111 20.5517987,22.6648747 20.7268504,22.527556 C20.8989846,22.3931589 21.1732323,22.4603574 21.1732323,22.4603574 C21.1732323,22.4603574 21.039026,23.77219 21.8296763,24.1198694 C22.6203266,24.4646272 23.7610803,23.9825507 24.1082662,23.6319495 C24.4554522,23.2871918 24.697607,22.7700551 24.697607,22.7700551 C24.697607,22.7700551 25.0418754,22.9453557 25.0097826,23.4975524 C24.9747723,24.0497492 25.24902,24.8473668 25.7712576,25.1220043 C26.2818252,25.3966419 27.0783105,25.7764598 26.6640214,26.1591994 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg> Linux</a></li>
+        <li><a href="https://github.com/concourse/concourse/releases/download/v7.14.0/fly-7.14.0-darwin-arm64.tgz"><svg class="icon" width="21px" height="24px" viewBox="0 0 21 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    
+    <title>apple_logo_legend_d_ic</title>
+    <desc>Created with Sketch Beta.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dashboard_empty_state_member1_no-pipelines" transform="translate(-823.000000, -510.000000)">
+            <g id="apple_logo_legend_d_ic" transform="translate(817.000000, 507.000000)">
+                <g id="Group-10">
+                    <polygon id="Shape" points="0 0 31.8857143 0 31.8857143 32 0 32"></polygon>
+                    <path d="M26.4292054,21.7434664 C26.067642,22.5672441 25.6395213,23.325527 25.1438105,24.0226817 C24.4679082,24.9729369 23.9144948,25.6309402 23.4878499,25.9964006 C22.8268529,26.5958953 22.1184837,26.9029927 21.3597908,26.9206035 C20.8153796,26.9206035 20.1585147,26.767637 19.3942139,26.4577743 C18.6272566,26.149076 17.9222817,25.9964006 17.2778133,25.9964006 C16.6019111,25.9964006 15.8771608,26.149076 15.1016441,26.4577743 C14.3250944,26.767637 13.6995159,26.9291906 13.2212191,26.9453459 C12.4938125,26.9759101 11.7687671,26.6600801 11.0450499,25.9964006 C10.5831341,25.5990661 10.0053705,24.9179213 9.31323478,23.9528207 C8.57062774,22.9223708 7.96010204,21.7276021 7.48180526,20.3653125 C6.96956579,18.8938651 6.71278195,17.4689917 6.71278195,16.0895279 C6.71278195,14.5093593 7.0589974,13.1464875 7.75246132,12.0044056 C8.29746287,11.0870433 9.02250826,10.3633997 9.92995871,9.832165 C10.8374092,9.30093028 11.8179102,9.03021888 12.873823,9.01289918 C13.4515866,9.01289918 14.2092465,9.18915267 15.1507872,9.53554682 C16.0896716,9.88310532 16.6925233,10.0593588 16.9569811,10.0593588 C17.154439,10.0593588 17.8242906,9.85326885 18.9594523,9.44239881 C20.0329268,9.06136525 20.9391966,8.90359581 21.6815085,8.965743 C23.6929818,9.12584113 25.2041694,9.90784776 26.2091682,11.3167114 C24.4102056,12.3916976 23.5203168,13.8973478 23.5378785,15.828859 C23.5542595,17.3333449 24.107673,18.5851668 25.1951673,19.5793762 C25.6880741,20.0407499 26.238536,20.3973321 26.8511278,20.6505783 C26.7184562,21.0303019 26.5782581,21.3941613 26.4292054,21.7434664 Z M21.8158035,3.84012838 C21.8158035,5.01932393 21.3791234,6.12036248 20.5084196,7.13945989 C19.4576719,8.35096615 18.1867395,9.05103164 16.8085187,8.94056393 C16.7909571,8.79909539 16.7807743,8.65020412 16.7807743,8.49374458 C16.7807743,7.36170521 17.2804697,6.15019895 18.1678497,5.15962811 C18.6108756,4.65808432 19.1741767,4.2409559 19.8574578,3.9083884 C20.5392632,3.5807694 21.1841743,3.39942187 21.7907154,3.36842105 C21.8087198,3.52604495 21.8158035,3.68366884 21.8158035,3.84012838 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg> OS X</a></li>
+        <li><a href="https://github.com/concourse/concourse/releases/download/v7.14.0/fly-7.14.0-windows-amd64.zip"><svg class="icon" width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    
+    <title>windows_logo</title>
+    <desc>Created with Sketch Beta.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dashboard_empty_state_member1_no-pipelines" transform="translate(-862.000000, -511.000000)">
+            <g id="windows_logo" transform="translate(858.000000, 507.000000)">
+                <polygon id="Shape-Copy" points="0 0 31.8857143 0 31.8857143 32 0 32"></polygon>
+                <path d="M4,7.39800217 L13.8080392,6.06636452 L13.8123266,15.4978618 L4.00895962,15.553517 L4,7.39800217 Z M13.803367,16.5845539 L13.8109799,26.0242708 L4.00761293,24.6806051 L4.00706326,16.5212352 L13.803367,16.5845539 Z M14.992331,5.89216279 L27.9969768,4 L27.9969768,15.3779097 L14.992331,15.4808334 L14.992331,5.89216279 Z M28,16.6733261 L27.9969493,28 L14.9923035,26.1701969 L14.9740819,16.6521194 L28,16.6733261 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
+            </g>
+        </g>
+    </g>
+</svg> Windows</a></li>
+      </ul>
+    </li>
+  </ul>
+</div>
+      </div>
+    </div>
+  </div>
+</div><div class="page-region light">
+  <div class="page-content">
+    <h1>Core features</h2>
+
+    <p>Concourse is engineered to be <a href="https://github.com/concourse/rfcs/blob/master/DESIGN_PRINCIPLES.md">expressive, versatile, and secure</a>, remaining intuitive even as your project complexity grows.</p><div class="side-by-side">
+
+  <div class="segment">
+    <h2>Code-based configuration</h2><pre><code class="language-yaml">resources:
+- name: booklit
+  type: git
+  source: {uri: &#34;https://github.com/concourse/booklit&#34;}
+
+jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: true
+  - task: test
+    file: booklit/ci/test.yml</code></pre>
+  </div>
+
+  <div class="segment">
+    <h2>Visual verification</h2><svg class="pipeline-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 161 20">
+  <defs>
+    <filter id="embiggen">
+      <feMorphology operator="dilate" radius="4"></feMorphology>
+    </filter>
+  </defs>
+  <g class="test">
+    <g class="node job-animation-node succeeded" transform="translate(124.0625, 0)">
+      <foreignObject class="js-animation-wrapper" height="160" x="-70" y="-70" width="177.53125">
+        <div style="padding: 70px; height: 20px; width: 37.5312px;">
+          <div class="animation animation-small" style="height: 20px; width: 37.5312px;"></div>
+        </div>
+      </foreignObject>
+    </g>
+    <g class="edge ">
+      <path d="M74.0625,10 C99.0625,10 99.0625,10 124.0625,10"></path>
+    </g>
+    <g class="node job succeeded" transform="translate(124.0625, 0)">
+    <rect height="20" width="37.53125"></rect><text dominant-baseline="middle" text-anchor="middle" x="18.765625"
+    y="10">unit</text>
+    </g>
+    <g class="node input" transform="translate(0, 0)">
+    <rect height="20" width="74.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="74.0625">
+    <div style="padding: 0px; height: 20px; width: 74.0625px;">
+      <div class="animation animation-small" style="height: 20px; width: 74.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-unit-input-booklit-unconstrained-svg-icon" width="12" height="12" fill="white" y="4"
+                                                                                                         x="5"></use><text dominant-baseline="middle" text-anchor="end" x="69.0625" y="10">booklit</text>
+    </g>
+  </g>
+</svg>
+
+<div style="display: none;">
+  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="job-unit-input-booklit-unconstrained-svg-icon" width="24" height="24" viewBox="0 0 24 24"><path d="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z"></path></svg>
+</div>
+  </div>
+
+</div><div class="side-by-side">
+
+  <div class="segment">
+    <p>A Concourse <a href="pipelines.html">pipeline</a> functions like a distributed, continuous <code>Makefile</code>.</p><p>Each <a href="jobs.html">job</a> contains a <a href="jobs.html#schema.job.plan">build plan</a> defining the job&#39;s input <a href="resources.html">resources</a> and what actions to perform with them when changes occur.</p>
+  </div>
+
+  <div class="segment">
+    <p>Your pipeline appears visualized in the web UI, requiring just one click to move from a failed job to understanding the cause of failure.</p><p>The visualization provides immediate feedback: if it <em>looks</em> wrong, it probably <em>is</em> wrong.</p>
+  </div>
+
+</div><h2>A more complex example...</h2><p>Jobs can depend on other jobs through <a href="get-step.html#schema.get.passed"><code>passed</code></a> constraints. The resulting network of jobs and resources creates a dependency graph that continuously advances your project forward, from source code to production.</p><div class="pipeline-image">
+  <svg class="pipeline-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 732 110">
+  <style></style>
+  <defs>
+    <filter id="embiggen">
+      <feMorphology operator="dilate" radius="4"></feMorphology>
+    </filter>
+  </defs>
+  <g class="test">
+    <g class="node job-animation-node succeeded" transform="translate(124.0625, 0)">
+      <foreignObject class="js-animation-wrapper" height="160" x="-70" y="-70" width="177.53125">
+        <div style="padding: 70px; height: 20px; width: 37.5312px;">
+          <div class="animation animation-medium" style="height: 20px; width: 37.5312px;"></div>
+        </div>
+      </foreignObject>
+    </g>
+    <g class="node job-animation-node succeeded" transform="translate(335.65625, 0)">
+      <foreignObject class="js-animation-wrapper" height="190" x="-70" y="-70" width="163.53125">
+        <div style="padding: 70px; height: 50px; width: 23.5312px;">
+          <div class="animation animation-medium" style="height: 50px; width: 23.5312px;"></div>
+        </div>
+      </foreignObject>
+    </g>
+    <g class="node job-animation-node no-builds" transform="translate(571.3125, 0)">
+      <foreignObject class="js-animation-wrapper" height="250" x="-70" y="-70" width="177.53125">
+        <div style="padding: 70px; height: 110px; width: 37.5312px;">
+          <div class="animation animation-medium" style="height: 110px; width: 37.5312px;"></div>
+        </div>
+      </foreignObject>
+    </g>
+    <g class="edge succeeded">
+      <path d="M359.1875,40 C393.703125,40 393.703125,40 428.21875,40"></path>
+    </g>
+    <g class="edge no-builds">
+      <path d="M608.84375,100 C634.09375,100 634.09375,100 659.34375,100"></path>
+    </g>
+    <g class="edge no-builds">
+      <path d="M608.84375,40 C633.84375,40 633.84375,40 658.84375,40"></path>
+    </g>
+    <g class="edge succeeded">
+      <path d="M161.59375,10 C186.59375,10 186.59375,10 211.59375,10"></path>
+    </g>
+    <g class="edge undefined">
+      <path d="M285.65625,10 C310.65625,10 310.65625,10 335.65625,10"></path>
+    </g>
+    <g class="edge succeeded">
+      <path d="M359.1875,10 C393.703125,10 393.703125,10 428.21875,10"></path>
+    </g>
+    <g class="edge undefined trigger-false">
+      <path d="M502.28125,10 C536.796875,10 536.796875,10 571.3125,10"></path>
+    </g>
+    <g class="edge undefined trigger-false">
+      <path d="M502.28125,40 C536.796875,40 536.796875,40 571.3125,40"></path>
+    </g>
+    <g class="edge">
+      <path d="M74.0625,10 C99.0625,10 99.0625,10 124.0625,10"></path>
+    </g>
+    <g class="edge trigger-false">
+      <path d="M285.65625,40 C310.65625,40 310.65625,40 335.65625,40"></path>
+    </g>
+    <g class="edge trigger-false">
+      <path d="M521.3125,70 C546.3125,70 546.3125,70 571.3125,70"></path>
+    </g>
+    <g class="node job succeeded" transform="translate(124.0625, 0)">
+    <rect height="20" width="37.53125"></rect><text dominant-baseline="middle" text-anchor="middle" x="18.765625"
+    y="10">unit</text>
+    </g>
+    <g class="node job succeeded" transform="translate(335.65625, 0)">
+    <rect height="50" width="23.53125"></rect><text dominant-baseline="middle" text-anchor="middle" x="11.765625"
+    y="25">rc</text>
+    </g>
+    <g class="node job no-builds" transform="translate(571.3125, 0)">
+    <rect height="110" width="37.53125"></rect><text dominant-baseline="middle" text-anchor="middle" x="18.765625"
+    y="55">ship</text>
+    </g>
+    <g class="node output" transform="translate(428.21875, 30)">
+    <rect height="20" width="74.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="74.0625">
+    <div style="padding: 0px; height: 20px; width: 74.0625px;">
+      <div class="animation animation-medium" style="height: 20px; width: 74.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-rc-output-version-svg-icon" width="12" height="12" fill="white" y="4" x="5"></use><text
+                                                                                                dominant-baseline="middle" text-anchor="end" x="69.0625" y="10">version</text>
+    </g>
+    <g class="node output" transform="translate(659.34375, 90)">
+    <rect height="20" width="73.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="73.0625">
+    <div style="padding: 0px; height: 20px; width: 73.0625px;">
+      <div class="animation animation-medium" style="height: 20px; width: 73.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-ship-output-release-svg-icon" width="12" height="12" fill="white" y="4" x="5"></use><text
+                                                                                                  dominant-baseline="middle" text-anchor="end" x="68.0625" y="10">release</text>
+    </g>
+    <g class="node output" transform="translate(658.84375, 30)">
+    <rect height="20" width="74.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="74.0625">
+    <div style="padding: 0px; height: 20px; width: 74.0625px;">
+      <div class="animation animation-medium" style="height: 20px; width: 74.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-ship-output-version-svg-icon" width="12" height="12" fill="white" y="4" x="5"></use><text
+                                                                                                  dominant-baseline="middle" text-anchor="end" x="69.0625" y="10">version</text>
+    </g>
+    <g class="node constrained-input" transform="translate(211.59375, 0)">
+    <rect height="20" width="74.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="74.0625">
+    <div style="padding: 0px; height: 20px; width: 74.0625px;">
+      <div class="animation animation-medium" style="height: 20px; width: 74.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-unit-input-booklit-svg-icon" width="12" height="12" fill="white" y="4" x="5"></use><text
+                                                                                                 dominant-baseline="middle" text-anchor="end" x="69.0625" y="10">booklit</text>
+    </g>
+    <g class="node constrained-input" transform="translate(428.21875, 0)">
+    <rect height="20" width="74.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="74.0625">
+    <div style="padding: 0px; height: 20px; width: 74.0625px;">
+      <div class="animation animation-medium" style="height: 20px; width: 74.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-rc-input-booklit-svg-icon" width="12" height="12" fill="white" y="4" x="5"></use><text
+                                                                                               dominant-baseline="middle" text-anchor="end" x="69.0625" y="10">booklit</text>
+    </g>
+    <g class="node input" transform="translate(0, 0)">
+    <rect height="20" width="74.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="74.0625">
+    <div style="padding: 0px; height: 20px; width: 74.0625px;">
+      <div class="animation animation-medium" style="height: 20px; width: 74.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-unit-input-booklit-unconstrained-svg-icon" width="12" height="12" fill="white" y="4"
+                                                                                                         x="5"></use><text dominant-baseline="middle" text-anchor="end" x="69.0625" y="10">booklit</text>
+    </g>
+    <g class="node input" transform="translate(211.59375, 30)">
+    <rect height="20" width="74.0625"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="74.0625">
+    <div style="padding: 0px; height: 20px; width: 74.0625px;">
+      <div class="animation animation-medium" style="height: 20px; width: 74.0625px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-rc-input-version-unconstrained-svg-icon" width="12" height="12" fill="white" y="4" x="5">
+    </use><text dominant-baseline="middle" text-anchor="end" x="69.0625" y="10">version</text>
+    </g>
+    <g class="node input" transform="translate(409.1875, 60)">
+    <rect height="20" width="112.125"></rect>
+    <foreignObject class="js-animation-wrapper" height="20" x="0" y="0" width="112.125">
+    <div style="padding: 0px; height: 20px; width: 112.125px;">
+      <div class="animation animation-medium" style="height: 20px; width: 112.125px;"></div>
+    </div>
+    </foreignObject>
+    <use xlink:href="#job-ship-input-release-notes-unconstrained-svg-icon" width="12" height="12" fill="white" y="4"
+    x="5"></use><text dominant-baseline="middle" text-anchor="end" x="107.125" y="10">release-notes</text>
+    </g>
+  </g>
+</svg>
+
+<div style="display: none;">
+  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-rc-output-version-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M5.5,7A1.5,1.5 0 0,1 4,5.5A1.5,1.5 0 0,1 5.5,4A1.5,1.5 0 0,1 7,5.5A1.5,1.5 0 0,1 5.5,7M21.41,11.58L12.41,2.58C12.05,2.22 11.55,2 11,2H4C2.89,2 2,2.89 2,4V11C2,11.55 2.22,12.05 2.59,12.41L11.58,21.41C11.95,21.77 12.45,22 13,22C13.55,22 14.05,21.77 14.41,21.41L21.41,14.41C21.78,14.05 22,13.55 22,13C22,12.44 21.77,11.94 21.41,11.58Z">
+    </path>
+  </svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-ship-output-release-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M18,18.5A1.5,1.5 0 0,1 16.5,17A1.5,1.5 0 0,1 18,15.5A1.5,1.5 0 0,1 19.5,17A1.5,1.5 0 0,1 18,18.5M19.5,9.5L21.46,12H17V9.5M6,18.5A1.5,1.5 0 0,1 4.5,17A1.5,1.5 0 0,1 6,15.5A1.5,1.5 0 0,1 7.5,17A1.5,1.5 0 0,1 6,18.5M20,8H17V4H3C1.89,4 1,4.89 1,6V17H3A3,3 0 0,0 6,20A3,3 0 0,0 9,17H15A3,3 0 0,0 18,20A3,3 0 0,0 21,17H23V12L20,8Z">
+    </path>
+  </svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-ship-output-version-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M5.5,7A1.5,1.5 0 0,1 4,5.5A1.5,1.5 0 0,1 5.5,4A1.5,1.5 0 0,1 7,5.5A1.5,1.5 0 0,1 5.5,7M21.41,11.58L12.41,2.58C12.05,2.22 11.55,2 11,2H4C2.89,2 2,2.89 2,4V11C2,11.55 2.22,12.05 2.59,12.41L11.58,21.41C11.95,21.77 12.45,22 13,22C13.55,22 14.05,21.77 14.41,21.41L21.41,14.41C21.78,14.05 22,13.55 22,13C22,12.44 21.77,11.94 21.41,11.58Z">
+    </path>
+  </svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-unit-input-booklit-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z">
+    </path>
+  </svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-rc-input-booklit-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z">
+    </path>
+  </svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-unit-input-booklit-unconstrained-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z">
+    </path>
+  </svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-rc-input-version-unconstrained-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M5.5,7A1.5,1.5 0 0,1 4,5.5A1.5,1.5 0 0,1 5.5,4A1.5,1.5 0 0,1 7,5.5A1.5,1.5 0 0,1 5.5,7M21.41,11.58L12.41,2.58C12.05,2.22 11.55,2 11,2H4C2.89,2 2,2.89 2,4V11C2,11.55 2.22,12.05 2.59,12.41L11.58,21.41C11.95,21.77 12.45,22 13,22C13.55,22 14.05,21.77 14.41,21.41L21.41,14.41C21.78,14.05 22,13.55 22,13C22,12.44 21.77,11.94 21.41,11.58Z">
+    </path>
+  </svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    id="job-ship-input-release-notes-unconstrained-svg-icon" width="24" height="24" viewBox="0 0 24 24">
+    <path
+      d="M3,7V5H5V4C5,2.89 5.9,2 7,2H13V9L15.5,7.5L18,9V2H19C20.05,2 21,2.95 21,4V20C21,21.05 20.05,22 19,22H7C5.95,22 5,21.05 5,20V19H3V17H5V13H3V11H5V7H3M7,11H5V13H7V11M7,7V5H5V7H7M7,19V17H5V19H7Z">
+    </path>
+  </svg>
+</div>
+</div><p><em>This pipeline example can be found in the <a href="https://github.com/concourse/booklit/blob/8741a4ca3116dcf24c30fedfa78e4aadcaff178a/ci/pipeline.yml">Booklit repository</a>.</em></p><h2 class="splash-title">
+  Source-controlled CI
+</h2>
+
+<div class="side-by-side">
+  <div class="segment example">
+    <pre><code class="language-sh">$ fly -t ci set-pipeline -p booklit -c pipeline.yml
+$ vim pipeline.yml
+$ fly -t ci set-pipeline -p booklit -c pipeline.yml
+$ git add pipeline.yml
+$ git commit -m &#34;initial pipeline&#34;█</code></pre>
+  </div>
+
+  <div class="segment">
+    <p>All configuration and management happens through <a href="fly.html">the <code>fly</code> CLI</a>.</p><p>The <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a> command uploads your configuration to Concourse. Once finalized, you can commit the file to source control, making it easy to recover your project if you migrate to a new Concourse server.</p>
+  </div>
+</div><h2 class="splash-title">
+  Reproducible, debuggable builds
+</h2>
+
+<div class="side-by-side">
+  <div class="segment example">
+    <pre><code class="language-sh">$ fly -t ci intercept -j booklit/unit -s unit
+root@2c15ff11:/tmp/build/0df9eea0# ps
+    PID TTY          TIME CMD
+    171 pts/1    00:00:00 bash
+   1876 pts/1    00:00:00 ps
+root@2c15ff11:/tmp/build/0df9eea0# ls
+depspath  gopath
+root@2c15ff11:/tmp/build/0df9eea0# █</code></pre>
+  </div>
+
+  <div class="segment">
+    <p>Everything executes in containers, ensuring a clean environment for each run.</p><p>Every <a href="tasks.html">task</a> specifies its own image, providing complete control over its dependencies, instead of managing packages on your workers.</p><p>The <a href="builds.html#fly-intercept"><code>fly intercept</code></a> command lets you access a build&#39;s containers directly, simplifying troubleshooting of problematic builds.</p>
+  </div>
+</div><h2 class="splash-title">
+  Efficient local testing
+</h2>
+
+<div class="side-by-side">
+  <div class="segment example">
+    <pre><code class="language-sh">~/booklit $ fly -t ci execute -c ci/test.yml
+executing build 1 at http://localhost:8080/builds/1
+initializing
+booklit: 4.74 MiB/s 0s
+running gopath/src/github.com/concourse/booklit/ci/test
+fetching dependencies...
+installing ginkgo...
+running tests...
+█</code></pre>
+  </div>
+
+  <div class="segment">
+    <p>The <a href="tasks.html#running-tasks"><code>fly execute</code></a> command enables you to run builds with local modifications.</p><p>These builds execute exactly as they would in your pipeline, eliminating the need to push incomplete commits while debugging.</p><p>When a pipeline build fails, you can use <a href="tasks.html#running-tasks"><code>fly execute</code></a> with the <code>-j</code> flag to run a one-off build with the same inputs as the failed build. You can then replace an input with your local changes using <code>-i</code> to test your fix.</p>
+  </div>
+</div><h2>Custom integrations</h2><div class="side-by-side">
+
+  <div class="segment">
+    <pre><code class="language-yaml">resource_types:
+- name: rubygem
+  type: registry-image
+  source:
+    repository: troykinsella/concourse-rubygems-resource
+
+resources:
+- name: rspec-gem
+  type: rubygem
+  source: {gem: rspec}
+
+jobs:
+- name: bundle
+  plan:
+  - get: rspec-gem
+    trigger: true
+  - # ...</code></pre>
+  </div>
+
+  <div class="segment">
+    <p>Concourse doesn&#39;t rely on a complex plugin system. Instead, it focuses on a single powerful abstraction: <a href="resources.html">resource</a>, which are implemented by <a href="resource-types.html">resource types</a>.</p><p>The <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a> field configures external artifacts that your pipeline will monitor for changes, retrieve, and update.</p><p>For instance, a resource with type <code>git</code> refers to a git repository, which will be <code>clone</code>d in a <a href="get-step.html"><code>get</code> step</a> and <code>push</code>ed to using a <a href="put-step.html"><code>put</code> step</a>. Behind the scenes, Concourse continuously runs <code>git fetch</code> to check for new commits that jobs might want to trigger on.</p><p>At its foundation, Concourse has no built-in knowledge of <code>git</code>. It includes a <a href="https://github.com/concourse/git-resource"><code>git</code> resource type</a> by default, but you can easily integrate your own into your pipeline through the <a href="pipelines.html#schema.pipeline.resource_types"><code class="schema-attribute-name"><bold>pipeline<wbr />.resource_types</bold></code></a> field.</p><p>To discover available resource types, check out the <a href="https://resource-types.concourse-ci.org">Resource Types catalog</a>!</p>
+  </div>
+
+</div>
+  </div>
+</div>
+
+  
+</div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/install.html b/install.html
new file mode 100644
index 00000000..272a2671
--- /dev/null
+++ b/install.html
@@ -0,0 +1,902 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Install - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html"  class="self">Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2</span><a href="install.html"  class="self">Install</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1</td>
+            <td class="title-cell"><a href="postgresql-node.html" >Running a PostgreSQL node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.2</td>
+            <td class="title-cell"><a href="concourse-cli.html" >The <code>concourse</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3</td>
+            <td class="title-cell"><a href="concourse-generate-key.html" >Generating Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4</td>
+            <td class="title-cell"><a href="concourse-web.html" >Running a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5</td>
+            <td class="title-cell"><a href="concourse-worker.html" >Running a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6</td>
+            <td class="title-cell"><a href="upgrading-concourse.html" >Upgrading Concourse</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_install">
+  
+  <h1 class="section-header"><a class="anchor-target" name="install" href="#install"></a><span class="section-number">1.2 </span>Install</h1>
+  
+
+  <p>A Concourse installation is composed of a <a href="concourse-web.html"><code>web</code> node</a>, a <a href="concourse-worker.html"><code>worker</code> node</a>, and a <a href="postgresql-node.html">PostgreSQL node</a>.</p><p>There are many ways to deploy Concourse, depending on your personal preference. The <a href="quick-start.html">Quick Start</a> guide shows how to get Concourse up and running quickly via Docker Compose, and there is also an official <a href="https://github.com/concourse/concourse-chart">Concourse Helm chart</a>.</p><p>The documentation found here will primarily focus on the <code>concourse</code> CLI, which is the lowest common denominator, and can also be directly used if you want to just run Concourse yourself on real hardware or your own managed VMs.</p><p>The high-level steps to follow for installing Concourse are:</p><ol>
+
+  <li><p>Setup a Postgres database</p></li>
+
+  <li><p>Generate Secrets for the web and worker nodes</p></li>
+
+  <li><p>Install the web node</p></li>
+
+  <li><p>Install the worker node</p></li>
+
+</ol><blockquote class="aside"><p>We don&#39;t document every configuration option for the <code>web</code> and <code>worker</code> commands. To view all flags you can run the following <code>docker</code> commands.</p><pre><code class="language-bash">docker run -t concourse/concourse web --help
+docker run -t concourse/concourse worker --help</code></pre></blockquote><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.1</span>
+      <a href="postgresql-node.html">Running a PostgreSQL node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.1.1</span>
+      <a href="postgresql-node.html#db-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.1.2</span>
+      <a href="postgresql-node.html#db-running">Running PostgreSQL</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.1.3</span>
+      <a href="postgresql-node.html#db-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.2</span>
+      <a href="concourse-cli.html">The <code>concourse</code> CLI</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.3</span>
+      <a href="concourse-generate-key.html">Generating Keys</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.3.1</span>
+      <a href="concourse-generate-key.html#generating-the-keys">Generating the Keys</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.3.2</span>
+      <a href="concourse-generate-key.html#multiple-worker-keys">Multiple Worker Keys</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4</span>
+      <a href="concourse-web.html">Running a <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.1</span>
+      <a href="concourse-web.html#web-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.2</span>
+      <a href="concourse-web.html#web-running">Running <code>concourse web</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.2.1</span>
+      <a href="concourse-web.html#web-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3</span>
+      <a href="concourse-web.html#web-operation">Operating a <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.3.1</span>
+      <a href="concourse-web.html#scaling">Scaling</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.3.1.1</span>
+      <a href="concourse-web.html#web-connection-pooling">Database connection pooling</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.2</span>
+      <a href="concourse-web.html#reloading-worker-authorized-key">Reloading worker authorized key</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.3</span>
+      <a href="concourse-web.html#restarting-and-upgrading">Restarting &amp; Upgrading</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.3.4</span>
+      <a href="concourse-web.html#downgrading">Downgrading</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4</span>
+      <a href="concourse-web.html#web-configuration">Configuring the <code>web</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.4.4.1</span>
+      <a href="concourse-web.html#giving-your-cluster-a-name">Giving your cluster a name</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.2</span>
+      <a href="concourse-web.html#web-ingress">Configuring ingress traffic</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.3</span>
+      <a href="concourse-web.html#lets-encrypt">TLS via Let&#39;s Encrypt</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.4</span>
+      <a href="concourse-web.html#build-log-retention">Build log retention</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.5</span>
+      <a href="concourse-web.html#audit-logs">Enabling audit logs</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.4.4.6</span>
+      <a href="concourse-web.html#resource-defaults">Configuring defaults for resource types</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5</span>
+      <a href="concourse-worker.html">Running a <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.1</span>
+      <a href="concourse-worker.html#worker-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.2</span>
+      <a href="concourse-worker.html#worker-running">Running <code>concourse worker</code></a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.2.1</span>
+      <a href="concourse-worker.html#worker-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3</span>
+      <a href="concourse-worker.html#worker-operation">Operating a <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.3.1</span>
+      <a href="concourse-worker.html#scaling-workers">Scaling Workers</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.3.1.1</span>
+      <a href="concourse-worker.html#horizontal-vs-vertical-scaling">Horizontal vs Vertical Scaling</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.2</span>
+      <a href="concourse-worker.html#worker-heartbeating-and-stalling">Worker Heartbeating &amp; Stalling</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.3</span>
+      <a href="concourse-worker.html#restarting-a-worker">Restarting a Worker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.3.4</span>
+      <a href="concourse-worker.html#gracefully-removing-a-worker">Gracefully Removing a Worker</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4</span>
+      <a href="concourse-worker.html#worker-configuration">Configuring the <code>worker</code> node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.1</span>
+      <a href="concourse-worker.html#tagging-workers">Tagging Workers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.2</span>
+      <a href="concourse-worker.html#team-workers">Team Workers</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.2.1</span>
+      <a href="concourse-worker.html#tags-and-team-workers">Tags and Team Workers</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.3</span>
+      <a href="concourse-worker.html#worker-healthcheck-endpoint">Healthcheck Endpoint</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.4</span>
+      <a href="concourse-worker.html#worker-resource-types">Resource Types</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.4.1</span>
+      <a href="concourse-worker.html#bundled-resource-types">Bundled Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.4.2</span>
+      <a href="concourse-worker.html#installing-or-upgrading-bundled-resource-types">Installing or Upgrading Bundled Resource Types</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5</span>
+      <a href="concourse-worker.html#configuring-runtimes">Configuring Runtimes</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.1</span>
+      <a href="concourse-worker.html#containerd-runtime"><code>containerd</code> runtime</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.2</span>
+      <a href="concourse-worker.html#transitioning-from-guardian-to-containerd">Transitioning from Guardian to containerd</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.3</span>
+      <a href="concourse-worker.html#guardian-runtime"><code>Guardian</code> runtime</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4</span>
+      <a href="concourse-worker.html#troubleshooting-and-fixing-dns-resolution">Troubleshooting and fixing DNS resolution</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.1</span>
+      <a href="concourse-worker.html#pointing-to-external-dns-servers">Pointing to external DNS servers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.2</span>
+      <a href="concourse-worker.html#using-a-local-dns-server">Using a local DNS server</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.5.4.3</span>
+      <a href="concourse-worker.html#note-on-allow-host-access">A note on allowing host access and DNS proxy</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.6</span>
+      <a href="concourse-worker.html#configuring-peer-to-peer-volume-streaming">Configuring Peer-to-Peer Volume Streaming</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.5.4.6.1</span>
+      <a href="concourse-worker.html#p2p-worker-configuration">P2P Worker Configuration</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.5.4.6.2</span>
+      <a href="concourse-worker.html#p2p-web-configuration">P2P Web Configuration</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.6</span>
+      <a href="upgrading-concourse.html">Upgrading Concourse</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.6.1</span>
+      <a href="upgrading-concourse.html#upgrading-the-web-node">Upgrading the Web Node</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.6.2</span>
+      <a href="upgrading-concourse.html#upgrading-the-worker-node">Upgrading the Worker Node</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.6.2.1</span>
+      <a href="upgrading-concourse.html#linux-workers">Linux Workers</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.6.2.2</span>
+      <a href="upgrading-concourse.html#darwin-and-windows-workers">Darwin and Windows Workers</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.1</span>
+              
+
+              <a href="getting-started.html">Getting Started</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.2.1</span>
+              
+
+              <a href="postgresql-node.html">Running a PostgreSQL node</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/instanced-pipelines.html b/instanced-pipelines.html
new file mode 100644
index 00000000..a90d6763
--- /dev/null
+++ b/instanced-pipelines.html
@@ -0,0 +1,387 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Grouping Pipelines - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html"  class="active">Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.6</span><a href="pipelines.html"  class="active">Pipelines</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.6.1</td>
+            <td class="title-cell"><a href="setting-pipelines.html" >Setting Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2</td>
+            <td class="title-cell"><a href="managing-pipelines.html" >Managing Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.3</td>
+            <td class="title-cell"><a href="instanced-pipelines.html"  class="self">Grouping Pipelines</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.6.3</span><a href="instanced-pipelines.html"  class="self">Grouping Pipelines</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.6.3.1</td>
+            <td class="title-cell"><a href="instanced-pipelines.html#managing-instanced-pipelines" >Managing Instanced Pipelines</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_instanced-pipelines">
+  
+  <h1 class="section-header"><a class="anchor-target" name="instanced-pipelines" href="#instanced-pipelines"></a><span class="section-number">1.6.3 </span>Grouping Pipelines</h1>
+  
+
+  <div class="warning">
+  <p>Instanced Pipelines/Instance Groups are currently experimental, and are subject to change.</p><p>To experiment with Instanced Pipelines on your deployment, you need to set the feature flag <code>--enable-pipeline-instances</code> (<code>CONCOURSE_ENABLE_PIPELINE_INSTANCES=true</code>)</p>
+</div><p>Although pipelines operate independently of one another, it&#39;s not uncommon to have several pipelines that are highly related, and possibly derived from the same pipeline template. It&#39;s useful to be able to group these pipelines to reduce clutter and improve navigation. For this, Concourse has the concept of Instanced Pipelines and Instance Groups, where an Instance Group composes several related Instanced Pipelines.</p><p>For instance, suppose you support multiple version lines of your software (v1.0.x and v2.0.x, say), and want a pipeline for each version line in order to facilitate delivering patch releases. You create a common pipeline template that uses <a href="vars.html">Vars</a> to specialize each pipeline:</p><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    uri: git@...
+    # The only difference between the pipelines is the git branch to use
+    branch: release/v((version))
+
+jobs:
+- name: test
+  plan: [...]
+
+- name: deploy-to-staging
+  plan: [...]
+
+- name: release
+  plan: [...]</code></pre><p>Before Concourse v7.0.0, you might set multiple pipelines with the version information encoded in the pipeline name, e.g.:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline release-1.0.x \
+    --config template.yml \
+    --var version=1.0.x
+$ fly -t example set-pipeline \
+    --pipeline release-2.0.x \
+    --config template.yml \
+    --var version=2.0.x</code></pre><p>The downside to this approach is that things can get disorganized quickly as the number of pipelines increases, which can make the UI cluttered and hard to navigate. Additionally, not everything can easily be encoded into the pipeline name, especially with the restrictions on <a href="config-basics.html#schema.identifier">identifiers</a> - while it&#39;s readable in this case, it can get unwieldy as the number of variables in the template grows.</p><p>The recommended approach is to construct an Instance Group where each version has its own Instanced Pipeline:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline release \
+    --config template.yml \
+    --instance-var version=1.0.x
+$ fly -t example set-pipeline \
+    --pipeline release \
+    --config template.yml \
+    --instance-var version=2.0.x</code></pre><p>There are only a few differences from the previous approach in terms of creating the pipelines:</p><ol>
+
+  <li><p>We give each Instanced Pipeline the same name (in this case, <code>release</code>), and</p></li>
+
+  <li><p>We use the <code>--instance-var</code> flag instead of <code>--var</code>. Doing so makes the variable name and value a part of the pipeline&#39;s identifier (<a href="instanced-pipelines.html#managing-instanced-pipelines">Managing Instanced Pipelines</a> describes how to work with Instanced Pipelines in <a href="fly.html">fly</a>)</p></li>
+
+</ol><p><div class="warning">
+  The <code>-i</code> or <code>--instance-var</code> flag behaves like the <code>-y</code> or <code>--yaml-var</code>, meaning instance vars can hold arbitrary YAML/JSON data. The <code>v</code> or <code>--var</code> flag, on the other hand, only defines strings. See <a href="vars.html#static-vars">Static vars</a> to learn the difference between the flags
+</div></p><p>Note that there are no <a href="fly.html">fly</a> commands for constructing an Instance Group - Concourse logically groups all Instanced Pipelines with the same name into a single Instance Group. Instanced Pipelines have the same pipeline semantics as other pipelines - they are just organized and identified in a different way.</p>
+
+  
+    
+      <div class="section" id="section_managing-instanced-pipelines">
+  
+  <h2 class="section-header"><a class="anchor-target" name="managing-instanced-pipelines" href="#managing-instanced-pipelines"></a>Managing Instanced Pipelines</h2>
+  
+
+  <p>Instanced Pipelines can be managed via <a href="fly.html">fly</a> as described in <a href="managing-pipelines.html">Managing Pipelines</a>, with one important distinction - since instance vars are a part of the pipeline&#39;s identifier, the <code>--pipeline</code> flag must include both the name of the Instance Group as well as the instance vars. The <code>--pipeline</code> flag takes the form:</p><pre>--pipeline group/var1:value1,var2:value2</pre><p>As a concrete example, to pause the <code>release</code> Instanced Pipeline with <code>version:1.0.x</code>, you would issue the following command:</p><pre><code class="language-bash">$ fly -t example pause-pipeline --pipeline release/version:1.0.x</code></pre><p>Let&#39;s look at a more complicated example - suppose you have an Instanced Pipeline that was set using one of the following commands:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline upgrade \
+    --config template.yml \
+    --instance-var version.from=1.0.0 \
+    --instance-var version.to=2.0.0 \
+    --instance-var branch=feature/foo
+# ...or equivalently
+$ fly -t example set-pipeline \
+    --pipeline upgrade \
+    --config template.yml \
+    --instance-var &#39;version={from: 1.0.0, to: 2.0.0}&#39; \
+    --instance-var branch=feature/foo</code></pre><div class="warning">
+  <p>Using dot-notation here (as in the first command) is recommended since YAML is finicky about spaces.</p><p>For instance, had we used <code>--instance-var &#39;version={from:1.0.0, to:2.0.0}&#39;</code> (no spaces between keys and values), we would end up with the following object (represented as JSON):</p><p><pre><code class="language-json">{&#34;from:1.0.0&#34;: null, &#34;to:2.0.0&#34;: null}</code></pre></p><p>Specifying each field individually using dot-notation is harder to mess up.</p>
+</div><p>Here, there are two instance vars: <code>version</code>, that contains the object <code>{&#34;from&#34;: &#34;1.0.0&#34;, &#34;to&#34;: &#34;2.0.0&#34;}</code>, and <code>branch</code>, that contains the string <code>&#34;feature/foo&#34;</code>. In order to pause this pipeline, you could issue one of the following commands:</p><p><pre><code class="language-bash">$ fly -t example pause-pipeline \
+    --pipeline &#39;upgrade/version.from:1.0.0,version.to:2.0.0,branch:&#34;feature/foo&#34;&#39;
+# ... or equivalently
+$ fly -t example pause-pipeline \
+    --pipeline &#39;upgrade/version:{from: 1.0.0, to: 2.0.0},branch:&#34;feature/foo&#34;&#39;</code></pre> For accessing sub-fields of an object, we can either use dot-notation as described in <a href="setting-pipelines.html#pipeline-static-vars">Providing static values for vars</a>, or we can define the object in full as valid YAML.</p><div class="warning">
+  <p>If the instance var name or value contains a &#34;special character&#34; (<code>.</code>, <code>,</code>, <code>/</code>, <code>{</code>, <code>}</code>, or whitespace), it must be surrounded by double quotes <code>&#34;</code>.  Depending on your shell, this usually means the entire flag must be quoted, since otherwise your shell will try to expand the quotes.</p>
+</div>
+
+  
+    
+      <div class="section" id="section_fly-order-instanced-pipelines">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fly-order-instanced-pipelines" href="#fly-order-instanced-pipelines"></a><code>fly order-instanced-pipelines</code></h3>
+  
+
+  <p>To configure the ordering of instanced pipelines within an individual instance group, run:</p><pre><code class="language-bash">$ fly -t example order-instanced-pipelines \
+    --group group \
+    --pipeline key1:value1 \
+    --pipeline key2:value2 \
+    --pipeline key3:value3</code></pre><p>Note that this command only ensures that the given pipelines are in the given order. If there are other pipelines that you haven&#39;t included in the command, they may appear in-between, before, or after the given set.</p><div class="warning">
+  <p>If you want to reorder pipelines outside of an individual instance group, you should use the <a href="managing-pipelines.html#fly-order-pipelines"><code>fly order-pipelines</code></a> command.</p>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_jobs-and-resources-instanced-pipelines">
+  
+  <h3 class="section-header"><a class="anchor-target" name="jobs-and-resources-instanced-pipelines" href="#jobs-and-resources-instanced-pipelines"></a>Managing Jobs and Resources</h3>
+  
+
+  <p><a href="jobs.html#managing-jobs">Managing Jobs</a> and <a href="managing-resources.html">Managing Resources</a> walk you through some of the commands you can use to manage jobs and resources within pipelines. For Instanced Pipelines, we need to encode the instance vars in the <code>--job</code> and <code>--resource</code> flags. These flags now take the form:</p><pre>--job group/var1:value1,var2:value2/job</pre><p>and:</p><pre>--resource group/var1:value1,var2:value2/resource</pre><p>For instance, to trigger the <code>test</code> job of <code>release/version:1.0.x</code>, we issue the following command:</p><pre><code class="language-bash">$ fly -t example trigger-job --job release/version:1.0.x/test</code></pre><p>To check the <code>repo</code> resource of <code>release/version:1.0.x</code>, we issue the following command:</p><pre><code class="language-bash">$ fly -t example check-resource --resource release/version:1.0.x/repo</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.6.2</span>
+              
+
+              <a href="managing-pipelines.html">Managing Pipelines</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.7</span>
+              
+
+              <a href="vars.html">Vars</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/internals.html b/internals.html
new file mode 100644
index 00000000..5ee836e3
--- /dev/null
+++ b/internals.html
@@ -0,0 +1,630 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Internals - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html"  class="self">Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.17</span><a href="internals.html"  class="self">Internals</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.1</td>
+            <td class="title-cell"><a href="internals.html#basic-architecture" >Basic architecture</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2</td>
+            <td class="title-cell"><a href="internals.html#component-atc" >ATC: web UI &amp; build scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.3</td>
+            <td class="title-cell"><a href="internals.html#component-tsa" >TSA: worker registration &amp; forwarding</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.4</td>
+            <td class="title-cell"><a href="internals.html#architecture-worker" >Workers Architecture</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.17.1</td>
+        <td class="title-cell"><a href="internals.html#basic-architecture" >Basic architecture</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.17.2</td>
+        <td class="title-cell"><a href="internals.html#component-atc" >ATC: web UI &amp; build scheduler</a></td>
+      </tr>
+      
+      
+  
+
+    
+      <tr>
+        <td class="number-cell">1.17.3</td>
+        <td class="title-cell"><a href="internals.html#component-tsa" >TSA: worker registration &amp; forwarding</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.17.4</td>
+        <td class="title-cell"><a href="internals.html#architecture-worker" >Workers Architecture</a></td>
+      </tr>
+      
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.17.4.1</td>
+        <td class="title-cell"><a href="internals.html#worker-lifecycle" >The worker lifecycle</a></td>
+      </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="internals.html#RUNNING-table"><code><strong>RUNNING</strong></code></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="internals.html#STALLED-table"><code><strong>STALLED</strong></code></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="internals.html#LANDING-table"><code><strong>LANDING</strong></code></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="internals.html#LANDED-table"><code><strong>LANDED</strong></code></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="internals.html#RETIRING-table"><code><strong>RETIRING</strong></code></a></td>
+        </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_internals">
+  
+  <h1 class="section-header"><a class="anchor-target" name="internals" href="#internals"></a><span class="section-number">1.17 </span>Internals</h1>
+  
+
+  <p>This section provides a deeper understanding of some of the concepts surrounding Concourse.</p><p>An understanding of the basics of Concourse concepts, such as pipelines, jobs, etc, is recommended as parts of this section might assume a level of knowledge from them. This section is not necessary for using Concourse but are more for experienced users that want to dig deeper into how Concourse works.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.17.1</span>
+      <a href="internals.html#basic-architecture">Basic architecture</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2</span>
+      <a href="internals.html#component-atc">ATC: web UI &amp; build scheduler</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.17.2.1</span>
+      <a href="checker.html">Resource Checker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.2</span>
+      <a href="scheduler.html">Build Scheduler</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.3</span>
+      <a href="build-tracker.html">Build Tracker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.4</span>
+      <a href="garbage-collector.html">Garbage Collector</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.3</span>
+      <a href="internals.html#component-tsa">TSA: worker registration &amp; forwarding</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.4</span>
+      <a href="internals.html#architecture-worker">Workers Architecture</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.17.4.1</span>
+      <a href="internals.html#worker-lifecycle">The worker lifecycle</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_basic-architecture">
+  
+  <h2 class="section-header"><a class="anchor-target" name="basic-architecture" href="#basic-architecture"></a>Basic architecture</h2>
+  
+
+  <p>Concourse is a fairly simple distributed system built up from the following components. You&#39;ll see them referenced here and there throughout the documentation, so you may want to skim this page just to get an idea of what they are.</p><div class="diagram">
+  <img src="images/concourse_architecture.png" alt="diagram" width="80%" />
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_component-atc">
+  
+  <h2 class="section-header"><a class="anchor-target" name="component-atc" href="#component-atc"></a>ATC: web UI &amp; build scheduler</h2>
+  
+
+  <p>The ATC is the heart of Concourse. It runs the web UI and API and is responsible for all pipeline scheduling. It connects to PostgreSQL, which it uses to store pipeline data (including build logs).</p><p>Multiple ATCs can be running as one cluster; as long as they&#39;re all pointing to the same database, they&#39;ll synchronize using basic locking mechanisms and roughly spread work across the cluster.</p><p>The ATC by default listens on port <code>8080</code>, and is usually colocated with the <a href="internals.html#component-tsa">TSA</a> and sitting behind a load balancer.</p><p><strong>Note:</strong> for <a href="builds.html#fly-intercept"><code>fly intercept</code></a> to function, make sure your load balancer is configured to do TCP or SSL forwarding, not HTTP or HTTPS.</p><p>There are multiple components within the ATC that each have their own set of responsibilities. The main components consist of the <a href="checker.html">checker</a>, <a href="scheduler.html">scheduler</a>, <a href="build-tracker.html">build tracker</a> and the <a href="garbage-collector.html">garbage collector</a>.</p><p>The <a href="checker.html">checker</a>&#39;s responsibility is to continously checks for new versions of resources. The <a href="scheduler.html">scheduler</a> is responsible for scheduling builds for a job and the <a href="build-tracker.html">build tracker</a> is responsible for running any scheduled builds. The <a href="garbage-collector.html">garbage collector</a> is the cleanup mechanism for removing any unused or outdated objects, such as containers and volumes.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.17.2.1</span>
+      <a href="checker.html">Resource Checker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.2</span>
+      <a href="scheduler.html">Build Scheduler</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.3</span>
+      <a href="build-tracker.html">Build Tracker</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.17.2.4</span>
+      <a href="garbage-collector.html">Garbage Collector</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div><p>All the components in a Concourse deployment can be viewed in the <em>components</em> table in the database as of v5.7.0. The intervals that the components run at can also be adjusted through editing that table, as well as pausing the component from running entirely.</p>
+
+  
+</div>
+    
+      <div class="section" id="section_component-tsa">
+  
+  <h2 class="section-header"><a class="anchor-target" name="component-tsa" href="#component-tsa"></a>TSA: worker registration &amp; forwarding</h2>
+  
+
+  <p>The TSA is a custom-built SSH server that is used solely for securely registering <a href="internals.html#architecture-worker">workers</a> with the <a href="internals.html#component-atc">ATC</a>.</p><p>The TSA by default listens on port <code>2222</code>, and is usually colocated with the <a href="internals.html#component-atc">ATC</a> and sitting behind a load balancer.</p><p>The TSA implements CLI over the SSH connection, supporting the following commands:</p><ul>
+
+  <li><p>The <code>forward-worker</code> command is used to reverse-tunnel a worker&#39;s addresses through the TSA and register the forwarded connections with the ATC. This allows workers running in arbitrary networks to register securely, so long as they can reach the TSA. This is much safer than opening the worker up to the outside world.</p></li>
+
+  <li><p>The <code>land-worker</code> command is sent from the worker when landing, and initiates the state change to <a href="internals.html#LANDING-table"><code><strong>LANDING</strong></code></a> through the ATC.</p></li>
+
+  <li><p>The <code>retire-worker</code> command is sent from the worker when retiring, and initiates the state change to <a href="internals.html#RETIRING-table"><code><strong>RETIRING</strong></code></a> through the ATC.</p></li>
+
+  <li><p>The <code>delete-worker</code> command is sent from the worker when draining is interrupted while a worker is retiring. It removes the worker from the ATC.</p></li>
+
+  <li><p>The <code>sweep-containers</code> command is sent periodically to facilitate garbage collection of containers which can be removed from the worker. It returns a list of handles for containers in the <code>DESTROYING</code> state, and it is the worker&#39;s job to subsequently destroy them.</p></li>
+
+  <li><p>The <code>report-containers</code> command is sent along with the list of all container handles on the worker. The ATC uses this to update the database, removing any <code>DESTROYING</code> containers which are no longer in the set of handles, and marking any <code>CREATED</code> containers that are not present as missing.</p></li>
+
+  <li><p>The <code>sweep-volumes</code> command is sent periodically to facilitate garbage collection of volumes which can be removed from the worker. It returns a list of handles for volumes in the <code>DESTROYING</code> state, and it is the worker&#39;s job to subsequently destroy them.</p></li>
+
+  <li><p>The <code>report-volumes</code> command is sent along with the list of all volume handles on the worker. The ATC uses this to update the database, removing any <code>DESTROYING</code> volumes which are no longer in the set of handles, and marking any <code>CREATED</code> volumes that are not present as missing.</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_architecture-worker">
+  
+  <h2 class="section-header"><a class="anchor-target" name="architecture-worker" href="#architecture-worker"></a>Workers Architecture</h2>
+  
+
+  <p>Workers are machines running <a href="https://github.com/cloudfoundry-incubator/garden">Garden</a> and <a href="https://github.com/concourse/concourse/tree/master/worker/baggageclaim">Baggageclaim</a> servers and registering themselves via the <a href="internals.html#component-tsa">TSA</a>.</p><blockquote class="aside"><p><strong>Note</strong>: Windows and Darwin workers also run Garden and Baggageclaim servers but do not run containers. They both use <a href="https://github.com/vito/houdini">houdini</a> to fake making containers. Windows containers are not supported and Darwin does not have native container technology.</p></blockquote><p>Workers have no important state configured on their machines, as everything runs in a container and thus shouldn&#39;t care about what packages are installed on the host (well, except for those that allow it to be a worker in the first place). This is very different from workers in other non-containerized CI solutions, where the state of packages on the worker is crucial to whether your pipeline works or not.</p><p>Each worker registers itself with the Concourse cluster via the <a href="internals.html#component-tsa">TSA</a>.</p><p>Workers by default listen on port <code>7777</code> for Garden and port <code>7788</code> for Baggageclaim. Connections to both servers are forwarded over the SSH connection made to the <a href="internals.html#component-tsa">TSA</a>.</p>
+
+  
+    
+      <div class="section" id="section_worker-lifecycle">
+  
+  <h3 class="section-header"><a class="anchor-target" name="worker-lifecycle" href="#worker-lifecycle"></a>The worker lifecycle</h3>
+  
+
+  <div class="definition">
+  <div class="definition-thumb">
+    <a id="RUNNING-table"></a>
+    <pre><a href="internals.html#RUNNING-table"><strong>RUNNING</strong></a></pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A worker in this state is registered with the cluster and ready to start running containers and storing volumes.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="STALLED-table"></a>
+    <pre><a href="internals.html#STALLED-table"><strong>STALLED</strong></a></pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A worker in this state was previously registered with the cluster, but stopped advertising itself for some reason. Ususally this is due to network connectivity issues, or the worker stopping unexpectedly.</p><p>If the worker remains in this state and cannot be recovered, it can be removed using the <a href="administration.html#fly-prune-worker"><code>fly prune-worker</code></a> command.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="LANDING-table"></a>
+    <pre><a href="internals.html#LANDING-table"><strong>LANDING</strong></a></pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The <code>concourse land-worker</code> command will put a worker in the LANDING state to safely drain its assignments for temporary downtime.</p><p>The ATC will wait for builds on the worker for jobs which aren&#39;t interruptible to finish, and transition the worker into <a href="internals.html#LANDED-table"><code><strong>LANDED</strong></code></a> state.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="LANDED-table"></a>
+    <pre><a href="internals.html#LANDED-table"><strong>LANDED</strong></a></pre>
+  </div>
+
+  <div class="definition-content">
+    <p>A worker in this state has successfully waited for all non-interruptible jobs on it after having <code>concourse land-worker</code> called. It will no longer be used to schedule any new containers or create volumes until it registers as <a href="internals.html#RUNNING-table"><code><strong>RUNNING</strong></code></a> again.</p>
+  </div>
+</div><div class="definition">
+  <div class="definition-thumb">
+    <a id="RETIRING-table"></a>
+    <pre><a href="internals.html#RETIRING-table"><strong>RETIRING</strong></a></pre>
+  </div>
+
+  <div class="definition-content">
+    <p>The <code>concourse retire-worker</code> command will put a worker in the RETIRING state to remove it from the cluster permanently.</p><p>The ATC will wait for builds on the worker for jobs which aren&#39;t interruptible to finish, and remove the worker.</p>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.16</span>
+              
+
+              <a href="observation.html">Observation</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2</span>
+              
+
+              <a href="examples.html">Examples</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/java-example.html b/java-example.html
new file mode 100644
index 00000000..106ead2a
--- /dev/null
+++ b/java-example.html
@@ -0,0 +1,287 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Java application testing example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html"  class="self">Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_java-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="java-example" href="#java-example"></a><span class="section-number">2.12 </span>Java application testing example</h1>
+  
+
+  <p>You can run the tests for a Java application.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/java"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">resources:
+- name: apache-kafka
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/apache/kafka.git
+
+jobs:
+- name: test
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: apache-kafka
+    trigger: true
+  - task: run-tests
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: gradle
+          tag: jdk17
+      caches:
+        - path: $HOME/.m2/repository
+        - path: $HOME/.gradle/caches/
+        - path: $HOME/.gradle/wrapper/
+      inputs:
+        - name: apache-kafka
+      run:
+        user: root
+        path: /bin/sh
+        args:
+          - -ce
+          - |
+            cd apache-kafka
+
+            ./gradlew clients:test --tests RequestResponseTest
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.11</span>
+              
+
+              <a href="rails-example.html">Rails application testing example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.13</span>
+              
+
+              <a href="nodejs-example.html">Nodejs application testing example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/jobs.html b/jobs.html
new file mode 100644
index 00000000..4c630f47
--- /dev/null
+++ b/jobs.html
@@ -0,0 +1,870 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Jobs - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html"  class="self">Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.10</span><a href="jobs.html"  class="self">Jobs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.10.1</td>
+            <td class="title-cell"><a href="jobs.html#managing-jobs" >Managing Jobs</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job"><strong><code>job</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.build_log_retention_policy"><strong><code>build_log_retention_policy</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.name"><code class="schema-attribute-name"><bold>job<wbr />.name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.plan"><code class="schema-attribute-name"><bold>job<wbr />.plan</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.old_name"><code class="schema-attribute-name"><bold>job<wbr />.old_name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.serial"><code class="schema-attribute-name"><bold>job<wbr />.serial</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.serial_groups"><code class="schema-attribute-name"><bold>job<wbr />.serial_groups</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.max_in_flight"><code class="schema-attribute-name"><bold>job<wbr />.max_in_flight</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.build_log_retention_policy.days"><code class="schema-attribute-name"><bold>build_log_retention_policy<wbr />.days</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.build_log_retention_policy.builds"><code class="schema-attribute-name"><bold>build_log_retention_policy<wbr />.builds</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.build_log_retention_policy.minimum_succeeded_builds"><code class="schema-attribute-name"><bold>build_log_retention_policy<wbr />.minimum_succeeded_builds</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.build_log_retention"><code class="schema-attribute-name"><bold>job<wbr />.build_log_retention</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.build_logs_to_retain"><code class="schema-attribute-name"><bold>job<wbr />.build_logs_to_retain</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.public"><code class="schema-attribute-name"><bold>job<wbr />.public</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.disable_manual_trigger"><code class="schema-attribute-name"><bold>job<wbr />.disable_manual_trigger</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.interruptible"><code class="schema-attribute-name"><bold>job<wbr />.interruptible</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.on_success"><code class="schema-attribute-name"><bold>job<wbr />.on_success</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.on_failure"><code class="schema-attribute-name"><bold>job<wbr />.on_failure</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.on_error"><code class="schema-attribute-name"><bold>job<wbr />.on_error</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.on_abort"><code class="schema-attribute-name"><bold>job<wbr />.on_abort</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="jobs.html#schema.job.ensure"><code class="schema-attribute-name"><bold>job<wbr />.ensure</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.10.1</td>
+        <td class="title-cell"><a href="jobs.html#managing-jobs" >Managing Jobs</a></td>
+      </tr>
+      
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.10.1.1</td>
+        <td class="title-cell"><a href="jobs.html#fly-jobs" ><code>fly jobs</code></a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.10.1.2</td>
+        <td class="title-cell"><a href="jobs.html#fly-trigger-job" ><code>fly trigger-job</code></a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.10.1.3</td>
+        <td class="title-cell"><a href="jobs.html#fly-rerun-build" ><code>fly rerun-build</code></a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.10.1.4</td>
+        <td class="title-cell"><a href="jobs.html#fly-pause-job" ><code>fly pause-job</code></a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.10.1.5</td>
+        <td class="title-cell"><a href="jobs.html#fly-unpause-job" ><code>fly unpause-job</code></a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.10.1.6</td>
+        <td class="title-cell"><a href="jobs.html#fly-clear-task-cache" ><code>fly clear-task-cache</code></a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_jobs">
+  
+  <h1 class="section-header"><a class="anchor-target" name="jobs" href="#jobs"></a><span class="section-number">1.10 </span>Jobs</h1>
+  
+
+  <p><a href="jobs.html">Jobs</a> determine the <em>actions</em> of your pipeline. They determine how <a href="resources.html">resources</a> progress through it, and how the pipeline is visualized.</p><p>The most important attribute of a job is its build plan, configured as <a href="jobs.html#schema.job.plan"><code class="schema-attribute-name"><bold>job<wbr />.plan</bold></code></a>. This determines the sequence of <a href="steps.html">Steps</a> to execute in any builds of the job.</p><p>A pipeline&#39;s jobs are listed under <a href="pipelines.html#schema.pipeline.jobs"><code class="schema-attribute-name"><bold>pipeline<wbr />.jobs</bold></code></a> with the following schema:</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.job" href="#schema.job"></a><code>job</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.job.name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.name" class="toggle-title">
+    <a id="schema.job.name"></a>
+
+    <code><a class="attribute-name" href="#schema.job.name">name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of the job. This should be short; it will show up in URLs. If you want to rename a job, use <a href="jobs.html#schema.job.old_name"><code class="schema-attribute-name"><bold>job<wbr />.old_name</bold></code></a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.job.plan" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.plan" class="toggle-title">
+    <a id="schema.job.plan"></a>
+
+    <code><a class="attribute-name" href="#schema.job.plan">plan</a>: <span class="attribute-type">[<a href="steps.html#schema.step"><strong>step</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The sequence of <a href="steps.html">steps</a> to execute.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.old_name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.old_name" class="toggle-title">
+    <a id="schema.job.old_name"></a>
+
+    <code><a class="attribute-name" href="#schema.job.old_name">old_name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The old name of the job. If configured, the history of old job will be inherited to the new one. Once the pipeline is set, this field can be removed as the builds have been transfered.</p><div class="toggleable example">
+  <input id="toggle-8d6dc7cd543f11b7267f8953d34dab033ac741a4" type="checkbox" class="toggle" />
+  <label for="toggle-8d6dc7cd543f11b7267f8953d34dab033ac741a4" class="toggle-title">Renaming a job</label>
+  <div class="toggle-content">
+    <p>This can be used to rename a job without losing its history, like so:</p><pre><code class="language-yaml">jobs:
+- name: new-name
+  old_name: current-name
+  plan: [get: 10m]</code></pre><p>After the pipeline is set, because the builds have been inherited, the job can have the field removed:</p><pre><code class="language-yaml">jobs:
+- name: new-name
+  plan: [get: 10m]</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.serial" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.serial" class="toggle-title">
+    <a id="schema.job.serial"></a>
+
+    <code><a class="attribute-name" href="#schema.job.serial">serial</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, builds will queue up and execute one-by-one, rather than executing in parallel.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.serial_groups" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.serial_groups" class="toggle-title">
+    <a id="schema.job.serial_groups"></a>
+
+    <code><a class="attribute-name" href="#schema.job.serial_groups">serial_groups</a>: <span class="attribute-type">[<a href="config-basics.html#schema.identifier"><strong>identifier</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>[]</code>.</em> When set to an array of arbitrary tag-like strings, builds of this job and other jobs referencing the same tags will be serialized.</p><div class="toggleable example">
+  <input id="toggle-17821c1e6eeaa874a2cde83946f0ad8d35ac5826" type="checkbox" class="toggle" />
+  <label for="toggle-17821c1e6eeaa874a2cde83946f0ad8d35ac5826" class="toggle-title">Limiting parallelism</label>
+  <div class="toggle-content">
+    <p>This can be used to ensure that certain jobs do not run at the same time, like so:</p><pre><code class="language-yaml">jobs:
+- name: job-a
+  serial_groups: [some-tag]
+- name: job-b
+  serial_groups: [some-tag, some-other-tag]
+- name: job-c
+  serial_groups: [some-other-tag]</code></pre><p>In this example, <code>job-a</code> and <code>job-c</code> can run concurrently, but neither job can run builds at the same time as <code>job-b</code>.</p><p>The builds are executed in their order of creation, across all jobs with common tags.</p>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.max_in_flight" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.max_in_flight" class="toggle-title">
+    <a id="schema.job.max_in_flight"></a>
+
+    <code><a class="attribute-name" href="#schema.job.max_in_flight">max_in_flight</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>If set, specifies a maximum number of builds to run at a time. If <code>serial</code> or <code>serial_groups</code> are set, they take precedence and force this value to be <code>1</code>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.build_log_retention" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.build_log_retention" class="toggle-title">
+    <a id="schema.job.build_log_retention"></a>
+
+    <code><a class="attribute-name" href="#schema.job.build_log_retention">build_log_retention</a>: <span class="attribute-type"><a href="jobs.html#schema.build_log_retention_policy"><strong>build_log_retention_policy</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Configures the retention policy for build logs. This is useful if you have a job that runs often but after some amount of time the logs aren&#39;t worth keeping around.</p><p>Builds which are not retained by the configured policy will have their logs reaped. If this configuration is omitted, logs are kept forever (unless <a href="concourse-web.html#build-log-retention">Build log retention</a> is configured globally).</p><div class="toggleable example">
+  <input id="toggle-2bcf96eb78ea68872c3d8f5e659ec77803338d27" type="checkbox" class="toggle" />
+  <label for="toggle-2bcf96eb78ea68872c3d8f5e659ec77803338d27" class="toggle-title">A complicated example</label>
+  <div class="toggle-content">
+    <p>The following example will keep logs for any builds that have completed in the last 2 days, while also keeping the last 1000 builds and at least 1 succeeded build.</p><pre><code class="language-yaml">jobs:
+- name: smoke-tests
+  build_log_retention:
+    days: 2
+    builds: 1000
+    minimum_succeeded_builds: 1
+  plan:
+  - get: 10m
+  - task: smoke-tests
+    # ...</code></pre><p>If more than 1000 builds finish in the past 2 days, <em>all</em> of them will be retained thanks to the <a href="jobs.html#schema.build_log_retention_policy.days"><code>days</code></a> configuration. Similarly, if there are 1000 builds spanning more than 2 days, they will also be kept thanks to the <a href="jobs.html#schema.build_log_retention_policy.builds"><code>builds</code></a> configuration. And if they all happened to have failed, the <a href="jobs.html#schema.build_log_retention_policy.minimum_succeeded_builds"><code>minimum_succeeded_builds</code></a> will keep around at least one successful build. All policies operate independently.</p>
+  </div>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.build_log_retention_policy" href="#schema.build_log_retention_policy"></a><code>build_log_retention_policy</code> schema</h2>
+
+  <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.build_log_retention_policy.days" type="checkbox" class="toggle" />
+  <label for="toggle-schema.build_log_retention_policy.days" class="toggle-title">
+    <a id="schema.build_log_retention_policy.days"></a>
+
+    <code><a class="attribute-name" href="#schema.build_log_retention_policy.days">days</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Keep logs for builds which have finished within the specified number of days.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.build_log_retention_policy.builds" type="checkbox" class="toggle" />
+  <label for="toggle-schema.build_log_retention_policy.builds" class="toggle-title">
+    <a id="schema.build_log_retention_policy.builds"></a>
+
+    <code><a class="attribute-name" href="#schema.build_log_retention_policy.builds">builds</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Keep logs for the last specified number of builds.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.build_log_retention_policy.minimum_succeeded_builds" type="checkbox" class="toggle" />
+  <label for="toggle-schema.build_log_retention_policy.minimum_succeeded_builds" class="toggle-title">
+    <a id="schema.build_log_retention_policy.minimum_succeeded_builds"></a>
+
+    <code><a class="attribute-name" href="#schema.build_log_retention_policy.minimum_succeeded_builds">minimum_succeeded_builds</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Keep a minimum number of successful build logs that would normally be reaped.</p><p>Requires <a href="jobs.html#schema.build_log_retention_policy.builds"><code>builds</code></a> to be set to an integer higher than 0 in order to work. For example, if <a href="jobs.html#schema.build_log_retention_policy.builds"><code>builds</code></a> is set to 5, and this attribute to 1, say a job has the following build history: 7(f), 6(f), 5(f), 4(f), 3(f), 2(f), 1(s), where f means failed and s means succeeded, then builds 2 and 3 will be reaped, because it retains 5 build logs, and at least 1 succeeded build log. Default is 0.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.build_logs_to_retain" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.build_logs_to_retain" class="toggle-title">
+    <a id="schema.job.build_logs_to_retain"></a>
+
+    <code><a class="attribute-name" href="#schema.job.build_logs_to_retain">build_logs_to_retain</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Deprecated.</em> Equivalent to setting <a href="jobs.html#schema.build_log_retention_policy.builds"><code>job.build_log_retention.builds</code></a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.public" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.public" class="toggle-title">
+    <a id="schema.job.public"></a>
+
+    <code><a class="attribute-name" href="#schema.job.public">public</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, the build log of this job will be viewable by unauthenticated users. Unauthenticated users will always be able to see the inputs, outputs, and build status history of a job. This is useful if you would like to expose your pipeline publicly without showing sensitive information in the build log.</p><p>Note: when this is set to <code>true</code>, any <a href="get-step.html"><code>get</code> step</a> and <a href="put-step.html"><code>put</code> step</a>s will show the metadata for their resource version, regardless of whether the resource itself has set <a href="resources.html#schema.resource.public"><code class="schema-attribute-name"><bold>resource<wbr />.public</bold></code></a> to <code>true</code>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.disable_manual_trigger" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.disable_manual_trigger" class="toggle-title">
+    <a id="schema.job.disable_manual_trigger"></a>
+
+    <code><a class="attribute-name" href="#schema.job.disable_manual_trigger">disable_manual_trigger</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, manual triggering of the job (via the web UI or <a href="jobs.html#fly-trigger-job"><code>fly trigger-job</code></a>) will be disabled.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.interruptible" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.interruptible" class="toggle-title">
+    <a id="schema.job.interruptible"></a>
+
+    <code><a class="attribute-name" href="#schema.job.interruptible">interruptible</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> Normally, when a worker is shutting down it will wait for builds with containers running on that worker to finish before exiting. If this value is set to <code>true</code>, the worker will not wait on the builds of this job. You may want this if e.g. you have a self-deploying Concourse or long-running-but-low-importance jobs.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.on_success" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.on_success" class="toggle-title">
+    <a id="schema.job.on_success"></a>
+
+    <code><a class="attribute-name" href="#schema.job.on_success">on_success</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Step to execute when the job succeeds. Equivalent to the <a href="on-success-step.html#schema.on_success"><code class="schema-attribute-name"><bold>on_success</bold></code></a> hook.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.on_failure" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.on_failure" class="toggle-title">
+    <a id="schema.job.on_failure"></a>
+
+    <code><a class="attribute-name" href="#schema.job.on_failure">on_failure</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Step to execute when the job fails. Equivalent to the <a href="on-failure-hook.html#schema.on_failure"><code class="schema-attribute-name"><bold>on_failure</bold></code></a> hook.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.on_error" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.on_error" class="toggle-title">
+    <a id="schema.job.on_error"></a>
+
+    <code><a class="attribute-name" href="#schema.job.on_error">on_error</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Step to execute when the job errors. Equivalent to the <a href="on-error-hook.html#schema.on_error"><code class="schema-attribute-name"><bold>on_error</bold></code></a> hook.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.on_abort" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.on_abort" class="toggle-title">
+    <a id="schema.job.on_abort"></a>
+
+    <code><a class="attribute-name" href="#schema.job.on_abort">on_abort</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Step to execute when the job aborts. Equivalent to the <a href="on-abort-hook.html#schema.on_abort"><code class="schema-attribute-name"><bold>on_abort</bold></code></a> hook.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.job.ensure" type="checkbox" class="toggle" />
+  <label for="toggle-schema.job.ensure" class="toggle-title">
+    <a id="schema.job.ensure"></a>
+
+    <code><a class="attribute-name" href="#schema.job.ensure">ensure</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Step to execute regardless of whether the job succeeds, fails, errors, or aborts. Equivalent to the <a href="ensure-hook.html#schema.ensure"><code class="schema-attribute-name"><bold>ensure</bold></code></a> hook.</p>
+  </div>
+</div>
+</div><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.10.1</span>
+      <a href="jobs.html#managing-jobs">Managing Jobs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.10.1.1</span>
+      <a href="jobs.html#fly-jobs"><code>fly jobs</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.2</span>
+      <a href="jobs.html#fly-trigger-job"><code>fly trigger-job</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.3</span>
+      <a href="jobs.html#fly-rerun-build"><code>fly rerun-build</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.4</span>
+      <a href="jobs.html#fly-pause-job"><code>fly pause-job</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.5</span>
+      <a href="jobs.html#fly-unpause-job"><code>fly unpause-job</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.10.1.6</span>
+      <a href="jobs.html#fly-clear-task-cache"><code>fly clear-task-cache</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_managing-jobs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="managing-jobs" href="#managing-jobs"></a>Managing Jobs</h2>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_fly-jobs">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fly-jobs" href="#fly-jobs"></a><code>fly jobs</code></h3>
+  
+
+  <p>To list the jobs configured in a pipeline, run:</p><pre><code class="language-bash">$ fly -t example jobs -p my-pipeline</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-trigger-job">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fly-trigger-job" href="#fly-trigger-job"></a><code>fly trigger-job</code></h3>
+  
+
+  <p>To immediately queue a new build of a job, run:</p><pre><code class="language-bash">$ fly -t example trigger-job --job my-pipeline/my-job</code></pre><p>This will enqueue a new build of the <code>my-job</code> job in the <code>my-pipeline</code> pipeline.</p><p>To start watching the newly created build, append the <code>--watch</code> flag like so:</p><pre><code class="language-bash">$ fly -t example trigger-job --job my-pipeline/my-job --watch</code></pre><p>You can also queue new builds by clicking the <code>&#43;</code> button on the job or build pages in the web UI.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-rerun-build">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fly-rerun-build" href="#fly-rerun-build"></a><code>fly rerun-build</code></h3>
+  
+
+  <p>To queue a new build of a job with exactly the same inputs as a given build of the same job, run:</p><pre><code class="language-bash">$ fly -t example rerun-build --job my-pipeline/my-job --build 4</code></pre><p>This will enqueue a new build of the <code>my-job</code> job in the <code>my-pipeline</code> pipeline, using the same input versions as build number 4.</p><p>To start watching the newly created build, append the <code>--watch</code> flag like so:</p><pre><code class="language-bash">$ fly -t example rerun-build --job my-pipeline/my-job --build 4 --watch</code></pre><p>You can also rerun builds by visiting the build page for the build in question in the web UI and clicking the rerun button.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-pause-job">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fly-pause-job" href="#fly-pause-job"></a><code>fly pause-job</code></h3>
+  
+
+  <p>To prevent scheduling and running builds of a job, run:</p><pre><code class="language-bash">$ fly -t example pause-job --job my-pipeline/my-job</code></pre><p>This will prevent pending builds of the job from being scheduled, though builds that are in-flight will still run, and pending builds will still be created as normal.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-unpause-job">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fly-unpause-job" href="#fly-unpause-job"></a><code>fly unpause-job</code></h3>
+  
+
+  <p>To resume scheduling of a job, run:</p><pre><code class="language-bash">$ fly -t example unpause-job --job my-pipeline/my-job</code></pre><p>This will resume scheduling of builds queued for the job.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-clear-task-cache">
+  
+  <h3 class="section-header"><a class="anchor-target" name="fly-clear-task-cache" href="#fly-clear-task-cache"></a><code>fly clear-task-cache</code></h3>
+  
+
+  <p>If you&#39;ve got a <a href="tasks.html#schema.task-config.caches">task cache</a> that you need to clear out for whatever reason, this can be done like so:</p><pre><code class="language-bash">$ fly -t example clear-task-cache --job my-pipeline/my-job --step my-step-name</code></pre><p>This will immediately invalidate the caches - they&#39;ll be garbage collected asynchronously and subsequent builds will run with empty caches.</p><p>You can also clear out a particular path for the given step&#39;s cache, using <code>--cache-path</code>:</p><pre><code class="language-bash">$ fly -t example clear-task-cache \
+    --job my-pipeline/my-job \
+    --step my-step-name \
+    --cache-path go/pkg</code></pre><p>If <code>--cache-path</code> is not specified, all caches for the given step will be cleared.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.9</span>
+              
+
+              <a href="resource-types.html">Resource Types</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11</span>
+              
+
+              <a href="steps.html">Steps</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/kubernetes-credential-manager.html b/kubernetes-credential-manager.html
new file mode 100644
index 00000000..f38ed0a0
--- /dev/null
+++ b/kubernetes-credential-manager.html
@@ -0,0 +1,517 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Kubernetes Credential Manager - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html" >The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html"  class="self">Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_kubernetes-credential-manager">
+  
+  <h1 class="section-header"><a class="anchor-target" name="kubernetes-credential-manager" href="#kubernetes-credential-manager"></a><span class="section-number">1.15.4.5 </span>Kubernetes Credential Manager</h1>
+  
+
+  <p>Concourse can be configured to pull credentials from <a href="https://kubernetes.io/docs/concepts/configuration/secret">Kubernetes <code>secret</code> objects</a>.</p><p>To configure it, either enable the in-cluster client by setting the following environment variable on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_KUBERNETES_IN_CLUSTER=true</code></pre><p>or set the path to a <code>kubeconfig</code> file:</p><pre><code class="language-bash">CONCOURSE_KUBERNETES_CONFIG_PATH=~/.kube/config</code></pre>
+
+  
+    
+      <div class="section" id="section_kubernetes-credential-lookup-rules">
+  
+  <h2 class="section-header"><a class="anchor-target" name="kubernetes-credential-lookup-rules" href="#kubernetes-credential-lookup-rules"></a>Credential lookup rules</h2>
+  
+
+  <p>When resolving a parameter such as <code>((foo))</code>, Concourse will lookup for it in the following order in the namespace configured for that team:</p><ul>
+
+  <li><pre><code class="language-c">Name:         PIPELINE_NAME.foo
+Namespace:    concourse-TEAM_NAME
+Type:         Opaque
+
+Data
+====
+value:        32 bytes</code></pre></li>
+
+  <li><pre><code class="language-c">Name:         foo
+Namespace:    concourse-TEAM_NAME
+Type:         Opaque
+
+Data
+====
+value:        32 bytes</code></pre></li>
+
+</ul><p>You can also have nested fields, which can be accessed using <code>.</code> syntax, e.g. <code>((foo.bar))</code>:</p><ul>
+
+  <li><pre><code class="language-c">Name:         PIPELINE_NAME.foo
+Namespace:    concourse-TEAM_NAME
+Type:         Opaque
+
+Data
+====
+bar:          32 bytes</code></pre></li>
+
+  <li><pre><code class="language-c">Name:         foo
+Namespace:    concourse-TEAM_NAME
+Type:         Opaque
+
+Data
+====
+bar:          32 bytes</code></pre></li>
+
+</ul><p>The prefix prepended to the namespace used by Concourse to search for secrets (in the examples above, <code>concourse-</code>) can be changed by configuring the following in the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_KUBERNETES_NAMESPACE_PREFIX=some-other-prefix-</code></pre><p>If an action is being run in a one-off build, Concourse will not include the pipeline name in the secret that it looks for.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_configuring-kubernetes-rbac">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuring-kubernetes-rbac" href="#configuring-kubernetes-rbac"></a>Configuring Kubernetes RBAC</h2>
+  
+
+  <p>As the Web nodes need to retrieve secrets from namespaces that are not their own, they needs extra permissions to do so.</p><p>If you have <a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/">RBAC</a> enabled, that means creating the necessary Kubernetes objects to identify the Web nodes and give them access to a predefined list of namespaces where the secrets live.</p><p>Regardless of how the Kubernetes RBAC-related objects are created, the basic requirement is that <strong><code>web</code> must be able to read secrets in the  namespaces where each teams&#39; secrets live</strong>.</p><p>For instance, if you have the following teams which you want to read secrets from:</p><ul>
+
+  <li><p>team-a</p></li>
+
+  <li><p>team-b</p></li>
+
+</ul><p>Assuming the following <a href="concourse-web.html"><code>web</code> node</a> configuration:</p><pre><code class="language-bash">CONCOURSE_KUBERNETES_NAMESPACE_PREFIX=myprefix-</code></pre><p><code>web</code> must be able to <code>get</code> secrets from the following namespaces:</p><ul>
+
+  <li><p>myprefix-team-a</p></li>
+
+  <li><p>myprefix-team-b</p></li>
+
+</ul><p>To allow <code>web</code> to interpolate credentials for &#34;team-a&#34; and &#34;team-b&#34;, we&#39;d then need to create a few Kubernetes RBAC objects.</p><p>Starting with identifying the <code>web</code> service as an actor, we can use a <a href="https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/">ServiceAccount</a> for that:</p><pre><code class="language-yaml">apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: web
+  labels:
+    app: web</code></pre><p>To allow actors to do something, in this case, retrieve secrets from a given namespace, a <a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/#api-overview">ClusterRole</a> is then needed.</p><pre><code class="language-yaml">apiVersion: rbac.authorization.k8s.io/v1beta1
+kind: ClusterRole
+metadata:
+  name: read-secrets
+  labels:
+    app: web
+rules:
+- apiGroups: [&#34;&#34;]
+  resources: [&#34;secrets&#34;]
+  verbs: [&#34;get&#34;]</code></pre><p>As that role is useless if not bound to an actor, the next step is creating the the object that represents binding the role to the <code>web</code> <code>ServiceAccount</code> that we had created before.</p><p>This is accomplished through the <a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding">RoleBinding</a> object, which is per-namespace (thus, per-team).</p><blockquote class="aside"><p>Even though in this example we&#39;re binding to a <code>ClusterRole</code> (which is not tied to any namespace), the use of such cluster role is (see <code>metadata.namespace</code>), making the effective  permissions restricted to the namespace applied in the <code>RoleBinding</code>.</p></blockquote><pre><code class="language-yaml">---
+# Role binding for the first team (`team-b`), allowing `web`
+# to consume secrets from it.
+#
+apiVersion: rbac.authorization.k8s.io/v1beta1
+kind: RoleBinding
+metadata:
+  name: web-team-a
+  namespace: myprefix-team-a
+  labels:
+    app: web
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: read-secrets
+subjects:
+- kind: ServiceAccount
+  name: web
+  namespace: concourse
+
+---
+# Role binding for the second team (`team-b`), allowing `web`
+# to consume secrets from it.
+#
+apiVersion: rbac.authorization.k8s.io/v1beta1
+kind: RoleBinding
+metadata:
+  name: web-team-b
+  namespace: myprefix-team-b
+  labels:
+    app: web
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: read-secrets
+subjects:
+- kind: ServiceAccount
+  name: web
+  namespace: concourse</code></pre><p>To finish the example, we need to associate the <code>web</code> <a href="https://kubernetes.io/docs/concepts/workloads/pods/pod/">Pod</a> with the service, granting the pod access to those namespaces through the roles that have been bound to it.</p><pre><code class="language-yaml">apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: web
+  labels:
+    app: web
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: web
+    spec:
+      serviceAccountName: web
+      containers:
+        - name: web
+          image: &#34;concourse/concourse:5.3.0&#34;
+          args: [ web ]
+          env:
+            - name: CONCOURSE_KUBERNETES_NAMESPACE_PREFIX
+              value: &#34;myprefix-&#34;
+          # ...</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4.4</span>
+              
+
+              <a href="aws-asm-credential-manager.html">The AWS Secrets Manager credential manager</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.6</span>
+              
+
+              <a href="conjur-credential-manager.html">The Conjur credential manager</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/ldap-auth.html b/ldap-auth.html
new file mode 100644
index 00000000..4b095b40
--- /dev/null
+++ b/ldap-auth.html
@@ -0,0 +1,424 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>LDAP auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html"  class="self">LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_ldap-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="ldap-auth" href="#ldap-auth"></a><span class="section-number">1.3.2.6 </span>LDAP auth</h1>
+  
+
+  <p>The LDAP provider can be used for operators who wish to authenticate their users against an LDAP server.</p>
+
+  
+    
+      <div class="section" id="section_ldap-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="ldap-authentication" href="#ldap-authentication"></a>Authentication</h2>
+  
+
+  <p>The LDAP provider is configured by pointing it to an LDAP host with a read-only bind DN and password. This bind DN and password is used for authenticating with the LDAP host and querying the users.</p><p>Additionally, the base DN under which users are searched as well as the attribute of the users to associate to &#39;usernames&#39; must also be configured.</p><p>These can be specified via env to the <a href="concourse-web.html"><code>web</code> node</a> like so:</p><pre><code class="language-bash">CONCOURSE_LDAP_DISPLAY_NAME=Acme # optional; default &#34;LDAP&#34;
+CONCOURSE_LDAP_HOST=ldap.example.com # port defaults to 389 or 636
+CONCOURSE_LDAP_BIND_DN=&#39;cn=read-only-admin,dc=example,dc=com&#39;
+CONCOURSE_LDAP_BIND_PW=read-only-admin-password
+CONCOURSE_LDAP_USER_SEARCH_BASE_DN=&#39;cn=users,dc=example,dc=com&#39;
+CONCOURSE_LDAP_USER_SEARCH_USERNAME=uid</code></pre><p>To configure TLS, you may need to set a CA cert:</p><pre><code class="language-bash">CONCOURSE_LDAP_CA_CERT=/path/to/ca_cert</code></pre><p>If your LDAP host does not use TLS, you must set:</p><pre><code class="language-bash">CONCOURSE_LDAP_INSECURE_NO_SSL=true</code></pre><p>To fine-tune which users are queried, you can specify a user search filter like so:</p><pre><code class="language-bash">CONCOURSE_LDAP_USER_SEARCH_FILTER=&#39;(objectClass=person)&#39;</code></pre><p>To set which user attributes map to the token claims, you can set the following:</p><pre><code class="language-bash">CONCOURSE_LDAP_USER_SEARCH_ID_ATTR=uid         # default
+CONCOURSE_LDAP_USER_SEARCH_EMAIL_ATTR=mail     # default
+CONCOURSE_LDAP_USER_SEARCH_NAME_ATTR=some-attr # no default</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-ldap-group-search">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-ldap-group-search" href="#configuring-ldap-group-search"></a>Configuring LDAP group search</h3>
+  
+
+  <p>The LDAP provider can also be configured with group search configuration, so that users can be configured for team authorization by their &#39;group&#39; in LDAP.</p><p>For example, to find groups and identify them by their <code>ou</code> attribute, you would configure:</p><pre><code class="language-bash">CONCOURSE_LDAP_GROUP_SEARCH_BASE_DN=&#39;cn=groups,dc=example,dc=com&#39;
+CONCOURSE_LDAP_GROUP_SEARCH_NAME_ATTR=ou</code></pre><p>The attributes correlating a user to a group must be specified like so:</p><pre><code class="language-bash">CONCOURSE_LDAP_GROUP_SEARCH_USER_ATTR=uid
+CONCOURSE_LDAP_GROUP_SEARCH_GROUP_ATTR=members</code></pre><p>This specifies that the <code>uid</code> attribute of the user must be present in the <code>members</code> attribute of the group.</p><p>An additional filter may be specified, just like with users:</p><pre><code class="language-bash">CONCOURSE_LDAP_GROUP_SEARCH_FILTER=&#39;(objectClass=posixGroup)&#39;</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_ldap-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="ldap-authorization" href="#ldap-authorization"></a>Authorization</h2>
+  
+
+  <p>LDAP users and groups can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--ldap-user=USERNAME</code></dt>
+    <dd><p>Authorize an individual user.</p></dd>
+  
+  <dt><code>--ldap-group=GROUP_NAME</code></dt>
+    <dd><p>Authorize anyone from the group.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --ldap-user my-username \
+    --ldap-group my-group</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  ldap:
+    users: [&#34;my-username&#34;]
+    groups: [&#34;my-groups&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>LDAP users and groups can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_LDAP_USER=my-user
+CONCOURSE_MAIN_TEAM_LDAP_GROUP=my-group</code></pre><p>Multiple users and groups may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.5</span>
+              
+
+              <a href="cf-uaa-auth.html">CF/UAA auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.7</span>
+              
+
+              <a href="microsoft-auth.html">Microsoft auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/load-var-step.html b/load-var-step.html
new file mode 100644
index 00000000..5cb33d29
--- /dev/null
+++ b/load-var-step.html
@@ -0,0 +1,439 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>load_var step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html"  class="self"><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="load-var-step.html#schema.load-var.load_var"><code>load_var</code> step <strong><code>load_var</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="load-var-step.html#schema.load-var.file"><code>load_var</code> step <strong><code>file</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="load-var-step.html#schema.load-var.format"><code>load_var</code> step <strong><code>format</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="load-var-step.html#schema.load-var.reveal"><code>load_var</code> step <strong><code>reveal</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="load-var-step.html#load-var"><code>load_var</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_load-var-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="load-var-step" href="#load-var-step"></a><span class="section-number">1.11.5 </span><code>load_var</code> step</h1>
+  
+
+  <div class="schema-group">
+  <a id="load-var"></a>
+  <p>Load the value for a var at runtime from a file, making it available to subsequent steps as a <a href="vars.html#local-vars">local build var</a> named after the given identifier. Expand each section below for more details and examples.</p><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.load-var.load_var" type="checkbox" class="toggle" />
+  <label for="toggle-schema.load-var.load_var" class="toggle-title">
+    <a id="schema.load-var.load_var"></a>
+
+    <code><a class="attribute-name" href="#schema.load-var.load_var">load_var</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The identifier will be the name of var, available to subsequent steps as a <a href="vars.html#local-vars">local build var</a>.</p><div class="toggleable example">
+  <input id="toggle-7feaacff031684d8ac05cb7ec09e131b425967ac" type="checkbox" class="toggle" />
+  <label for="toggle-7feaacff031684d8ac05cb7ec09e131b425967ac" class="toggle-title">Loading a simple value as a var</label>
+  <div class="toggle-content">
+    <p>The following pipeline loads vars from a text file whose contents are used as a version number to <a href="put-step.html"><code>put</code></a>.</p><pre><code class="language-yaml">jobs:
+- name: loading-vars
+  plan:
+  - get: examples
+  - load_var: version
+    file: examples/misc/simple-value.txt
+  - put: img
+    params:
+      version: ((.:version))
+
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git
+- name: img
+  type: mock</code></pre><p><code>simple-value.txt</code> looks like this: <pre><code class="language-">2.6.0
+</code></pre></p>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.load-var.file" type="checkbox" class="toggle" />
+  <label for="toggle-schema.load-var.file" class="toggle-title">
+    <a id="schema.load-var.file"></a>
+
+    <code><a class="attribute-name" href="#schema.load-var.file">file</a>: <span class="attribute-type"><a href="config-basics.html#schema.file-path"><strong>file-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The path to a file whose content shall be read and used as the var&#39;s value.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.load-var.format" type="checkbox" class="toggle" />
+  <label for="toggle-schema.load-var.format" class="toggle-title">
+    <a id="schema.load-var.format"></a>
+
+    <code><a class="attribute-name" href="#schema.load-var.format">format</a>: <span class="attribute-type"><span class="schema-scalar">json</span> | <span class="schema-scalar">yaml</span> | <span class="schema-scalar">yml</span> | <span class="schema-scalar">trim</span> | <span class="schema-scalar">raw</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The format of the file&#39;s content.</p><p>If unset, Concourse will try to detect the format from the file extension. If the file format cannot be determined, Concourse will fallback to <code>trim</code>.</p><p>If set to <code>json</code>, <code>yaml</code>, or <code>yml</code>, the file content will be parsed accordingly and the resulting structure will be the value of the var.</p><p>If set to <code>trim</code>, the var will be set to the content of the file with any trailing and leading whitespace removed.</p><p>If set to <code>raw</code>, the var will be set to the content of the file without modification (i.e. with any existing whitespace).</p><div class="toggleable example">
+  <input id="toggle-e01b12bf099cdb17f84e512c12998bbb16920814" type="checkbox" class="toggle" />
+  <label for="toggle-e01b12bf099cdb17f84e512c12998bbb16920814" class="toggle-title">Loading a var with multiple fields</label>
+  <div class="toggle-content">
+    <p>Let&#39;s say we have a file with multiple fields, like this yaml file:</p><p><pre><code class="language-yaml">first: initial
+number: &#34;9000&#34;
+hello: HAL
+</code></pre></p><p>We could pass these values to subsequent steps by loading it into a var with <code>load_var</code>, which will detect that it is in YAML format based on the file extension:</p><pre><code class="language-yaml">jobs:
+- name: loading-vars
+  plan:
+  - get: examples
+  - load_var: version
+    file: examples/pipelines/vars-file.yml
+  - put: img
+    params:
+      version: &#34;((.:version.hello))-((.:version.number))&#34;
+
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git
+- name: img
+  type: mock</code></pre><p>If the file <code>vars-file.yml</code> was generated in a task and printed these values, they would be automatically redacted unless <a href="load-var-step.html#schema.load-var.reveal"><code>reveal: true</code></a> is set.</p>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.load-var.reveal" type="checkbox" class="toggle" />
+  <label for="toggle-schema.load-var.reveal" class="toggle-title">
+    <a id="schema.load-var.reveal"></a>
+
+    <code><a class="attribute-name" href="#schema.load-var.reveal">reveal</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, allow the var&#39;s content to be printed in the build output even with secret redaction enabled.</p>
+  </div>
+</div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.4</span>
+              
+
+              <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.6</span>
+              
+
+              <a href="in-parallel-step.html"><code>in_parallel</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/local-auth.html b/local-auth.html
new file mode 100644
index 00000000..58048778
--- /dev/null
+++ b/local-auth.html
@@ -0,0 +1,392 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Local User auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html"  class="self">Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html" >Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_local-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="local-auth" href="#local-auth"></a><span class="section-number">1.3.2.1 </span>Local User auth</h1>
+  
+
+  <p>Local User auth is a primitive username/password-based auth mechanism. All users and passwords are configured statically.</p><p>In general, we recommend configuring one of the other providers instead, but for small deployments with only a few users, local user auth may be all you need.</p>
+
+  
+    
+      <div class="section" id="section_local-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="local-authentication" href="#local-authentication"></a>Authentication</h2>
+  
+
+  <p>Local users are configured on the <a href="concourse-web.html"><code>web</code> node</a> by setting the following env:</p><pre><code class="language-bash">CONCOURSE_ADD_LOCAL_USER=myuser:mypass,anotheruser:anotherpass</code></pre><p>This configures two users, <code>myuser</code> and <code>anotheruser</code>, with their corresponding passwords.</p><p>When local users are configured, the log-in page in the web UI will show a username/password prompt.</p><p>Local users can also log in via <a href="fly.html#fly-login"><code>fly login</code></a> with the <code>--username</code> and <code>--password</code> flags.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_local-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="local-authorization" href="#local-authorization"></a>Authorization</h2>
+  
+
+  <p>Local users are granted access to teams via <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>, using the <code>--local-user</code> flag:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --local-user some_username</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  local:
+    users: [&#34;some_username&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>Local users can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_LOCAL_USER=myuser</code></pre><p>Multiple users may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2</span>
+              
+
+              <a href="configuring-auth.html">Configuring Auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.2</span>
+              
+
+              <a href="github-auth.html">GitHub auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main-team.html b/main-team.html
new file mode 100644
index 00000000..71c18289
--- /dev/null
+++ b/main-team.html
@@ -0,0 +1,282 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The main team - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html"  class="self">The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html" >Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_main-team">
+  
+  <h1 class="section-header"><a class="anchor-target" name="main-team" href="#main-team"></a><span class="section-number">1.3.1 </span>The <code>main</code> team</h1>
+  
+
+  <p>Out of the box, Concourse comes with a single team called <code>main</code>.</p><p>The <code>main</code> team is an <em>admin team</em>, meaning members (specifically, users with the <a href="user-roles.html#team-owner-role">owner</a> role) can create and update other teams. Currently there is no way to promote a team to become an admin team, so <code>main</code> is a special-case.</p><p>The <code>main</code> team is different in that all flags normally passed to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a> are instead passed to the <code>concourse web</code> command, prefixed with <code>--main-team-</code>. The values set in these flags take effect whenever the <code>web</code> node starts up. This is done so that you can&#39;t get locked out.</p><p>To learn how to configure your <code>main</code> team, continue on to the appropriate section for your auth provider of choice under <a href="configuring-auth.html">Configuring Auth</a>.</p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3</span>
+              
+
+              <a href="auth.html">Auth &amp; Teams</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2</span>
+              
+
+              <a href="configuring-auth.html">Configuring Auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/managing-pipelines.html b/managing-pipelines.html
new file mode 100644
index 00000000..302e13a0
--- /dev/null
+++ b/managing-pipelines.html
@@ -0,0 +1,458 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Managing Pipelines - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html"  class="active">Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.6</span><a href="pipelines.html"  class="active">Pipelines</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.6.1</td>
+            <td class="title-cell"><a href="setting-pipelines.html" >Setting Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2</td>
+            <td class="title-cell"><a href="managing-pipelines.html"  class="self">Managing Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.3</td>
+            <td class="title-cell"><a href="instanced-pipelines.html" >Grouping Pipelines</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.6.2</span><a href="managing-pipelines.html"  class="self">Managing Pipelines</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.6.2.1</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-pipelines" ><code>fly pipelines</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.2</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-rename-pipeline" ><code>fly rename-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.3</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-pause-pipeline" ><code>fly pause-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.4</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-unpause-pipeline" ><code>fly unpause-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.5</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-expose-pipeline" ><code>fly expose-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.6</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-hide-pipeline" ><code>fly hide-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.7</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-get-pipeline" ><code>fly get-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.8</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-destroy-pipeline" ><code>fly destroy-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.9</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-order-pipelines" ><code>fly order-pipelines</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2.10</td>
+            <td class="title-cell"><a href="managing-pipelines.html#fly-archive-pipeline" ><code>fly archive-pipeline</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_managing-pipelines">
+  
+  <h1 class="section-header"><a class="anchor-target" name="managing-pipelines" href="#managing-pipelines"></a><span class="section-number">1.6.2 </span>Managing Pipelines</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_fly-pipelines">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-pipelines" href="#fly-pipelines"></a><code>fly pipelines</code></h2>
+  
+
+  <p>To list the currently-configured pipelines and their paused state, run:</p><pre><code class="language-bash">$ fly -t example pipelines</code></pre><p>By default, archived pipelines are not included in the output of this command. To view archived pipelines, provide <code>--include-archived</code> flag.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-rename-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-rename-pipeline" href="#fly-rename-pipeline"></a><code>fly rename-pipeline</code></h2>
+  
+
+  <p>To rename a pipeline, run:</p><pre><code class="language-bash">$ fly -t example rename-pipeline \
+    --old-name my-pipeline \
+    --new-name my-cool-pipeline</code></pre><p>All job history is retained when renaming a pipeline.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-pause-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-pause-pipeline" href="#fly-pause-pipeline"></a><code>fly pause-pipeline</code></h2>
+  
+
+  <p>To pause a pipeline, run:</p><pre><code class="language-bash">$ fly -t example pause-pipeline --pipeline my-pipeline</code></pre><p>This will prevent jobs from being scheduled and stop the periodic checking for new versions of resources. Builds that are in-flight will still finish.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-unpause-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-unpause-pipeline" href="#fly-unpause-pipeline"></a><code>fly unpause-pipeline</code></h2>
+  
+
+  <p>To unpause a pipeline, run:</p><pre><code class="language-bash">$ fly -t example unpause-pipeline --pipeline my-pipeline</code></pre><p>This will resume job scheduling and resource checking.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-expose-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-expose-pipeline" href="#fly-expose-pipeline"></a><code>fly expose-pipeline</code></h2>
+  
+
+  <p>By default, newly configured pipelines are only visible to the pipeline&#39;s team. To make a pipeline viewable by other teams and unauthenticated users, run:</p><pre><code class="language-bash">$ fly -t example expose-pipeline --pipeline my-pipeline</code></pre><p>This feature is useful if you&#39;re using Concourse for an open source project and you&#39;d like your community to be able to see into your build pipeline.</p><p>To undo this change, see <a href="managing-pipelines.html#fly-hide-pipeline"><code>fly hide-pipeline</code></a>.</p><p>Exposing a pipeline reveals basically everything except for build output and resource metadata.</p><p>To expose a resource&#39;s metadata, <a href="resources.html#schema.resource.public"><code class="schema-attribute-name"><bold>resource<wbr />.public</bold></code></a> must be set to <code>true</code>.</p><p>To expose a job&#39;s build output, <a href="jobs.html#schema.job.public"><code class="schema-attribute-name"><bold>job<wbr />.public</bold></code></a> must be set to <code>true</code>. This will also reveal resource metadata for any <a href="get-step.html"><code>get</code> step</a> or <a href="put-step.html"><code>put</code> step</a>s in the build output.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-hide-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-hide-pipeline" href="#fly-hide-pipeline"></a><code>fly hide-pipeline</code></h2>
+  
+
+  <p>If you realize that you&#39;ve made a terrible mistake in <a href="managing-pipelines.html#fly-expose-pipeline">exposing your pipeline</a>, you can run:</p><pre><code class="language-bash">$ fly -t example hide-pipeline --pipeline my-pipeline</code></pre><p>If you&#39;re panicking you can run the command&#39;s short form, <code>hp</code>, instead.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-get-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-get-pipeline" href="#fly-get-pipeline"></a><code>fly get-pipeline</code></h2>
+  
+
+  <p>Fly can be used to fetch and update the configuration for your pipelines. This is achieved by using the <a href="managing-pipelines.html#fly-get-pipeline"><code>fly get-pipeline</code></a> and <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a> commands. For example, to fetch the current configuration of your <code>my-pipeline</code> Concourse pipeline and print it on <code>STDOUT</code> run the following:</p><pre><code class="language-bash">$ fly -t example get-pipeline --pipeline my-pipeline</code></pre><p>To get JSON instead of YAML you can use the <code>-j</code> or <code>--json</code> argument. This can be useful when inspecting your config with <a href="http://stedolan.github.io/jq/">jq</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-destroy-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-destroy-pipeline" href="#fly-destroy-pipeline"></a><code>fly destroy-pipeline</code></h2>
+  
+
+  <p>Every now and then you just don&#39;t want a pipeline to be around anymore. Running <code>fly destroy-pipeline</code> will stop the pipeline activity and remove all data collected by the pipeline, including build history and collected versions.</p><p>For example, to destroy the <code>my-pipeline</code> pipeline, you would run:</p><pre><code class="language-bash">$ fly -t example destroy-pipeline --pipeline my-pipeline</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-order-pipelines">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-order-pipelines" href="#fly-order-pipelines"></a><code>fly order-pipelines</code></h2>
+  
+
+  <p>To configure the ordering of pipelines, run:</p><pre><code class="language-bash">$ fly -t example order-pipelines \
+    --pipeline pipeline-1 \
+    --pipeline pipeline-2 \
+    --pipeline pipeline-3</code></pre><p>Note that this command only ensures that the given pipelines are in the given order. If there are other pipelines that you haven&#39;t included in the command, they may appear in-between, before, or after the given set.</p><div class="warning">
+  <p>If you want to reorder instanced pipelines within an individual instance group, you should use the <a href="instanced-pipelines.html#fly-order-instanced-pipelines"><code>fly order-instanced-pipelines</code></a> command.</p>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-archive-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-archive-pipeline" href="#fly-archive-pipeline"></a><code>fly archive-pipeline</code></h2>
+  
+
+  <p>A pipeline can be archived via fly. This means that the pipeline will be paused and hidden from the web UI. The pipeline config will be deleted (so any secrets or interpolated <a href="vars.html">Vars</a> will be removed) while the build logs will be retained.</p><pre><code class="language-bash">$ fly -t example archive-pipeline -p pipeline-1</code></pre><p>To unarchive a pipeline, simply set the pipeline again with the same name using <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>. If a job in the new pipeline has the same name as a job in the archived pipeline, the old build logs for that job will be restored.</p><p>Note that because the config is deleted, <a href="managing-pipelines.html#fly-get-pipeline"><code>fly get-pipeline</code></a> will no longer work for archived pipelines.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.6.1</span>
+              
+
+              <a href="setting-pipelines.html">Setting Pipelines</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.6.3</span>
+              
+
+              <a href="instanced-pipelines.html">Grouping Pipelines</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/managing-resource-types.html b/managing-resource-types.html
new file mode 100644
index 00000000..8b1bdcfe
--- /dev/null
+++ b/managing-resource-types.html
@@ -0,0 +1,293 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Managing Resource Types - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html"  class="active">Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.9</span><a href="resource-types.html"  class="active">Resource Types</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.9.1</td>
+            <td class="title-cell"><a href="implementing-resource-types.html" >Implementing a Resource Type</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.2</td>
+            <td class="title-cell"><a href="managing-resource-types.html"  class="self">Managing Resource Types</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.9.2</span><a href="managing-resource-types.html"  class="self">Managing Resource Types</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.9.2.1</td>
+            <td class="title-cell"><a href="managing-resource-types.html#fly-check-resource-type" ><code>fly check-resource-type</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_managing-resource-types">
+  
+  <h1 class="section-header"><a class="anchor-target" name="managing-resource-types" href="#managing-resource-types"></a><span class="section-number">1.9.2 </span>Managing Resource Types</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_fly-check-resource-type">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-check-resource-type" href="#fly-check-resource-type"></a><code>fly check-resource-type</code></h2>
+  
+
+  <p>To force immediate checking for new versions of a resource type, rather than waiting for the periodic checking, run:</p><pre><code class="language-bash">$ fly -t example check-resource-type --resource-type my-pipeline/my-resource-type</code></pre><p>This can be useful for forcing an update if you&#39;re iterating on your own resource type implementation.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.9.1</span>
+              
+
+              <a href="implementing-resource-types.html">Implementing a Resource Type</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.10</span>
+              
+
+              <a href="jobs.html">Jobs</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/managing-resources.html b/managing-resources.html
new file mode 100644
index 00000000..e6caeaea
--- /dev/null
+++ b/managing-resources.html
@@ -0,0 +1,369 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Managing Resources - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html"  class="active">Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.8</span><a href="resources.html"  class="active">Resources</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.8.1</td>
+            <td class="title-cell"><a href="resource-versions.html" >Resource Versions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.2</td>
+            <td class="title-cell"><a href="managing-resources.html"  class="self">Managing Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.8.2</span><a href="managing-resources.html"  class="self">Managing Resources</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.8.2.1</td>
+            <td class="title-cell"><a href="managing-resources.html#fly-check-resource" ><code>fly check-resource</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.2.2</td>
+            <td class="title-cell"><a href="managing-resources.html#fly-pin-resource" ><code>fly pin-resource</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.2.3</td>
+            <td class="title-cell"><a href="managing-resources.html#fly-enable-resource-version" ><code>fly enable-resource-version</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.2.4</td>
+            <td class="title-cell"><a href="managing-resources.html#fly-disable-resource-version" ><code>fly disable-resource-version</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.2.5</td>
+            <td class="title-cell"><a href="managing-resources.html#fly-clear-resource-cache" ><code>fly clear-resource-cache</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_managing-resources">
+  
+  <h1 class="section-header"><a class="anchor-target" name="managing-resources" href="#managing-resources"></a><span class="section-number">1.8.2 </span>Managing Resources</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_fly-check-resource">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-check-resource" href="#fly-check-resource"></a><code>fly check-resource</code></h2>
+  
+
+  <p>To force immediate checking for new versions of a resource, rather than waiting for the periodic checking, run:</p><pre><code class="language-bash">$ fly -t example check-resource --resource my-pipeline/my-resource</code></pre><p>To check from a particular version, including the given version, append the <code>--from</code> flag like so:</p><pre><code class="language-bash">$ fly -t example check-resource --resource my-pipeline/my-resource \
+    --from ref:abcdef</code></pre><p>This can be useful for collecting versions that are older than the current ones, given that a newly configured resource will only start from the latest version.</p><p>Note the <code>ref:</code> prefix is resource-dependent. For example, the <em>bosh-io-release</em> resource might use <code>version:11.2</code> in place of <code>ref:abcdef</code>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-pin-resource">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-pin-resource" href="#fly-pin-resource"></a><code>fly pin-resource</code></h2>
+  
+
+  <p>To pin a resource to a specific version of that resource, run:</p><pre><code class="language-bash">$ fly -t example pin-resource --resource my-pipeline/my-resource \
+    --version ref:bceaf</code></pre><p>Note that the version needs to be provided as a key-value pair. For the git resource the <code>ref:</code> prefix is used while the <em>registry</em>  resource might use <code>digest</code> as a prefix like <code>digest:sha256:94be7d7b</code>.</p><p>A comment can be provided using the <code>--comment</code> flag, which is then also visible in the UI :</p><pre><code class="language-bash">$ fly -t example pin-resource --resource my-pipeline/my-resource \
+    --version ref:abcdef \
+    --comment &#34;Some reason&#34;</code></pre><p>This can, for example, be used to pull in a fixed version of an external dependency which might break your build in a new release. After the problem has been resolved, the pin can be removed. Another example could be running a build with a set of older inputs when needed.</p><p>To remove the pin on a resource use:</p><pre><code class="language-bash">$ fly -t example unpin-resource --resource my-pipeline/my-resource</code></pre><p>You can also pin a resource via the UI by clicking on the pin button next to the desired version on the resource page. A default comment is automatically generated containing your username and a timestamp. This comment can be edited.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-enable-resource-version">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-enable-resource-version" href="#fly-enable-resource-version"></a><code>fly enable-resource-version</code></h2>
+  
+
+  <p>To enable a specific version of a resource, run:</p><pre><code class="language-bash">$ fly -t example enable-resource-version --resource my-pipeline/my-resource \
+    --version ref:bceaf</code></pre><p>Note that the version needs to be provided as a key-value pair. For the git resource the <code>ref:</code> prefix is used while the <em>registry</em>  resource might use <code>digest</code> as a prefix like <code>digest:sha256:94be7d7b</code>.</p><p>This command is idempotent. Enabling an already enabled resource version will do nothing.</p><p>You can also enable a resource version via the UI by clicking on the check mark button next to the desired version on the resource page.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-disable-resource-version">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-disable-resource-version" href="#fly-disable-resource-version"></a><code>fly disable-resource-version</code></h2>
+  
+
+  <p>To disable a specific version of a resource, run:</p><pre><code class="language-bash">$ fly -t example disable-resource-version --resource my-pipeline/my-resource \
+    --version ref:bceaf</code></pre><p>Note that the version needs to be provided as a key-value pair. For the git resource the <code>ref:</code> prefix is used while the <em>registry</em>  resource might use <code>digest</code> as a prefix like <code>digest:sha256:94be7d7b</code>.</p><p>This command is idempotent. Disabling an already disabled resource version will do nothing.</p><p>You can also disable a resource version via the UI by clicking on the check mark button next to the desired version on the resource page.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-clear-resource-cache">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-clear-resource-cache" href="#fly-clear-resource-cache"></a><code>fly clear-resource-cache</code></h2>
+  
+
+  <p>If you&#39;ve got a resource cache that you need to clear out for whatever reason, this can be done like so:</p><pre><code class="language-bash">$ fly -t example clear-resource-cache -r my-pipeline/my-resource</code></pre><p>This will immediately invalidate all the caches related to that resource - they&#39;ll be garbage collected asynchronously and subsequent builds will run with empty caches.</p><p>You can also clear out a particular version for the given resource cache, using <code>-v</code>:</p><pre><code class="language-bash">$ fly -t example clear-resource-cache \
+    -r my-pipeline/my-resource \
+    -v ref:abcdef</code></pre><p>If <code>-v</code> is not specified, all caches for the given resource will be cleared.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.8.1</span>
+              
+
+              <a href="resource-versions.html">Resource Versions</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.9</span>
+              
+
+              <a href="resource-types.html">Resource Types</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/managing-teams.html b/managing-teams.html
new file mode 100644
index 00000000..179539f6
--- /dev/null
+++ b/managing-teams.html
@@ -0,0 +1,422 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Managing Teams - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html" >Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html"  class="self">Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.3</span><a href="managing-teams.html"  class="self">Managing Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.3.1</td>
+            <td class="title-cell"><a href="managing-teams.html#fly-set-team" ><code>fly set-team</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3.2</td>
+            <td class="title-cell"><a href="managing-teams.html#fly-active-users" ><code>fly active-users</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html#fly-teams" ><code>fly teams</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3.4</td>
+            <td class="title-cell"><a href="managing-teams.html#fly-get-team" ><code>fly get-team</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3.5</td>
+            <td class="title-cell"><a href="managing-teams.html#fly-rename-team" ><code>fly rename-team</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3.6</td>
+            <td class="title-cell"><a href="managing-teams.html#fly-destroy-team" ><code>fly destroy-team</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_managing-teams">
+  
+  <h1 class="section-header"><a class="anchor-target" name="managing-teams" href="#managing-teams"></a><span class="section-number">1.3.3 </span>Managing Teams</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_fly-set-team">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-set-team" href="#fly-set-team"></a><code>fly set-team</code></h2>
+  
+
+  <p>Once you&#39;ve <a href="fly.html#fly-login">logged in as the <code>main</code> team with <code>fly</code></a>, you can run <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a> to create or update other teams. Users with a <a href="user-roles.html#team-owner-role"><code>owner</code> role</a> can also update their own configuration with the same command.</p><p>For example, to create a new team that authorizes the local <code>foo</code> user, you would run:</p><pre><code class="language-bash">fly -t example set-team --team-name my-team \
+  --local-user foo</code></pre><p>Note that each time <code>set-team</code> is run, the team&#39;s authorization config is set <em>as a whole</em> - it is not a stateful operation.</p><p>There are many different ways to configure team auth; see <a href="configuring-auth.html">Configuring Auth</a> for more information.</p><p>Once the team has been created, you can use <a href="fly.html#fly-login"><code>fly login</code></a> to log in:</p><pre><code class="language-bash">$ fly -t example login -n my-team</code></pre><p>Any newly configured pipelines (via <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>) and one-off builds (via <a href="tasks.html#running-tasks"><code>fly execute</code></a>) will be owned by the authorized team. Commands that list content will be scoped to the current team by default, such as <a href="managing-pipelines.html#fly-pipelines"><code>fly pipelines</code></a> and <a href="builds.html#fly-builds"><code>fly builds</code></a>. The web UI will reflect the same state.</p><p>Newly configured pipelines are hidden by default, meaning other teams and unauthorized visitors cannot view them. To make them publicly viewable, see <a href="exposing.html">Pipeline &amp; Build Visibility</a>.</p>
+
+  
+    
+      <div class="section" id="section_setting-roles">
+  
+  <h3 class="section-header"><a class="anchor-target" name="setting-roles" href="#setting-roles"></a>Setting User Roles</h3>
+  
+
+  <p>By default, authorization config passed to <code>set-team</code> configures the <a href="user-roles.html#team-owner-role"><code>owner</code> role</a>.</p><p>More advanced <a href="user-roles.html">roles</a> configuration can be specified through the <code>--config</code> or <code>-c</code> flag.</p><p>The <code>-c</code> flag expects a <code>.yml</code> file with a single field, <code>roles:</code>, pointing to a list of role authorization configs.</p><p>All of the attributes in each config will vary by provider. Consult the appropriate section for your provider under <a href="configuring-auth.html">Configuring Auth</a> for specifics.</p><p>For example, the following config sets three roles with different auth config for each role&#39;s provider:</p><pre><code class="language-bash">roles:
+- name: owner
+  github:
+    users: [&#34;admin&#34;]
+- name: member
+  github:
+    teams: [&#34;org:team&#34;]
+- name: viewer
+  github:
+    orgs: [&#34;org&#34;]
+  local:
+    users: [&#34;visitor&#34;]</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-active-users">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-active-users" href="#fly-active-users"></a><code>fly active-users</code></h2>
+  
+
+  <p>To list all users that have logged into your instance in the last two months, run:</p><pre><code class="language-bash">$ fly -t example active-users</code></pre><p>The output will include the username, connector (which method they used to authenticate) and the date of their last login.</p><p>You can list users whose last login was within a different range by using:</p><pre><code class="language-bash">$ fly -t example active-users --since yyyy-MM-dd</code></pre><p>This can be helpful to get a sense of how active your cluster is. </p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-teams">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-teams" href="#fly-teams"></a><code>fly teams</code></h2>
+  
+
+  <p>To list all the teams, run:</p><pre><code class="language-bash">$ fly -t example teams</code></pre><p>This can be useful if you&#39;ve forgotten your team name.</p><p><strong><code>fly teams -d</code>: With Details</strong></p><p>To list all the teams with authentication details and members, run:</p><pre><code class="language-bash">$ fly -t example teams -d</code></pre><p>This can be helpful when debugging OAuth, OIDC groups or listing all individual members.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-get-team">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-get-team" href="#fly-get-team"></a><code>fly get-team</code></h2>
+  
+
+  <p>To show a team&#39;s configuration, run: <pre><code class="language-bash">$ fly -t example get-team -n some-team</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-rename-team">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-rename-team" href="#fly-rename-team"></a><code>fly rename-team</code></h2>
+  
+
+  <p>To rename a team, run:</p><pre><code class="language-bash">$ fly -t example rename-team --old-name my-team --new-name cool-team</code></pre><p>This can only be run by the <a href="main-team.html"><code>main</code> team</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-destroy-team">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-destroy-team" href="#fly-destroy-team"></a><code>fly destroy-team</code></h2>
+  
+
+  <p>To remove a team, including all of its pipelines and one-off builds, first log in as the <a href="main-team.html"><code>main</code> team</a>, and then run:</p><pre><code class="language-bash">$ fly -t example destroy-team --team-name my-team</code></pre><p>Currently, if there were any workers assigned specifically to this team, they&#39;ll be orphaned, without having their containers or volumes cleaned up.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2</span>
+              
+
+              <a href="configuring-auth.html">Configuring Auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.4</span>
+              
+
+              <a href="user-roles.html">User Roles &amp; Permissions</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/manual-approval-step.html b/manual-approval-step.html
new file mode 100644
index 00000000..087cdc94
--- /dev/null
+++ b/manual-approval-step.html
@@ -0,0 +1,370 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Manual Approval Step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html"  class="active">Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.1</span><a href="pipeline-guides.html"  class="active">Pipeline Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1.1</td>
+            <td class="title-cell"><a href="common-pipeline-practices.html" >Common Pipeline Practices</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.2</td>
+            <td class="title-cell"><a href="exploring-task-input-and-output-scenarios.html" >Exploring Task Input and Output Scenarios</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.3</td>
+            <td class="title-cell"><a href="gated-pipeline-patterns.html" >Gated Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.4</td>
+            <td class="title-cell"><a href="time-triggered-pipeline-patterns.html" >Time Triggered Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.5</td>
+            <td class="title-cell"><a href="manual-approval-step.html"  class="self">Manual Approval Step</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_manual-approval-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="manual-approval-step" href="#manual-approval-step"></a><span class="section-number">1.14.1.5 </span>Manual Approval Step</h1>
+  
+
+  <p>This is an exampe of a <a href="task-step.html"><code>task</code> step</a> you can add to your <a href="jobs.html">Jobs</a> that requires a human to approve or reject the job from running. This is probably the most minimal version of a manual approval step you can have in Concourse that doesn&#39;t require pulling in a bunch of other tech into your stack. It&#39;s definitely not the best UX since you need to use the <code>fly</code> CLI to approve the step.</p><p>Task configuration, <code>config.yml</code>: <pre><code class="language-yaml">platform: linux
+
+inputs:
+- name: repo
+
+params:
+  APPROVAL_TIMEOUT: 600 #default of 10mins
+
+run:
+  path: repo/tasks/manual-approval/run.sh</code></pre></p><p>Task script, <code>run.sh</code>: <pre><code class="language-bash">#!/usr/bin/env bash
+
+set -euo pipefail
+
+timeout=$((EPOCHSECONDS&#43;APPROVAL_TIMEOUT))
+echo -n &#34;Waiting for manual approval...&#34;
+until [[ -f /tmp/approved || $EPOCHSECONDS -gt $timeout ]]; do
+    sleep 5
+    echo -n &#34;.&#34;
+done
+
+if [[ -f /tmp/approved ]]; then
+    echo &#34;Step approved!&#34;
+else
+    echo &#34;Approval timeout reached. Aborting job.&#34;
+    exit 1
+fi</code></pre></p><p>To approve the job when it gets to this step you have to create <code>/tmp/approved</code> on the step&#39;s container. You can do that user <code>fly</code>&#39;s <code>intercept</code> command, like so (replace <code>PIPELINE/JOB</code> with the name of your pipeline and job that the step resides in):</p><pre><code class="language-bash">fly -t ci intercept --job PIPELINE/JOB --step manual-approval touch /tmp/approved</code></pre><p>Here&#39;s the step added in-line to a pipeline so you can see how it works on its own.</p><pre><code class="language-yaml">jobs:
+- name: approval
+  plan:
+  - task: manual-approval
+    params:
+      APPROVAL_TIMEOUT: 600 #10mins
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source:
+          mirror_self: true
+      run:
+        path: bash
+        args:
+        - -c
+        - |
+          #!/usr/bin/env bash
+
+          set -euo pipefail
+
+          timeout=$((EPOCHSECONDS&#43;APPROVAL_TIMEOUT))
+          echo -n &#34;Waiting for manual approval...&#34;
+          until [[ -f /tmp/approved || $EPOCHSECONDS -gt $timeout ]]; do
+              sleep 5
+              echo -n &#34;.&#34;
+          done
+
+          if [[ -f /tmp/approved ]]; then
+              echo &#34;Step approved!&#34;
+          else
+              echo &#34;Approval timeout reached. Aborting job.&#34;
+              exit 1
+          fi</code></pre>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.1.4</span>
+              
+
+              <a href="time-triggered-pipeline-patterns.html">Time Triggered Pipeline Patterns</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.2</span>
+              
+
+              <a href="git-guides.html">Git Guides</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/manual-trigger-example.html b/manual-trigger-example.html
new file mode 100644
index 00000000..84ad965e
--- /dev/null
+++ b/manual-trigger-example.html
@@ -0,0 +1,307 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Manually triggered job example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html"  class="self">Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_manual-trigger-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="manual-trigger-example" href="#manual-trigger-example"></a><span class="section-number">2.8 </span>Manually triggered job example</h1>
+  
+
+  <p>A job can be triggered by a resource. After it&#39;s complete, the next job can run automatically or manually.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/manual-trigger"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: every-30s
+  type: time
+  icon: clock-outline
+  source:
+    interval: 30s
+
+jobs:
+- name: triggered-first
+  public: true
+  build_log_retention:
+    builds: 20
+  plan:
+    - get: every-30s
+      trigger: true
+    - task: simple-task
+      config:
+        platform: linux
+        image_resource:
+          type: registry-image
+          source: { repository: busybox }
+        run:
+          path: echo
+          args: [&#34;Hello, world!&#34;]
+- name: not-triggered
+  public: true
+  plan:
+    - get: every-30s
+      passed: [triggered-first]
+    - task: simple-task
+      config:
+        platform: linux
+        image_resource:
+          type: registry-image
+          source: { repository: busybox }
+        run:
+          path: echo
+          args: [&#34;Hello, world!&#34;]
+- name: triggered-second
+  public: true
+  build_log_retention:
+    builds: 20
+  plan:
+    - get: every-30s
+      passed: [triggered-first]
+      trigger: true
+    - task: simple-task
+      config:
+        platform: linux
+        image_resource:
+          type: registry-image
+          source: { repository: busybox }
+        run:
+          path: echo
+          args: [&#34;Hello, world!&#34;]
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="resources.html">Resources</a></p></li>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.7</span>
+              
+
+              <a href="git-trigger-example.html"><code>git</code>-triggered job example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.9</span>
+              
+
+              <a href="hooks-example.html">Job &amp; task hooks example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/metrics.html b/metrics.html
new file mode 100644
index 00000000..0780d186
--- /dev/null
+++ b/metrics.html
@@ -0,0 +1,1054 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Metrics - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html"  class="self">Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.1</span><a href="metrics.html"  class="self">Metrics</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1.1</td>
+            <td class="title-cell"><a href="metrics.html#configuring-metrics" >Configuring Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.1.2</td>
+            <td class="title-cell"><a href="metrics.html#whats-emitted" >What&#39;s emitted?</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_metrics">
+  
+  <h1 class="section-header"><a class="anchor-target" name="metrics" href="#metrics"></a><span class="section-number">1.15.1 </span>Metrics</h1>
+  
+
+  <p>Metrics are essential in understanding how any large system is behaving and performing. Concourse can emit metrics about both the system health itself and about the builds that it is running. Operators can tap into these metrics in order to observe the health of the system.</p>
+
+  
+    
+      <div class="section" id="section_configuring-metrics">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuring-metrics" href="#configuring-metrics"></a>Configuring Metrics</h2>
+  
+
+  <p>The <a href="concourse-web.html"><code>web</code> node</a> can be configured to emit metrics on start.</p><p>Currently supported metrics emitters are InfluxDB, NewRelic, Prometheus, and Datadog. There is also a dummy emitter that will just spit the metrics out in to the logs at <code>DEBUG</code> level, which can be enabled with the <code>--emit-to-logs</code> flag.</p><p>Regardless of your metrics emitter, you can set <code>CONCOURSE_METRICS_BUFFER_SIZE</code> to determine how many metrics emissions are sent at a time. Increasing this number can be helpful if sending metrics is regularly failing (due to rate limiting or network failures) or if latency is particularly high.</p><p>There are various flags for different emitters; run <code>concourse web --help</code> and look for &#34;Metric Emitter&#34; to see what&#39;s available.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_whats-emitted">
+  
+  <h2 class="section-header"><a class="anchor-target" name="whats-emitted" href="#whats-emitted"></a>What&#39;s emitted?</h2>
+  
+
+  <p>This reference section lists of all of the metrics that Concourse emits via the Prometheus emitter.</p><p>To make this document easy to maintain, Prometheus is used as the &#34;source of truth&#34; - primarily because it has help text built-in, making this list easy to generate. Treat this list as a reference when looking for the equivalent metric names for your emitter of choice.</p><p>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_aborted_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_aborted_total" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_aborted_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of Concourse builds aborted.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_errored_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_errored_total" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_errored_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of Concourse builds errored.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_failed_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_failed_total" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_failed_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of Concourse builds failed.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_finished_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_finished_total" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_finished_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of Concourse builds finished.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_latest_completed_build_status" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_latest_completed_build_status" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_latest_completed_build_status</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Status of Latest Completed Build. 0=Success, 1=Failed, 2=Aborted, 3=Errored.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_running" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_running" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_running</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of Concourse builds currently running.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_started_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_started_total" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_started_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of Concourse builds started.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_builds_succeeded_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_builds_succeeded_total" class="toggle-title">
+    <code><span class="metric-name">concourse_builds_succeeded_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of Concourse builds succeeded.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_concurrent_requests" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_concurrent_requests" class="toggle-title">
+    <code><span class="metric-name">concourse_concurrent_requests</span><span class="metric-labels">{<span class="metric-label">action</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of concurrent requests being served by endpoints that have a specified limit of concurrent requests.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_concurrent_requests_limit_hit_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_concurrent_requests_limit_hit_total" class="toggle-title">
+    <code><span class="metric-name">concourse_concurrent_requests_limit_hit_total</span><span class="metric-labels">{<span class="metric-label">action</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of requests rejected because the server was already serving too many concurrent requests.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_db_connections" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_db_connections" class="toggle-title">
+    <code><span class="metric-name">concourse_db_connections</span><span class="metric-labels">{<span class="metric-label">dbname</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Current number of concourse database connections
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_db_queries_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_db_queries_total" class="toggle-title">
+    <code><span class="metric-name">concourse_db_queries_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of database Concourse database queries
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_http_responses_duration_seconds" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_http_responses_duration_seconds" class="toggle-title">
+    <code><span class="metric-name">concourse_http_responses_duration_seconds</span><span class="metric-labels">{<span class="metric-label">method</span>,<span class="metric-label">route</span>,<span class="metric-label">status</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#histogram">histogram</a>
+  </label>
+  <div class="toggle-content">
+    Response time in seconds
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_jobs_scheduled_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_jobs_scheduled_total" class="toggle-title">
+    <code><span class="metric-name">concourse_jobs_scheduled_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of Concourse jobs scheduled.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_jobs_scheduling" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_jobs_scheduling" class="toggle-title">
+    <code><span class="metric-name">concourse_jobs_scheduling</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of Concourse jobs currently being scheduled.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_lidar_check_queue_size" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_lidar_check_queue_size" class="toggle-title">
+    <code><span class="metric-name">concourse_lidar_check_queue_size</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    The size of the checks queue
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_lidar_checks_enqueued_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_lidar_checks_enqueued_total" class="toggle-title">
+    <code><span class="metric-name">concourse_lidar_checks_enqueued_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of checks enqueued
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_lidar_checks_finished_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_lidar_checks_finished_total" class="toggle-title">
+    <code><span class="metric-name">concourse_lidar_checks_finished_total</span><span class="metric-labels">{<span class="metric-label">status</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of checks finished
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_lidar_checks_started_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_lidar_checks_started_total" class="toggle-title">
+    <code><span class="metric-name">concourse_lidar_checks_started_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of checks started
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_locks_held" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_locks_held" class="toggle-title">
+    <code><span class="metric-name">concourse_locks_held</span><span class="metric-labels">{<span class="metric-label">type</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Database locks held
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_tasks_wait_duration" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_tasks_wait_duration" class="toggle-title">
+    <code><span class="metric-name">concourse_tasks_wait_duration</span><span class="metric-labels">{<span class="metric-label">platform</span>,<span class="metric-label">teamId</span>,<span class="metric-label">workerTags</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#histogram">histogram</a>
+  </label>
+  <div class="toggle-content">
+    Elapsed time waiting for execution
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_tasks_waiting" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_tasks_waiting" class="toggle-title">
+    <code><span class="metric-name">concourse_tasks_waiting</span><span class="metric-labels">{<span class="metric-label">platform</span>,<span class="metric-label">teamId</span>,<span class="metric-label">workerTags</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of Concourse tasks currently waiting.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_volumes_volumes_streamed" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_volumes_volumes_streamed" class="toggle-title">
+    <code><span class="metric-name">concourse_volumes_volumes_streamed</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of volumes streamed from one worker to the other
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_workers_containers" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_workers_containers" class="toggle-title">
+    <code><span class="metric-name">concourse_workers_containers</span><span class="metric-labels">{<span class="metric-label">platform</span>,<span class="metric-label">tags</span>,<span class="metric-label">team</span>,<span class="metric-label">worker</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of containers per worker
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_workers_registered" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_workers_registered" class="toggle-title">
+    <code><span class="metric-name">concourse_workers_registered</span><span class="metric-labels">{<span class="metric-label">state</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of workers per state as seen by the database
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_workers_tasks" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_workers_tasks" class="toggle-title">
+    <code><span class="metric-name">concourse_workers_tasks</span><span class="metric-labels">{<span class="metric-label">platform</span>,<span class="metric-label">worker</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of active tasks per worker
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-concourse_workers_volumes" type="checkbox" class="toggle" checked />
+  <label for="toggle-concourse_workers_volumes" class="toggle-title">
+    <code><span class="metric-name">concourse_workers_volumes</span><span class="metric-labels">{<span class="metric-label">platform</span>,<span class="metric-label">tags</span>,<span class="metric-label">team</span>,<span class="metric-label">worker</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of volumes per worker
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_gc_duration_seconds" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_gc_duration_seconds" class="toggle-title">
+    <code><span class="metric-name">go_gc_duration_seconds</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#summary">summary</a>
+  </label>
+  <div class="toggle-content">
+    A summary of the GC invocation durations.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_goroutines" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_goroutines" class="toggle-title">
+    <code><span class="metric-name">go_goroutines</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of goroutines that currently exist.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_info" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_info" class="toggle-title">
+    <code><span class="metric-name">go_info</span><span class="metric-labels">{<span class="metric-label">version</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Information about the Go environment.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_alloc_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_alloc_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_alloc_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes allocated and still in use.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_alloc_bytes_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_alloc_bytes_total" class="toggle-title">
+    <code><span class="metric-name">go_memstats_alloc_bytes_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of bytes allocated, even if freed.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_buck_hash_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_buck_hash_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_buck_hash_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes used by the profiling bucket hash table.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_frees_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_frees_total" class="toggle-title">
+    <code><span class="metric-name">go_memstats_frees_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of frees.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_gc_cpu_fraction" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_gc_cpu_fraction" class="toggle-title">
+    <code><span class="metric-name">go_memstats_gc_cpu_fraction</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    The fraction of this program&#39;s available CPU time used by the GC since the program started.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_gc_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_gc_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_gc_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes used for garbage collection system metadata.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_heap_alloc_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_heap_alloc_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_heap_alloc_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of heap bytes allocated and still in use.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_heap_idle_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_heap_idle_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_heap_idle_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of heap bytes waiting to be used.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_heap_inuse_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_heap_inuse_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_heap_inuse_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of heap bytes that are in use.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_heap_objects" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_heap_objects" class="toggle-title">
+    <code><span class="metric-name">go_memstats_heap_objects</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of allocated objects.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_heap_released_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_heap_released_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_heap_released_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of heap bytes released to OS.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_heap_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_heap_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_heap_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of heap bytes obtained from system.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_last_gc_time_seconds" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_last_gc_time_seconds" class="toggle-title">
+    <code><span class="metric-name">go_memstats_last_gc_time_seconds</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of seconds since 1970 of last garbage collection.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_lookups_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_lookups_total" class="toggle-title">
+    <code><span class="metric-name">go_memstats_lookups_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of pointer lookups.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_mallocs_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_mallocs_total" class="toggle-title">
+    <code><span class="metric-name">go_memstats_mallocs_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of mallocs.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_mcache_inuse_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_mcache_inuse_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_mcache_inuse_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes in use by mcache structures.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_mcache_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_mcache_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_mcache_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes used for mcache structures obtained from system.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_mspan_inuse_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_mspan_inuse_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_mspan_inuse_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes in use by mspan structures.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_mspan_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_mspan_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_mspan_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes used for mspan structures obtained from system.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_next_gc_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_next_gc_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_next_gc_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of heap bytes when next garbage collection will take place.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_other_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_other_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_other_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes used for other system allocations.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_stack_inuse_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_stack_inuse_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_stack_inuse_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes in use by the stack allocator.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_stack_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_stack_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_stack_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes obtained from system for stack allocator.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_memstats_sys_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_memstats_sys_bytes" class="toggle-title">
+    <code><span class="metric-name">go_memstats_sys_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of bytes obtained from system.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-go_threads" type="checkbox" class="toggle" checked />
+  <label for="toggle-go_threads" class="toggle-title">
+    <code><span class="metric-name">go_threads</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of OS threads created.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-process_cpu_seconds_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-process_cpu_seconds_total" class="toggle-title">
+    <code><span class="metric-name">process_cpu_seconds_total</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total user and system CPU time spent in seconds.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-process_max_fds" type="checkbox" class="toggle" checked />
+  <label for="toggle-process_max_fds" class="toggle-title">
+    <code><span class="metric-name">process_max_fds</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Maximum number of open file descriptors.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-process_open_fds" type="checkbox" class="toggle" checked />
+  <label for="toggle-process_open_fds" class="toggle-title">
+    <code><span class="metric-name">process_open_fds</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Number of open file descriptors.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-process_resident_memory_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-process_resident_memory_bytes" class="toggle-title">
+    <code><span class="metric-name">process_resident_memory_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Resident memory size in bytes.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-process_start_time_seconds" type="checkbox" class="toggle" checked />
+  <label for="toggle-process_start_time_seconds" class="toggle-title">
+    <code><span class="metric-name">process_start_time_seconds</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Start time of the process since unix epoch in seconds.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-process_virtual_memory_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-process_virtual_memory_bytes" class="toggle-title">
+    <code><span class="metric-name">process_virtual_memory_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Virtual memory size in bytes.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-process_virtual_memory_max_bytes" type="checkbox" class="toggle" checked />
+  <label for="toggle-process_virtual_memory_max_bytes" class="toggle-title">
+    <code><span class="metric-name">process_virtual_memory_max_bytes</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Maximum amount of virtual memory available in bytes.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-promhttp_metric_handler_requests_in_flight" type="checkbox" class="toggle" checked />
+  <label for="toggle-promhttp_metric_handler_requests_in_flight" class="toggle-title">
+    <code><span class="metric-name">promhttp_metric_handler_requests_in_flight</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#gauge">gauge</a>
+  </label>
+  <div class="toggle-content">
+    Current number of scrapes being served.
+  </div>
+</div>
+
+<div class="toggleable metric">
+  <input id="toggle-promhttp_metric_handler_requests_total" type="checkbox" class="toggle" checked />
+  <label for="toggle-promhttp_metric_handler_requests_total" class="toggle-title">
+    <code><span class="metric-name">promhttp_metric_handler_requests_total</span><span class="metric-labels">{<span class="metric-label">code</span>}</span></code>
+    <a class="metric-type" href="https://prometheus.io/docs/concepts/metric_types/#counter">counter</a>
+  </label>
+  <div class="toggle-content">
+    Total number of scrapes by HTTP status code.
+  </div>
+</div></p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15</span>
+              
+
+              <a href="operation.html">Operation</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.2</span>
+              
+
+              <a href="tracing.html">Tracing</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/microsoft-auth.html b/microsoft-auth.html
new file mode 100644
index 00000000..0a38dda5
--- /dev/null
+++ b/microsoft-auth.html
@@ -0,0 +1,400 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Microsoft auth - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html"  class="active">Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.2</span><a href="configuring-auth.html"  class="active">Configuring Auth</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.2.1</td>
+            <td class="title-cell"><a href="local-auth.html" >Local User auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.2</td>
+            <td class="title-cell"><a href="github-auth.html" >GitHub auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.3</td>
+            <td class="title-cell"><a href="gitlab-auth.html" >GitLab auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.4</td>
+            <td class="title-cell"><a href="bitbucket-cloud-auth.html" >BitBucket Cloud auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.5</td>
+            <td class="title-cell"><a href="cf-uaa-auth.html" >CF/UAA auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.6</td>
+            <td class="title-cell"><a href="ldap-auth.html" >LDAP auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.7</td>
+            <td class="title-cell"><a href="microsoft-auth.html"  class="self">Microsoft auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.8</td>
+            <td class="title-cell"><a href="generic-oidc-auth.html" >Generic OIDC auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.9</td>
+            <td class="title-cell"><a href="generic-oauth.html" >Generic oAuth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2.10</td>
+            <td class="title-cell"><a href="generic-saml-auth.html" >Generic SAML auth</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_microsoft-auth">
+  
+  <h1 class="section-header"><a class="anchor-target" name="microsoft-auth" href="#microsoft-auth"></a><span class="section-number">1.3.2.7 </span>Microsoft auth</h1>
+  
+
+  <p>A Concourse server can authenticate against Microsoft Azure AD to leverage its permission model.</p>
+
+  
+    
+      <div class="section" id="section_microsoft-authentication">
+  
+  <h2 class="section-header"><a class="anchor-target" name="microsoft-authentication" href="#microsoft-authentication"></a>Authentication</h2>
+  
+
+  <p>You&#39;ll need to <a href="https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade">register a new application on Azure</a>.</p><p>The &#34;Callback URL&#34; must be the URL of your Concourse server with <code>/sky/issuer/callback</code> appended. This address must be reachable by Microsoft - it can&#39;t be <code>localhost</code>.</p><p>For example, Concourse&#39;s own CI server&#39;s callback URL would be:</p><pre><code class="language-bash">https://ci.concourse-ci.org/sky/issuer/callback</code></pre><p>You will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the <a href="concourse-web.html"><code>web</code> node</a> by setting the following env:</p><pre><code class="language-bash">CONCOURSE_MICROSOFT_CLIENT_ID=myclientid
+CONCOURSE_MICROSOFT_CLIENT_SECRET=myclientsecret</code></pre><p>Consult <code>concourse web --help</code> for a full list of flags with descriptions.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_bitbucket-cloud-authorization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="bitbucket-cloud-authorization" href="#bitbucket-cloud-authorization"></a>Authorization</h2>
+  
+
+  <p><div class="warning">
+  Individual user auth is disabled due to a quirk with with Microsoft returning unique IDs but non-unique usernames
+</div></p><p>Groups can be authorized for a team by passing the following flags to <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>:</p><dl>
+  
+  <dt><code>--microsoft-group=GROUP_NAME</code></dt>
+    <dd><p>Authorize an entire group&#39;s members.</p></dd>
+  
+</dl><p>For example:</p><pre><code class="language-bash">$ fly set-team -n my-team \
+    --microsoft-group my-group</code></pre><p>...or via <code>--config</code> for <a href="managing-teams.html#setting-roles">setting user roles</a>:</p><pre><code class="language-bash">roles:
+- name: member
+  microsoft:
+    groups: [&#34;my-groups&#34;]</code></pre>
+
+  
+    
+      <div class="section" id="section_configuring-main-team-authorization">
+  
+  <h3 class="section-header"><a class="anchor-target" name="configuring-main-team-authorization" href="#configuring-main-team-authorization"></a>Configuring <code>main</code> Team Authorization</h3>
+  
+
+  <p>Microsoft groups can be added to the <a href="main-team.html"><code>main</code> team</a> authorization config by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_MAIN_TEAM_MICROSOFT_GROUP=my-group</code></pre><p>Multiple teams may be specified by comma-separating them.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.2.6</span>
+              
+
+              <a href="ldap-auth.html">LDAP auth</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.2.8</span>
+              
+
+              <a href="generic-oidc-auth.html">Generic OIDC auth</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/modifier-and-hook-steps.html b/modifier-and-hook-steps.html
new file mode 100644
index 00000000..11f9f36d
--- /dev/null
+++ b/modifier-and-hook-steps.html
@@ -0,0 +1,445 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Modifier And Hook Steps - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="self">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="self">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_modifier-and-hook-steps">
+  
+  <h1 class="section-header"><a class="anchor-target" name="modifier-and-hook-steps" href="#modifier-and-hook-steps"></a><span class="section-number">1.11.9 </span>Modifier And Hook Steps</h1>
+  
+
+  <p>The following steps can be added to any other <a href="steps.html">step</a> type.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.11.9.1</span>
+      <a href="across-step.html"><code>across</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.2</span>
+      <a href="timeout-step.html"><code>timeout</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.3</span>
+      <a href="attempts-step.html"><code>attempts</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.4</span>
+      <a href="tags-step.html"><code>tags</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.5</span>
+      <a href="on-success-step.html"><code>on_success</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.6</span>
+      <a href="on-failure-hook.html"><code>on_failure</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.7</span>
+      <a href="on-abort-hook.html"><code>on_abort</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.8</span>
+      <a href="on-error-hook.html"><code>on_error</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.9</span>
+      <a href="ensure-hook.html"><code>ensure</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.8</span>
+              
+
+              <a href="try-step.html"><code>try</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.1</span>
+              
+
+              <a href="across-step.html"><code>across</code> Step Modifier</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/multi-branch-workflows.html b/multi-branch-workflows.html
new file mode 100644
index 00000000..e77e15b2
--- /dev/null
+++ b/multi-branch-workflows.html
@@ -0,0 +1,554 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Multi-Branch Workflows - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html" >Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html"  class="active">Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.2</span><a href="git-guides.html"  class="active">Git Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.2.1</td>
+            <td class="title-cell"><a href="basic-git-operations.html" >Basic Git Operations</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2.2</td>
+            <td class="title-cell"><a href="multi-branch-workflows.html"  class="self">Multi-Branch Workflows</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_multi-branch-workflows">
+  
+  <h1 class="section-header"><a class="anchor-target" name="multi-branch-workflows" href="#multi-branch-workflows"></a><span class="section-number">1.14.2.2 </span>Multi-Branch Workflows</h1>
+  
+
+  <p>Teams may make use of multiple branches for their development. For instance, some teams create feature branches while working on new functionality - once this functionality is ready, the branch will be merged into the main branch and the feature branch will be deleted.</p><p>While a feature is under development, you&#39;ll often want to run tests against the feature branch and possibly deploy to a staging environment. To model this in Concourse, you&#39;ll need to have a pipeline for each active feature branch. Manually setting (and eventually archiving) a pipeline for each feature branch would be quite a burden. For this type of workflow, Concourse has a few important tools to help you out: the <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>, <a href="across-step.html#schema.across"><code class="schema-attribute-name"><bold>across</bold></code></a>, and <a href="instanced-pipelines.html">instanced pipelines</a>.</p><div class="warning">
+  <p><a href="across-step.html#schema.across"><code class="schema-attribute-name"><bold>across</bold></code></a> and <a href="instanced-pipelines.html">instanced pipelines</a> are both experimental features, and must be enabled with the feature flags <code>CONCOURSE_ENABLE_ACROSS_STEP</code> and <code>CONCOURSE_ENABLE_PIPELINE_INSTANCES</code>, respectively.</p>
+</div><p>In this guide, we&#39;ll cover:</p><ol>
+
+  <li><p>Writing a pipeline to <a href="multi-branch-workflows.html#multi-branch-test-build-deploy">Test, Build &amp; Deploy</a> a branch to a staging environment. We&#39;ll use <a href="https://www.terraform.io/">Terraform</a> for our deployment</p></li>
+
+  <li><p><a href="multi-branch-workflows.html#multi-branch-tracking-branches">Tracking Branches</a> in a repository; for each branch, we&#39;ll set a pipeline (using the <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a> and <a href="across-step.html#schema.across"><code class="schema-attribute-name"><bold>across</bold></code></a>)</p></li>
+
+  <li><p>Automatically <a href="multi-branch-workflows.html#multi-branch-cleaning-up">Cleaning Up Old Workspaces</a> after branches get merged or deleted</p></li>
+
+</ol>
+
+  
+    
+      <div class="section" id="section_multi-branch-test-build-deploy">
+  
+  <h2 class="section-header"><a class="anchor-target" name="multi-branch-test-build-deploy" href="#multi-branch-test-build-deploy"></a>Test, Build &amp; Deploy</h2>
+  
+
+  <p>We&#39;ll start out by defining the pipeline that should run for each active branch. For this example, we&#39;ll be working with the following <a href="https://github.com/concourse/examples/tree/master/apps/golang">sample Go application</a>.</p><p>Our pipeline will have three stages:</p><ol>
+
+  <li><p>Run unit tests</p></li>
+
+  <li><p>Build and upload a binary to a blobstore (in our case, we&#39;ll use <a href="https://cloud.google.com/storage">Google Cloud Storage</a>)</p></li>
+
+  <li><p>Trigger a <code>terraform apply</code> to deploy our app to a staging environment. The <a href="https://github.com/concourse/examples/blob/master/terraform/staging/main.tf">Terraform module</a> we&#39;ll use here doesn&#39;t actually provision any infrastructure, and is just used as an example</p></li>
+
+</ol><p>Since the pipeline config is intended to be used as a template for multiple different branches, we can use <a href="vars.html">Vars</a> to parameterize the config. In particular, we&#39;ll use the vars <code>((feature))</code> and <code>((branch))</code>, which represent the name of the feature and the name of the branch, respectively.</p><p>Below is the full pipeline config:</p><p><a href="https://github.com/concourse/examples/blob/master/pipelines/multi-branch/template.yml"><code>examples/pipelines/multi-branch/template.yml</code></a> <pre><code class="language-yaml">resource_types:
+- name: terraform
+  type: registry-image
+  source:
+    repository: ljfranklin/terraform-resource
+
+- name: gcs
+  type: registry-image
+  source:
+    repository: frodenas/gcs-resource
+
+resources:
+- name: branch
+  type: git
+  source:
+    uri: https://github.com/concourse/examples
+    branch: ((branch))
+
+- name: examples
+  type: git
+  source:
+    uri: https://github.com/concourse/examples
+
+- name: build-artifact
+  type: gcs
+  source:
+    bucket: concourse-examples
+    json_key: ((gcp_service_account_key))
+    regexp: multi-branch/features/((feature))/my-app-(.&#43;)\.tgz
+
+- name: staging-env
+  type: terraform
+  source:
+    env_name: ((feature))
+    backend_type: gcs
+    backend_config:
+      bucket: concourse-examples
+      prefix: multi-branch/terraform
+      credentials: ((gcp_service_account_key))
+
+jobs:
+- name: test
+  build_log_retention:
+    builds: 50
+  plan:
+  - in_parallel:
+    - get: branch
+      trigger: true
+    - get: examples
+  - task: unit
+    file: examples/tasks/go-test.yml
+    input_mapping: {repo: branch}
+    params: {MODULE: apps/golang}
+
+- name: build
+  build_log_retention:
+    builds: 50
+  plan:
+  - in_parallel:
+    - get: branch
+      passed: [test]
+      trigger: true
+    - get: examples
+  - task: build
+    file: examples/tasks/go-build.yml
+    params:
+      MODULE: apps/golang
+      BINARY_NAME: my-app
+    input_mapping: {repo: branch}
+  - put: build-artifact
+    params: {file: &#34;binary/my-app-*.tgz&#34;}
+
+- name: deploy
+  build_log_retention:
+    builds: 50
+  plan:
+  - in_parallel:
+    - get: build-artifact
+      passed: [build]
+      trigger: true
+    - get: examples
+  - load_var: bundle_url
+    file: build-artifact/url
+  - put: staging-env
+    params:
+      terraform_source: examples/terraform/staging
+      vars: {bundle_url: ((.:bundle_url))}
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_multi-branch-tracking-branches">
+  
+  <h2 class="section-header"><a class="anchor-target" name="multi-branch-tracking-branches" href="#multi-branch-tracking-branches"></a>Tracking Branches</h2>
+  
+
+  <p>In addition to the branch pipeline template, we&#39;ll also need a pipeline to track the list of branches and set a pipeline for each one.</p><p>To track the list of branches in a repository, we can use <a href="https://github.com/aoldershaw/git-branches-resource">aoldershaw/git-branches-resource</a>. This <a href="resource-types.html"><code>resource_type</code></a> emits a new <a href="resource-versions.html">resource version</a> whenever a branch is created or deleted. It also lets us filter the list of branches by a regular expression. In this case, let&#39;s assume our feature branches match the regular expression <code>feature/.*</code>.</p><p>Below is the full pipeline config for this tracker pipeline:</p><p><a href="https://github.com/concourse/examples/blob/master/pipelines/multi-branch/tracker.yml"><code>examples/pipelines/multi-branch/tracker.yml</code></a> <pre><code class="language-yaml">resource_types:
+- name: git-branches
+  type: registry-image
+  source:
+    repository: aoldershaw/git-branches-resource
+
+resources:
+- name: feature-branches
+  type: git-branches
+  source:
+    uri: https://github.com/concourse/examples
+    # The &#34;(?P&lt;name&gt;pattern)&#34; syntax defines a named capture group.
+    # aoldershaw/git-branches-resource emits the value of each named capture
+    # group under the `groups` key.
+    #
+    # e.g. feature/some-feature ==&gt; {&#34;groups&#34;: {&#34;feature&#34;: &#34;some-feature&#34;}}
+    branch_regex: &#39;feature/(?P&lt;feature&gt;.*)&#39;
+
+- name: examples
+  type: git
+  source:
+    uri: https://github.com/concourse/examples
+
+jobs:
+- name: set-feature-pipelines
+  plan:
+  - in_parallel:
+    - get: feature-branches
+      trigger: true
+    - get: examples
+  - load_var: branches
+    file: feature-branches/branches.json
+  - across:
+    - var: branch
+      values: ((.:branches))
+    set_pipeline: dev
+    file: examples/pipelines/multi-branch/template.yml
+    instance_vars: {feature: ((.:branch.groups.feature))}
+    vars: {branch: ((.:branch.name))}</code></pre></p><p>We set each pipeline as an <a href="instanced-pipelines.html">instanced pipeline</a> - this will result in Concourse grouping all of the related <code>dev</code> pipelines in the UI.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_multi-branch-cleaning-up">
+  
+  <h2 class="section-header"><a class="anchor-target" name="multi-branch-cleaning-up" href="#multi-branch-cleaning-up"></a>Cleaning Up Old Workspaces</h2>
+  
+
+  <p>With the setup described in <a href="multi-branch-workflows.html#multi-branch-tracking-branches">Tracking Branches</a>, Concourse will automatically archive any pipelines for branches that get removed. However, Concourse doesn&#39;t know that it should destroy Terraform workspaces when a branch is removed. To accomplish this, we can yet again make use of the <a href="https://github.com/ljfranklin/terraform-resource">Terraform resource</a> to destroy these workspaces. We&#39;ll add another job to the tracker pipeline that figures out which workspaces don&#39;t belong to an active branch and destroy them.</p><p><a href="https://github.com/concourse/examples/blob/master/pipelines/multi-branch/tracker.yml"><code>examples/pipelines/multi-branch/tracker.yml</code></a> <pre><code class="language-yaml">resource_types:
+- name: git-branches
+  ...
+
+- name: terraform
+  type: registry-image
+  source:
+    repository: ljfranklin/terraform-resource
+
+resources:
+- name: feature-branches
+  ...
+
+- name: examples
+  ...
+
+- name: staging-env
+  type: terraform
+  source:
+    backend_type: gcs
+    backend_config: &amp;terraform_backend_config
+      bucket: concourse-examples
+      prefix: multi-branch/terraform
+      credentials: ((gcp_service_account_key))
+
+jobs:
+- name: set-feature-pipelines
+  ...
+
+- name: cleanup-inactive-workspaces
+  plan:
+  - in_parallel:
+    - get: feature-branches
+      passed: [set-feature-pipelines]
+      trigger: true
+    - get: examples
+  - task: find-inactive-workspaces
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: {repository: hashicorp/terraform}
+      inputs:
+      - name: feature-branches
+      outputs:
+      - name: extra-workspaces
+      params:
+        TERRAFORM_BACKEND_CONFIG:
+          gcs: *terraform_backend_config
+      run:
+        path: sh
+        args:
+        - -c
+        - |
+          set -euo pipefail
+
+          apk add -q jq
+
+          active_features=&#34;$(jq &#39;[.[].groups.feature]&#39; feature-branches/branches.json)&#34;
+
+          jq -n &#34;{terraform: {backend: $TERRAFORM_BACKEND_CONFIG}}&#34; &gt; backend.tf.json
+          terraform init
+
+          # List all active workspaces, ignoring the default workspace
+          active_workspaces=&#34;$(terraform workspace list | grep -v &#39;^[*]&#39; | tr -d &#39; &#39; | jq --raw-input --slurp &#39;split(&#34;\n&#34;) | map(select(. != &#34;&#34;))&#39;)&#34;
+
+          jq -n &#34;$active_workspaces - $active_features&#34; &gt; extra-workspaces/workspaces.json
+  - load_var: extra_workspaces
+    file: extra-workspaces/workspaces.json
+  - across:
+    - var: workspace
+      values: ((.:extra_workspaces))
+    put: staging-env
+    params:
+      terraform_source: examples/terraform/staging
+      env_name: ((.:workspace))
+      action: destroy
+    get_params:
+      action: destroy</code></pre></p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.2.1</span>
+              
+
+              <a href="basic-git-operations.html">Basic Git Operations</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.3</span>
+              
+
+              <a href="container-image-guides.html">Container Image Guides</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/nodejs-example.html b/nodejs-example.html
new file mode 100644
index 00000000..9baf2605
--- /dev/null
+++ b/nodejs-example.html
@@ -0,0 +1,288 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Nodejs application testing example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html"  class="self">Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_nodejs-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="nodejs-example" href="#nodejs-example"></a><span class="section-number">2.13 </span>Nodejs application testing example</h1>
+  
+
+  <p>You can run the tests for a Nodejs application.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/nodejs"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: repo
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/nodejs/nodejs.org.git
+
+- name: node-image
+  type: registry-image
+  icon: docker
+  source:
+    repository: node
+    tag: 22-slim
+
+jobs:
+- name: test
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: node-image
+  - get: repo
+    trigger: true
+  - task: test
+    image: node-image
+    config:
+      inputs:
+      - name: repo
+      platform: linux
+      run:
+        path: bash
+        dir: repo
+        args:
+          - -cex
+          - |
+            npm install -g pnpm
+            pnpm install --frozen-lockfile
+            pnpm run test
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.12</span>
+              
+
+              <a href="java-example.html">Java application testing example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.14</span>
+              
+
+              <a href="php-example.html">PHP application testing example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/observation.html b/observation.html
new file mode 100644
index 00000000..8d376df9
--- /dev/null
+++ b/observation.html
@@ -0,0 +1,316 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Observation - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html"  class="self">Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.16</span><a href="observation.html"  class="self">Observation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.16.1</td>
+            <td class="title-cell"><a href="observation.html#dashboard" >The Dashboard</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16.2</td>
+            <td class="title-cell"><a href="observation.html#ccxml" ><code>cc.xml</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16.3</td>
+            <td class="title-cell"><a href="observation.html#badges" >Badges</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16.4</td>
+            <td class="title-cell"><a href="observation.html#pipeline-visibility" >Pipeline Visibility</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_observation">
+  
+  <h1 class="section-header"><a class="anchor-target" name="observation" href="#observation"></a><span class="section-number">1.16 </span>Observation</h1>
+  
+
+  <p>This section outlines everything you need to know for observing the state of your pipelines.</p>
+
+  
+    
+      <div class="section" id="section_dashboard">
+  
+  <h2 class="section-header"><a class="anchor-target" name="dashboard" href="#dashboard"></a>The Dashboard</h2>
+  
+
+  <p>The dashboard, available at the default route (<code>/</code>), provides a bird&#39;s-eye view of the Concourse cluster. All visible pipelines across all teams are listed here. A high-density (HD) view is available at <code>/hd</code>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_ccxml">
+  
+  <h2 class="section-header"><a class="anchor-target" name="ccxml" href="#ccxml"></a><code>cc.xml</code></h2>
+  
+
+  <p>The Concourse API can return the status of a team&#39;s pipelines in a format compatible with tools like <a href="http://ccmenu.org/">CCMenu</a>. This endpoint is available at the following route:</p><pre>/api/v1/teams/{team}/cc.xml</pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_badges">
+  
+  <h2 class="section-header"><a class="anchor-target" name="badges" href="#badges"></a>Badges</h2>
+  
+
+  <p>The Concourse API supports returning SVG badges indicating the status of a job:</p><pre>/api/v1/teams/{team}/pipelines/{pipeline}/jobs/{job}/badge</pre><p>...and for an entire pipeline:</p><pre>/api/v1/teams/{team}/pipelines/{pipeline}/badge</pre><p>This can be used to annotate your READMEs with a build status badge like so:</p><pre><code class="language-md">![CI](https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge)</code></pre><p>...which should render the following:</p><p><img src="https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge" alt="" /></p><p>You can also specify a custom title for the badge with a <code>title</code> query parameter:</p><pre>/api/v1/teams/{team}/pipelines/{pipeline}/badge?title=hello</pre><p>or</p><pre>/api/v1/teams/{team}/pipelines/{pipeline}/jobs/{job}/badge?title=hello</pre><p>...which should render the following:</p><p><img src="https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge?title=hello" alt="" /></p><p>If you want to have the image link to your pipeline/job in a README, you can make it like so:</p><pre><code class="language-html">&lt;a href=&#34;https://ci.concourse-ci.org/teams/main/pipelines/concourse/jobs/unit/badge&#34;&gt;
+  &lt;img src=&#34;https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge&#34; alt=&#34;Concourse Pipeline Status&#34;&gt;
+&lt;/a&gt;</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_pipeline-visibility">
+  
+  <h2 class="section-header"><a class="anchor-target" name="pipeline-visibility" href="#pipeline-visibility"></a>Pipeline Visibility</h2>
+  
+
+  <p>Pipelines may be exposed so that they can be monitored without having to authenticate. For more information, see <a href="exposing.html">Pipeline &amp; Build Visibility</a>.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15</span>
+              
+
+              <a href="operation.html">Operation</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.17</span>
+              
+
+              <a href="internals.html">Internals</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/on-abort-hook.html b/on-abort-hook.html
new file mode 100644
index 00000000..ffa15510
--- /dev/null
+++ b/on-abort-hook.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>on_abort Step Hook - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html"  class="self"><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="on-abort-hook.html#schema.on_abort"><code class="schema-attribute-name"><bold>on_abort</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_on-abort-hook">
+  
+  <h1 class="section-header"><a class="anchor-target" name="on-abort-hook" href="#on-abort-hook"></a><span class="section-number">1.11.9.7 </span><code>on_abort</code> Step Hook</h1>
+  
+
+  <p>A hook step to execute if the build is aborted and the parent step was running and then terminated.</p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.on_abort" type="checkbox" class="toggle" />
+  <label for="toggle-schema.on_abort" class="toggle-title">
+    <a id="schema.on_abort"></a>
+
+    <code><a class="attribute-name" href="#schema.on_abort">on_abort</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-2eb26048f01c848ce54394851cfd8f4e2b713697" type="checkbox" class="toggle" />
+  <label for="toggle-2eb26048f01c848ce54394851cfd8f4e2b713697" class="toggle-title">Cleaning up <code>on_abort</code></label>
+  <div class="toggle-content">
+    <p>The following will perform the <code>cleanup</code> task only if the build is aborted while the <code>unit</code> task was running:</p><pre><code class="language-yaml">plan:
+- get: foo
+- task: unit
+  file: foo/unit.yml
+  on_abort:
+    task: cleanup
+    file: foo/cleanup.yml</code></pre>
+  </div>
+</div>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.6</span>
+              
+
+              <a href="on-failure-hook.html"><code>on_failure</code> Step Hook</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.8</span>
+              
+
+              <a href="on-error-hook.html"><code>on_error</code> Step Hook</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/on-error-hook.html b/on-error-hook.html
new file mode 100644
index 00000000..8642198c
--- /dev/null
+++ b/on-error-hook.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>on_error Step Hook - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html"  class="self"><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="on-error-hook.html#schema.on_error"><code class="schema-attribute-name"><bold>on_error</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_on-error-hook">
+  
+  <h1 class="section-header"><a class="anchor-target" name="on-error-hook" href="#on-error-hook"></a><span class="section-number">1.11.9.8 </span><code>on_error</code> Step Hook</h1>
+  
+
+  <p>A hook step to execute after the parent step if the parent step terminates abnormally in any way other than those handled by the <a href="on-abort-hook.html#schema.on_abort"><code class="schema-attribute-name"><bold>on_abort</bold></code></a> or <a href="on-failure-hook.html#schema.on_failure"><code class="schema-attribute-name"><bold>on_failure</bold></code></a>. This covers scenarios as broad as configuration mistakes, temporary network issues with the workers, or running longer than a <a href="timeout-step.html#schema.timeout"><code class="schema-attribute-name"><bold>timeout</bold></code></a>.</p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.on_error" type="checkbox" class="toggle" />
+  <label for="toggle-schema.on_error" class="toggle-title">
+    <a id="schema.on_error"></a>
+
+    <code><a class="attribute-name" href="#schema.on_error">on_error</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-6f0ff2b0ae1db18da74dca45fe1c87f0afd6b6a2" type="checkbox" class="toggle" />
+  <label for="toggle-6f0ff2b0ae1db18da74dca45fe1c87f0afd6b6a2" class="toggle-title">Sending a notification</label>
+  <div class="toggle-content">
+    <p>Until notifications become first-class (<a href="https://github.com/concourse/rfcs/pull/28">RFC #28</a>, this step can be used to notify folks if their builds errored out:</p><pre><code class="language-yaml">plan:
+- do:
+  - get: ci
+  - task: unit
+    file: ci/unit.yml
+  on_error:
+    put: slack</code></pre>
+  </div>
+</div>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.7</span>
+              
+
+              <a href="on-abort-hook.html"><code>on_abort</code> Step Hook</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.9</span>
+              
+
+              <a href="ensure-hook.html"><code>ensure</code> Step Hook</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/on-failure-hook.html b/on-failure-hook.html
new file mode 100644
index 00000000..11d5c160
--- /dev/null
+++ b/on-failure-hook.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>on_failure Step Hook - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html"  class="self"><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="on-failure-hook.html#schema.on_failure"><code class="schema-attribute-name"><bold>on_failure</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_on-failure-hook">
+  
+  <h1 class="section-header"><a class="anchor-target" name="on-failure-hook" href="#on-failure-hook"></a><span class="section-number">1.11.9.6 </span><code>on_failure</code> Step Hook</h1>
+  
+
+  <p>A hook step to execute if the parent step fails.</p><p>This does not &#34;recover&#34; the failure - it will still fail even if the hook step succeeds. <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.on_failure" type="checkbox" class="toggle" />
+  <label for="toggle-schema.on_failure" class="toggle-title">
+    <a id="schema.on_failure"></a>
+
+    <code><a class="attribute-name" href="#schema.on_failure">on_failure</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-48faea67145003de4e14afdd50c71263f15eca63" type="checkbox" class="toggle" />
+  <label for="toggle-48faea67145003de4e14afdd50c71263f15eca63" class="toggle-title">Alerting on failure</label>
+  <div class="toggle-content">
+    <p>The following will perform the <code>alert</code> task only if the <code>unit</code> task fails:</p><pre><code class="language-yaml">plan:
+- get: foo
+- task: unit
+  file: foo/unit.yml
+  on_failure:
+    task: alert
+    file: foo/alert.yml</code></pre>
+  </div>
+</div>
+  </div>
+</div></p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.5</span>
+              
+
+              <a href="on-success-step.html"><code>on_success</code> Step Hook</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.7</span>
+              
+
+              <a href="on-abort-hook.html"><code>on_abort</code> Step Hook</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/on-success-step.html b/on-success-step.html
new file mode 100644
index 00000000..ecf1d9a6
--- /dev/null
+++ b/on-success-step.html
@@ -0,0 +1,413 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>on_success Step Hook - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html"  class="self"><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="on-success-step.html#schema.on_success"><code class="schema-attribute-name"><bold>on_success</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_on-success-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="on-success-step" href="#on-success-step"></a><span class="section-number">1.11.9.5 </span><code>on_success</code> Step Hook</h1>
+  
+
+  <p>A hook step to execute if the parent step succeeds.</p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.on_success" type="checkbox" class="toggle" />
+  <label for="toggle-schema.on_success" class="toggle-title">
+    <a id="schema.on_success"></a>
+
+    <code><a class="attribute-name" href="#schema.on_success">on_success</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-a703a81bf9b821cd03f8d101769c3b08ee0a8d12" type="checkbox" class="toggle" />
+  <label for="toggle-a703a81bf9b821cd03f8d101769c3b08ee0a8d12" class="toggle-title">Running on success</label>
+  <div class="toggle-content">
+    <p>The following will perform the second task only if the first one succeeds:</p><pre><code class="language-yaml">plan:
+- get: foo
+- task: unit
+  file: foo/unit.yml
+  on_success:
+    task: alert
+    file: foo/alert.yml</code></pre><p>Note that this is semantically equivalent to the following:</p><pre><code class="language-yaml">plan:
+- get: foo
+- task: unit
+  file: foo/unit.yml
+- task: alert
+  file: foo/alert.yml</code></pre><p>The <code>on_success</code> hook is provided mainly for cases where there is an equivalent <a href="on-failure-hook.html#schema.on_failure"><code class="schema-attribute-name"><bold>on_failure</bold></code></a>, and having them next to each other is more clear.</p>
+  </div>
+</div>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.4</span>
+              
+
+              <a href="tags-step.html"><code>tags</code> Step Modifier</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.6</span>
+              
+
+              <a href="on-failure-hook.html"><code>on_failure</code> Step Hook</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/opa.html b/opa.html
new file mode 100644
index 00000000..38a7c2e2
--- /dev/null
+++ b/opa.html
@@ -0,0 +1,524 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Open Policy Agent Integration - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html"  class="self">Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.7</span><a href="opa.html"  class="self">Open Policy Agent Integration</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.7.1</td>
+            <td class="title-cell"><a href="opa.html#configure-opa" >Configuring Concourse</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7.2</td>
+            <td class="title-cell"><a href="opa.html#writing-opa-rules" >Writing OPA Rules</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7.3</td>
+            <td class="title-cell"><a href="opa.html#special-actions" >Special Actions</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_opa">
+  
+  <h1 class="section-header"><a class="anchor-target" name="opa" href="#opa"></a><span class="section-number">1.15.7 </span>Open Policy Agent Integration</h1>
+  
+
+  <blockquote class="aside"><p>The <a href="https://www.openpolicyagent.org/docs/latest/">Open Policy Agent</a> (OPA, pronounced “oh-pa”) is an open source, general-purpose policy engine that unifies policy enforcement across the stack.</p></blockquote><p>OPA allows you to create arbitrary rules within Concourse without having to add a new feature to Concourse. You could even recreate Concourse&#39;s <a href="user-roles.html">RBAC system</a> using OPA.</p><p>More likely use-cases are to enforce rules your organization may have, such as not using certain container images or disallowing the use of privileged workloads. With OPA you can be as general or fine-grained as you want, enforcing these rules at the team or pipeline level.</p><p>The next few sections explain how to <a href="opa.html#configure-opa">configure Concourse</a> to talk to an OPA server and how to <a href="opa.html#writing-opa-rules">write OPA rules</a> for Concourse.</p>
+
+  
+    
+      <div class="section" id="section_configure-opa">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configure-opa" href="#configure-opa"></a>Configuring Concourse</h2>
+  
+
+  <p>There are four configuration options you need to set on the <code>concourse web</code> nodes to have them interact with OPA.</p><ul>
+
+  <li><p><code>CONCOURSE_OPA_URL</code>: The OPA policy check endpoint. Should point to a specific <code>package/rule</code> that contains all Concourse rules for your cluster.</p><p><em>Example:</em> <code>http://opa-endpoint.com/v1/data/concourse/decision</code></p></li>
+
+  <li><p><code>CONCOURSE_POLICY_CHECK_FILTER_HTTP_METHOD</code>: API http methods to go through policy check. You will need to make sure these match up with an API action in the next two configuration options.</p><p><em>Example:</em> <code>PUT,POST</code></p></li>
+
+  <li><p><code>CONCOURSE_POLICY_CHECK_FILTER_ACTION</code>: Actions in this list will go through policy check.</p><p><em>Example:</em> <code>ListWorkers,ListContainers</code></p></li>
+
+  <li><p><code>CONCOURSE_POLICY_CHECK_FILTER_ACTION_SKIP</code>: Actions in this list will not go through policy check</p><p><em>Example:</em> <code>PausePipeline,UnpausePipeline</code></p></li>
+
+</ul><p>For the last three configuration options you can refer to the <a href="https://github.com/concourse/concourse/blob/master/atc/routes.go">this list of routes</a> for a list of API actions and their respective HTTP method. There are also some <a href="opa.html#special-actions">Special Actions</a> not directly in the API.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_writing-opa-rules">
+  
+  <h2 class="section-header"><a class="anchor-target" name="writing-opa-rules" href="#writing-opa-rules"></a>Writing OPA Rules</h2>
+  
+
+  <p>On the OPA server you&#39;ll need to create a package and policy for Concourse. This should match up with the endpoint provided to Concourse. The <a href="https://www.openpolicyagent.org/docs/latest/">OPA documentation</a> has a good guide explaining how to generally write OPA rules and setup an OPA server.</p><p>For any actions that Concourse has been configured to filter it will send a JSON request to the OPA server with the following details. Top-level data directly under the <code>input</code> key will be present for most actions. The information under the <code>data</code> key will differ based on the action being checked.</p><p>This sample JSON payload is what OPA is sent when a user sets a pipeline. The <code>data</code> key contains the pipeline in JSON format. <pre><code class="language-json">{
+  &#34;input&#34;: {
+    &#34;service&#34;: &#34;concourse&#34;,
+    &#34;cluster_name&#34;: &#34;dev&#34;,
+    &#34;cluster_version&#34;: &#34;7.4.0&#34;,
+    &#34;http_method&#34;: &#34;PUT&#34;,
+    &#34;action&#34;: &#34;SaveConfig&#34;,
+    &#34;user&#34;: &#34;test&#34;,
+    &#34;team&#34;: &#34;main&#34;,
+    &#34;pipeline&#34;: &#34;check-pipeline&#34;,
+    &#34;data&#34;: {
+      &#34;jobs&#34;: [
+        {
+          &#34;name&#34;: &#34;test&#34;,
+          &#34;plan&#34;: [
+            {
+              &#34;get&#34;: &#34;tiny&#34;
+            },
+            {
+              &#34;config&#34;: {
+                &#34;image_resource&#34;: {
+                  &#34;source&#34;: {
+                    &#34;repository&#34;: &#34;busybox&#34;
+                  },
+                  &#34;type&#34;: &#34;registry-image&#34;
+                },
+                &#34;platform&#34;: &#34;linux&#34;,
+                &#34;run&#34;: {
+                  &#34;args&#34;: [
+                    &#34;-exc&#34;,
+                    &#34;echo hello&#34;
+                  ],
+                  &#34;path&#34;: &#34;sh&#34;
+                }
+              },
+              &#34;task&#34;: &#34;a-task&#34; }
+] } ] } } }</code></pre></p><p>An OPA rule can respond to Concourse with three fields:</p><ul>
+
+  <li><p><code>allowed</code> <em>(required)</em>: Boolean type. Setting to <code>False</code> will deny the action unless the <code>block</code> field is <code>False</code>.</p></li>
+
+  <li><p><code>block</code> <em>(optional)</em>: Boolean type. If set to <code>False</code> and <code>allowed</code> is <code>True</code> this creates a soft-policy enforcement. The action will be allowed and the <code>reasons</code> will still be printed to the web UI like a warning message.</p><p>Not setting <code>block</code> is the same as setting <code>&#34;block&#34;: true</code>.</p></li>
+
+  <li><p><code>reasons</code> <em>(optional)</em>: List of string type. If an action is denied based on the <code>allowed</code> field then the reason(s) will be displayed in the UI.</p></li>
+
+</ul><p>Here is an example OPA policy. By default it will allow whatever action it has been sent. It will deny the action if one or more of the three deny rules are true.</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>concourse.rego</code>
+  </div>
+
+  <pre><code class="language-yaml">package concourse
+
+default decision = {&#34;allowed&#34;: true}
+
+decision = {&#34;allowed&#34;: false, &#34;reasons&#34;: reasons} {
+  count(deny) &gt; 0
+  reasons := deny
+}
+
+deny[&#34;cannot use docker-image types&#34;] {
+  input.action == &#34;UseImage&#34;
+  input.data.image_type == &#34;docker-image&#34;
+}
+
+deny[&#34;cannot run privileged tasks&#34;] {
+  input.action == &#34;SaveConfig&#34;
+  input.data.jobs[_].plan[_].privileged
+}
+
+deny[&#34;cannot use privileged resource types&#34;] {
+  input.action == &#34;SaveConfig&#34;
+  input.data.resource_types[_].privileged
+}</code></pre>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_special-actions">
+  
+  <h2 class="section-header"><a class="anchor-target" name="special-actions" href="#special-actions"></a>Special Actions</h2>
+  
+
+  <p>Most of the actions you can filter for come directly from the list of <a href="user-roles.html#action-matrix">API actions</a>. There are currently two special actions you can also filter on.</p>
+
+  
+    
+      <div class="section" id="section_useimage">
+  
+  <h3 class="section-header"><a class="anchor-target" name="useimage" href="#useimage"></a><code>UseImage</code></h3>
+  
+
+  <p>Before Concourse starts a container you can check what image it is going to use to create the container. Depending on the <code>image_type</code> the <code>image_source</code> field may contain other fields. The JSON payload for this action will look similar to the following example:</p><pre><code class="language-json">{
+  &#34;input&#34;: {
+    &#34;service&#34;: &#34;concourse&#34;,
+    &#34;cluster_name&#34;: &#34;dev&#34;,
+    &#34;cluster_version&#34;: &#34;7.4.0&#34;,
+    &#34;action&#34;: &#34;UseImage&#34;,
+    &#34;team&#34;: &#34;main&#34;,
+    &#34;pipeline&#34;: &#34;simple&#34;,
+    &#34;data&#34;: {
+      &#34;image_type&#34;: &#34;registry-image&#34;,
+      &#34;privileged&#34;: true,
+      &#34;image_source&#34;: {
+        &#34;repository&#34;: &#34;alpine&#34;,
+        &#34;tag&#34;: &#34;latest&#34;
+      }
+    }
+  }
+}</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_setpipeline">
+  
+  <h3 class="section-header"><a class="anchor-target" name="setpipeline" href="#setpipeline"></a><code>SetPipeline</code></h3>
+  
+
+  <p>This action occurs whenever a <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a> is run. The JSON payload for this action will contain the pipeline config in JSON format under the <code>data</code> key:</p><pre><code class="language-json">{
+  &#34;input&#34;: {
+    &#34;service&#34;: &#34;concourse&#34;,
+    &#34;cluster_name&#34;: &#34;dev&#34;,
+    &#34;cluster_version&#34;: &#34;7.4.0&#34;,
+    &#34;action&#34;: &#34;SetPipeline&#34;,
+    &#34;team&#34;: &#34;main&#34;,
+    &#34;pipeline&#34;: &#34;simple&#34;,
+    &#34;data&#34;: {
+      &#34;jobs&#34;: [
+        {
+          &#34;name&#34;: &#34;test&#34;,
+          &#34;plan&#34;: [
+            {
+              &#34;get&#34;: &#34;tiny&#34;
+            },
+            {
+              &#34;config&#34;: {
+                &#34;image_resource&#34;: {
+                  &#34;source&#34;: {
+                    &#34;repository&#34;: &#34;busybox&#34;
+                  },
+                  &#34;type&#34;: &#34;registry-image&#34;
+                },
+                &#34;platform&#34;: &#34;linux&#34;,
+                &#34;run&#34;: {
+                  &#34;args&#34;: [
+                    &#34;-exc&#34;,
+                    &#34;echo hello&#34;
+                  ],
+                  &#34;path&#34;: &#34;sh&#34;
+                }
+              },
+              &#34;task&#34;: &#34;a-task&#34; }
+] } ] } } }</code></pre>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.6</span>
+              
+
+              <a href="container-placement.html">Container Placement</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.8</span>
+              
+
+              <a href="performance-tuning.html">Performance Tuning</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/operation.html b/operation.html
new file mode 100644
index 00000000..9b7f870b
--- /dev/null
+++ b/operation.html
@@ -0,0 +1,994 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Operation - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="self">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="self">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_operation">
+  
+  <h1 class="section-header"><a class="anchor-target" name="operation" href="#operation"></a><span class="section-number">1.15 </span>Operation</h1>
+  
+
+  <p>The following sections describes operator-focused features and tools that Concourse provides, such as monitoring and credential management.</p><p>These concepts are not required to operate Concourse, but are for users that are looking to extend the capabilities of managing a Concourse deployment. For users that are new to these concepts, we do recommend learning how to set up <a href="creds.html">Credential Management</a> and <a href="encryption.html">Encryption</a>.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.1</span>
+      <a href="metrics.html">Metrics</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.1.1</span>
+      <a href="metrics.html#configuring-metrics">Configuring Metrics</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.1.2</span>
+      <a href="metrics.html#whats-emitted">What&#39;s emitted?</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.2</span>
+      <a href="tracing.html">Tracing</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.2.1</span>
+      <a href="tracing.html#configuring-tracing">Configuring Tracing</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.2.2</span>
+      <a href="tracing.html#trace-context-propagation">Trace context propagation</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.2.3</span>
+      <a href="tracing.html#whats-emitted">What&#39;s emitted?</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3</span>
+      <a href="encryption.html">Encryption</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.3.1</span>
+      <a href="encryption.html#whats-encrypted">What&#39;s encrypted?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3.2</span>
+      <a href="encryption.html#enabling-encryption">Enabling Encryption</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3.3</span>
+      <a href="encryption.html#rotating-the-encryption-key">Rotating the Encryption Key</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.3.4</span>
+      <a href="encryption.html#disabling-encryption">Disabling Encryption</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4</span>
+      <a href="creds.html">Credential Management</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.4.1</span>
+      <a href="vault-credential-manager.html">The Vault credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.2</span>
+      <a href="credhub-credential-manager.html">The CredHub credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.3</span>
+      <a href="aws-ssm-credential-manager.html">The AWS SSM credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.4</span>
+      <a href="aws-asm-credential-manager.html">The AWS Secrets Manager credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.5</span>
+      <a href="kubernetes-credential-manager.html">Kubernetes Credential Manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.6</span>
+      <a href="conjur-credential-manager.html">The Conjur credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.7</span>
+      <a href="idtoken-credential-manager.html">The IDToken credential manager</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.8</span>
+      <a href="creds-caching.html">Caching credentials</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.9</span>
+      <a href="creds-redacting.html">Redacting credentials</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.4.10</span>
+      <a href="creds-retry-logic.html">Retrying failed fetches</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.5</span>
+      <a href="security-hardening.html">Security Hardening</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.5.1</span>
+      <a href="security-hardening.html#keeping-your-kernel-up-to-date">Keeping your kernel up-to-date</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.5.2</span>
+      <a href="security-hardening.html#locking-down-privileged-mode">Locking down privileged mode</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6</span>
+      <a href="container-placement.html">Container Placement</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.6.1</span>
+      <a href="container-placement.html#volume-locality-strategy">The <code>volume-locality</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.2</span>
+      <a href="container-placement.html#fewest-build-containers-strategy">The <code>fewest-build-containers</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.3</span>
+      <a href="container-placement.html#random-strategy">The <code>random</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.4</span>
+      <a href="container-placement.html#limit-active-tasks-strategy">The <code>limit-active-tasks</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.5</span>
+      <a href="container-placement.html#limit-active-containers-strategy">The <code>limit-active-containers</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.6</span>
+      <a href="container-placement.html#limit-active-volumes-strategy">The <code>limit-active-volumes</code> strategy</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.6.7</span>
+      <a href="container-placement.html#chaining-placement-strategies">Chaining Placement Strategies</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7</span>
+      <a href="opa.html">Open Policy Agent Integration</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.7.1</span>
+      <a href="opa.html#configure-opa">Configuring Concourse</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7.2</span>
+      <a href="opa.html#writing-opa-rules">Writing OPA Rules</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7.3</span>
+      <a href="opa.html#special-actions">Special Actions</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.7.3.1</span>
+      <a href="opa.html#useimage"><code>UseImage</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.7.3.2</span>
+      <a href="opa.html#setpipeline"><code>SetPipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8</span>
+      <a href="performance-tuning.html">Performance Tuning</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.1</span>
+      <a href="performance-tuning.html#the-big-caveat">The Big Caveat</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2</span>
+      <a href="performance-tuning.html#build-logs">Build Logs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.2.1</span>
+      <a href="performance-tuning.html#concourse_default_build_logs_to_retain"><code>CONCOURSE_DEFAULT_BUILD_LOGS_TO_RETAIN</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.2</span>
+      <a href="performance-tuning.html#concourse_max_build_logs_to_retain"><code>CONCOURSE_MAX_BUILD_LOGS_TO_RETAIN</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.3</span>
+      <a href="performance-tuning.html#concourse_default_days_to_retain_build_logs"><code>CONCOURSE_DEFAULT_DAYS_TO_RETAIN_BUILD_LOGS</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.4</span>
+      <a href="performance-tuning.html#concourse_max_days_to_retain_build_logs"><code>CONCOURSE_MAX_DAYS_TO_RETAIN_BUILD_LOGS</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3</span>
+      <a href="performance-tuning.html#resource-checking">Resource Checking</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.3.1</span>
+      <a href="performance-tuning.html#concourse_resource_checking_interval"><code>CONCOURSE_RESOURCE_CHECKING_INTERVAL</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3.2</span>
+      <a href="performance-tuning.html#concourse_resource_with_webhook_checking_interval"><code>CONCOURSE_RESOURCE_WITH_WEBHOOK_CHECKING_INTERVAL</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3.3</span>
+      <a href="performance-tuning.html#concourse_max_checks_per_second"><code>CONCOURSE_MAX_CHECKS_PER_SECOND</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4</span>
+      <a href="performance-tuning.html#pipeline-management">Pipeline Management</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.4.1</span>
+      <a href="performance-tuning.html#concourse_pause_pipelines_after"><code>CONCOURSE_PAUSE_PIPELINES_AFTER</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4.2</span>
+      <a href="performance-tuning.html#concourse_default_task_cpumemory_limit"><code>CONCOURSE_DEFAULT_TASK_{CPU/MEMORY}_LIMIT</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4.3</span>
+      <a href="performance-tuning.html#concourse_default_getputtask_timeout"><code>CONCOURSE_DEFAULT_{GET/PUT/TASK}_TIMEOUT</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.5</span>
+      <a href="performance-tuning.html#optimize-containers-placement">Container Placement</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.6</span>
+      <a href="performance-tuning.html#garbage-collection">Garbage Collection</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.6.1</span>
+      <a href="performance-tuning.html#concourse_gc_failed_grace_period"><code>CONCOURSE_GC_FAILED_GRACE_PERIOD</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.6.2</span>
+      <a href="performance-tuning.html#other-gc-grace-periods">Other GC Grace Periods</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.7</span>
+      <a href="performance-tuning.html#web-to-worker-ratio">Web To Worker Ratio</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.9</span>
+      <a href="global-resources.html">Global Resources</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.9.1</span>
+      <a href="global-resources.html#benefits-of-global-resources">Benefits of Global Resources</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.9.2</span>
+      <a href="global-resources.html#risks-and-side-effects">Risks and Side Effects</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10</span>
+      <a href="administration.html">Administration</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.10.1</span>
+      <a href="administration.html#fly-workers"><code>fly workers</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.2</span>
+      <a href="administration.html#fly-prune-worker"><code>fly prune-worker</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.3</span>
+      <a href="administration.html#fly-land-worker"><code>fly land-worker</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.4</span>
+      <a href="administration.html#fly-containers"><code>fly containers</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.5</span>
+      <a href="administration.html#fly-volumes"><code>fly volumes</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.10.6</span>
+      <a href="administration.html#fly-curl"><code>fly curl</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14</span>
+              
+
+              <a href="how-to-guides.html">How-To Guides</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.1</span>
+              
+
+              <a href="metrics.html">Metrics</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/performance-tuning.html b/performance-tuning.html
new file mode 100644
index 00000000..ded6ecc3
--- /dev/null
+++ b/performance-tuning.html
@@ -0,0 +1,784 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Performance Tuning - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html"  class="self">Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.8</span><a href="performance-tuning.html"  class="self">Performance Tuning</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.8.1</td>
+            <td class="title-cell"><a href="performance-tuning.html#the-big-caveat" >The Big Caveat</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8.2</td>
+            <td class="title-cell"><a href="performance-tuning.html#build-logs" >Build Logs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8.3</td>
+            <td class="title-cell"><a href="performance-tuning.html#resource-checking" >Resource Checking</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8.4</td>
+            <td class="title-cell"><a href="performance-tuning.html#pipeline-management" >Pipeline Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8.5</td>
+            <td class="title-cell"><a href="performance-tuning.html#optimize-containers-placement" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8.6</td>
+            <td class="title-cell"><a href="performance-tuning.html#garbage-collection" >Garbage Collection</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8.7</td>
+            <td class="title-cell"><a href="performance-tuning.html#web-to-worker-ratio" >Web To Worker Ratio</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_performance-tuning">
+  
+  <h1 class="section-header"><a class="anchor-target" name="performance-tuning" href="#performance-tuning"></a><span class="section-number">1.15.8 </span>Performance Tuning</h1>
+  
+
+  <p>By default Concourse is configured to feel very snappy. This is good for when you are first trying out Concourse or using it on a small team with a few dozen pipelines.</p><p>When you begin trying to scale Concourse is where fires can start breaking out. This section will go over some configuration values in Concourse that you can change to make scaling easier.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.1</span>
+      <a href="performance-tuning.html#the-big-caveat">The Big Caveat</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2</span>
+      <a href="performance-tuning.html#build-logs">Build Logs</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.2.1</span>
+      <a href="performance-tuning.html#concourse_default_build_logs_to_retain"><code>CONCOURSE_DEFAULT_BUILD_LOGS_TO_RETAIN</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.2</span>
+      <a href="performance-tuning.html#concourse_max_build_logs_to_retain"><code>CONCOURSE_MAX_BUILD_LOGS_TO_RETAIN</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.3</span>
+      <a href="performance-tuning.html#concourse_default_days_to_retain_build_logs"><code>CONCOURSE_DEFAULT_DAYS_TO_RETAIN_BUILD_LOGS</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.2.4</span>
+      <a href="performance-tuning.html#concourse_max_days_to_retain_build_logs"><code>CONCOURSE_MAX_DAYS_TO_RETAIN_BUILD_LOGS</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3</span>
+      <a href="performance-tuning.html#resource-checking">Resource Checking</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.3.1</span>
+      <a href="performance-tuning.html#concourse_resource_checking_interval"><code>CONCOURSE_RESOURCE_CHECKING_INTERVAL</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3.2</span>
+      <a href="performance-tuning.html#concourse_resource_with_webhook_checking_interval"><code>CONCOURSE_RESOURCE_WITH_WEBHOOK_CHECKING_INTERVAL</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.3.3</span>
+      <a href="performance-tuning.html#concourse_max_checks_per_second"><code>CONCOURSE_MAX_CHECKS_PER_SECOND</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4</span>
+      <a href="performance-tuning.html#pipeline-management">Pipeline Management</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.4.1</span>
+      <a href="performance-tuning.html#concourse_pause_pipelines_after"><code>CONCOURSE_PAUSE_PIPELINES_AFTER</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4.2</span>
+      <a href="performance-tuning.html#concourse_default_task_cpumemory_limit"><code>CONCOURSE_DEFAULT_TASK_{CPU/MEMORY}_LIMIT</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.4.3</span>
+      <a href="performance-tuning.html#concourse_default_getputtask_timeout"><code>CONCOURSE_DEFAULT_{GET/PUT/TASK}_TIMEOUT</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.5</span>
+      <a href="performance-tuning.html#optimize-containers-placement">Container Placement</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.6</span>
+      <a href="performance-tuning.html#garbage-collection">Garbage Collection</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.15.8.6.1</span>
+      <a href="performance-tuning.html#concourse_gc_failed_grace_period"><code>CONCOURSE_GC_FAILED_GRACE_PERIOD</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.6.2</span>
+      <a href="performance-tuning.html#other-gc-grace-periods">Other GC Grace Periods</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.15.8.7</span>
+      <a href="performance-tuning.html#web-to-worker-ratio">Web To Worker Ratio</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_the-big-caveat">
+  
+  <h2 class="section-header"><a class="anchor-target" name="the-big-caveat" href="#the-big-caveat"></a>The Big Caveat</h2>
+  
+
+  <p>Track <a href="metrics.html">Metrics</a>! Everything you read next could be all for nothing if you don&#39;t have metrics to track where the bottlenecks are in your Concourse system. We highly suggest tracking metrics so you have a clear before and after picture for any changes you make and to clearly see if you&#39;re moving things in the right direction.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_build-logs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="build-logs" href="#build-logs"></a>Build Logs</h2>
+  
+
+  <p>Is the size of your database growing dramatically? Can&#39;t keep up with the storage costs? Then you should probably configure some default log retention settings.</p><p>By default Concourse will not delete any of your logs from your pipelines. You have to opt-in to having Concourse automatically delete build logs for you. You can set a time-based retention policy and/or a policy based on the number of logs a job generates.</p>
+
+  
+    
+      <div class="section" id="section_concourse_default_build_logs_to_retain">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_default_build_logs_to_retain" href="#concourse_default_build_logs_to_retain"></a><code>CONCOURSE_DEFAULT_BUILD_LOGS_TO_RETAIN</code></h3>
+  
+
+  <p>Determines how many build logs to retain per job by default. If you set this to <code>10</code> then any jobs in your pipelines that have more than ten builds will have the extra logs for those builds deleted.</p><p>Users can override this value in their pipelines.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_concourse_max_build_logs_to_retain">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_max_build_logs_to_retain" href="#concourse_max_build_logs_to_retain"></a><code>CONCOURSE_MAX_BUILD_LOGS_TO_RETAIN</code></h3>
+  
+
+  <p>Determines how many build logs to retain per job. Users cannot override this setting.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_concourse_default_days_to_retain_build_logs">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_default_days_to_retain_build_logs" href="#concourse_default_days_to_retain_build_logs"></a><code>CONCOURSE_DEFAULT_DAYS_TO_RETAIN_BUILD_LOGS</code></h3>
+  
+
+  <p>Determines how old build logs have to be before they are deleted. Setting this to a value like <code>10</code> will result in any build logs older than 10 days to be deleted.</p><p>Users can override this value in their pipelines.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_concourse_max_days_to_retain_build_logs">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_max_days_to_retain_build_logs" href="#concourse_max_days_to_retain_build_logs"></a><code>CONCOURSE_MAX_DAYS_TO_RETAIN_BUILD_LOGS</code></h3>
+  
+
+  <p>Determines how old build logs have to be before they are deleted. Users cannot override this setting in their pipelines.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_resource-checking">
+  
+  <h2 class="section-header"><a class="anchor-target" name="resource-checking" href="#resource-checking"></a>Resource Checking</h2>
+  
+
+  <p>By default Concourse checks any given resource every ~1min. This makes Concourse feel snappy when you first start using it. Once you start trying to scale though the amount of checks can begin to feel aggressive. The following settings can help you reduce the load caused by resource checking.</p>
+
+  
+    
+      <div class="section" id="section_concourse_resource_checking_interval">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_resource_checking_interval" href="#concourse_resource_checking_interval"></a><code>CONCOURSE_RESOURCE_CHECKING_INTERVAL</code></h3>
+  
+
+  <p>This is where the default value for 1min checks comes from. Changing this value changes the default checking interval for all resources. Users can override this value when defining a resource with the <a href="resources.html#schema.resource.check_every"><code class="schema-attribute-name"><bold>resource<wbr />.check_every</bold></code></a> field.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_concourse_resource_with_webhook_checking_interval">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_resource_with_webhook_checking_interval" href="#concourse_resource_with_webhook_checking_interval"></a><code>CONCOURSE_RESOURCE_WITH_WEBHOOK_CHECKING_INTERVAL</code></h3>
+  
+
+  <p>Same as the previous var but only applies to resources with webhooks. Could use this to disable resource checking of resources that use webhooks by setting it to a large value like <code>99h</code>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_concourse_max_checks_per_second">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_max_checks_per_second" href="#concourse_max_checks_per_second"></a><code>CONCOURSE_MAX_CHECKS_PER_SECOND</code></h3>
+  
+
+  <p>Maximum number of checks that can be started per second. This will be calculated as (# of resources)/(resource checking interval). If you&#39;re finding that too many resource checks are running at once and consuming a lot of resources on your workers then you can use this var to reduce the overall load.</p><p>A value of <code>-1</code> will remove this maximum limit of checks per second.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_pipeline-management">
+  
+  <h2 class="section-header"><a class="anchor-target" name="pipeline-management" href="#pipeline-management"></a>Pipeline Management</h2>
+  
+
+  <p>Here are some flags you can set on the web node to help manage the amount of resources pipelines consume. These flags are mostly about ensuring pipelines don&#39;t run forever without good reason.</p>
+
+  
+    
+      <div class="section" id="section_concourse_pause_pipelines_after">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_pause_pipelines_after" href="#concourse_pause_pipelines_after"></a><code>CONCOURSE_PAUSE_PIPELINES_AFTER</code></h3>
+  
+
+  <p>This flag takes a number representing the number of days since a pipeline last ran before it&#39;s automatically paused. So specifying <code>90</code> means any pipelines that last ran 91 days ago will be automatically paused.</p><p>For large instances it can be common for users to set a pipeline and then forget about it. The pipeline may never run another job again and be forgotten forever. Even if the jobs in the pipeline never run Concourse will still be running resource checks for that pipeline, if any resources are defined. By setting this flag you can ensure that any pipelines that meet this criteria will be automatically paused and not consume resources long-term. For some large instances this can mean up to 50% of pipelines eventually being paused.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_concourse_default_task_cpumemory_limit">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_default_task_cpumemory_limit" href="#concourse_default_task_cpumemory_limit"></a><code>CONCOURSE_DEFAULT_TASK_{CPU/MEMORY}_LIMIT</code></h3>
+  
+
+  <p>Global defaults for CPU and memory you can set. Only applies to tasks, not resource containers (<code>check/get/put</code> steps).  You can read more about how to set these limits on the <a href="task-step.html#schema.task.container_limits"><code>task</code> step <strong><code>container_limits</code></strong></a> page.</p><p>Users can override these values in their pipelines.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_concourse_default_getputtask_timeout">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_default_getputtask_timeout" href="#concourse_default_getputtask_timeout"></a><code>CONCOURSE_DEFAULT_{GET/PUT/TASK}_TIMEOUT</code></h3>
+  
+
+  <p>Global defaults for how long the mentioned step takes to execute. Useful if you&#39;re finding your users write pipelines with tasks that get stuck or never end. Ensures that every build eventually finishes.</p><p>Users can override these values in their pipelines.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_optimize-containers-placement">
+  
+  <h2 class="section-header"><a class="anchor-target" name="optimize-containers-placement" href="#optimize-containers-placement"></a>Container Placement</h2>
+  
+
+  <p>If you find that workers keep crashing due to high CPU and/or memory usage then you could try specifying a custom container placement strategy or strategy chain. The <a href="container-placement.html">Container Placement</a> page has some examples of container placement strategy chains you can use.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_garbage-collection">
+  
+  <h2 class="section-header"><a class="anchor-target" name="garbage-collection" href="#garbage-collection"></a>Garbage Collection</h2>
+  
+
+  <p>When jobs fail or error out in Concourse their resources are not immediately cleaned up. The container and storage space remain on a worker for some period of time before they get garbage collected. If you want to make the garbage collector more aggressive you can change the following settings on your web node:</p>
+
+  
+    
+      <div class="section" id="section_concourse_gc_failed_grace_period">
+  
+  <h3 class="section-header"><a class="anchor-target" name="concourse_gc_failed_grace_period" href="#concourse_gc_failed_grace_period"></a><code>CONCOURSE_GC_FAILED_GRACE_PERIOD</code></h3>
+  
+
+  <p>This env var only applies to containers where the job failed and has the longest grace period among all the other GC grace periods. It has a default value of <code>120h</code> (five days).</p><p>The reason the default value is so long is so users don&#39;t feel rushed to investigate their failed job. A job can fail over a weekend and users can investigate the failed jobs containers when they come back on Monday.</p><p>Failed containers get GC as soon as a new build of the job is kicked off. So you don&#39;t have to worry about failed containers always hanging around for five days. They&#39;ll only hang around for that long if they&#39;re the most recent build of a job.</p><p>If you notice a lot of containers and volumes hanging around that are tied to failed jobs you can try reducing this setting to fewer days or even a few hours.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_other-gc-grace-periods">
+  
+  <h3 class="section-header"><a class="anchor-target" name="other-gc-grace-periods" href="#other-gc-grace-periods"></a>Other GC Grace Periods</h3>
+  
+
+  <p>Depending on what a container was used for and its exit condition, there are various flags you can adjust to make Concourse GC these resources faster or slower. The following env vars cover the cases where you probably don&#39;t need the container hanging around for very long. They have a default value of <code>5m</code>.</p><ul>
+
+  <li><p><code>CONCOURSE_GC_ONE_OFF_GRACE_PERIOD</code> - Period after which one-off build containers will be garbage-collected</p></li>
+
+  <li><p><code>CONCOURSE_GC_MISSING_GRACE_PERIOD</code> - Period after which containers and volumes that were created but went missing from the worker will be garbage-collected</p></li>
+
+  <li><p><code>CONCOURSE_GC_HIJACK_GRACE_PERIOD</code> - Period after which hijacked containers will be garbage-collected</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_web-to-worker-ratio">
+  
+  <h2 class="section-header"><a class="anchor-target" name="web-to-worker-ratio" href="#web-to-worker-ratio"></a>Web To Worker Ratio</h2>
+  
+
+  <p>This is anecdotal and you should adjust based on your metrics of your web nodes. A starting ratio of web to workers is 1:6; one web instance for every six workers.</p><p>The core Concourse team runs two web nodes and 16 workers, a 1:8 ratio. We can get away with this lower web to worker ratio because we don&#39;t have that many users actively interacting with the web UI on a daily basis; less than 10 active users. Since we&#39;re only one team using the instance we have fewer pipelines than an instance supporting multiple teams would.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.7</span>
+              
+
+              <a href="opa.html">Open Policy Agent Integration</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.9</span>
+              
+
+              <a href="global-resources.html">Global Resources</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/php-example.html b/php-example.html
new file mode 100644
index 00000000..c0757534
--- /dev/null
+++ b/php-example.html
@@ -0,0 +1,286 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>PHP application testing example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html"  class="self">PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_php-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="php-example" href="#php-example"></a><span class="section-number">2.14 </span>PHP application testing example</h1>
+  
+
+  <p>You can run the tests for a PHP application.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/php"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: laravel-git
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/laravel/laravel.git
+
+jobs:
+- name: test
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: laravel-git
+    trigger: true
+  - task: run-tests
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: composer }
+      inputs:
+        - name: laravel-git
+      run:
+        path: /bin/sh
+        args:
+          - -ce
+          - |
+            cd laravel-git
+
+            composer install
+
+            cp .env.example .env
+            php artisan key:generate
+
+            vendor/bin/phpunit
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.13</span>
+              
+
+              <a href="nodejs-example.html">Nodejs application testing example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">3</span>
+              
+
+              <a href="project.html">Project</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pipeline-guides.html b/pipeline-guides.html
new file mode 100644
index 00000000..fff28132
--- /dev/null
+++ b/pipeline-guides.html
@@ -0,0 +1,359 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Pipeline Guides - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html"  class="self">Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.1</span><a href="pipeline-guides.html"  class="self">Pipeline Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1.1</td>
+            <td class="title-cell"><a href="common-pipeline-practices.html" >Common Pipeline Practices</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.2</td>
+            <td class="title-cell"><a href="exploring-task-input-and-output-scenarios.html" >Exploring Task Input and Output Scenarios</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.3</td>
+            <td class="title-cell"><a href="gated-pipeline-patterns.html" >Gated Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.4</td>
+            <td class="title-cell"><a href="time-triggered-pipeline-patterns.html" >Time Triggered Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.5</td>
+            <td class="title-cell"><a href="manual-approval-step.html" >Manual Approval Step</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_pipeline-guides">
+  
+  <h1 class="section-header"><a class="anchor-target" name="pipeline-guides" href="#pipeline-guides"></a><span class="section-number">1.14.1 </span>Pipeline Guides</h1>
+  
+
+  <div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.14.1.1</span>
+      <a href="common-pipeline-practices.html">Common Pipeline Practices</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.2</span>
+      <a href="exploring-task-input-and-output-scenarios.html">Exploring Task Input and Output Scenarios</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.3</span>
+      <a href="gated-pipeline-patterns.html">Gated Pipeline Patterns</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.4</span>
+      <a href="time-triggered-pipeline-patterns.html">Time Triggered Pipeline Patterns</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.14.1.5</span>
+      <a href="manual-approval-step.html">Manual Approval Step</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14</span>
+              
+
+              <a href="how-to-guides.html">How-To Guides</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.1.1</span>
+              
+
+              <a href="common-pipeline-practices.html">Common Pipeline Practices</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pipeline-vars-example.html b/pipeline-vars-example.html
new file mode 100644
index 00000000..0db997a4
--- /dev/null
+++ b/pipeline-vars-example.html
@@ -0,0 +1,290 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Pipeline ((vars)) example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html"  class="self">Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_pipeline-vars-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="pipeline-vars-example" href="#pipeline-vars-example"></a><span class="section-number">2.3 </span>Pipeline <code>((vars))</code> example</h1>
+  
+
+  <p>You can use params in a pipelines configuration file.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/pipeline-vars"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+jobs:
+- name: ((first))-job
+  public: true
+  plan:
+  - task: simple-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: echo
+        args: [&#34;Hello, ((hello))!&#34;]
+- name: level-((number))-job
+  public: true
+  plan:
+  - task: simple-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: echo
+        args: [&#34;Hello, ((hello))!&#34;]
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_variables">
+  
+  <h2 class="section-header"><a class="anchor-target" name="variables" href="#variables"></a>Variables</h2>
+  
+
+  <pre><code class="language-yaml">---
+first: initial
+number: &#34;9000&#34;
+hello: HAL</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.2</span>
+              
+
+              <a href="serial-job-example.html">Serial job example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.4</span>
+              
+
+              <a href="set-pipelines-example.html">Set Pipelines Example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pipelines.html b/pipelines.html
new file mode 100644
index 00000000..b4078dd4
--- /dev/null
+++ b/pipelines.html
@@ -0,0 +1,784 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Pipelines - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html"  class="self">Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.6</span><a href="pipelines.html"  class="self">Pipelines</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.6.1</td>
+            <td class="title-cell"><a href="setting-pipelines.html" >Setting Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2</td>
+            <td class="title-cell"><a href="managing-pipelines.html" >Managing Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.3</td>
+            <td class="title-cell"><a href="instanced-pipelines.html" >Grouping Pipelines</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.pipeline"><strong><code>pipeline</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.group_config"><strong><code>group_config</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.display_config"><strong><code>display_config</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.pipeline.jobs"><code class="schema-attribute-name"><bold>pipeline<wbr />.jobs</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.pipeline.resource_types"><code class="schema-attribute-name"><bold>pipeline<wbr />.resource_types</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.pipeline.var_sources"><code class="schema-attribute-name"><bold>pipeline<wbr />.var_sources</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.group_config.name"><code class="schema-attribute-name"><bold>group_config<wbr />.name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.group_config.jobs"><code class="schema-attribute-name"><bold>group_config<wbr />.jobs</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.pipeline.groups"><code class="schema-attribute-name"><bold>pipeline<wbr />.groups</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.display_config.background_image"><code class="schema-attribute-name"><bold>display_config<wbr />.background_image</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.display_config.background_filter"><code class="schema-attribute-name"><bold>display_config<wbr />.background_filter</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="pipelines.html#schema.pipeline.display"><code class="schema-attribute-name"><bold>pipeline<wbr />.display</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_pipelines">
+  
+  <h1 class="section-header"><a class="anchor-target" name="pipelines" href="#pipelines"></a><span class="section-number">1.6 </span>Pipelines</h1>
+  
+
+  <p>A pipeline is the result of configuring <a href="jobs.html">Jobs</a> and <a href="resources.html">Resources</a> together. When you configure a pipeline, it takes on a life of its own, to continuously detect resource versions and automatically queue new builds for jobs as they have new available inputs.</p><p>The name of a pipeline has a few restrictions that are outlined here: <a href="config-basics.html#schema.identifier"><strong><code>identifier</code></strong> schema</a>.</p><p>Pipelines are configured via <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a> or the <a href="set-pipeline-step.html#set-pipeline"><code>set_pipeline</code> step</a> as declarative <a href="config-basics.html#intro-to-yaml">YAML files</a> which conform to the following schema:</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.pipeline" href="#schema.pipeline"></a><code>pipeline</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.pipeline.jobs" type="checkbox" class="toggle" />
+  <label for="toggle-schema.pipeline.jobs" class="toggle-title">
+    <a id="schema.pipeline.jobs"></a>
+
+    <code><a class="attribute-name" href="#schema.pipeline.jobs">jobs</a>: <span class="attribute-type">[<a href="jobs.html#schema.job"><strong>job</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A set of <a href="jobs.html">jobs</a> for the pipeline to continuously schedule. At least one job is required for a pipeline to be valid.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.pipeline.resources" type="checkbox" class="toggle" />
+  <label for="toggle-schema.pipeline.resources" class="toggle-title">
+    <a id="schema.pipeline.resources"></a>
+
+    <code><a class="attribute-name" href="#schema.pipeline.resources">resources</a>: <span class="attribute-type">[<a href="resources.html#schema.resource"><strong>resource</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A set of <a href="resources.html">resources</a> for the pipeline to continuously check.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.pipeline.resource_types" type="checkbox" class="toggle" />
+  <label for="toggle-schema.pipeline.resource_types" class="toggle-title">
+    <a id="schema.pipeline.resource_types"></a>
+
+    <code><a class="attribute-name" href="#schema.pipeline.resource_types">resource_types</a>: <span class="attribute-type">[<a href="resource-types.html#schema.resource_type"><strong>resource_type</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A set of <a href="resource-types.html">resource types</a> for resources within the pipeline to use.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.pipeline.var_sources" type="checkbox" class="toggle" />
+  <label for="toggle-schema.pipeline.var_sources" class="toggle-title">
+    <a id="schema.pipeline.var_sources"></a>
+
+    <code><a class="attribute-name" href="#schema.pipeline.var_sources">var_sources</a>: <span class="attribute-type">[<a href="vars.html#schema.var_source"><strong>var_source</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A set of <a href="vars.html#var-sources">Var sources</a> for the pipeline to use.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.pipeline.groups" type="checkbox" class="toggle" />
+  <label for="toggle-schema.pipeline.groups" class="toggle-title">
+    <a id="schema.pipeline.groups"></a>
+
+    <code><a class="attribute-name" href="#schema.pipeline.groups">groups</a>: <span class="attribute-type">[<a href="pipelines.html#schema.group_config"><strong>group_config</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A list of job groups to use for organizing jobs in the web UI.</p><p>Groups have no functional effect on your pipeline. They are purely for making it easier to grok large pipelines in the web UI.</p><p>Note: once you have added groups to your pipeline, all jobs must be in a group.</p><div class="toggleable example">
+  <input id="toggle-fe7348d1e7dbff5278e1bfa33c7c2ae45cb7de51" type="checkbox" class="toggle" />
+  <label for="toggle-fe7348d1e7dbff5278e1bfa33c7c2ae45cb7de51" class="toggle-title">Grouping jobs</label>
+  <div class="toggle-content">
+    <p>The following example will make the &#34;tests&#34; group the default view (since it&#39;s listed first), separating the later jobs into a &#34;publish&#34; group:</p><pre><code class="language-yaml">groups:
+- name: test
+  jobs:
+  - unit
+  - integration
+- name: publish
+  jobs:
+  - deploy
+  - shipit</code></pre><p>This would display two tabs at the top of the home page: &#34;test&#34; and &#34;publish&#34;.</p><p>For a real world example of how groups can be used to simplify navigation and provide logical grouping, see the groups used at the top of the page in the <a href="https://ci.concourse-ci.org">Concourse pipeline</a>.</p>
+  </div>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.group_config" href="#schema.group_config"></a><code>group_config</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.group_config.name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.group_config.name" class="toggle-title">
+    <a id="schema.group_config.name"></a>
+
+    <code><a class="attribute-name" href="#schema.group_config.name">name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A unique name for the group. This should be short and simple as it will be used as the tab name for navigation.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.group_config.jobs" type="checkbox" class="toggle" />
+  <label for="toggle-schema.group_config.jobs" class="toggle-title">
+    <a id="schema.group_config.jobs"></a>
+
+    <code><a class="attribute-name" href="#schema.group_config.jobs">jobs</a>: <span class="attribute-type">[<a href="jobs.html#schema.job.name"><strong>job.name</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A list of jobs that should appear in this group. A job may appear in multiple groups. Neighbours of jobs in the current group will also appear on the same page in order to give context of the location of the group in the pipeline.</p><p>You may also use any valid <a href="https://www.man7.org/linux/man-pages/man7/glob.7.html">glob</a> to represent several jobs, e.g.:</p><pre><code class="language-yaml">groups:
+- name: develop
+  jobs:
+  - terraform-*
+  - test
+  - deploy-{dev,staging}
+- name: ship
+  jobs:
+  - deploy-prod
+- name: all
+  jobs:
+  - &#34;*&#34;</code></pre><p>In this example, the <code>develop</code> group will match <code>terraform-apply</code>, <code>terraform-destroy</code>, <code>test</code>, <code>deploy-dev</code>, <code>deploy-staging</code>. The <code>ship</code> group will only match <code>deploy-prod</code>. The <code>all</code> group will match all jobs in the pipeline.</p><p><div class="warning">
+  Note that depending on how it&#39;s used, <code>*</code>, <code>{</code>, and <code>}</code> have special meaning in YAML, and may need to be quoted (as was done in the <code>all</code> job above)
+</div></p>
+  </div>
+</div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.pipeline.display" type="checkbox" class="toggle" />
+  <label for="toggle-schema.pipeline.display" class="toggle-title">
+    <a id="schema.pipeline.display"></a>
+
+    <code><a class="attribute-name" href="#schema.pipeline.display">display</a>: <span class="attribute-type"><a href="pipelines.html#schema.display_config"><strong>display_config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="warning">
+  <p><code>display</code> was introduced in Concourse v6.6.0. It is considered an <strong>experimental</strong> feature.</p>
+</div><p>Visual configurations for personalizing your pipeline.</p><div class="toggleable example">
+  <input id="toggle-2871f65e39098cff3a9d3173e0413f8279877d5e" type="checkbox" class="toggle" />
+  <label for="toggle-2871f65e39098cff3a9d3173e0413f8279877d5e" class="toggle-title">Background image</label>
+  <div class="toggle-content">
+    <p>The following example will display an image in the background of the pipeline it is configured on.</p><pre><code class="language-yaml">display:
+  background_image: https://avatars1.githubusercontent.com/u/7809479?s=400&amp;v=4</code></pre>
+  </div>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.display_config" href="#schema.display_config"></a><code>display_config</code> schema</h2>
+
+  <p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.display_config.background_image" type="checkbox" class="toggle" />
+  <label for="toggle-schema.display_config.background_image" class="toggle-title">
+    <a id="schema.display_config.background_image"></a>
+
+    <code><a class="attribute-name" href="#schema.display_config.background_image">background_image</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Allows users to specify a custom background image for the pipeline. Must be an http, https, or relative URL.</p>
+  </div>
+</div> <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.display_config.background_filter" type="checkbox" class="toggle" />
+  <label for="toggle-schema.display_config.background_filter" class="toggle-title">
+    <a id="schema.display_config.background_filter"></a>
+
+    <code><a class="attribute-name" href="#schema.display_config.background_filter">background_filter</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>opacity(30%) grayscale(100%)</code>.</em> Allows users to specify custom <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter">CSS filters</a> that are applied to the <code>background_image</code>.</p>
+  </div>
+</div></p>
+</div>
+  </div>
+</div>
+</div><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.1</span>
+      <a href="setting-pipelines.html">Setting Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.1.1</span>
+      <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.1.2</span>
+      <a href="setting-pipelines.html#fly-validate-pipeline"><code>fly validate-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.1.3</span>
+      <a href="setting-pipelines.html#fly-format-pipeline"><code>fly format-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2</span>
+      <a href="managing-pipelines.html">Managing Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.2.1</span>
+      <a href="managing-pipelines.html#fly-pipelines"><code>fly pipelines</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.2</span>
+      <a href="managing-pipelines.html#fly-rename-pipeline"><code>fly rename-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.3</span>
+      <a href="managing-pipelines.html#fly-pause-pipeline"><code>fly pause-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.4</span>
+      <a href="managing-pipelines.html#fly-unpause-pipeline"><code>fly unpause-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.5</span>
+      <a href="managing-pipelines.html#fly-expose-pipeline"><code>fly expose-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.6</span>
+      <a href="managing-pipelines.html#fly-hide-pipeline"><code>fly hide-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.7</span>
+      <a href="managing-pipelines.html#fly-get-pipeline"><code>fly get-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.8</span>
+      <a href="managing-pipelines.html#fly-destroy-pipeline"><code>fly destroy-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.9</span>
+      <a href="managing-pipelines.html#fly-order-pipelines"><code>fly order-pipelines</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.2.10</span>
+      <a href="managing-pipelines.html#fly-archive-pipeline"><code>fly archive-pipeline</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.3</span>
+      <a href="instanced-pipelines.html">Grouping Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.3.1</span>
+      <a href="instanced-pipelines.html#managing-instanced-pipelines">Managing Instanced Pipelines</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.6.3.1.1</span>
+      <a href="instanced-pipelines.html#fly-order-instanced-pipelines"><code>fly order-instanced-pipelines</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.6.3.1.2</span>
+      <a href="instanced-pipelines.html#jobs-and-resources-instanced-pipelines">Managing Jobs and Resources</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.5</span>
+              
+
+              <a href="config-basics.html">Config Basics</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.6.1</span>
+              
+
+              <a href="setting-pipelines.html">Setting Pipelines</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside">
+          <div class="page-partial">
+            <div class="content">
+  <h2>Examples</h2>
+
+  <div class="example">
+  <h3>Hello, world!</h3>
+
+  <p>The following example makes use of an embedded <a href="tasks.html">task config</a> to define the smallest possible pipeline.</p><pre><code class="language-yaml">jobs:
+- name: hello-world
+  plan:
+  - task: say-hello
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: {repository: alpine}
+      run:
+        path: echo
+        args: [&#34;Hello, world!&#34;]</code></pre>
+</div><div class="example">
+  <h3>Small Go Project</h3>
+
+  <p>When it comes to real-world projects, task configs are usually stored alongside the code that it&#39;s testing. This makes the pipeline a bit smaller and makes the config able to change without needing to reconfigure the pipeline.</p><pre><code class="language-yaml">---
+resources:
+- name: booklit
+  type: git
+  source:
+    uri: https://github.com/concourse/booklit
+    branch: master
+
+jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: true
+  - task: unit
+    file: booklit/ci/test.yml</code></pre>
+</div><div class="example">
+  <h3>Chaining Jobs</h3>
+
+  <p>Promoting resources to downstream jobs is done by setting <a href="get-step.html#schema.get.passed"><code>get</code> step <strong><code>passed</code></strong></a> on a <a href="get-step.html"><code>get</code> step</a>.</p><p>Note that nothing in <code>unit</code> says anything about triggering <code>build</code>. Job definitions are self-contained; they describe their dependencies and where they come from, which results in a dependency flow that Concourse pushes forward.</p><pre><code class="language-yaml">---
+resources:
+- name: booklit
+  type: git
+  source:
+    uri: https://github.com/concourse/booklit
+    branch: master
+
+jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: true
+  - task: run-unit
+    file: booklit/ci/test.yml
+
+- name: build
+  plan:
+  - get: booklit
+    passed: [unit]
+    trigger: true
+  - task: run-build
+    file: booklit/ci/build.yml</code></pre>
+</div><div class="example">
+  <h3>Using Resource Types</h3>
+
+  <p><a href="resource-types.html">Resource Types</a> can be used to extend the functionality of your pipeline and provide deeper integrations. This example uses one to trigger a job whenever a new <a href="http://www.qwantz.com">Dinosaur Comic</a> is out.</p><pre><code class="language-yaml">---
+resource_types:
+- name: rss
+  type: registry-image
+  source:
+    repository: suhlig/concourse-rss-resource
+    tag: latest
+
+resources:
+- name: dinosaur-comics
+  type: rss
+  source:
+    url: http://www.qwantz.com/rssfeed.php
+
+jobs:
+- name: announce
+  plan:
+  - get: dinosaur-comics
+    trigger: true</code></pre>
+</div>
+</div>
+          </div>
+          </div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/postgresql-node.html b/postgresql-node.html
new file mode 100644
index 00000000..3aa5a9d1
--- /dev/null
+++ b/postgresql-node.html
@@ -0,0 +1,386 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Running a PostgreSQL node - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html"  class="active">Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2</span><a href="install.html"  class="active">Install</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1</td>
+            <td class="title-cell"><a href="postgresql-node.html"  class="self">Running a PostgreSQL node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.2</td>
+            <td class="title-cell"><a href="concourse-cli.html" >The <code>concourse</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3</td>
+            <td class="title-cell"><a href="concourse-generate-key.html" >Generating Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4</td>
+            <td class="title-cell"><a href="concourse-web.html" >Running a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5</td>
+            <td class="title-cell"><a href="concourse-worker.html" >Running a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6</td>
+            <td class="title-cell"><a href="upgrading-concourse.html" >Upgrading Concourse</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2.1</span><a href="postgresql-node.html"  class="self">Running a PostgreSQL node</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1.1</td>
+            <td class="title-cell"><a href="postgresql-node.html#db-prerequisites" >Prerequisites</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.1.2</td>
+            <td class="title-cell"><a href="postgresql-node.html#db-running" >Running PostgreSQL</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.1.3</td>
+            <td class="title-cell"><a href="postgresql-node.html#db-resource-utilization" >Resource utilization</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_postgresql-node">
+  
+  <h1 class="section-header"><a class="anchor-target" name="postgresql-node" href="#postgresql-node"></a><span class="section-number">1.2.1 </span>Running a PostgreSQL node</h1>
+  
+
+  <p>Concourse uses <a href="https://www.postgresql.org">PostgreSQL</a> for storing all data and coordinating work in a multi-<a href="concourse-web.html"><code>web</code> node</a> installation.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.2.1.1</span>
+      <a href="postgresql-node.html#db-prerequisites">Prerequisites</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.1.2</span>
+      <a href="postgresql-node.html#db-running">Running PostgreSQL</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.2.1.3</span>
+      <a href="postgresql-node.html#db-resource-utilization">Resource utilization</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_db-prerequisites">
+  
+  <h2 class="section-header"><a class="anchor-target" name="db-prerequisites" href="#db-prerequisites"></a>Prerequisites</h2>
+  
+
+  <p><a href="https://www.postgresql.org">PostgreSQL</a> v11 or above is required, though the latest available version is recommended.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_db-running">
+  
+  <h2 class="section-header"><a class="anchor-target" name="db-running" href="#db-running"></a>Running PostgreSQL</h2>
+  
+
+  <p>How this node is managed is up to you; Concourse doesn&#39;t actually have much of an opinion on it, it just needs a database. By default Concourse will try connecting to a database named <code>atc</code>.</p><p>How to install PostgreSQL is really dependent on your platform. Please refer to your Linux distribution or operating system&#39;s documentation.</p><p>For the most part, the instruction on Linux should look something like this:</p><pre><code class="language-bash">sudo apt install postgresql
+sudo su postgres -c &#34;createuser $(whoami)&#34;
+sudo su postgres -c &#34;createdb --owner=$(whoami) atc&#34;</code></pre><p>This will install PostgreSQL (assuming your distro uses <code>apt</code>), create a user, and create a database that the current UNIX user can access, assuming this same user is going to be running the <a href="concourse-web.html"><code>web</code> node</a>. This is a reasonable default for distros like Ubuntu and Debian which default PostgreSQL to <code>peer</code> auth.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_db-resource-utilization">
+  
+  <h2 class="section-header"><a class="anchor-target" name="db-resource-utilization" href="#db-resource-utilization"></a>Resource utilization</h2>
+  
+
+  <p><strong>CPU usage</strong>: this is one of the most volatile metrics, and one we try pretty hard to keep down. There will be near-constant database queries running, and while we try to keep them very simple, there is always more work to do. Expect to feed your database with at least a couple cores, ideally four to eight. Monitor this closely as the size of your deployment and the amount of traffic it&#39;s handling increases, and scale accordingly.</p><p><strong>Memory usage</strong>: similar to CPU usage, but not quite as volatile.</p><p><strong>Disk usage</strong>: pipeline configurations and various bookkeeping metadata for keeping track of jobs, builds, resources, containers, and volumes. In addition, <strong>all build logs are stored in the database</strong>. This is the primary source of disk usage. To mitigate this, log retention can be defined by pipeline authors by using <a href="jobs.html#schema.job.build_log_retention"><code class="schema-attribute-name"><bold>job<wbr />.build_log_retention</bold></code></a>. Concourse operators can also configure a default <a href="concourse-web.html#build-log-retention">Build log retention</a> policy that applies to all pipelines.</p><p><strong>Bandwidth usage</strong>: well, it&#39;s a database, so it most definitely uses the network. Something important to consider here is the number of simultaneous connections that the database server itself will allow. Postgres exposes a <a href="https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS"><code>max_connections</code></a> configuration variable, and depending on how many web nodes you are running and the size of their <a href="concourse-web.html#web-connection-pooling">connection pool</a>, you may need to tune these two numbers against each other.</p><p><strong>Highly available</strong>: Up to you. Clustered PostgreSQL is kind of new and probably tricky to deploy, but there are various cloud solutions for this.</p><p><strong>Outbound traffic</strong>: None</p><p><strong>Inbound traffic</strong>: Only ever from the <code>web</code> node</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.2</span>
+              
+
+              <a href="install.html">Install</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.2.2</span>
+              
+
+              <a href="concourse-cli.html">The <code>concourse</code> CLI</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/project.html b/project.html
new file mode 100644
index 00000000..42d103ec
--- /dev/null
+++ b/project.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Project - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link active" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">3</span><a href="project.html"  class="self">Project</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">3.1</td>
+            <td class="title-cell"><a href="project.html#where-is-everything" >Where is everything?</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">3.2</td>
+            <td class="title-cell"><a href="project.html#why-make-concourse" >Why make Concourse?</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">3.3</td>
+            <td class="title-cell"><a href="project.html#how-can-i-help" >How can I help?</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">3.4</td>
+            <td class="title-cell"><a href="project.html#security-contact" >Report a security issue</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">3.5</td>
+            <td class="title-cell"><a href="project.html#thanks" >Thanks!</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_project">
+  
+  <h1 class="section-header"><a class="anchor-target" name="project" href="#project"></a><span class="section-number">3 </span>Project</h1>
+  
+
+  <p>Concourse began as a side-project by <a href="https://github.com/vito"><code>@vito</code></a> (hi!) and <a href="https://github.com/xoebus"><code>@xoebus</code></a> in 2014. Since then, Concourse has evolved into a dedicated community with contributors from all around the world.</p>
+
+  
+    
+      <div class="section" id="section_where-is-everything">
+  
+  <h2 class="section-header"><a class="anchor-target" name="where-is-everything" href="#where-is-everything"></a>Where is everything?</h2>
+  
+
+  <ul>
+
+  <li><p>The <a href="https://github.com/concourse/concourse">Concourse repo</a> houses the main codebase, where planning happens, and where issues are tracked. It is overseen by the <a href="https://github.com/concourse/governance/blob/master/teams/maintainers.yml"><strong>maintainers</strong> team</a>.</p></li>
+
+  <li><p>The <a href="https://github.com/concourse/docs">Docs repo</a> contains the source for the website you&#39;re reading now! It is overseen by the <a href="https://github.com/concourse/governance/blob/master/teams/community.yml"><strong>community</strong> team</a>.</p></li>
+
+  <li><p><a href="https://github.com/concourse/concourse/discussions">GitHub Discussions</a> are used for support, announcements, idea sharing, and general conversations.</p></li>
+
+  <li><p>The <a href="https://blog.concourse-ci.org">Concourse blog</a> features tutorials and updates from the development perspective.</p></li>
+
+  <li><p>The <a href="https://discord.gg/MeRxXKW">Concourse Discord server</a> offers a great space to chat with other contributors.</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_why-make-concourse">
+  
+  <h2 class="section-header"><a class="anchor-target" name="why-make-concourse" href="#why-make-concourse"></a>Why make Concourse?</h2>
+  
+
+  <p>When working on a substantial project, having a pipeline to reliably test, deploy, and publish the product is essential for rapid iteration.</p><p>But with every CI system we tried, we found ourselves repeatedly facing the same problems: complex configs buried in many pages of the web UI, uncertainty about who changed what &amp; when, managing dependencies and state on the workers, build contamination, frustrating UX...</p><p>Our project was expanding, and with every box we checked and for every worker we manually configured, the anxiety of having to rebuild everything if something failed grew increasingly. We began writing software to manage our CI instead of creating the software for the product we intended to build.</p><p>We created Concourse to be a CI system that provides peace of mind. A CI that&#39;s straightforward enough to fully understand and easy to maintain as your project grows; both in the complexity of the product and the size of your team. We aimed to build a CI with robust abstractions and fewer concepts to learn, making it easier to comprehend and allowing Concourse to evolve gracefully.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_how-can-i-help">
+  
+  <h2 class="section-header"><a class="anchor-target" name="how-can-i-help" href="#how-can-i-help"></a>How can I help?</h2>
+  
+
+  <p>Concourse is a free and Open Source software project that depends on the contributions of sponsors and volunteers worldwide.</p><p>If you&#39;re interested in contributing, head over to GitHub and check out the <a href="https://github.com/concourse/concourse/blob/master/CONTRIBUTING.md">contributing docs</a>!</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_security-contact">
+  
+  <h2 class="section-header"><a class="anchor-target" name="security-contact" href="#security-contact"></a>Report a security issue</h2>
+  
+
+  <p>To report a security issue, please email <a href="mailto:security@concourse-ci.org">security@concourse-ci.org</a>.</p><p>Security advisories will be published as <a href="https://github.com/concourse/concourse/security/advisories"><code>concourse/concourse</code> GitHub Security Advisories</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_thanks">
+  
+  <h2 class="section-header"><a class="anchor-target" name="thanks" href="#thanks"></a>Thanks!</h2>
+  
+
+  <p>It&#39;s been a long journey and we&#39;re grateful to many people for our continued success. We are deeply indebted to all who help sustain this project, but the extraordinary efforts of the following organizations deserve special recognition.</p><dl>
+  
+  <dt><span style="font-size: 120%">Pivotal</span></dt>
+    <dd><p>Concourse wouldn&#39;t be what it is today without <a href="https://pivotal.io">Pivotal</a>. This extends beyond the sponsorship, which began in early 2015 - without the experiences we gained and the practices we learned while working on <a href="https://cloudfoundry.org">Cloud Foundry</a> and <a href="https://bosh.io">BOSH</a>, we would have neither the technical expertise nor the strong opinions that led to Concourse&#39;s creation.</p></dd>
+  
+</dl>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2</span>
+              
+
+              <a href="examples.html">Examples</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">4</span>
+              
+
+              <a href="ecosystem.html">Ecosystem</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/put-step.html b/put-step.html
new file mode 100644
index 00000000..15b2bbc7
--- /dev/null
+++ b/put-step.html
@@ -0,0 +1,539 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>put step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html"  class="self"><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="put-step.html#schema.put.put"><code>put</code> step <strong><code>put</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="put-step.html#schema.put.resource"><code>put</code> step <strong><code>resource</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="put-step.html#schema.put.inputs"><code>put</code> step <strong><code>inputs</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="put-step.html#schema.put.params"><code>put</code> step <strong><code>params</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="put-step.html#schema.put.get_params"><code>put</code> step <strong><code>get_params</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="put-step.html#schema.put.no_get"><code>put</code> step <strong><code>no_get</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="put-step.html#put"><code>put</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_put-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="put-step" href="#put-step"></a><span class="section-number">1.11.2 </span><code>put</code> step</h1>
+  
+
+  <p>Pushes to the given <a href="resources.html">resource</a>. Expand each section below for more details and examples.</p><div class="schema-group">
+  <a id="put"></a>
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.put.put" type="checkbox" class="toggle" />
+  <label for="toggle-schema.put.put" class="toggle-title">
+    <a id="schema.put.put"></a>
+
+    <code><a class="attribute-name" href="#schema.put.put">put</a>: <span class="attribute-type"><a href="resources.html#schema.resource.name"><strong>resource.name</strong></a> | <a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>When the step succeeds, the version by the step will be immediately fetched via an additional implicit <a href="get-step.html"><code>get</code> step</a>. This is so that later steps in your plan can use the artifact that was produced. The artifact will be available under the identifier <code>put</code> specifies.</p><div class="toggleable example">
+  <input id="toggle-3721c7e6af902ab42ef803ba12f41dabd7155449" type="checkbox" class="toggle" />
+  <label for="toggle-3721c7e6af902ab42ef803ba12f41dabd7155449" class="toggle-title">Getting and Putting</label>
+  <div class="toggle-content">
+    <p>The following plan fetches a version using <a href="get-step.html"><code>get</code></a> and pushes it to another resource using <a href="put-step.html"><code>put</code></a>:</p><pre><code class="language-yaml">jobs:
+- name: get-and-pull
+  plan:
+  - get: the-ice
+  - put: cyberdeck
+    params:
+      file: the-ice/version.txt
+
+resources:
+- name: the-ice
+  type: mock
+  source:
+    create_files:
+      version.txt: &#34;made-via-source&#34;
+- name: cyberdeck
+  type: mock</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.put.resource" type="checkbox" class="toggle" />
+  <label for="toggle-schema.put.resource" class="toggle-title">
+    <a id="schema.put.resource"></a>
+
+    <code><a class="attribute-name" href="#schema.put.resource">resource</a>: <span class="attribute-type"><a href="resources.html#schema.resource.name"><strong>resource.name</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Defaults to the value of <code>put</code>.</em> The resource to update, as configured in <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a>.</p><div class="toggleable example">
+  <input id="toggle-b497a418bf436d8cce9b7353d8b20b2a7a377075" type="checkbox" class="toggle" />
+  <label for="toggle-b497a418bf436d8cce9b7353d8b20b2a7a377075" class="toggle-title">Re-label Put Resource</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: fetch-repo
+  plan:
+    # puts to &#34;repo&#34; and fetches new version under artifact name &#34;thecode&#34;
+  - put: thecode
+    resource: repo
+    params:
+      version: put-only
+  - task: ls-repo
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source: {mirror_self: true}
+      # pass the &#34;thecode&#34; artifact into the task
+      inputs:
+      - name: thecode
+      run:
+        path: ls
+        args: [&#34;-lah&#34;,&#34;thecode&#34;]
+
+resources:
+- name: repo
+  type: mock</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.put.inputs" type="checkbox" class="toggle" />
+  <label for="toggle-schema.put.inputs" class="toggle-title">
+    <a id="schema.put.inputs"></a>
+
+    <code><a class="attribute-name" href="#schema.put.inputs">inputs</a>: <span class="attribute-type"><span class="schema-scalar">all</span> | <span class="schema-scalar">detect</span> | [<a href="config-basics.html#schema.identifier"><strong>identifier</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>all</code>.</em> When not set, or set to <code>all</code>, all artifacts will be provided. This can result in slow performance if the prior steps in the build plan register a bunch of large artifacts before this step, so you may want to consider being explicit.</p><p>If configured as a list of identifiers, only the listed artifacts will be provided to the container.</p><p>If set to <code>detect</code>, the artifacts are detected based on the configured <a href="put-step.html#schema.put.params"><code>put</code> step <strong><code>params</code></strong></a> by looking for all string values and using the first path segment as an identifier. (This may become the default in the future.)</p><div class="toggleable example">
+  <input id="toggle-018fc0acd84947875cc396d01bafbe97c8fb5387" type="checkbox" class="toggle" />
+  <label for="toggle-018fc0acd84947875cc396d01bafbe97c8fb5387" class="toggle-title">Put Input Methods</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: put-input-methods
+  plan:
+  - in_parallel:
+    - get: repo-dev
+    - get: repo-master
+    - get: app-image
+    - get: ci
+  - put: all-inputs
+    resource: repo
+    inputs: all # default option
+    params:
+      file: ci/version.txt
+  - put: detect-inputs
+    resource: repo
+    inputs: detect # will only stream the &#34;ci&#34; artifact
+    params:
+      file: ci/version.txt
+  - put: explicit-inputs
+    resource: repo
+    inputs: # explicitly list artifacts to stream to put step
+      - ci
+    params:
+      file: ci/version.txt
+
+resources:
+- name: repo
+  type: mock
+- name: repo-dev
+  type: mock
+- name: repo-master
+  type: mock
+- name: app-image
+  type: mock
+- name: ci
+  type: mock
+  source:
+    create_files:
+      version.txt: &#34;42&#34;</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.put.params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.put.params" class="toggle-title">
+    <a id="schema.put.params"></a>
+
+    <code><a class="attribute-name" href="#schema.put.params">params</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Arbitrary configuration to pass to the resource. Refer to the resource type&#39;s documentation to see what it supports.</p><div class="toggleable example">
+  <input id="toggle-fc455e8299be5335939170eb3c6f856eec477696" type="checkbox" class="toggle" />
+  <label for="toggle-fc455e8299be5335939170eb3c6f856eec477696" class="toggle-title">Putting with params</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: resource-params
+  plan:
+  - put: cyberdeck
+    params:
+      version: &#34;made-via-params&#34;
+
+resources:
+- name: cyberdeck
+  type: mock</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.put.get_params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.put.get_params" class="toggle-title">
+    <a id="schema.put.get_params"></a>
+
+    <code><a class="attribute-name" href="#schema.put.get_params">get_params</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Arbitrary configuration to pass to the resource during the implicit <code>get</code> step. Refer to the resource type&#39;s documentation to see what it supports.</p><div class="toggleable example">
+  <input id="toggle-3e04a65a1f4557786efcb18de77c0ed6b16597ad" type="checkbox" class="toggle" />
+  <label for="toggle-3e04a65a1f4557786efcb18de77c0ed6b16597ad" class="toggle-title">Parameterizing the implicit <code>get</code></label>
+  <div class="toggle-content">
+    <p>You can control the settings of the implicit <code>get</code> step by setting <code>get_params</code>. For example, if you did not want a <code>put</code> step utilizing the <a href="https://github.com/concourse/registry-image-resource"> <code>registry-image</code> resource type</a> to download the image, you would implement your <code>put</code> step as such:</p><pre><code class="language-yaml">plan:
+- put: app-image
+  params:
+    build: git-resource
+  get_params:
+    skip_download: true</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.put.no_get" type="checkbox" class="toggle" />
+  <label for="toggle-schema.put.no_get" class="toggle-title">
+    <a id="schema.put.no_get"></a>
+
+    <code><a class="attribute-name" href="#schema.put.no_get">no_get</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Skips the get step that usually follows the completion of the put step.</p>
+  </div>
+</div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.1</span>
+              
+
+              <a href="get-step.html"><code>get</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.3</span>
+              
+
+              <a href="task-step.html"><code>task</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/quick-start.html b/quick-start.html
new file mode 100644
index 00000000..18936daf
--- /dev/null
+++ b/quick-start.html
@@ -0,0 +1,355 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Quick Start - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html"  class="active">Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1</span><a href="getting-started.html"  class="active">Getting Started</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.1</td>
+            <td class="title-cell"><a href="quick-start.html"  class="self">Quick Start</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html" >Hello World Pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html" >Inputs and Outputs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4</td>
+            <td class="title-cell"><a href="tutorial-resources.html" >Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1.1</span><a href="quick-start.html"  class="self">Quick Start</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.1.1</td>
+            <td class="title-cell"><a href="quick-start.html#docker-compose-concourse" >Docker Compose Concourse</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.1.2</td>
+            <td class="title-cell"><a href="quick-start.html#install-fly" >Install Fly</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_quick-start">
+  
+  <h1 class="section-header"><a class="anchor-target" name="quick-start" href="#quick-start"></a><span class="section-number">1.1.1 </span>Quick Start</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_docker-compose-concourse">
+  
+  <h2 class="section-header"><a class="anchor-target" name="docker-compose-concourse" href="#docker-compose-concourse"></a>Docker Compose Concourse</h2>
+  
+
+  <p>Concourse is distributed as a single <code>concourse</code> binary, making it easy to run just about anywhere, especially with Docker.</p><p>If you&#39;d like to get Concourse running somewhere quickly so you can start to kick the tires, the easiest way is to use our <a href="docker-compose.yml">docker-compose.yml</a>:</p><pre><code class="language-bash">$ curl -O https://concourse-ci.org/docker-compose.yml
+$ docker-compose up -d
+Creating docs_concourse-db_1 ...
+Creating docs_concourse-db_1 ... done
+Creating docs_concourse_1 ...
+Creating docs_concourse_1 ... done</code></pre><p>Concourse will be running at <a href="http://localhost:8080">localhost:8080</a> on your machine. You can log in with the username/password as <code>test</code>/<code>test</code>.</p><div class="diagram">
+  <img src="images/tutorial/welcome-screen.png" alt="diagram" width="100%" />
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_install-fly">
+  
+  <h2 class="section-header"><a class="anchor-target" name="install-fly" href="#install-fly"></a>Install Fly</h2>
+  
+
+  <p>Next, install the <a href="fly.html"><code>fly</code> CLI</a> by downloading it from the web UI. If you&#39;re on version <code>&gt;=v7.14.0</code> of Concourse, you can visit <a href="http://localhost:8080/download-fly">http://localhost:8080/download-fly</a>.</p><p>Otherwise, you can follow these steps to instally <code>fly</code> for your OS:</p><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>Linux</code>
+  </div>
+
+  <pre><code class="language-bash">curl &#39;http://localhost:8080/api/v1/cli?arch=amd64&amp;platform=linux&#39; -o fly
+chmod &#43;x ./fly
+mv ./fly /usr/local/bin/</code></pre>
+</div><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>MacOS</code>
+  </div>
+
+  <pre><code class="language-bash">curl &#39;http://localhost:8080/api/v1/cli?arch=amd64&amp;platform=darwin&#39; -o fly
+chmod &#43;x ./fly
+mv ./fly /usr/local/bin/</code></pre>
+</div><div class="titled-codeblock">
+  <div class="codeblock-title">
+    <code>Windows (Powershell)</code>
+  </div>
+
+  <pre><code class="language-bash">$concoursePath = &#39;C:\concourse\&#39;
+mkdir $concoursePath
+[Environment]::SetEnvironmentVariable(&#39;PATH&#39;, &#34;$ENV:PATH;${concoursePath}&#34;, &#39;USER&#39;)
+$concourseURL = &#39;http://localhost:8080/api/v1/cli?arch=amd64&amp;platform=windows&#39;
+Invoke-WebRequest $concourseURL -OutFile &#34;${concoursePath}\fly.exe&#34;</code></pre>
+</div><p>Use <a href="fly.html#fly-login"><code>fly login</code></a> to log into your local Concourse as the <code>test</code> user:</p><pre><code class="language-bash">fly -t tutorial login -c http://localhost:8080 -u test -p test</code></pre><p>You&#39;ve successfully logged in if you see the following output:</p><pre><code class="language-bash">logging in to team &#39;main&#39;
+
+target saved</code></pre><p>You&#39;ll notice that every <code>fly</code> command in this tutorial has to have the <a href="fly.html#fly-targets">target (<code>-t tutorial</code>)</a> specified. This is annoying when you only have one Concourse to target, but it helps ensure you don&#39;t trigger a job on the wrong Concourse instance. It will save you from hurting yourself!</p><p>Once you&#39;ve confirmed everything is up and running by logging in through fly and the <a href="http://localhost:8080">web UI</a>, you can move onto the next section.</p><blockquote class="aside"><p>If you have any feedback for this tutorial please share it in <a href="https://github.com/concourse/concourse/discussions/7353">this GitHub discussion</a></p></blockquote>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.1</span>
+              
+
+              <a href="getting-started.html">Getting Started</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.1.2</span>
+              
+
+              <a href="tutorial-hello-world.html">Hello World Pipeline</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/rails-example.html b/rails-example.html
new file mode 100644
index 00000000..7806a204
--- /dev/null
+++ b/rails-example.html
@@ -0,0 +1,301 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Rails application testing example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html"  class="self">Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_rails-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="rails-example" href="#rails-example"></a><span class="section-number">2.11 </span>Rails application testing example</h1>
+  
+
+  <p>You can run the tests for a Rails that requires a specific version of ruby and relies on a Postgres database.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/rails"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: rails-contributors-git
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/rails/rails-contributors.git
+
+jobs:
+- name: test
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+    - get: rails-contributors-git
+      trigger: true
+    - task: run-tests
+      config:
+        platform: linux
+        image_resource:
+          type: registry-image
+          source: { repository: ruby, tag: 3.3.4 }
+        inputs:
+          - name: rails-contributors-git
+        params:
+          RAILS_ENV: test
+          DATABASE_URL: postgresql://postgres@localhost
+        run:
+          path: /bin/bash
+          args:
+            - -ce
+            - |
+              cd rails-contributors-git
+
+              echo &#34;=== Setting up Postgres ===&#34;
+              apt-get update
+              apt-get install -y postgresql libpq-dev cmake nodejs
+              cat &gt; /etc/postgresql/*/main/pg_hba.conf &lt;&lt;-EOF
+              host   all   postgres   localhost   trust
+              EOF
+              service postgresql restart
+
+              echo &#34;=== Project requires that we clone rails ===&#34;
+              git clone --mirror https://github.com/rails/rails.git
+
+              echo &#34;=== Installing Gems ===&#34;
+              gem install -N bundler
+              bundle install
+
+              echo &#34;=== Running Tests ===&#34;
+              bundle exec rails db:setup
+              bundle exec rails test
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.10</span>
+              
+
+              <a href="golang-library-example.html">Golang library testing example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.12</span>
+              
+
+              <a href="java-example.html">Java application testing example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/resource-types.html b/resource-types.html
new file mode 100644
index 00000000..610ddba7
--- /dev/null
+++ b/resource-types.html
@@ -0,0 +1,578 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Resource Types - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html"  class="self">Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.9</span><a href="resource-types.html"  class="self">Resource Types</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.9.1</td>
+            <td class="title-cell"><a href="implementing-resource-types.html" >Implementing a Resource Type</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9.2</td>
+            <td class="title-cell"><a href="managing-resource-types.html" >Managing Resource Types</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type"><strong><code>resource_type</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.name"><code class="schema-attribute-name"><bold>resource_type<wbr />.name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.type"><code class="schema-attribute-name"><bold>resource_type<wbr />.type</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.source"><code class="schema-attribute-name"><bold>resource_type<wbr />.source</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.privileged"><code class="schema-attribute-name"><bold>resource_type<wbr />.privileged</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.params"><code class="schema-attribute-name"><bold>resource_type<wbr />.params</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.check_every"><code class="schema-attribute-name"><bold>resource_type<wbr />.check_every</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.tags"><code class="schema-attribute-name"><bold>resource_type<wbr />.tags</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resource-types.html#schema.resource_type.defaults"><code class="schema-attribute-name"><bold>resource_type<wbr />.defaults</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_resource-types">
+  
+  <h1 class="section-header"><a class="anchor-target" name="resource-types" href="#resource-types"></a><span class="section-number">1.9 </span>Resource Types</h1>
+  
+
+  <p>Each resource in a pipeline has a <code>type</code>. The resource&#39;s type determines what versions are detected, the bits that are fetched when the resource&#39;s <a href="get-step.html"><code>get</code> step</a> runs, and the side effect that occurs when the resource&#39;s <a href="put-step.html"><code>put</code> step</a> runs.</p><p>Concourse comes with a few &#34;core&#34; resource types to cover common use cases like <code>git</code> and <code>s3</code> - the rest are developed and supported by the Concourse community. An exhaustive list of all resource types is available in the <a href="https://resource-types.concourse-ci.org">Resource Types catalog</a>.</p><p>A pipeline&#39;s resource types are listed under <a href="pipelines.html#schema.pipeline.resource_types"><code class="schema-attribute-name"><bold>pipeline<wbr />.resource_types</bold></code></a> with the following schema:</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.resource_type" href="#schema.resource_type"></a><code>resource_type</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.resource_type.name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.name" class="toggle-title">
+    <a id="schema.resource_type.name"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.name">name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of the resource type. This should be short and simple. This name will be referenced by <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a> defined within the same pipeline, and <a href="tasks.html#schema.task-config.image_resource"><code class="schema-attribute-name"><bold>task-config<wbr />.image_resource</bold></code></a>s used by tasks running in the pipeline.</p><p>Pipeline-provided resource types can override the core resource types by specifying the same name.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.resource_type.type" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.type" class="toggle-title">
+    <a id="schema.resource_type.type"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.type">type</a>: <span class="attribute-type"><a href="resource-types.html#schema.resource_type.name"><strong>resource_type.name</strong></a> | <a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The type of the resource used to provide the resource type&#39;s container image.</p><p>This is a bit meta. Usually this value will be <code>registry-image</code> as the resource type must result in a container image.</p><p>A resource type&#39;s type can refer to other resource types, and can also use the core type that it&#39;s overriding. This is useful for bringing in a newer or forked <code>registry-image</code> resource.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.resource_type.source" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.source" class="toggle-title">
+    <a id="schema.resource_type.source"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.source">source</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The configuration for the resource type&#39;s resource. This varies by resource type, and is a black box to Concourse; it is blindly passed to the resource at runtime.</p><p>To use <code>registry-image</code> as an example, the source would contain something like <code>repository: username/reponame</code>. See the <a href="https://github.com/concourse/registry-image-resource">Registry Image resource</a> (or whatever resource type your resource type uses) for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource_type.privileged" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.privileged" class="toggle-title">
+    <a id="schema.resource_type.privileged"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.privileged">privileged</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, the resource&#39;s containers will be run with full capabilities, as determined by the worker backend the task runs on.</p><p>For Linux-based backends it typically determines whether or not the container will run in a separate user namespace, and whether the <code>root</code> user is &#34;actual&#34; <code>root</code> (if set to <code>true</code>) or a user namespaced <code>root</code> (if set to <code>false</code>, the default).</p><p>This is a gaping security hole; only configure it if the resource type needs it (which should be called out in its documentation). This is not up to the resource type to decide dynamically, so as to prevent privilege escalation via third-party resource type exploits.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource_type.params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.params" class="toggle-title">
+    <a id="schema.resource_type.params"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.params">params</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Arbitrary config to pass when running the <a href="get-step.html#get"><code>get</code> step</a> to fetch the resource type&#39;s image. This is equivalent to <a href="get-step.html#schema.get.params"><code>get</code> step <strong><code>params</code></strong></a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource_type.check_every" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.check_every" class="toggle-title">
+    <a id="schema.resource_type.check_every"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.check_every">check_every</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>1m</code>.</em> The interval on which to check for new versions of the resource type. Acceptable interval options are defined by the <a href="https://golang.org/pkg/time/#ParseDuration">time.ParseDuration function</a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource_type.tags" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.tags" class="toggle-title">
+    <a id="schema.resource_type.tags"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.tags">tags</a>: <span class="attribute-type">[<a href="config-basics.html#schema.string"><strong>string</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>[]</code>.</em> A list of tags to determine which workers the checks will be performed on. You&#39;ll want to specify this if the source is internal to a worker&#39;s network, for example. See also <a href="tags-step.html#schema.tags"><code class="schema-attribute-name"><bold>tags</bold></code></a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource_type.defaults" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource_type.defaults" class="toggle-title">
+    <a id="schema.resource_type.defaults"></a>
+
+    <code><a class="attribute-name" href="#schema.resource_type.defaults">defaults</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The default configuration for the resource type. This varies by resource type, and is a black box to Concourse; it is merged with (duplicate fields are overwritten by) <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a> and passed to the resource at runtime.</p><div class="toggleable example">
+  <input id="toggle-9c9fd20fb2a2d5cfc11e4a6986ab0d451124f1b6" type="checkbox" class="toggle" />
+  <label for="toggle-9c9fd20fb2a2d5cfc11e4a6986ab0d451124f1b6" class="toggle-title">Setting default configuration for resources</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">resource_types:
+- name: gcs
+  type: registry-image
+  source:
+    repository: frodenas/gcs-resource
+  defaults:
+    json_key: ((default_key))
+
+resources:
+- name: bucket-a
+  type: gcs
+  source:
+    bucket: a
+
+- name: bucket-b
+  type: gcs
+  source:
+    bucket: b
+
+- name: bucket-c
+  type: gcs
+  source:
+    bucket: c
+    json_key: ((different_key))</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-ca4a908f000f2d82c73716c20c5d8f03383c2111" type="checkbox" class="toggle" />
+  <label for="toggle-ca4a908f000f2d82c73716c20c5d8f03383c2111" class="toggle-title">Overriding default resource types</label>
+  <div class="toggle-content">
+    <p>Since it&#39;s possible to overwrite the base resource types, it can be used to give defaults to resources at the pipeline level.</p><pre><code class="language-yaml">resource_types:
+- name: registry-image
+  type: registry-image
+  source:
+    repository: concourse/registry-image-resource
+  defaults:
+    registry_mirror:
+      host: https://registry.mirror.example.com
+
+resources:
+- name: mirrored-image
+  type: registry-image
+  source:
+    repository: busybox</code></pre><p>Alternatively, the web node can be configured to use <a href="concourse-web.html#resource-defaults">defaults for base resource types</a></p>
+  </div>
+</div>
+  </div>
+</div>
+</div><div class="toggleable example">
+  <input id="toggle-70a30d14d470813edc5f94bc534c9bb679022e45" type="checkbox" class="toggle" />
+  <label for="toggle-70a30d14d470813edc5f94bc534c9bb679022e45" class="toggle-title">Using a <code>rss</code> resource type to subscribe to RSS feeds</label>
+  <div class="toggle-content">
+    <p><a href="resource-types.html">Resource Types</a> can be used to extend the functionality of your pipeline and provide deeper integrations. This example uses one to trigger a job whenever a new <a href="http://www.qwantz.com">Dinosaur Comic</a> is out.</p><pre><code class="language-yaml">---
+resource_types:
+- name: rss
+  type: registry-image
+  source:
+    repository: suhlig/concourse-rss-resource
+    tag: latest
+
+resources:
+- name: booklit-releases
+  type: rss
+  source:
+    url: http://www.qwantz.com/rssfeed.php
+
+jobs:
+- name: announce
+  plan:
+  - get: booklit-releases
+    trigger: true</code></pre>
+  </div>
+</div><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.9.1</span>
+      <a href="implementing-resource-types.html">Implementing a Resource Type</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.9.1.1</span>
+      <a href="implementing-resource-types.html#resource-check"><code>check</code>: Check for new versions.</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.2</span>
+      <a href="implementing-resource-types.html#resource-in"><code>in</code>: Fetch a given resource.</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.3</span>
+      <a href="implementing-resource-types.html#resource-out"><code>out</code>: Update a resource.</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.4</span>
+      <a href="implementing-resource-types.html#resource-metadata">Metadata</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.5</span>
+      <a href="implementing-resource-types.html#resource-certs">Certificate Propagation</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.1.6</span>
+      <a href="implementing-resource-types.html#test-resource-with-docker">Testing resources locally using docker</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.9.2</span>
+      <a href="managing-resource-types.html">Managing Resource Types</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.9.2.1</span>
+      <a href="managing-resource-types.html#fly-check-resource-type"><code>fly check-resource-type</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.8</span>
+              
+
+              <a href="resources.html">Resources</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.9.1</span>
+              
+
+              <a href="implementing-resource-types.html">Implementing a Resource Type</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/resource-versions.html b/resource-versions.html
new file mode 100644
index 00000000..dd10998e
--- /dev/null
+++ b/resource-versions.html
@@ -0,0 +1,339 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Resource Versions - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html"  class="active">Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.8</span><a href="resources.html"  class="active">Resources</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.8.1</td>
+            <td class="title-cell"><a href="resource-versions.html"  class="self">Resource Versions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.2</td>
+            <td class="title-cell"><a href="managing-resources.html" >Managing Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.8.1</span><a href="resource-versions.html"  class="self">Resource Versions</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.8.1.1</td>
+            <td class="title-cell"><a href="resource-versions.html#where-and-what-versions" >Where do they come from and what are they used for?</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.1.2</td>
+            <td class="title-cell"><a href="resource-versions.html#version-pinning" >Version Pinning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.1.3</td>
+            <td class="title-cell"><a href="resource-versions.html#disable-version" >Disabling a Version</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_resource-versions">
+  
+  <h1 class="section-header"><a class="anchor-target" name="resource-versions" href="#resource-versions"></a><span class="section-number">1.8.1 </span>Resource Versions</h1>
+  
+
+  <p>As you may know, resources represent external state that changes over time. But how do we track those changes in a generic way that will properly represent all the different resource types? That is where resource versions are introduced. Concourse uses versions to represent the exact changes of a resource over time.</p><p>The versions of a resource are directly dependent on its resource configuration and <a href="resource-types.html">resource type</a>. Each resource type has its own definition of what its versions should be. For example, the versions of a git resource would be the commits of the github repository and the versions of a docker image resource are the image digests.</p><p>If you want to figure out what determines the version of a resource type, it is typically outlined in the `check` behavior for the resource type. For example, the git resource uses commits as versions <a href="https://github.com/concourse/git-resource#check-check-for-new-commits">git resource type check behavior</a>.</p>
+
+  
+    
+      <div class="section" id="section_where-and-what-versions">
+  
+  <h2 class="section-header"><a class="anchor-target" name="where-and-what-versions" href="#where-and-what-versions"></a>Where do they come from and what are they used for?</h2>
+  
+
+  <p>The <a href="checker.html">resource checker</a> is responsible for checking for new versions of a resource. These versions are then saved to the database and can be viewed from the resource page in the web UI.</p><p>Resource versions are used by the <a href="scheduler.html">build scheduler</a> in order to schedule new builds for a job.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_version-pinning">
+  
+  <h2 class="section-header"><a class="anchor-target" name="version-pinning" href="#version-pinning"></a>Version Pinning</h2>
+  
+
+  <p>A common job workflow is to use the latest version of a resource in order to trigger new builds. This works most of the time until you run into a situation where you need to run the job using an old version of a resource. Concourse provides a solution to this, which is called resource pinning.</p><p>There are two different ways to pin a resource: through the pipeline config and through the web UI. Within the pipeline config, you can either pin the resource to a version through the <a href="resources.html#schema.resource.version">resource configuration</a> or through a <a href="get-step.html#schema.get.version">get step version configuration</a>. If you would like to pin through the web UI, the functionality can be found in the resource version history page which is accessed through clicking into the resource within the pipeline page.</p><p>Pinning through the pipeline config is useful for a more permanent pinned state. If a resource is pinned through the pipeline config, it cannot be modified through the web UI and can only be changed through modifiying and resetting the pipeline config.</p><p>Pinning through the web UI is useful for reactionary pinning of a resource. For example, it can be used in the event of a broken upstream dependency.</p><p>If you had a version pinned in the web UI and then pinned it through the pipeline config, the pipeline config pinned version will take precendence.</p><p>A pinned version is associated to a resource and can be viewed in the resource page (excluding the case that the version was pinned on a get step). This pinned version will be propagated throughout the pipeline and used by the jobs that take that pinned resource as an input. If there is a job that has a passed constraint on a pinned resource, this means that the input is only valid if that pinned version has been used by the passed constraint job.</p><p>Let&#39;s say we have a pipeline with two jobs and one resource that is being used as a passed constraint between the two jobs. If that resource is pinned to a version, the first job will produce a build using the pinned version of the resource. After that build succeeds, the second job that has a passed constraint on the first will then be able to trigger off a build because the pinned version has been successfully used by the first job.</p>
+
+  
+    
+      <div class="section" id="section_version-unpinning">
+  
+  <h3 class="section-header"><a class="anchor-target" name="version-unpinning" href="#version-unpinning"></a>Unpinning</h3>
+  
+
+  <p>When a version is unpinned, Concourse will go back to using the latest available version. This means a new build will be queued up if the most recent build used the old pinned version and the input has <code>trigger: true</code>.</p><p>If you would like to learn more about how version pinning and unpinning works with the build scheduler, you can read more about it in the <a href="scheduler.html#scheduling-behavior">scheduling behavior section</a>.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_disable-version">
+  
+  <h2 class="section-header"><a class="anchor-target" name="disable-version" href="#disable-version"></a>Disabling a Version</h2>
+  
+
+  <p>A resource version can also be disabled through the web UI on the resource version history page. These disabled versions will not be used to schedule any further builds for any jobs that use the resource as an input.</p><p>Disabled versions can also be re-enabled through the resource version history page.</p><p>Disabling a version is useful for cases where you know that the version is broken or incompatible.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.8</span>
+              
+
+              <a href="resources.html">Resources</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.8.2</span>
+              
+
+              <a href="managing-resources.html">Managing Resources</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/resources.html b/resources.html
new file mode 100644
index 00000000..ce1c0d5c
--- /dev/null
+++ b/resources.html
@@ -0,0 +1,649 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Resources - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html"  class="self">Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.8</span><a href="resources.html"  class="self">Resources</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.8.1</td>
+            <td class="title-cell"><a href="resource-versions.html" >Resource Versions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8.2</td>
+            <td class="title-cell"><a href="managing-resources.html" >Managing Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource"><strong><code>resource</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.name"><code class="schema-attribute-name"><bold>resource<wbr />.name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.type"><code class="schema-attribute-name"><bold>resource<wbr />.type</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.old_name"><code class="schema-attribute-name"><bold>resource<wbr />.old_name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.icon"><code class="schema-attribute-name"><bold>resource<wbr />.icon</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.version"><code class="schema-attribute-name"><bold>resource<wbr />.version</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.check_every"><code class="schema-attribute-name"><bold>resource<wbr />.check_every</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.check_timeout"><code class="schema-attribute-name"><bold>resource<wbr />.check_timeout</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.expose_build_created_by"><code class="schema-attribute-name"><bold>resource<wbr />.expose_build_created_by</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.tags"><code class="schema-attribute-name"><bold>resource<wbr />.tags</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.public"><code class="schema-attribute-name"><bold>resource<wbr />.public</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="resources.html#schema.resource.webhook_token"><code class="schema-attribute-name"><bold>resource<wbr />.webhook_token</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_resources">
+  
+  <h1 class="section-header"><a class="anchor-target" name="resources" href="#resources"></a><span class="section-number">1.8 </span>Resources</h1>
+  
+
+  <p>Resources are the heart and soul of Concourse. They represent all external inputs to and outputs of <a href="jobs.html">jobs</a> in the pipeline.</p><p>Each resource represents a versioned artifact with an external source of truth. Configuring the same resource in any pipeline on any Concourse cluster will behave the exact same way. Concourse will continuously <code>check</code> each configured resource to discover new versions. These versions then flow through the pipeline via <a href="get-step.html"><code>get</code> step</a>s configured on <a href="jobs.html">Jobs</a>.</p><p>More concretely, resources are containers that run on your workers. See <a href="implementing-resource-types.html">Implementing a Resource Type</a> for more details.</p><p>A pipeline&#39;s resources are listed under <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a> with the following schema.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.resource" href="#schema.resource"></a><code>resource</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.resource.name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.name" class="toggle-title">
+    <a id="schema.resource.name"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.name">name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of the resource. This should be short and simple. This name will be referenced by <a href="steps.html">build plans</a> of jobs in the pipeline.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.resource.type" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.type" class="toggle-title">
+    <a id="schema.resource.type"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.type">type</a>: <span class="attribute-type"><a href="resource-types.html#schema.resource_type.name"><strong>resource_type.name</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The <a href="resource-types.html">resource type</a> implementing the resource.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.resource.source" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.source" class="toggle-title">
+    <a id="schema.resource.source"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.source">source</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The configuration for the resource. This varies by resource type, and is a black box to Concourse; it is blindly passed to the resource at runtime.</p><p>To use <code>git</code> as an example, the source may contain the repo URI, the branch of the repo to track, and a private key to use when pushing/pulling.</p><p>By convention, documentation for each resource type&#39;s configuration is in each implementation&#39;s <code>README</code>.</p><p>You can find the source for the resource types provided with Concourse at the <a href="https://github.com/concourse?q=-resource">Concourse GitHub organization</a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.old_name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.old_name" class="toggle-title">
+    <a id="schema.resource.old_name"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.old_name">old_name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The old name of the resource. If configured, the history of the old resource will be inherited to the new one. Once the pipeline is set, this field can be removed as the history has been transferred.</p><div class="toggleable example">
+  <input id="toggle-6a6a75e552944d7d3644bfa16e5ccf6a1b2e72c1" type="checkbox" class="toggle" />
+  <label for="toggle-6a6a75e552944d7d3644bfa16e5ccf6a1b2e72c1" class="toggle-title">Renaming a resource</label>
+  <div class="toggle-content">
+    <p>This can be used to rename a resource without losing its history, like so:</p><pre><code class="language-yaml">resources:
+- name: new-name
+  old_name: current-name
+  type: git
+  source: uri: &#34;https://github.com/vito/booklit&#34;</code></pre><p>After the pipeline is set, the resource was successfully renamed, so the `old_name` field can be removed from the resource:</p><pre><code class="language-yaml">resources:
+- name: new-name
+  type: git
+  source: uri: &#34;https://github.com/vito/booklit&#34;</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.icon" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.icon" class="toggle-title">
+    <a id="schema.resource.icon"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.icon">icon</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of a <a href="https://materialdesignicons.com/">Material Design icon</a> to show next to the resource name in the web UI. For example, <code>github</code>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.version" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.version" class="toggle-title">
+    <a id="schema.resource.version"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.version">version</a>: <span class="attribute-type"><a href="config-basics.html#schema.version"><strong>version</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A version to pin the resource to across the pipeline. This has the same effect as setting <a href="get-step.html#schema.get.version"><code>get</code> step <strong><code>version</code></strong></a> on every <a href="get-step.html"><code>get</code> step</a> referencing the resource.</p><p>Resources can also be temporarily pinned to a version via the API and web UI. However this functionality is disabled if the resource is pinned via configuration, and if a pipeline is configured to have a version pinned while also pinned in the web UI, the configuration takes precedence and will clear out the temporary pin.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.check_every" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.check_every" class="toggle-title">
+    <a id="schema.resource.check_every"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.check_every">check_every</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a> | <span class="schema-scalar">never</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>1m</code>.</em> The interval on which to check for new versions of the resource. Acceptable interval options are defined by the <a href="https://golang.org/pkg/time/#ParseDuration">time.ParseDuration function</a>.</p><p>If set to <code>never</code> the resource will not be automatically checked. The resource can still be checked manually via the web UI, fly, or webhooks.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.check_timeout" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.check_timeout" class="toggle-title">
+    <a id="schema.resource.check_timeout"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.check_timeout">check_timeout</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>1h</code>.</em> The time limit on checking new versions of resources. Acceptable interval options are defined by the <a href="https://golang.org/pkg/time/#ParseDuration">time.ParseDuration function</a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.expose_build_created_by" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.expose_build_created_by" class="toggle-title">
+    <a id="schema.resource.expose_build_created_by"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.expose_build_created_by">expose_build_created_by</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, environment variable <a href="implementing-resource-types.html#resource-metadata"><code>BUILD_CREATED_BY</code></a> will be available in the metadata of a <a href="put-step.html">put step</a>. This field is not made available to the <a href="get-step.html"><code>get</code> step</a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.tags" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.tags" class="toggle-title">
+    <a id="schema.resource.tags"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.tags">tags</a>: <span class="attribute-type">[<a href="config-basics.html#schema.string"><strong>string</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>[]</code>.</em> A list of tags to determine which workers the checks will be performed on. You&#39;ll want to specify this if the source is internal to a worker&#39;s network, for example.</p><div class="warning">
+  <p>This does not apply tags to all <a href="get-step.html">get steps</a> or <a href="put-step.html">put steps</a> that use the resource. If you want these steps to use tags, you must set <a href="tags-step.html#schema.tags"><code class="schema-attribute-name"><bold>tags</bold></code></a> for each step.</p>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.public" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.public" class="toggle-title">
+    <a id="schema.resource.public"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.public">public</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, the metadata for each version of the resource will be viewable by unauthenticated users (assuming the pipeline has been <a href="exposing.html">exposed</a>).</p><p>Resource metadata should never contain credentials or secret information, but this is off by default just to be safe in case users don&#39;t want to show things like commit messages and authors to the public.</p><p>Note: even when set to <code>false</code>, the versions identifiers will be visible. In addition, if a resource is fetched in a build whose job is marked <a href="jobs.html#schema.job.public"><code class="schema-attribute-name"><bold>job<wbr />.public</bold></code></a>, metadata will be visible in the build output.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.resource.webhook_token" type="checkbox" class="toggle" />
+  <label for="toggle-schema.resource.webhook_token" class="toggle-title">
+    <a id="schema.resource.webhook_token"></a>
+
+    <code><a class="attribute-name" href="#schema.resource.webhook_token">webhook_token</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>If specified, web hooks can be sent to trigger an immediate <em>check</em> of the resource, specifying this value as a primitive form of authentication via query params.</p><p>After configuring this value, you would then configure your hook sender with the following painfully long path appended to your external URL:</p><pre>/api/v1/teams/TEAM_NAME/pipelines/PIPELINE_NAME/resources/RESOURCE_NAME/check/webhook?webhook_token=WEBHOOK_TOKEN</pre><p>For <a href="instanced-pipelines.html#managing-instanced-pipelines">instance pipelines</a> you will need to include the pipeline vars for a single pipeline instance. Currently you can not have webhooks for all instances of a pipeline.</p><p>The pipeline vars should be added to the webhook URL as <a href="https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL#parameters">URL parameters</a> with the format <code>vars.MY-VAR=&#34;SOME-VALUE&#34;</code>. A webhook URL for a pipeline instance may look like this:</p><pre>/api/v1/teams/TEAM_NAME/pipelines/PIPELINE_NAME/resources/RESOURCE_NAME/check/webhook?webhook_token=WEBHOOK_TOKEN&amp;vars.my-var=&#34;some-value&#34;&amp;vars.second-var=&#34;two&#34;</pre><p>Note that the request payload sent to this API endpoint is entirely ignored.  You should configure the resource as if you&#39;re not using web hooks, as the resource <a href="resources.html#schema.resource.source">config</a> is still the &#34;source of truth.&#34;</p>
+  </div>
+</div>
+</div><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.1</span>
+      <a href="resource-versions.html">Resource Versions</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.1.1</span>
+      <a href="resource-versions.html#where-and-what-versions">Where do they come from and what are they used for?</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.1.2</span>
+      <a href="resource-versions.html#version-pinning">Version Pinning</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.1.2.1</span>
+      <a href="resource-versions.html#version-unpinning">Unpinning</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.1.3</span>
+      <a href="resource-versions.html#disable-version">Disabling a Version</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2</span>
+      <a href="managing-resources.html">Managing Resources</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.8.2.1</span>
+      <a href="managing-resources.html#fly-check-resource"><code>fly check-resource</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.2</span>
+      <a href="managing-resources.html#fly-pin-resource"><code>fly pin-resource</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.3</span>
+      <a href="managing-resources.html#fly-enable-resource-version"><code>fly enable-resource-version</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.4</span>
+      <a href="managing-resources.html#fly-disable-resource-version"><code>fly disable-resource-version</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.8.2.5</span>
+      <a href="managing-resources.html#fly-clear-resource-cache"><code>fly clear-resource-cache</code></a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.7</span>
+              
+
+              <a href="vars.html">Vars</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.8.1</span>
+              
+
+              <a href="resource-versions.html">Resource Versions</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside">
+          <div class="page-partial">
+            <div class="content">
+  <h2>Examples</h2>
+
+  <div class="example">
+  <h3><code>git</code> resource</h3>
+
+  <p>The following resource definition is an example of the <a href="https://github.com/concourse/git-resource"><code>git</code> resource</a>:</p><pre><code class="language-yaml">name: booklit
+type: git
+source: {uri: &#34;https://github.com/concourse/booklit&#34;}</code></pre><p>This could be passed to a job via a <a href="get-step.html"><code>get</code> step</a> with <a href="get-step.html#schema.get.trigger"><code>trigger: true</code></a> to run the tests whenever there&#39;s new code:</p><pre><code class="language-yaml">resources:
+- name: booklit
+  type: git
+  source: {uri: &#34;https://github.com/concourse/booklit&#34;}
+
+jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: true
+  - task: test
+    file: booklit/ci/test.yml</code></pre>
+</div><div class="example">
+  <h3><code>time</code> resource</h3>
+
+  <p>The following resource emits a new version every hour:</p><pre><code class="language-yaml">name: 1h
+type: time
+source: {interval: 1h}</code></pre><p>This could be passed to a job via a <a href="get-step.html"><code>get</code> step</a> with <a href="get-step.html#schema.get.trigger"><code>trigger: true</code></a> to run the job periodically:</p><pre><code class="language-yaml">resources:
+- name: 1h
+  type: time
+  source: {interval: 1h}
+
+jobs:
+- name: nag
+  plan:
+  - get: 1h
+    trigger: true
+  - task: nag
+    config: # ...</code></pre>
+</div>
+</div>
+          </div>
+          </div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/scheduler.html b/scheduler.html
new file mode 100644
index 00000000..ddfd0685
--- /dev/null
+++ b/scheduler.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Build Scheduler - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html"  class="active">Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.17</span><a href="internals.html"  class="active">Internals</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.1</td>
+            <td class="title-cell"><a href="internals.html#basic-architecture" >Basic architecture</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2</td>
+            <td class="title-cell"><a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.3</td>
+            <td class="title-cell"><a href="internals.html#component-tsa" >TSA: worker registration &amp; forwarding</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.4</td>
+            <td class="title-cell"><a href="internals.html#architecture-worker" >Workers Architecture</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <a href="internals.html#component-atc"  class="active">ATC: web UI &amp; build scheduler</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.17.2.1</td>
+            <td class="title-cell"><a href="checker.html" >Resource Checker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.2</td>
+            <td class="title-cell"><a href="scheduler.html"  class="self">Build Scheduler</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.3</td>
+            <td class="title-cell"><a href="build-tracker.html" >Build Tracker</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17.2.4</td>
+            <td class="title-cell"><a href="garbage-collector.html" >Garbage Collector</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_scheduler">
+  
+  <h1 class="section-header"><a class="anchor-target" name="scheduler" href="#scheduler"></a><span class="section-number">1.17.2.2 </span>Build Scheduler</h1>
+  
+
+  <p><em>As of the v6.0.0 release, there have been many changes to the scheduler so it would be advisable to assume that this documentation should only be used for Concourse deployments v6.0.0 and above.</em></p><p>Builds represent each execution of a <a href="jobs.html">job</a>. Figuring out when to schedule a new job build is the responsibility of the <strong>build scheduler</strong>. The scheduling of new job builds can be dependent on many different factors such as when a new version of a resource is discovered, when a dependent upstream build finishes, or when a user manually triggers a build.</p><p>The build scheduler is a global component, where it deals with all the jobs within a deployment. It runs on an interval with a default of 10 seconds. If there are multiple ATCs, only one of the ATC&#39;s scheduler component will run per interval tick in order to ensure that there will be no duplicated work between ATC nodes.</p><p>The subcomponent used to figure out whether a build can be scheduled is called the <a href="scheduler.html#algorithm">algorithm</a>.</p>
+
+  
+    
+      <div class="section" id="section_algorithm">
+  
+  <h2 class="section-header"><a class="anchor-target" name="algorithm" href="#algorithm"></a>Algorithm</h2>
+  
+
+  <p>The algorithm is a subcomponent of the scheduler which is used to determine the input versions to the next build of a job. There are many factors that contribute to figuring out the next input versions. It can be anything that affects which resource versions will be used to schedule a build, such as <a href="get-step.html#schema.get.version">version constraints</a> or <a href="get-step.html#schema.get.passed">passed constraints</a> in a <a href="get-step.html"><code>get</code> step</a>, disabling versions through the web UI, etc. The algorithm can also fail to determine a successful set of input versions, which the error will be propogated to the preparation view in the build page.</p><p>If the algorithm computes a successful set of input versions, it will figure out whether or not the versions it computed can be used to produce a new build. This is done by comparing the <a href="get-step.html#schema.get.trigger">triggerable</a> input versions to the versions used by the previous build and if any of them have a different version, then the scheduler will know to schedule a new build. Conversly, if the input versions produced by the algorithm are the same as the previous build, then the scheduler will not create a new build.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_scheduling-behavior">
+  
+  <h2 class="section-header"><a class="anchor-target" name="scheduling-behavior" href="#scheduling-behavior"></a>Scheduling behavior</h2>
+  
+
+  <p>The scheduler will schedule a new build if any of the versions produced by the algorithm for <a href="get-step.html#schema.get.trigger"><code>trigger: true</code></a> resources is not equal to the version used by the <strong>previous build</strong> of the job.</p><p>What this means is if the algorithm runs and computes an input version, the scheduler will create a new build as long as that version is different than the previous build&#39;s version for that same input. Even if that version has been used by a build 2 months ago, the scheduler will schedule a new build as long as it has not been used by the previous build.</p><p>If there are any input versions that are different than the previous build, it will trigger a new build. This can affect some users that are using the pinning functionality to run older versions.</p><p>Let&#39;s say you have a job that takes a resource as an input. It currently has two builds, build 1 has ran with version <code>v1</code> of the resource and build 2 has ran with <code>v2</code>.</p><div class="diagram">
+  <img src="images/new-pinning-behavior-1.png" alt="diagram" width="80%" />
+</div><p>If I pin the input to an older version, a new build is produced because the pinned version <code>v1</code> is not equivalent to the version of the previous build <code>v2</code>.</p><div class="diagram">
+  <img src="images/new-pinning-behavior-3.png" alt="diagram" width="90%" />
+</div><p>Then if I unpin the version, another build would be triggered again using the latest version.</p><div class="diagram">
+  <img src="images/new-pinning-behavior-4.png" alt="diagram" width="90%" />
+</div><p>This is because after unpinning the resource, the input version for the next build becomes the latest version <code>v2</code> which is not equal to the version <code>v1</code> used by the previous build.</p><p>This is to allow the current state of the builds to always reflect the current state of the versions. That being said, this behavior can be undesirable if the goal is to only run a job using an old version. In this case, build rerunning is the better choice. If you would like to learn more about build rerunning, you can read more about it in the <a href="builds.html#build-rerunning">build rerunning section</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_scheduling-on-demand">
+  
+  <h2 class="section-header"><a class="anchor-target" name="scheduling-on-demand" href="#scheduling-on-demand"></a>Scheduling on demand</h2>
+  
+
+  <p>The scheduler runs on an interval, but rather than scheduling all the jobs within a deployment on every tick, it only schedules the jobs that <em>need to be scheduled</em>.</p><p>First, the scheduler determines which jobs need to be scheduled. Below are all the reasons why Concourse will think a job needs to be scheduled: <ul>
+
+  <li><p>Detecting new versions of a resource through a check</p></li>
+
+  <li><p>Saving a new version through a put</p></li>
+
+  <li><p>A build finishes for an upstream job (through passed constraints)</p></li>
+
+  <li><p>Enabling/Disabling a resource version</p></li>
+
+  <li><p>Pinning/Unpinning a resource version</p></li>
+
+  <li><p>Setting a pipeline</p></li>
+
+  <li><p>Updating a resource&#39;s <code>resource_config</code></p></li>
+
+  <li><p>Manually triggering a build</p></li>
+
+  <li><p>Rerunning a build</p></li>
+
+  <li><p>Multiple versions available for a version every constraint</p></li>
+
+</ul></p><p>Each job that is scheduled will use the algorithm to determine what inputs its next build should have. Then the build is scheduled and picked up by the <a href="build-tracker.html">Build Tracker</a>.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.17.2.1</span>
+              
+
+              <a href="checker.html">Resource Checker</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.17.2.3</span>
+              
+
+              <a href="build-tracker.html">Build Tracker</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/search_index.json b/search_index.json
new file mode 100644
index 00000000..5f0b91bf
--- /dev/null
+++ b/search_index.json
@@ -0,0 +1 @@
+{"1---a-simple-gated-pipeline":{"location":"gated-pipeline-patterns.html#1---a-simple-gated-pipeline","title":"#1 - A Simple Gated Pipeline","text":"By default all Jobs only run when manually triggered. That means a user has to run fly trigger-job or click the plus button in the web interface for a job to run. A job only runs automatically if one of its resources has the trigger: true parameter set.\n\nTherefore, in order to create a gated job in a pipeline you simply need to create a job that can only be manually triggered. That means not setting trigger: true for any of the jobs' get steps.\n\njobs:\n- name: run-automatically\n  plan:\n  - get: my-repo\n    trigger: true  # has trigger:true so automatically triggers\n  # can include more steps to run other things before hitting the gate\n\n- name: the-gate  # manually trigger this job\n  plan:\n  - get: my-repo\n    trigger: false  # redundant but guarantees the job won't run automatically\n    passed:\n      - run-automatically\n\n# runs immediately after the gate is triggered\n- name: do-more-stuff-after-the-gate\n  plan:\n  - get: my-repo\n    passed:\n      - the-gate\n    trigger: true\n  # can include more steps to run other things\n\nresources:\n- name: my-repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\nimages/how-to-guides/pipelines/simple-gated-pipeline.png","depth":5,"section_tag":"1---a-simple-gated-pipeline"},"1---passing-inputs-between-tasks":{"location":"exploring-task-input-and-output-scenarios.html#1---passing-inputs-between-tasks","title":"#1 - Passing Inputs Between Tasks","text":"This pipeline will show us how to create outputs and pass outputs as inputs to the next step in a job plan.\n\nThis pipeline has two tasks. The first task outputs a file with the date. The second task reads and prints the contents of the file from the first task.\n\nHere's a visualization of the job. images/how-to-guides/pipelines/explore-task-inputs-outs-example-one-10.gif\n\nbusybox: \u0026busybox #YAML anchor\n  type: registry-image\n  source:\n    repository: busybox\n\njobs:\n- name: the-job\n  plan:\n  - task: create-one-output\n    config:\n      platform: linux\n      image_resource: *busybox\n      outputs:\n        # Concourse will make an empty dir with this name\n        # and save the contents for later steps\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            date \u003e ./the-output/file\n  - task: read-output-from-previous-step\n    config:\n      platform: linux\n      image_resource: *busybox\n      # You must explicitly name the inputs you expect\n      # this task to have.\n      # If you don't then outputs from previous steps\n      # will not appear in the step's container.\n      # The name must match the output from the previous step.\n      # Try removing or renaming the input to see what happens!\n      inputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            cat ./the-output/file\nSet and run this pipeline to see the results yourself. Save the pipeline in a file called passing-artifacts.yml.\n\nfly -t tutorial set-pipeline -p passing-artifacts -c passing-artifacts.yml\nfly -t tutorial unpause-pipeline -p passing-artifacts\nfly -t tutorial trigger-job --job passing-artifacts/the-job --watch\n","depth":5,"section_tag":"1---passing-inputs-between-tasks"},"1---single-time-trigger":{"location":"time-triggered-pipeline-patterns.html#1---single-time-trigger","title":"#1 - Single Time Trigger","text":"The following is an example of a pipeline that is triggered by a time resource on a pre-determined interval.\n\nresources:\n- name: trigger-every-3-minutes\n  type: time\n  source:\n    interval: 3m\n\njobs:\n- name: run-forrest-run\n  plan:\n  - get: trigger-every-3-minutes\n    trigger: true\n  # can add other steps to run in this job\n\n- name: run-bubba-run\n  plan:\n  - get: trigger-every-3-minutes\n    trigger: true\n    passed:\n      - run-forrest-run\n  # can add other steps to run in this job\n images/how-to-guides/pipelines/time-triggered-01.png\n\n","depth":5,"section_tag":"1---single-time-trigger"},"2---gated-pipeline-fanning-in-and-out":{"location":"gated-pipeline-patterns.html#2---gated-pipeline-fanning-in-and-out","title":"#2 - Gated Pipeline Fanning In and Out","text":"You can also use a gate as way to fan-in from multiple jobs and/or fan-out to multiple jobs as well.\n\njobs:\n# three pre-gate jobs\n- name: job-a\n  plan:\n  - get: my-repo\n    trigger: true\n- name: job-b\n  plan:\n  - get: my-repo\n    trigger: true\n- name: job-c\n  plan:\n  - get: my-repo\n    trigger: true\n\n- name: the-gate  # manually trigger this job\n  plan:\n  - get: my-repo\n    trigger: false\n    passed:  # fan-in from the three pre-gate jobs\n      - job-a\n      - job-b\n      - job-c\n\n# fan-out to three post-gate jobs\n- name: post-gate-job-a\n  plan:\n  - get: my-repo\n    trigger: true\n    passed: [the-gate]\n- name: post-gate-job-b\n  plan:\n  - get: my-repo\n    trigger: true\n    passed: [the-gate]\n- name: post-gate-job-c\n  plan:\n  - get: my-repo\n    trigger: true\n    passed: [the-gate]\n\nresources:\n- name: my-repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\nimages/how-to-guides/pipelines/simple-gated-fan-in-fan-out.png","depth":5,"section_tag":"2---gated-pipeline-fanning-in-and-out"},"2---multiple-time-triggers":{"location":"time-triggered-pipeline-patterns.html#2---multiple-time-triggers","title":"#2 - Multiple Time Triggers","text":"As an enhancement to the previous sample with a single time trigger, this pipeline example implements two time resource triggers and the ability to manually kick it off outside of the time resources schedules.\n\nThe first time you set up a pipeline like this you will need to manually trigger it in order to satisfy the passed constraint of the manual-trigger resource. Once one version is available that satisfies the passed constraint all future triggers by the other resources will work as expected.\n\nresources:\n- name: trigger-every-4-minutes\n  type: time\n  source:\n    interval: 4m\n- name: trigger-every-10-minutes\n  type: time\n  source:\n    interval: 10m\n- name: manual-trigger\n  type: time\n  source:\n    interval: 1m\n\njobs:\n- name: manual-trigger\n  plan:\n  - put: manual-trigger\n\n- name: run-forrest-run\n  plan:\n  - get: trigger-every-4-minutes\n    trigger: true\n  - get: trigger-every-10-minutes\n    trigger: true\n  - get: manual-trigger\n    trigger: true\n    passed:\n      - manual-trigger\n  # can add other steps to run in this job\n\n- name: run-bubba-run\n  plan:\n  - get: trigger-every-4-minutes\n    trigger: true\n    passed:\n      - run-forrest-run\n  - get: trigger-every-10-minutes\n    trigger: true\n    passed:\n      - run-forrest-run\n  - get: manual-trigger\n    trigger: true\n    passed:\n      - run-forrest-run\n  # can add other steps to run in this job\nimages/how-to-guides/pipelines/time-triggered-02.png","depth":5,"section_tag":"2---multiple-time-triggers"},"2---two-tasks-with-the-same-output-who-wins":{"location":"exploring-task-input-and-output-scenarios.html#2---two-tasks-with-the-same-output-who-wins","title":"#2 - Two tasks with the same output, who wins?","text":"This scenario is to satisfy the curiosity cat inside all of us. Never do this in real life because you're definitely going to hurt yourself!\n\nThere are two Jobs in this pipeline. The first job, writing-in-parallel, has two Steps; both steps will produce an artifact named the-output in parallel. If you run the writing-to-the-same-output-in-parallel job multiple times you'll see the file in the-output folder changes depending on which of the parallel tasks finished last. Here's a visualization of the first job.\n\nimages/how-to-guides/pipelines/explore-task-inputs-outs-example-two-parallel.gifThe second job, writing-to-the-same-output-serially, is a serial version of the first job. In this job the second task always wins because it's the last task that outputs the-output, so only file2 will be in the-output directory in the last step in the job plan.\n\nimages/how-to-guides/pipelines/explore-task-inputs-outs-example-two-serial.gifThe lesson to take away from this example is that last to write wins when it comes to the state of any particular artifact in your job.\n\nbusybox: \u0026busybox #YAML anchor\n  type: registry-image\n  source:\n    repository: busybox\n\njobs:\n- name: writing-to-the-same-output-in-parallel\n  plan:\n  # running two tasks that output in parallel?!?\n  # who will win??\n  - in_parallel:\n    - task: create-the-output\n      config:\n        platform: linux\n        image_resource: *busybox\n        outputs:\n          - name: the-output\n        run:\n          path: /bin/sh\n          args:\n            - -cx\n            - |\n              ls -lah\n              date \u003e ./the-output/file1\n    - task: also-create-the-output\n      config:\n        platform: linux\n        image_resource: *busybox\n        outputs:\n          - name: the-output\n        run:\n          path: /bin/sh\n          args:\n            - -cx\n            - |\n              ls -lah\n              date \u003e ./the-output/file2\n  # run this job multiple times to see which\n  # previous task wins each time\n  - task: read-output-from-previous-step\n    config:\n      platform: linux\n      image_resource: *busybox\n      inputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah ./the-output\n            echo \"Get ready to error!\"\n            cat ./the-output/file1 ./the-output/file2\n\n- name: writing-to-the-same-output-serially\n  plan:\n  - task: create-the-output\n    config:\n      platform: linux\n      image_resource: *busybox\n      outputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            date \u003e ./the-output/file1\n  - task: also-create-the-output\n    config:\n      platform: linux\n      image_resource: *busybox\n      outputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            date \u003e ./the-output/file2\n  - task: read-output-from-previous-step\n    config:\n      platform: linux\n      image_resource: *busybox\n      inputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah ./the-output\n            echo \"Get ready to error! file1 will never exist\"\n            cat ./the-output/file1 ./the-output/file2\nSet and run this pipeline to see the results yourself. Save the pipeline in a file called parallel-artifacts.yml.\n\nfly -t tutorial set-pipeline -p parallel-artifacts -c parallel-artifacts.yml\nfly -t tutorial unpause-pipeline -p parallel-artifacts\nfly -t tutorial trigger-job --job parallel-artifacts/writing-to-the-same-output-in-parallel --watch\nfly -t tutorial trigger-job --job parallel-artifacts/writing-to-the-same-output-serially --watch\n","depth":5,"section_tag":"2---two-tasks-with-the-same-output-who-wins"},"3---a-gated-pipeline-with-notifications":{"location":"gated-pipeline-patterns.html#3---a-gated-pipeline-with-notifications","title":"#3 - A Gated Pipeline With Notifications","text":"This pipeline shows you how you can send a notification, like an email, to notify someone that a new build of your application is ready to be shipped.\n\njobs:\n- name: build-it\n  plan:\n  - get: my-repo\n    trigger: true\n  # can add steps to build your app\n\n- name: test-it\n  plan:\n  - get: my-repo\n    trigger: true\n    passed: [build-it]\n  # can add steps to run tests\n  - put: email-release-manager\n    params:\n      subject: \"Ready to ship\"\n      body_text: |\n        A build is ready to be shipped!\n        Build to be shipped: ${ATC_EXTERNAL_URL}/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}\n        Link to pipeline: ${ATC_EXTERNAL_URL}/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}\n\n- name: ship-it\n  plan:\n  - get: my-repo\n    trigger: false\n    passed: [test-it]\n\nresources:\n- name: my-repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n- name: email-release-manager\n  type: email\n  source:\n    # other required fields for this resource have been omitted\n    from: pipeline@example.com\n    to: release-manager@example.com\n\nresource_types:\n- name: email\n  type: registry-image\n  source:\n    repository: pcfseceng/email-resource\nimages/how-to-guides/pipelines/gated-pipeline-with-notification.png","depth":5,"section_tag":"3---a-gated-pipeline-with-notifications"},"3---mapping-the-names-of-inputs-and-outputs":{"location":"exploring-task-input-and-output-scenarios.html#3---mapping-the-names-of-inputs-and-outputs","title":"#3 - Mapping the Names of Inputs and Outputs","text":"Sometimes the names of inputs and outputs don't match between multiple task configs, or they do match and you don't want them overwriting each other, like in the previous example. That's when input_mapping and output_mapping become helpful. Both of these features rename the inputs/outputs in the task's config to some other name in the job plan.\n\nThis pipeline has one job with four tasks.\n\nThe first task outputs a file with the date to the the-output directory.  the-output is mapped to the new name demo-disk. The artifact demo-disk is now available in the rest of the job plan for future steps to take as inputs.\n\nThe second task reads and prints the contents of the file under the new name demo-disk.\n\nThe third task reads and prints the contents of the file under another name, generic-input. The demo-disk artifact in the job plan is mapped to generic-input.\n\nThe fourth task tries to use the artifact named the-output as its input. This task fails to even start because there was no artifact with the name the-output available in the job plan; it was remapped to demo-disk.\n\nHere's a visualization of the job.\n\nimages/how-to-guides/pipelines/explore-task-inputs-outs-example-three-1.gifbusybox: \u0026busybox #YAML anchor\n  type: registry-image\n  source:\n    repository: busybox\n\njobs:\n- name: the-job\n  plan:\n  - task: create-one-output\n    # The task config has the artifact `the-output`\n    # output_mapping will rename `the-output` to `demo-disk`\n    # in the rest of the job's plan\n    output_mapping:\n      the-output: demo-disk\n    config:\n      platform: linux\n      image_resource: *busybox\n      outputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            date \u003e ./the-output/file\n  # this task expects the artifact `demo-disk` so no mapping is needed\n  - task: read-output-from-previous-step\n    config:\n      platform: linux\n      image_resource: *busybox\n      inputs:\n        - name: demo-disk\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            cat ./demo-disk/file\n  - task: rename-and-read-output\n    # This task expects the artifact `generic-input`.\n    # input_mapping will map the task's `generic-input` to\n    # the job plans `demo-disk` artifact.\n    # `demo-disk` is renamed to `generic-input`.\n    input_mapping:\n      generic-input: demo-disk\n    config:\n      platform: linux\n      image_resource: *busybox\n      inputs:\n        - name: generic-input\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            cat ./generic-input/file\n  - task: try-to-read-the-output\n    input_mapping:\n      generic-input: demo-disk\n    config:\n      platform: linux\n      image_resource: *busybox\n      # `the-output` is not available in the job plan\n      # so this task will error while initializing\n      # since there's no artiact named `the-output` in\n      # the job's plan\n      inputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            cat ./generic-input/file\nSet and run this pipeline to see the results yourself. Save the pipeline in a file called mapping-artifacts.yml.\n\nfly -t tutorial set-pipeline -p mapping-artifacts -c mapping-artifacts.yml\nfly -t tutorial unpause-pipeline -p mapping-artifacts\nfly -t tutorial trigger-job --job mapping-artifacts/the-job --watch\n","depth":5,"section_tag":"3---mapping-the-names-of-inputs-and-outputs"},"4---adding-files-to-an-existing-artifact":{"location":"exploring-task-input-and-output-scenarios.html#4---adding-files-to-an-existing-artifact","title":"#4 - Adding Files to an Existing Artifact","text":"This pipeline will also have two jobs in order to illustrate this point. What happens if we add a file to an output? If you think back to example two you may already know the answer.\n\nThe first task will create the-output with file1. The second task will add file2 to the the-output. The last task will read the contents of file1 and file2.\n\nAs long as you re-declare the input as an output in the second task you can modify any of your outputs.\n\nThis means you can pass something between a bunch of tasks and have each task add or modify something in the artifact.\n\nHere's a visualization of the job. images/how-to-guides/pipelines/explore-task-inputs-outs-example-four.gif\n\njobs:\n- name: add-file-to-output\n  plan:\n  - task: create-one-output\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      outputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            date \u003e ./the-output/file1\n  - task: add-file-to-previous-output\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      # this task lists the same artifact as\n      # its input and output\n      inputs:\n        - name: the-output\n      outputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            date \u003e ./the-output/file2\n  - task: read-output-from-previous-step\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      inputs:\n        - name: the-output\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah ./the-output\n            cat ./the-output/file1 ./the-output/file2\nSet and run this pipeline to see the results yourself. Save the pipeline in a file called existing-artifact.yml.\n\nfly -t tutorial set-pipeline -p existing-artifact -c existing-artifact.yml\nfly -t tutorial unpause-pipeline -p existing-artifact\nfly -t tutorial trigger-job --job existing-artifact/add-file-to-output --watch\n","depth":5,"section_tag":"4---adding-files-to-an-existing-artifact"},"5---task-with-multiple-inputs-and-outputs":{"location":"exploring-task-input-and-output-scenarios.html#5---task-with-multiple-inputs-and-outputs","title":"#5 - Task With Multiple Inputs and Outputs","text":"What happens if you have a task that has multiple outputs and a second task that only lists one of the outputs? Does the second task get the extra outputs from the first task?\n\nThe answer is no. A task will only get the artifacts that match the name of the inputs listed in the task's config.\n\nHere's a visualization of the job. images/how-to-guides/pipelines/explore-task-inputs-outs-example-five.gif\n\njobs:\n- name: multiple-outputs\n  plan:\n  - task: create-three-outputs\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      outputs:\n        - name: the-output-1\n        - name: the-output-2\n        - name: the-output-3\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah\n            date \u003e ./the-output-1/file\n            date \u003e ./the-output-2/file\n            date \u003e ./the-output-3/file\n  - task: take-one-output\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      # only one of the three outputs are\n      # listed as inputs\n      inputs:\n        - name: the-output-1\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah ./\n            cat ./the-output-1/file\n  - task: take-two-outputs\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      # this task pulls in the other\n      # two outputs, just for fun!\n      inputs:\n        - name: the-output-2\n        - name: the-output-3\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah ./\n            cat ./the-output-2/file\n            cat ./the-output-3/file\nSet and run this pipeline to see the results yourself. Save the pipeline in a file called multiple-artifacts.yml.\n\nfly -t tutorial set-pipeline -p multiple-artifacts -c multiple-artifacts.yml\nfly -t tutorial unpause-pipeline -p multiple-artifacts\nfly -t tutorial trigger-job --job multiple-artifacts/multiple-outputs --watch\n","depth":5,"section_tag":"5---task-with-multiple-inputs-and-outputs"},"6---get-steps-generate-artifacts":{"location":"exploring-task-input-and-output-scenarios.html#6---get-steps-generate-artifacts","title":"#6 - Get Steps Generate Artifacts","text":"The majority of Concourse pipelines have at least one resource, which means they have at least one get step. Using a get step in a job makes an artifact with the name of the get step available for later steps in the job plan to consume as inputs.\n\nHere's a visualization of the job. images/how-to-guides/pipelines/explore-task-inputs-outs-example-six.gif\n\nresources:\n- name: concourse-examples\n  type: git\n  source:\n    uri: \"https://github.com/concourse/examples\"\n\njobs:\n- name: get-job\n  plan:\n  # there will be an artifact named\n  # \"concourse-examples\" available in the job plan\n  - get: concourse-examples\n  - task: take-one-output\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      inputs:\n        - name: concourse-examples\n      run:\n        path: /bin/sh\n        args:\n          - -cx\n          - |\n            ls -lah ./\n            cat ./concourse-examples/README.md\nSet and run this pipeline to see the results yourself. Save the pipeline in a file called get-artifact.yml.\n\nfly -t tutorial set-pipeline -p get-artifact -c get-artifact.yml\nfly -t tutorial unpause-pipeline -p get-artifact\nfly -t tutorial trigger-job --job get-artifact/get-job --watch\n","depth":5,"section_tag":"6---get-steps-generate-artifacts"},"LANDED-table":{"location":"internals.html#LANDED-table","title":"LANDED","text":"A worker in this state has successfully waited for all non-interruptible jobs on it after having concourse land-worker called. It will no longer be used to schedule any new containers or create volumes until it registers as RUNNING again.\n\n","depth":4,"section_tag":"worker-lifecycle"},"LANDING-table":{"location":"internals.html#LANDING-table","title":"LANDING","text":"The concourse land-worker command will put a worker in the LANDING state to safely drain its assignments for temporary downtime.\n\nThe ATC will wait for builds on the worker for jobs which aren't interruptible to finish, and transition the worker into LANDED state.\n\n","depth":4,"section_tag":"worker-lifecycle"},"RETIRING-table":{"location":"internals.html#RETIRING-table","title":"RETIRING","text":"The concourse retire-worker command will put a worker in the RETIRING state to remove it from the cluster permanently.\n\nThe ATC will wait for builds on the worker for jobs which aren't interruptible to finish, and remove the worker.\n\n","depth":4,"section_tag":"worker-lifecycle"},"RUNNING-table":{"location":"internals.html#RUNNING-table","title":"RUNNING","text":"A worker in this state is registered with the cluster and ready to start running containers and storing volumes.\n\n","depth":4,"section_tag":"worker-lifecycle"},"STALLED-table":{"location":"internals.html#STALLED-table","title":"STALLED","text":"A worker in this state was previously registered with the cluster, but stopped advertising itself for some reason. Ususally this is due to network connectivity issues, or the worker stopping unexpectedly.\n\nIf the worker remains in this state and cannot be recovered, it can be removed using the fly prune-worker command.\n\n","depth":4,"section_tag":"worker-lifecycle"},"a-note-about-user-lookup":{"location":"generic-oidc-auth.html#a-note-about-user-lookup","title":"A note about user lookup","text":"When determining the user identity, Concourse will first look at the preferred_username claim. If this claim is empty or missing, it will then look at the claim specified by CONCOURSE_OIDC_USER_NAME_KEY (which defaults to username).\n\nLet's say that you want to tie each user to their email by using CONCOURSE_OIDC_USER_NAME_KEY=email.\n\nIf your OIDC provider returns the following claims, Concourse will still resolve the user to Jane Doe: {\n \"sub\": \"248289761001\",\n \"username\": \"j.doe\",\n \"preferred_username\": \"Jane Doe\",\n \"email\": \"janedoe@example.com\",\n}\n\n\nHowever, if the preferred_username claim is empty or missing, Concourse will respect the key and resolve the user to janedoe@example.com: {\n \"sub\": \"248289761001\",\n \"username\": \"j.doe\",\n \"preferred_username\": \"\",\n \"email\": \"janedoe@example.com\",\n}\n\n\n","depth":6,"section_tag":"a-note-about-user-lookup"},"across-step":{"location":"across-step.html","title":"across Step Modifier","text":"Run a step multiple times with different combinations of variable values.\n\nThe across step is not enabled by default. To enable across for your deployment, you must set the feature flag CONCOURSE_ENABLE_ACROSS_STEP. The across step may be enabled by default in a future version of Concourse.\n\nThe across step can be combined with the load_var step, the set_pipeline step, and instanced pipelines to maintain a dynamically sized group of related pipelines.\n\nMore fields are also available for variable interpolation with the across step. See Across Step \u0026 Dynamic Vars for details.\n\nOutputs from steps ran within the across step are not available to steps outside of the across step.\n\njobs:\n- name: job\n  plan:\n  - across:\n    - var: some-text\n      values: [\"hello-world\", \"hello-concourse\"]\n    task: running-((.:some-text))\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source:\n          mirror_self: true\n      run:\n        path: echo\n        args: [\"((.:some-text))\"]\n resources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\njobs:\n- name: job\n  plan:\n  - get: ci\n  - across:\n    - var: pipeline\n      values: [\"hello-world\", \"time-triggered\"]\n    do:\n      - task: running-((.:pipeline))\n        input_mapping:\n          ((.:pipeline)): ci\n        output_mapping:\n          ((.:pipeline)): newci\n        config:\n          platform: linux\n          image_resource:\n            type: mock\n            source:\n              mirror_self: true\n          inputs:\n            - name: ((.:pipeline))\n          outputs:\n            - name: ((.:pipeline))\n          run:\n            path: cat\n            args: [\"((.:pipeline))/pipelines/((.:pipeline)).yml\"]\n      - task: newci-((.:pipeline))\n        config:\n          platform: linux\n          image_resource:\n            type: mock\n            source:\n              mirror_self: true\n          inputs:\n            - name: newci\n          run:\n            path: cat\n            args: [\"newci/pipelines/((.:pipeline)).yml\"]\n resources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\njobs:\n- name: job\n  plan:\n  - get: ci\n  - across:\n    - var: pipeline\n      values: [\"hello-world\", \"time-triggered\"]\n    set_pipeline: ((.:pipeline))\n    file: ci/pipelines/((.:pipeline)).yml\n Use the do step to across over multiple steps. jobs:\n- name: job\n  plan:\n  - across:\n    - var: name\n      values: [\"Kaladin\", \"Jasnah\"]\n    do:  # takes a list of steps\n    - task: saying-hello\n      config:\n        platform: linux\n        image_resource:\n          type: mock\n          source:\n            mirror_self: true\n        run:\n          path: echo\n          args: [\"Hello ((.:name))!\"]\n    - task: saying-bye\n      config:\n        platform: linux\n        image_resource:\n          type: mock\n          source:\n            mirror_self: true\n        run:\n          path: echo\n          args: [\"Bye ((.:name))!\"]\n\n\n You can use the across step to set a pipeline for each branch in a git repository.\n\nplan:\n- get: release-branches\n  trigger: true\n- get: ci\n- load_var: branches\n  file: release-branches/branches.json\n- across:\n  - var: branch\n    values: ((.:branches))\n  set_pipeline: release\n  file: ci/pipelines/release.yml\n  instance_vars: {branch: ((.:branch.name))}\nWhen a new branch is added, a new pipeline will be created. When a branch is deleted, the pipeline will be automatically archived as described in the set_pipeline step.\n\nFor a more complete example, refer to Multi-Branch Workflows.\n\n\n\n","depth":4,"section_tag":"across-step"},"action-matrix":{"location":"user-roles.html#action-matrix","title":"Action Matrix","text":"In this table, an action is marked as customizable if it is possible to change its permissions by providing the --config-rbac flag, documented below. Assigning an action to a role that is not customizable will have no effect on its permissions.\n\n| Action                        | fly commands affected                                       | UI actions affected                              | can be performed unauthenticated? | customizable |\n| GetBuild                      | n/a                                                                | view one-off build page                          | ✓                                 | ✓            |\n| BuildResources                | n/a                                                                | view build page                                  | ✓                                 | ✓            |\n| GetBuildPreparation           | n/a                                                                | view build page                                  | ✓                                 | ✓            |\n| BuildEvents                   | fly watch,Running tasks with fly execute                      | view build page                                  | ✓                                 | ✓            |\n| GetBuildPlan                  | n/a                                                                | view build page                                  | ✓                                 | ✓            |\n| ListBuildArtifacts            | n/a                                                                | n/a                                              | ✓                                 | ✓            |\n| AbortBuild                    | fly abort-build                                        | abort button on build page                       | ✘                                 | ✓            |\n| PruneWorker                   | fly prune-worker                                       | n/a                                              | ✘                                 | ✓            |\n| LandWorker                    | fly land-worker                                        | n/a                                              | ✘                                 | ✓            |\n| RetireWorker                  | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| ListDestroyingVolumes         | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| ListDestroyingContainers      | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| ReportWorkerContainers        | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| ReportWorkerVolumes           | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| GetPipeline                   | n/a                                                                | view pipeline page                               | ✓                                 | ✓            |\n| GetJobBuild                   | n/a                                                                | view build page                                  | ✓                                 | ✓            |\n| PipelineBadge                 | n/a                                                                | n/a                                              | ✓                                 | ✓            |\n| JobBadge                      | n/a                                                                | n/a                                              | ✓                                 | ✓            |\n| ListJobs                      | fly jobs                                               | view pipeline page                               | ✓                                 | ✓            |\n| GetJob                        | n/a                                                                | view job page                                    | ✓                                 | ✓            |\n| ListJobBuilds                 | fly builds                                             | view job page                                    | ✓                                 | ✓            |\n| ListPipelineBuilds            | fly builds                                             | n/a                                              | ✓                                 | ✓            |\n| GetResource                   | n/a                                                                | view resource page                               | ✓                                 | ✓            |\n| ListBuildsWithVersionAsInput  | n/a                                                                | expand version on resource page                  | ✓                                 | ✓            |\n| ListBuildsWithVersionAsOutput | n/a                                                                | expand version on resource page                  | ✓                                 | ✓            |\n| GetResourceCausality          | n/a                                                                | n/a                                              | ✓                                 | ✓            |\n| GetResourceVersion            | n/a                                                                | n/a                                              | ✓                                 | ✓            |\n| ListResources                 | fly resources                                               | view pipeline page                               | ✓                                 | ✓            |\n| ListResourceTypes             | n/a                                                                | n/a                                              | ✓                                 | ✓            |\n| ListResourceVersions          | fly resource-versions,fly pin-resource          | view resource page                               | ✓                                 | ✓            |\n| CreateBuild                   | Running tasks with fly execute                                            | n/a                                              | ✘                                 | ✓            |\n| GetContainer                  | n/a                                                                | n/a                                              | ✘                                 | ✓            |\n| HijackContainer               | fly intercept                                          | n/a                                              | ✘                                 | ✓            |\n| ListContainers                | fly containers                                         | n/a                                              | ✘                                 | ✓            |\n| ListWorkers                   | fly workers                                            | n/a                                              | ✘                                 | ✓            |\n| RegisterWorker                | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| HeartbeatWorker               | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| DeleteWorker                  | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| GetTeam                       | fly get-team                                           | n/a                                              | ✘                                 | ✓            |\n| SetTeam                       | fly set-team                                           | n/a                                              | ✘                                 | ✓            |\n| ListTeamBuilds                | fly builds                                             | n/a                                              | ✘                                 | ✓            |\n| RenameTeam                    | fly rename-team                                        | n/a                                              | ✘                                 | ✓            |\n| DestroyTeam                   | fly destroy-team                                       | n/a                                              | ✘                                 | ✓            |\n| ListVolumes                   | fly volumes                                            | n/a                                              | ✘                                 | ✓            |\n| DownloadCLI                   | fly sync                                               | icons on dashboard and pipeline pages            | ✓                                 | ✘            |\n| CheckResourceWebHook          | n/a                                                                | n/a                                              | ✓                                 | ✘            |\n| GetInfo                       | n/a                                                                | n/a                                              | ✓                                 | ✘            |\n| GetCheck                      | fly check-resource,fly check-resource-type | check button on resource page                    | ✘                                 | ✓            |\n| ListTeams                     | fly teams                                              | view dashboard page                              | ✓                                 | ✘            |\n| ListAllPipelines              | n/a                                                                | view dashboard page                              | ✓                                 | ✘            |\n| ListPipelines                 | fly pipelines                                          | n/a                                              | ✓                                 | ✓            |\n| ListAllJobs                   | fly teams                                              | view dashboard page                              | ✓                                 | ✘            |\n| ListAllResources              | n/a                                                                | view dashboard page                              | ✓                                 | ✘            |\n| ListBuilds                    | fly builds                                             | n/a                                              | ✓                                 | ✘            |\n| MainJobBadge                  | n/a                                                                | n/a                                              | ✓                                 | ✘            |\n| GetLogLevel                   | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| SetLogLevel                   | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| GetWall                       | n/a                                                                | n/a                                              | ✓                                 | ✘            |\n| SetWall                       | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| ClearWall                     | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| ListActiveUsersSince          | fly active-users                                       | n/a                                              | ✘                                 | ✘            |\n| GetInfoCreds                  | n/a                                                                | n/a                                              | ✘                                 | ✘            |\n| CheckResource                 | fly check-resource                                     | check button on resource page                    | ✘                                 | ✓            |\n| CheckResourceType             | fly check-resource-type                                | n/a                                              | ✘                                 | ✓            |\n| CreateJobBuild                | fly trigger-job                                        | trigger button on job and build pages            | ✘                                 | ✓            |\n| RerunJobBuild                 | fly rerun-build                                        | rerun button on build page                       | ✘                                 | ✓            |\n| CreatePipelineBuild           | Running tasks with fly execute                                            | n/a                                              | ✘                                 | ✓            |\n| DeletePipeline                | fly destroy-pipeline                                   | n/a                                              | ✘                                 | ✓            |\n| DisableResourceVersion        | fly disable-resource-version                           | version disable widget on resource page          | ✘                                 | ✓            |\n| EnableResourceVersion         | fly enable-resource-version                            | version enable widget on resource page           | ✘                                 | ✓            |\n| PinResourceVersion            | fly pin-resource                                       | pin buttons on resource page                     | ✘                                 | ✓            |\n| UnpinResource                 | fly unpin-resource                                          | pin buttons on resource page                     | ✘                                 | ✓            |\n| SetPinCommentOnResource       | fly pin-resource                                       | comment overlay on resource page                 | ✘                                 | ✓            |\n| GetConfig                     | fly get-pipeline                                       | n/a                                              | ✘                                 | ✓            |\n| GetCC                         | n/a                                                                | n/a                                              | ✘                                 | ✓            |\n| GetVersionsDB                 | n/a                                                                | n/a                                              | ✘                                 | ✓            |\n| ListJobInputs                 | n/a                                                                | n/a                                              | ✘                                 | ✓            |\n| OrderPipelines                | fly order-pipelines                                    | drag and drop on dashboard                       | ✘                                 | ✓            |\n| OrderPipelinesWithinGroup     | fly order-instanced-pipelines                          | drag and drop within instance group on dashboard | ✘                                 | ✓            |\n| PauseJob                      | fly pause-job                                          | pause button on job page                         | ✘                                 | ✓            |\n| PausePipeline                 | fly pause-pipeline                                     | pause button on pipeline or dashboard            | ✘                                 | ✓            |\n| RenamePipeline                | fly rename-pipeline                                    | n/a                                              | ✘                                 | ✓            |\n| UnpauseJob                    | fly unpause-job                                        | play button on job page                          | ✘                                 | ✓            |\n| UnpausePipeline               | fly unpause-pipeline                                   | play button on pipeline or dashboard             | ✘                                 | ✓            |\n| ExposePipeline                | fly expose-pipeline                                    | eyeball button on dashboard                      | ✘                                 | ✓            |\n| HidePipeline                  | fly hide-pipeline                                      | slashed eyeball button on dashboard              | ✘                                 | ✓            |\n| SaveConfig                    | fly set-pipeline                                       | n/a                                              | ✘                                 | ✓            |\n| ClearTaskCache                | fly clear-task-cache                                   | n/a                                              | ✘                                 | ✓            |\n| CreateArtifact                | Running tasks with fly execute                                            | n/a                                              | ✘                                 | ✓            |\n| GetArtifact                   | Running tasks with fly execute                                            | n/a                                              | ✘                                 | ✓            |\n| ClearResourceCache            | fly clear-resource-cache                               | n/a                                              | ✘                                 | ✓            |\n\n","depth":4,"section_tag":"action-matrix"},"add-a-job":{"location":"tutorial-hello-world.html#add-a-job","title":"Add a job","text":"We only need one job right now so let's add a single job named hello-world-job.\n\njobs:\n- name: hello-world-job\nAwesome, we have a job named hello-world! Now we need to add a step to our job. To define a list of steps a job should execute, we need to add the plan key to our job.\n\njobs:\n- name: hello-world-job\n  plan:\n","depth":4,"section_tag":"add-a-job"},"add-a-step":{"location":"tutorial-hello-world.html#add-a-step","title":"Add a step","text":"Unlike jobs, the order of steps does matter! Concourse will run the steps in the order that they are listed. Let's carefully place a task step as the first (and only) step in our job.\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\nFantastic! Now we need to tell Concourse how to run our task step. We do that by providing a task config.\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\nAt this point we are going to pause to explain steps a bit more.\n\n","depth":4,"section_tag":"add-a-step"},"adding-cf-users-to-the-main-team":{"location":"cf-uaa-auth.html#adding-cf-users-to-the-main-team","title":"Adding CF Users to the main Team","text":"CloudFoundry users and org/space members can be added to the The main team authorization config by setting the following env on the Running a web node:\n\nCONCOURSE_MAIN_TEAM_CF_USER=username\nCONCOURSE_MAIN_TEAM_CF_ORG=org-name\nCONCOURSE_MAIN_TEAM_CF_SPACE=org-name:space-name\nCONCOURSE_MAIN_TEAM_CF_SPACE_WITH_ANY_ROLE=org-name:space-name\nCONCOURSE_MAIN_TEAM_CF_SPACE_WITH_DEVELOPER_ROLE=org-name:space-name\nCONCOURSE_MAIN_TEAM_CF_SPACE_WITH_AUDITOR_ROLE=org-name:space-name\nCONCOURSE_MAIN_TEAM_CF_SPACE_WITH_MANAGER_ROLE=org-name:space-name\nCONCOURSE_MAIN_TEAM_CF_SPACE_GUID=SPACE_GUID\nMultiple users, spaces, etc. may be specified by comma-separating them.\n\n","depth":6,"section_tag":"adding-cf-users-to-the-main-team"},"administration":{"location":"administration.html","title":"Administration","text":"","depth":3,"section_tag":"administration"},"algorithm":{"location":"scheduler.html#algorithm","title":"Algorithm","text":"The algorithm is a subcomponent of the scheduler which is used to determine the input versions to the next build of a job. There are many factors that contribute to figuring out the next input versions. It can be anything that affects which resource versions will be used to schedule a build, such as version constraints or passed constraints in a get step, disabling versions through the web UI, etc. The algorithm can also fail to determine a successful set of input versions, which the error will be propogated to the preparation view in the build page.\n\nIf the algorithm computes a successful set of input versions, it will figure out whether or not the versions it computed can be used to produce a new build. This is done by comparing the triggerable input versions to the versions used by the previous build and if any of them have a different version, then the scheduler will know to schedule a new build. Conversly, if the input versions produced by the algorithm are the same as the previous build, then the scheduler will not create a new build.\n\n","depth":5,"section_tag":"algorithm"},"architecture-worker":{"location":"internals.html#architecture-worker","title":"Workers Architecture","text":"Workers are machines running Garden and Baggageclaim servers and registering themselves via the TSA.\n\nNote: Windows and Darwin workers also run Garden and Baggageclaim servers but do not run containers. They both use houdini to fake making containers. Windows containers are not supported and Darwin does not have native container technology.\n\nWorkers have no important state configured on their machines, as everything runs in a container and thus shouldn't care about what packages are installed on the host (well, except for those that allow it to be a worker in the first place). This is very different from workers in other non-containerized CI solutions, where the state of packages on the worker is crucial to whether your pipeline works or not.\n\nEach worker registers itself with the Concourse cluster via the TSA.\n\nWorkers by default listen on port 7777 for Garden and port 7788 for Baggageclaim. Connections to both servers are forwarded over the SSH connection made to the TSA.\n\n","depth":3,"section_tag":"architecture-worker"},"attempts-step":{"location":"attempts-step.html","title":"attempts Step Modifier","text":"The total number of times a step should be tried before it should fail, e.g. 5 will run the step up to 5 times before giving up.\n\nAttempts will retry on a Concourse error as well as build failure. When the number of attempts is reached and the step has still not succeeded then the step will fail.\n\n","depth":4,"section_tag":"attempts-step"},"audit-logs":{"location":"concourse-web.html#audit-logs","title":"Enabling audit logs","text":"A very simplistic form of audit logging can be enabled with the following vars:\n\n# Enable auditing for all api requests connected to builds.\nCONCOURSE_ENABLE_BUILD_AUDITING=true\n\n# Enable auditing for all api requests connected to containers.\nCONCOURSE_ENABLE_CONTAINER_AUDITING=true\n\n# Enable auditing for all api requests connected to jobs.\nCONCOURSE_ENABLE_JOB_AUDITING=true\n\n# Enable auditing for all api requests connected to pipelines.\nCONCOURSE_ENABLE_PIPELINE_AUDITING=true\n\n# Enable auditing for all api requests connected to resources.\nCONCOURSE_ENABLE_RESOURCE_AUDITING=true\n\n# Enable auditing for all api requests connected to system transactions.\nCONCOURSE_ENABLE_SYSTEM_AUDITING=true\n\n# Enable auditing for all api requests connected to teams.\nCONCOURSE_ENABLE_TEAM_AUDITING=true\n\n# Enable auditing for all api requests connected to workers.\nCONCOURSE_ENABLE_WORKER_AUDITING=true\n\n# Enable auditing for all api requests connected to volumes.\nCONCOURSE_ENABLE_VOLUME_AUDITING=true\nWhen enabled, API requests will result in an info-level log line like so:\n\n{\"timestamp\":\"2019-05-09T14:41:54.880381537Z\",\"level\":\"info\",\"source\":\"atc\",\"message\":\"atc.audit\",\"data\":{\"action\":\"Info\",\"parameters\":{},\"user\":\"test\"}}\n{\"timestamp\":\"2019-05-09T14:42:36.704864093Z\",\"level\":\"info\",\"source\":\"atc\",\"message\":\"atc.audit\",\"data\":{\"action\":\"GetPipeline\",\"parameters\":{\":pipeline_name\":[\"booklit\"],\":team_name\":[\"main\"]},\"user\":\"test\"}}\n","depth":5,"section_tag":"audit-logs"},"auth":{"location":"auth.html","title":"Auth \u0026 Teams","text":"A single Concourse installation can accomodate many projects and users.\n\nPipelines, builds, and all other user data are owned by teams. A team is just a conceptual owner and a separate namespace, tied to an authorization config. For example, a team may authorize all members of the concourse GitHub organization to be a member.\n\nWhen a user authenticates, each team's authorization config is checked against the user to determine which role, if any, to grant for the team. This information is then stored in the user's token to determine access control for future requests.\n\n","depth":2,"section_tag":"auth"},"authenticating-with-vault":{"location":"vault-credential-manager.html#authenticating-with-vault","title":"Authenticating with Vault","text":"There are many ways to authenticate with a Vault server. The web-node can be configured with either a token or an arbitrary auth backend and arbitrary auth params, so just about all of them should be configurable.\n\nWhen the web node acquires a token, either by logging in with an auth backend or by being given one directly, it will continuously renew the token to ensure it doesn't expire. The renewal interval is half of the token's lease duration.\n\n","depth":5,"section_tag":"authenticating-with-vault"},"aws-asm-credential-manager":{"location":"aws-asm-credential-manager.html","title":"The AWS Secrets Manager credential manager","text":"","depth":4,"section_tag":"aws-asm-credential-manager"},"aws-secretsmanager-access-key":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-access-key","title":"aws-secretsmanager-access-key","text":"A valid AWS access key.\n\nEnvironment variable CONCOURSE_AWS_SECRETSMANAGER_ACCESS_KEY.\n\n","depth":5,"section_tag":"configuration"},"aws-secretsmanager-iam-permissions":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-iam-permissions","title":"IAM Permissions","text":"The following is an example of an IAM policy that can be used to grant permissions to an IAM user or instance role. Note that the Resource section can contain a wildcard to a secret or be restricted to an individual secret. In order for the health check to work properly (see Scaling), Concourse needs to have access to the __concourse-health-check secret.\n\n{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n        \"Sid\": \"AllowAccessToSecretManagerParameters\",\n        \"Effect\": \"Allow\",\n        \"Action\": [\n            \"secretsmanager:ListSecrets\"\n        ],\n          \"Resource\": \"*\"\n        },\n        {\n            \"Sid\": \"AllowAccessGetSecret\",\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"secretsmanager:GetSecretValue\",\n                \"secretsmanager:DescribeSecret\"\n            ],\n            \"Resource\": [\n                \"arn:aws:secretsmanager:*:*:secret:/concourse/*\",\n                \"arn:aws:secretsmanager:*:*:secret:__concourse-health-check-??????\"\n            ]\n        }\n    ]\n}\nIf you wish to restrict concourse to only have access to secrets for a specific pipeline, you can replace \"arn:aws:secretsmanager:*:*:secret:/concourse/*\" in the example above with\n\n\"arn:aws:secretsmanager:*:*:secret:/concourse/TEAM_NAME/*\",\n\"arn:aws:secretsmanager:*:*:secret:/concourse/TEAM_NAME/PIPELINE_NAME/*\",\nwhere TEAM_NAME and PIPELINE_NAME are replaced with the team and name of the pipeline in question.\n\nFor more information on how to use IAM roles to restrict access to Secrets Manager, review the official documentation.\n\n","depth":5,"section_tag":"aws-secretsmanager-iam-permissions"},"aws-secretsmanager-pipeline-secret-template":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-pipeline-secret-template","title":"aws-secretsmanager-pipeline-secret-template","text":"The base path used when attempting to locate a pipeline-level secret.\n\nEnvironment variable CONCOURSE_AWS_SECRETSMANAGER_PIPELINE_SECRET_TEMPLATE.\n\nExample:\n\nDefault: /concourse/{{.Team}}/{{.Pipeline}}/{{.Secret}}\n\n","depth":5,"section_tag":"configuration"},"aws-secretsmanager-region":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-region","title":"aws-secretsmanager-region","text":"The AWS region that requests to Secrets Manager will be sent to.\n\nEnvironment variable CONCOURSE_AWS_SECRETSMANAGER_REGION.\n\n","depth":5,"section_tag":"configuration"},"aws-secretsmanager-scaling":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-scaling","title":"Scaling","text":"If your cluster has a large workload, in particular if there are many resources, Concourse can generate a lot of traffic to AWS and subsequently get rate-limited.\n\nAs long as Concourse has permission to get the value of the __concourse-health-check secret, you should be able to measure an error rate by polling the /api/v1/info/creds endpoint when authenticated as a Concourse Admin.\n\nDepending on your workflow for updating secrets and your reliability requirements it may be worth Caching credentials and/or Retrying failed fetches to mitigate rate-limit-related errors.\n\n","depth":5,"section_tag":"aws-secretsmanager-scaling"},"aws-secretsmanager-secret-key":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-secret-key","title":"aws-secretsmanager-secret-key","text":"The secret key that corresponds to the access key defined above.\n\nEnvironment variable CONCOURSE_AWS_SECRETSMANAGER_SECRET_KEY.\n\n","depth":5,"section_tag":"configuration"},"aws-secretsmanager-session-token":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-session-token","title":"aws-secretsmanager-session-token","text":"A valid AWS session token.\n\nEnvironment variable CONCOURSE_AWS_SECRETSMANAGER_SESSION_TOKEN.\n\n","depth":5,"section_tag":"configuration"},"aws-secretsmanager-team-secret-template":{"location":"aws-asm-credential-manager.html#aws-secretsmanager-team-secret-template","title":"aws-secretsmanager-team-secret-template","text":"The base path used when attempting to locate a team-level secret.\n\nEnvironment variable CONCOURSE_AWS_SECRETSMANAGER_TEAM_SECRET_TEMPLATE.\n\nExample:\n\nDefault: /concourse/{{.Team}}/{{.Secret}}\n\n","depth":5,"section_tag":"configuration"},"aws-ssm-access-key":{"location":"aws-ssm-credential-manager.html#aws-ssm-access-key","title":"aws-ssm-access-key","text":"A valid AWS access key.\n\nEnvironment variable CONCOURSE_AWS_SSM_ACCESS_KEY.\n\n","depth":5,"section_tag":"configuration"},"aws-ssm-credential-manager":{"location":"aws-ssm-credential-manager.html","title":"The AWS SSM credential manager","text":"","depth":4,"section_tag":"aws-ssm-credential-manager"},"aws-ssm-pipeline-secret-template":{"location":"aws-ssm-credential-manager.html#aws-ssm-pipeline-secret-template","title":"aws-ssm-pipeline-secret-template","text":"The base path used when attempting to locate a pipeline-level secret.\n\nEnvironment variable CONCOURSE_AWS_SSM_PIPELINE_SECRET_TEMPLATE.\n\nExample:\n\nDefault: /concourse/{{.Team}}/{{.Pipeline}}/{{.Secret}}\n\n","depth":5,"section_tag":"configuration"},"aws-ssm-region":{"location":"aws-ssm-credential-manager.html#aws-ssm-region","title":"aws-ssm-region","text":"The AWS region that requests to parameter store will be sent to.\n\nEnvironment variable CONCOURSE_AWS_SSM_REGION.\n\n","depth":5,"section_tag":"configuration"},"aws-ssm-secret-key":{"location":"aws-ssm-credential-manager.html#aws-ssm-secret-key","title":"aws-ssm-secret-key","text":"The secret key that corresponds to the access key defined above.\n\nEnvironment variable CONCOURSE_AWS_SSM_SECRET_KEY.\n\n","depth":5,"section_tag":"configuration"},"aws-ssm-session-token":{"location":"aws-ssm-credential-manager.html#aws-ssm-session-token","title":"aws-ssm-session-token","text":"A valid AWS session token.\n\nEnvironment variable CONCOURSE_AWS_SSM_SESSION_TOKEN.\n\n","depth":5,"section_tag":"configuration"},"aws-ssm-team-secret-template":{"location":"aws-ssm-credential-manager.html#aws-ssm-team-secret-template","title":"aws-ssm-team-secret-template","text":"The base path used when attempting to locate a team-level secret.\n\nEnvironment variable CONCOURSE_AWS_SSM_TEAM_SECRET_TEMPLATE.\n\nExample:\n\nDefault: /concourse/{{.Team}}/{{.Secret}}\n\n","depth":5,"section_tag":"configuration"},"badges":{"location":"observation.html#badges","title":"Badges","text":"The Concourse API supports returning SVG badges indicating the status of a job:\n\n/api/v1/teams/{team}/pipelines/{pipeline}/jobs/{job}/badge\n...and for an entire pipeline:\n\n/api/v1/teams/{team}/pipelines/{pipeline}/badge\nThis can be used to annotate your READMEs with a build status badge like so:\n\n![CI](https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge)\n...which should render the following:\n\n{image: https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge}\n\nYou can also specify a custom title for the badge with a title query parameter:\n\n/api/v1/teams/{team}/pipelines/{pipeline}/badge?title=hello\nor\n\n/api/v1/teams/{team}/pipelines/{pipeline}/jobs/{job}/badge?title=hello\n...which should render the following:\n\n{image: https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge?title=hello}\n\nIf you want to have the image link to your pipeline/job in a README, you can make it like so:\n\n\u003ca href=\"https://ci.concourse-ci.org/teams/main/pipelines/concourse/jobs/unit/badge\"\u003e\n  \u003cimg src=\"https://ci.concourse-ci.org/api/v1/teams/main/pipelines/concourse/jobs/unit/badge\" alt=\"Concourse Pipeline Status\"\u003e\n\u003c/a\u003e\n","depth":3,"section_tag":"badges"},"basic-architecture":{"location":"internals.html#basic-architecture","title":"Basic architecture","text":"Concourse is a fairly simple distributed system built up from the following components. You'll see them referenced here and there throughout the documentation, so you may want to skim this page just to get an idea of what they are.\n\nimages/concourse_architecture.png","depth":3,"section_tag":"basic-architecture"},"basic-git-operations":{"location":"basic-git-operations.html","title":"Basic Git Operations","text":"All of these examples use the concourse/git-resource image. That image is probably the most popular git resource for Concourse since it is shipped in the concourse/concourse image and in the tarball on the GitHub release page. It is not the only resource available for working with git-related resources. If you don't see your use-case on this page then there is probably another resource that you can use. For example, Pull Request workflows can be accomplished with the teliaoss/github-pr-resource.\n\nCheck out the docs for the git resource for all configuration options.\n\n","depth":4,"section_tag":"basic-git-operations"},"basic-schemas":{"location":"config-basics.html#basic-schemas","title":"Basic Schemas","text":"Throughout the Concourse documentation you will come across schema definitions for each API.\n\nThe following are basic schema definitions that the other schemas refer to. You can probably skip past this and just make assumptions along the way; this is just here for completeness!\n\nAny integer, i.e. 1000.\n\nAn arbitrary string value with no content restrictions.\n\nAn arbitrary object representing configuration that is not directly interpreted by Concourse - typically given to a resource type.\n\nuri: https://github.com/vito/booklit\nbranch: master\nAll object keys must be strings, preferably snake_cased.\n\nAn arbitrary object representing key-value definitions for ((vars)).\n\nAs with config schema, all object keys must be strings, preferably snake_cased.\n\nAn object containing string keys and string values. Each pair represents an environment variable to set to the given value.\n\nSOME_SIMPLE_VAR: simple-var\nSOME_LONG_VAR: |\n  This is an example of using YAML multi-line string syntax to set a very\n  long environment variable value.\nSOME_NUMERIC_VALUE: \"1\"\nNote that in the last example we took special care to quote the number.\n\ntrue or false.\n\nYAML also supports the alias yes, no, on, or off, but...please don't.\n\nAn arbitrary YAML value. May be a number schema, string schema, boolean schema, config schema, or a [value schema].\n\nvalues:\n- 123\n- bar\n- true\n- key1: abc\n  key2: def\n- [hello, world]\nAn identifier is a string value. The following defines the allowed character set for an identifier:\n\n* Unicode lowercase letters, while still supporting languages that don't have any casing (e.g. Japanese).\n\n* Decimal numbers.\n\n* Hyphens - and underscores _ as word separators.\n\n* Periods . in order to support domain names and version numbers.\n\nThe validation rule is as follows:\n\n^[\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\d][\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\d\\-_.]*$\nWhere all identifier must start with a Unicode lowercase letter or number, followed by any number of allowed characters.\n\nCurrently, the validation will only show as warnings. For the sake of future-proofing, you may want to conform to it.\n\nA string value specifying a (typically relative) path of a directory.\n\nA string value specifying a (typically relative) path of a file.\n\nA string value in Go time.ParseDuration format. 1h for one hour, 5m for 5 minutes.\n\nAn object with string keys and string values.\n\nThe following is an array of versions:\n\n- {\"ref\": \"33042e15e930b6786fc9b0a9ea5dec78689c5e4b\"}\n- ref: v1.2.0,\n  sha: 33042e15e930b6786fc9b0a9ea5dec78689c5e4b\n- foo: \"0\"\nNote that in the last example we took special care to quote the number.\n\nIn many scenarios where a version can be specified, e.g. get step version, only a subset of the full set of fields is necessary. The latest version matching the fields specified will be chosen.\n\n","depth":3,"section_tag":"basic-schemas"},"benefits-of-global-resources":{"location":"global-resources.html#benefits-of-global-resources","title":"Benefits of Global Resources","text":"","depth":4,"section_tag":"benefits-of-global-resources"},"bitbucket-cloud-auth":{"location":"bitbucket-cloud-auth.html","title":"BitBucket Cloud auth","text":"A Concourse server can authenticate against BitBucket Cloud to leverage its permission model.\n\n","depth":4,"section_tag":"bitbucket-cloud-auth"},"bitbucket-cloud-authentication":{"location":"bitbucket-cloud-auth.html#bitbucket-cloud-authentication","title":"Authentication","text":"First, you'll need to create an OAuth consumer on Bitbucket Cloud.\n\nThe consumer will need the following permissions:\n\n* Account:\n\n  * Email\n\n  * Read\n\n* Team membership:\n\n  * Read\n\nThe \"Callback URL\" must be the URL of your Concourse server with /sky/issuer/callback appended. This address must be reachable by BitBucket Cloud - it can't be localhost.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nYou will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the Running a web node by setting the following env:\n\nCONCOURSE_BITBUCKET_CLOUD_CLIENT_ID=myclientid\nCONCOURSE_BITBUCKET_CLOUD_CLIENT_SECRET=myclientsecret\n","depth":5,"section_tag":"bitbucket-cloud-authentication"},"bitbucket-cloud-authorization":{"location":"microsoft-auth.html#bitbucket-cloud-authorization","title":"Authorization","text":"Individual user auth is disabled due to a quirk with with Microsoft returning unique IDs but non-unique usernames\n\nGroups can be authorized for a team by passing the following flags to fly set-team:\n\n--microsoft-group=GROUP_NAME: Authorize an entire group's members.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --microsoft-group my-group\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  microsoft:\n    groups: [\"my-groups\"]\n","depth":5,"section_tag":"bitbucket-cloud-authorization"},"build-log-retention":{"location":"concourse-web.html#build-log-retention","title":"Build log retention","text":"Build logs are stored in the DB - if they are not cleanup up every once in a while, the storage usage for build logs will continue to grow as more builds run. While this is usually fine for small Concourse instances, as you scale up, you may run into storage concerns.\n\nTo clean up old build logs, you can configure Concourse to periodically scan for builds whose logs should be reaped based on a log retention policy, skipping over any paused pipelines and jobs. When a build's logs are reaped, they are no longer visible in the UI.\n\nConcourse can be configured with a default build log retention policy for all jobs:\n\nCONCOURSE_DEFAULT_BUILD_LOGS_TO_RETAIN=50\nCONCOURSE_DEFAULT_DAYS_TO_RETAIN_BUILD_LOGS=14\nWith these settings, Concource will keep the latest 50 builds for each job. If a job runs more than 50 builds in 14 days, all of those builds will be retained until 14 days after they ran.\n\nSome jobs have differing retention requirements - you can configure build_log_retention_policy schema on a job-by-job basis.\n\nYou can also configure Concourse with maximum values for build log retention policies to prevent jobs from retaining their build logs for too long:\n\nCONCOURSE_MAX_BUILD_LOGS_TO_RETAIN=100\nCONCOURSE_MAX_DAYS_TO_RETAIN_BUILD_LOGS=30\nWith these settings, build_log_retention_policy.builds is capped at 100, and build_log_retention_policy.days is capped at 30.\n\n","depth":5,"section_tag":"build-log-retention"},"build-logs":{"location":"performance-tuning.html#build-logs","title":"Build Logs","text":"Is the size of your database growing dramatically? Can't keep up with the storage costs? Then you should probably configure some default log retention settings.\n\nBy default Concourse will not delete any of your logs from your pipelines. You have to opt-in to having Concourse automatically delete build logs for you. You can set a time-based retention policy and/or a policy based on the number of logs a job generates.\n\n","depth":4,"section_tag":"build-logs"},"build-plans":{"location":"steps.html","title":"Steps","text":"Each job has a single build plan configured as job.plan. A build plan is a recipe for what to run when a build of the job is created.\n\nA build plan is a sequence of steps:\n\n* the task step runs a task\n\n* the get step fetches a resource\n\n* the put step updates a resource\n\n* the set_pipeline step configures a pipeline\n\n* the load_var step loads a value into a local var\n\n* the in_parallel step runs steps in parallel\n\n* the do step runs steps in sequence\n\n* the across step modifier runs a step multiple times; once for each combination of variable values\n\n* the try step attempts to run a step and succeeds even if the step fails\n\nWhen a new version is available for a get step with trigger: true configured, a new build of the job will be created from the build plan.\n\nWhen viewing the job in the pipeline, resources that are used as get steps appear as inputs, and resources that are used in put steps appear as outputs. Jobs are rendered downstream of any jobs they reference in passed constraints, connected by the resource.\n\nIf any step in the build plan fails, the build will fail and subsequent steps will not be executed. Additional steps may be configured to run after failure by configuring on_failure or ensure (or the job equivalents, job.on_failure and job.ensure).\n\n","depth":2,"section_tag":"steps"},"build-rerunning":{"location":"builds.html#build-rerunning","title":"Rerunning a Build","text":"Concourse supports build rerunning, which means to run a new build using the exact same set of input versions as the original build. There are two ways to rerun a build: through the web UI on the builds page and through the fly rerun-build.\n\nWhen a build is rerun, it will create a new build using the name of the original build with the rerun number appended to it, e.g. 3.1 for the first rerun of build 3.\n\nRerun builds are ordered chronologically after the original build, rather than becoming a new \"latest\" build. Similarly, when the scheduler is resolving passed constraints that reference a job with rerun builds, those rerun builds are processed in this same order. This ensures that the versions, which made it through a rerun build, do not become the new \"latest versions\". Instead, they act as if the original build had succeeded at its point in the build history.\n\nThis may sound a little confusing, but the summary is that reruns should behave as if they replace the original failed build.\n\n","depth":3,"section_tag":"build-rerunning"},"build-the-image":{"location":"building-an-image-and-using-it-in-a-task.html#build-the-image","title":"Build The Image","text":"To avoid repeating ourselves we're going to use the pipeline made in the other guide Building and Pushing an Image. We will start with the pipeline from the Defining the Build Context section.\n\nWe will add the UNPACK_ROOTFS parameter to the task. This paramter tells the oci-build-task to include the image in a special format that Concourse's container runtime uses. In the future this may not be necessary if Concourse starts using the OCI image format.\n\nresources:\n# The repo with our Dockerfile\n- name: concourse-examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n    branch: master\n\njobs:\n- name: build-and-run\n  plan:\n  - get: concourse-examples\n  - task: build-image\n    privileged: true # oci-build-task must run in a privileged container\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: concourse/oci-build-task\n      inputs:\n      - name: concourse-examples\n      outputs:\n      - name: image\n      params:\n        CONTEXT: concourse-examples/Dockerfiles/simple\n        UNPACK_ROOTFS: true #add this param\n      run: # binary used to build the image\n        path: build\n \n\nThe above pipeline will build a container image and also output it in Concourse's rootfs image format.\n\n","depth":5,"section_tag":"build-the-image"},"build-tracker":{"location":"build-tracker.html","title":"Build Tracker","text":"The build tracker is the component that runs the execution of a build. It picks up any started builds, which can be orphaned builds (builds that an ATC started but did not finish) or builds that have just been scheduled. There is one build tracker per ATC, which runs on an interval that is defaulted to 10 seconds.\n\n","depth":4,"section_tag":"build-tracker"},"building-an-image-and-using-it-in-a-task":{"location":"building-an-image-and-using-it-in-a-task.html","title":"Building an Image and Using it in a Task","text":"This guide will show you how to build and use an image within one job without pushing the image to an external image registry like Docker Hub.\n\n","depth":4,"section_tag":"building-an-image-and-using-it-in-a-task"},"building-and-pushing-an-image":{"location":"building-and-pushing-an-image.html","title":"Building and Pushing an Image","text":"In this guide we are going to show how to build and publish container images using the oci-build task and registry-image resource. This guide assumes you understand how to build container images with Dockerfile's and publish to Docker Hub or another image registry using the docker cli.\n\nThis is one way of building and pushing images. There are many other ways to accomplish this same task in Concourse.\n\nFirst we need a Dockerfile. You can store this in your own repo or reference the github.com/concourse/examples repo. The rest of this post assumes you use the examples repo. All files in this blog post can be found in the examples repo.\n\n","depth":4,"section_tag":"building-and-pushing-an-image"},"builds":{"location":"builds.html","title":"Builds","text":"A build is an execution of a build plan, which is either\n\n* configured as a sequence of steps in a job\n\n* generated by the Resource Checker to run a check: Check for new versions.\n\n* submitted directly to Concourse as a one-off build via Running tasks with fly execute\n\nContainers and volumes are created as get steps, put steps, and task steps run. When a build completes successfully, these containers go away.\n\nA failed build's containers and volumes are kept around so that you can debug the build via fly intercept. If the build belongs to a job, the containers will go away when the next build starts. If the build is a one-off, its containers will be removed immediately, so make sure you intercept while it's running, if you want to debug.\n\n","depth":2,"section_tag":"builds"},"bundled-resource-types":{"location":"concourse-worker.html#bundled-resource-types","title":"Bundled Resource Types","text":"Workers come prepackaged with a bundle of resource types. They are included in the tarball from the GitHub release page and are part of the concourse/concourse image.\n\nTo view the resource types available on a worker run:\n\nfly workers --details\nIf you want more details, like the version number of each resource, you can run:\n\nfly curl api/v1/workers\n","depth":6,"section_tag":"bundled-resource-types"},"ccxml":{"location":"observation.html#ccxml","title":"cc.xml","text":"The Concourse API can return the status of a team's pipelines in a format compatible with tools like CCMenu. This endpoint is available at the following route:\n\n/api/v1/teams/{team}/cc.xml\n","depth":3,"section_tag":"ccxml"},"cf-authentication":{"location":"cf-uaa-auth.html#cf-authentication","title":"Authentication","text":"You'll need to configure your UAA with a concourse client by setting the following under uaa.clients:\n\nconcourse:\n  id: myclientid\n  secret: myclientsecret\n  scope: openid,cloud_controller.read\n  authorized-grant-types: \"authorization_code,refresh_token\"\n  access-token-validity: 3600\n  refresh-token-validity: 3600\n  redirect-uri: https://concourse.example.com/sky/issuer/callback\nThe value for redirect-uri must be the external URL of your Concourse server with /sky/issuer/callback appended.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nNext, you'll need to take the same client ID and secret and configure it on the Running a web node by setting the following env:\n\nCONCOURSE_CF_API_URL=http://mycf.example.com\nCONCOURSE_CF_CLIENT_ID=myclientid\nCONCOURSE_CF_CLIENT_SECRET=myclientsecret\nNote: if you're integrating with Cloud Foundry, you're probably also deploying Concourse via BOSH - in which case you'll want to set the cf_auth.* properties in your manifest instead of setting the above env.\n\n","depth":5,"section_tag":"cf-authentication"},"cf-authorization":{"location":"cf-uaa-auth.html#cf-authorization","title":"Authorization","text":"CloudFoundry users and org/space members can be authorized for a team by passing the following flags to fly set-team:\n\n--cf-user=USERNAME: Authorize an individual user.\n\n\n--cf-org=ORG_NAME: Authorize an entire organization's members. Members will need to be part of a Space inside the organization.\n\n\n--cf-space=ORG_NAME:SPACE_NAME: Deprecated in favor of --cf-space-with-developer-role. Authorize the members with developer role of a space within an organization.\n\n\n--cf-space-with-any-role=ORG_NAME:SPACE_NAME: Authorize the members with any role of a space within an organization.\n\n\n--cf-space-with-developer-role=ORG_NAME:SPACE_NAME: Authorize the members with developer role of a space within an organization.\n\n\n--cf-space-with-auditor-role=ORG_NAME:SPACE_NAME: Authorize the members with auditor role of a space within an organization.\n\n\n--cf-space-with-manager-role=ORG_NAME:SPACE_NAME: Authorize the members with manager role of a space within an organization.\n\n\n--cf-space-guid=SPACE_GUID: Authorize the members with any role of a space within an organization by space GUID.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --cf-user my-username \\\n    --cf-org my-org \\\n    --cf-space my-other-org:my-space\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  cf:\n    users: [\"my-username\"]\n    orgs: [\"my-org\"]\n    spaces: [\"my-other-org:my-space\"]\n","depth":5,"section_tag":"cf-authorization"},"cf-uaa-auth":{"location":"cf-uaa-auth.html","title":"CF/UAA auth","text":"Cloud Foundry (CF) auth can be used for operators who wish to authenticate their users configured against their Cloud Foundry instance via the UAA auth component.\n\n","depth":4,"section_tag":"cf-uaa-auth"},"chaining-placement-strategies":{"location":"container-placement.html#chaining-placement-strategies","title":"Chaining Placement Strategies","text":"Container placement strategies can be chained together to apply multiple strategies in sequence. The first strategy in the chain receives the entire set of workers, filtering the set down in some way, and passing that new set of workers to the next strategy in the chain. If the last strategy in the chain returns multiple workers, one will be chosen at random.\n\nFor instance, consider the following configuration:\n\nCONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-containers,limit-active-volumes,volume-locality,fewest-build-containers\nCONCOURSE_MAX_ACTIVE_CONTAINERS_PER_WORKER=200\nCONCOURSE_MAX_ACTIVE_VOLUMES_PER_WORKER=100\nThis defines a chain of 4 placement strategies, plus the implicit random strategy. Let's look at what each strategy accomplishes:\n\n1. The limit-active-containers strategy removes all workers that already have more than 200 containers\n\n2. The limit-active-volumes strategy removes all remaining workers that already have more than 100 volumes\n\n3. The volume-locality strategy keeps only the remaining worker(s) that have the most inputs locally. This can keep more than one worker in the case of a tie\n\n4. The fewest-build-containers strategy will attempt to break ties by selecting the worker with fewer build containers. If all the remaining workers have the exact same number of containers, one will be selected at random.\n\n","depth":4,"section_tag":"chaining-placement-strategies"},"checker":{"location":"checker.html","title":"Resource Checker","text":"Resources represent external state such as a git repository, files in an S3 bucket, or anything else that changes over time. By modelling these as resources, it allows you to use this external state as inputs (or triggers) to your workloads.\n\n","depth":4,"section_tag":"checker"},"checks":{"location":"tutorial-resources.html#checks","title":"Checks","text":"Checks are how Concourse finds new versions of resources.  In order to find any new versions Concourse has to run the check scripts for all resources across all pipelines. By default, all resources have a check_every interval of one minute.\n\nThe default check_every interval helps keep Concourse feeling snappy and responsive to changes in external systems. The negative side-effect of this is that if you have a lot of resources all hitting the same system (e.g. an internal Git system) you may end up DDOS'ing your external system! In these cases you may want to increase the check_every interval of your resource or disable it and use webhooks instead.\n\nTo see the results of the last check that ran, go to the resource's page in the pipeline and expand the top line that starts with check: \u003cresource-name\u003e.\n\n{image: images/tutorial/view-check-status.png}\n\nIf your resource is having trouble finding new versions or is configured incorrectly the resource will print a message that will be visible on its resource page for you to debug.\n\nIf you want to debug a check container the easiest way to do that will be to start a shell session in the container using fly intercept. You can pass in the URL to the resources page to start a shell session on the resource container.\n\n$ fly -t tutorial intercept -u http://localhost:8080/teams/main/pipelines/hello-world/resources/every-1min\nroot@f5bf10f9-6a95-46e6-4e44-63594dace2e0:/tmp/build/check#\n","depth":4,"section_tag":"checks"},"cluster-wide-credential-manager":{"location":"vars.html#cluster-wide-credential-manager","title":"The cluster-wide credential manager","text":"Concourse can be configured with a single cluster-wide credential manager, which acts as a source for any vars which do not specify a source name.\n\nSee Credential Management for more information.\n\nIn the future we would like to introduce support for multiple cluster-wide var sources, configured using the var_source schema schema, and begin deprecating the The cluster-wide credential manager.\n\n","depth":4,"section_tag":"cluster-wide-credential-manager"},"commercial-support":{"location":"support.html#commercial-support","title":"Commercial Support","text":"The maintainers of Concourse provide commercial support for Concourse through Pixel Air. If you're interested in commercial support you can book a call with us.\n\n","depth":2,"section_tag":"commercial-support"},"common-pipeline-practices":{"location":"common-pipeline-practices.html","title":"Common Pipeline Practices","text":"The following are practices that we see a lot of people use in their pipelines. These are by no means \"Best\" practices, they are simply common and may or may not work for you and your team.\n\n","depth":4,"section_tag":"common-pipeline-practices"},"community-support":{"location":"support.html#community-support","title":"Community Support","text":"You can ask the community for support either on Discord or GitHub Discussions.\n\n","depth":2,"section_tag":"community-support"},"complications-with-reusing-containers":{"location":"global-resources.html#complications-with-reusing-containers","title":"Complications with reusing containers","text":"There is an exception to sharing check containers within a deployment, which is workers belonging to a team and workers with tags.\n\nIf a resource has resource.tags configured, and the resource's check interval ends up acquiring the checking lock, if a check container already exists with the same resource config elsewhere, it will reuse the container, otherwise a container will be created on a worker matching the appropriate tags.\n\nSimilarly, if a team has its own workers, and their check interval ended up acquiring the lock, it will try to re-use a container with the same resource config from the shared worker pool, rather than creating a new container on the team's workers.\n\nThis is a bit complicated to reason about and we plan to stop re-using check containers to simplify all of this. See 3079 for more information.\n\n","depth":6,"section_tag":"complications-with-reusing-containers"},"component-atc":{"location":"internals.html#component-atc","title":"ATC: web UI \u0026 build scheduler","text":"The ATC is the heart of Concourse. It runs the web UI and API and is responsible for all pipeline scheduling. It connects to PostgreSQL, which it uses to store pipeline data (including build logs).\n\nMultiple ATCs can be running as one cluster; as long as they're all pointing to the same database, they'll synchronize using basic locking mechanisms and roughly spread work across the cluster.\n\nThe ATC by default listens on port 8080, and is usually colocated with the TSA and sitting behind a load balancer.\n\nNote: for fly intercept to function, make sure your load balancer is configured to do TCP or SSL forwarding, not HTTP or HTTPS.\n\nThere are multiple components within the ATC that each have their own set of responsibilities. The main components consist of the checker, scheduler, build tracker and the garbage collector.\n\nThe checker's responsibility is to continously checks for new versions of resources. The scheduler is responsible for scheduling builds for a job and the build tracker is responsible for running any scheduled builds. The garbage collector is the cleanup mechanism for removing any unused or outdated objects, such as containers and volumes.\n\nAll the components in a Concourse deployment can be viewed in the components table in the database as of v5.7.0. The intervals that the components run at can also be adjusted through editing that table, as well as pausing the component from running entirely.\n\n","depth":3,"section_tag":"component-atc"},"component-tsa":{"location":"internals.html#component-tsa","title":"TSA: worker registration \u0026 forwarding","text":"The TSA is a custom-built SSH server that is used solely for securely registering workers with the ATC.\n\nThe TSA by default listens on port 2222, and is usually colocated with the ATC and sitting behind a load balancer.\n\nThe TSA implements CLI over the SSH connection, supporting the following commands:\n\n* The forward-worker command is used to reverse-tunnel a worker's addresses through the TSA and register the forwarded connections with the ATC. This allows workers running in arbitrary networks to register securely, so long as they can reach the TSA. This is much safer than opening the worker up to the outside world.\n\n* The land-worker command is sent from the worker when landing, and initiates the state change to LANDING through the ATC.\n\n* The retire-worker command is sent from the worker when retiring, and initiates the state change to RETIRING through the ATC.\n\n* The delete-worker command is sent from the worker when draining is interrupted while a worker is retiring. It removes the worker from the ATC.\n\n* The sweep-containers command is sent periodically to facilitate garbage collection of containers which can be removed from the worker. It returns a list of handles for containers in the DESTROYING state, and it is the worker's job to subsequently destroy them.\n\n* The report-containers command is sent along with the list of all container handles on the worker. The ATC uses this to update the database, removing any DESTROYING containers which are no longer in the set of handles, and marking any CREATED containers that are not present as missing.\n\n* The sweep-volumes command is sent periodically to facilitate garbage collection of volumes which can be removed from the worker. It returns a list of handles for volumes in the DESTROYING state, and it is the worker's job to subsequently destroy them.\n\n* The report-volumes command is sent along with the list of all volume handles on the worker. The ATC uses this to update the database, removing any DESTROYING volumes which are no longer in the set of handles, and marking any CREATED volumes that are not present as missing.\n\n","depth":3,"section_tag":"component-tsa"},"concourse-admin":{"location":"user-roles.html#concourse-admin","title":"Concourse Admin","text":"Admin is a special user attribute granted only to owners of the The main team.\n\nAdmins have the ability to administrate teams using fly set-team, fly destroy-team, fly rename-team, etc.\n\nAdmins always have permission to perform any action on any team. You cannot assign actions to the admin role using the --config-rbac flag.\n\nThe following actions are also assigned to admins, and cannot be reconfigured:\n\n- GetLogLevel\n- ListActiveUsersSince\n- SetLogLevel\n- GetInfoCreds\n- SetWall\n- ClearWall\n","depth":4,"section_tag":"concourse-admin"},"concourse-as-a-service":{"location":"ecosystem.html#concourse-as-a-service","title":"Concourse-as-a-Service","text":"The following organizations deliver Concourse as a fully-managed cloud solution, eliminating infrastructure overhead and providing dedicated support.\n\n* CentralCI\n\n","depth":2,"section_tag":"concourse-as-a-service"},"concourse-cli":{"location":"concourse-cli.html","title":"The concourse CLI","text":"The concourse CLI can be downloaded from the latest GitHub release - make sure to grab the appropriate archive for your platform. Each concourse-* archive contains the following files:\n\nconcourse/bin/concourse\nconcourse/bin/gdn            # Linux only\nconcourse/fly-assets/...\nconcourse/resource-types/... # Linux only\nThe Linux release is the largest among all the platforms because it is prepackaged with a bundle of resource types like the git, time, and registry-image resources. Resources only run on Linux workers, that's why the other platforms are not bundled with resources; resources don't currently exist for non-linux platforms.\n\nWhen extracted, the concourse binary will auto-discover its sibling assets based on its file location, so you may extract it anywhere. On Linux a typical install location is /usr/local/concourse:\n\ntar -zxf concourse-*.tgz -C /usr/local\nFrom there, you can either add /usr/local/concourse/bin to your $PATH, or just execute /usr/local/concourse/bin/concourse directly.\n\nConfiguring concourseAll Concourse web and worker node configuration is defined statically via flags. For a full list of flags, you can pass --help to any command.\n\nconcourse web --help\nconcourse worker --help\nconcourse quickstart --help\nconcourse migrate --help\nconcourse generate-key --help\nconcourse land-worker --help\nconcourse retire-worker --help\nEach flag can also be set via an environment variable. The env var for each flag is based on the flag name uppercased, preceded with CONCOURSE_ and dashes (-) replaced with underscores (_). These are also shown in --help.\n\nVarious sections in documentation may refer to configuration via env vars rather than flags, but they are both equivalent and interchangeable. Env vars are simply easier to reference in isolation and are more useful to copy-paste.\n\n","depth":3,"section_tag":"concourse-cli"},"concourse-generate-key":{"location":"concourse-generate-key.html","title":"Generating Keys","text":"","depth":3,"section_tag":"concourse-generate-key"},"concourse-web":{"location":"concourse-web.html","title":"Running a web node","text":"The web node is responsible for running the web UI, API, and as well as performing all pipeline scheduling. It's basically the brain of Concourse.\n\n","depth":3,"section_tag":"concourse-web"},"concourse-worker":{"location":"concourse-worker.html","title":"Running a worker node","text":"The worker node registers with the Running a web node and is then used for executing builds and performing resource checks. It doesn't really decide much on its own.\n\n","depth":3,"section_tag":"concourse-worker"},"concourse_default_build_logs_to_retain":{"location":"performance-tuning.html#concourse_default_build_logs_to_retain","title":"CONCOURSE_DEFAULT_BUILD_LOGS_TO_RETAIN","text":"Determines how many build logs to retain per job by default. If you set this to 10 then any jobs in your pipelines that have more than ten builds will have the extra logs for those builds deleted.\n\nUsers can override this value in their pipelines.\n\n","depth":5,"section_tag":"concourse_default_build_logs_to_retain"},"concourse_default_days_to_retain_build_logs":{"location":"performance-tuning.html#concourse_default_days_to_retain_build_logs","title":"CONCOURSE_DEFAULT_DAYS_TO_RETAIN_BUILD_LOGS","text":"Determines how old build logs have to be before they are deleted. Setting this to a value like 10 will result in any build logs older than 10 days to be deleted.\n\nUsers can override this value in their pipelines.\n\n","depth":5,"section_tag":"concourse_default_days_to_retain_build_logs"},"concourse_default_getputtask_timeout":{"location":"performance-tuning.html#concourse_default_getputtask_timeout","title":"CONCOURSE_DEFAULT_{GET/PUT/TASK}_TIMEOUT","text":"Global defaults for how long the mentioned step takes to execute. Useful if you're finding your users write pipelines with tasks that get stuck or never end. Ensures that every build eventually finishes.\n\nUsers can override these values in their pipelines.\n\n","depth":5,"section_tag":"concourse_default_getputtask_timeout"},"concourse_default_task_cpumemory_limit":{"location":"performance-tuning.html#concourse_default_task_cpumemory_limit","title":"CONCOURSE_DEFAULT_TASK_{CPU/MEMORY}_LIMIT","text":"Global defaults for CPU and memory you can set. Only applies to tasks, not resource containers (check/get/put steps).  You can read more about how to set these limits on the task step container_limits page.\n\nUsers can override these values in their pipelines.\n\n","depth":5,"section_tag":"concourse_default_task_cpumemory_limit"},"concourse_gc_failed_grace_period":{"location":"performance-tuning.html#concourse_gc_failed_grace_period","title":"CONCOURSE_GC_FAILED_GRACE_PERIOD","text":"This env var only applies to containers where the job failed and has the longest grace period among all the other GC grace periods. It has a default value of 120h (five days).\n\nThe reason the default value is so long is so users don't feel rushed to investigate their failed job. A job can fail over a weekend and users can investigate the failed jobs containers when they come back on Monday.\n\nFailed containers get GC as soon as a new build of the job is kicked off. So you don't have to worry about failed containers always hanging around for five days. They'll only hang around for that long if they're the most recent build of a job.\n\nIf you notice a lot of containers and volumes hanging around that are tied to failed jobs you can try reducing this setting to fewer days or even a few hours.\n\n","depth":5,"section_tag":"concourse_gc_failed_grace_period"},"concourse_max_build_logs_to_retain":{"location":"performance-tuning.html#concourse_max_build_logs_to_retain","title":"CONCOURSE_MAX_BUILD_LOGS_TO_RETAIN","text":"Determines how many build logs to retain per job. Users cannot override this setting.\n\n","depth":5,"section_tag":"concourse_max_build_logs_to_retain"},"concourse_max_checks_per_second":{"location":"performance-tuning.html#concourse_max_checks_per_second","title":"CONCOURSE_MAX_CHECKS_PER_SECOND","text":"Maximum number of checks that can be started per second. This will be calculated as (# of resources)/(resource checking interval). If you're finding that too many resource checks are running at once and consuming a lot of resources on your workers then you can use this var to reduce the overall load.\n\nA value of -1 will remove this maximum limit of checks per second.\n\n","depth":5,"section_tag":"concourse_max_checks_per_second"},"concourse_max_days_to_retain_build_logs":{"location":"performance-tuning.html#concourse_max_days_to_retain_build_logs","title":"CONCOURSE_MAX_DAYS_TO_RETAIN_BUILD_LOGS","text":"Determines how old build logs have to be before they are deleted. Users cannot override this setting in their pipelines.\n\n","depth":5,"section_tag":"concourse_max_days_to_retain_build_logs"},"concourse_pause_pipelines_after":{"location":"performance-tuning.html#concourse_pause_pipelines_after","title":"CONCOURSE_PAUSE_PIPELINES_AFTER","text":"This flag takes a number representing the number of days since a pipeline last ran before it's automatically paused. So specifying 90 means any pipelines that last ran 91 days ago will be automatically paused.\n\nFor large instances it can be common for users to set a pipeline and then forget about it. The pipeline may never run another job again and be forgotten forever. Even if the jobs in the pipeline never run Concourse will still be running resource checks for that pipeline, if any resources are defined. By setting this flag you can ensure that any pipelines that meet this criteria will be automatically paused and not consume resources long-term. For some large instances this can mean up to 50% of pipelines eventually being paused.\n\n","depth":5,"section_tag":"concourse_pause_pipelines_after"},"concourse_resource_checking_interval":{"location":"performance-tuning.html#concourse_resource_checking_interval","title":"CONCOURSE_RESOURCE_CHECKING_INTERVAL","text":"This is where the default value for 1min checks comes from. Changing this value changes the default checking interval for all resources. Users can override this value when defining a resource with the resource.check_every field.\n\n","depth":5,"section_tag":"concourse_resource_checking_interval"},"concourse_resource_with_webhook_checking_interval":{"location":"performance-tuning.html#concourse_resource_with_webhook_checking_interval","title":"CONCOURSE_RESOURCE_WITH_WEBHOOK_CHECKING_INTERVAL","text":"Same as the previous var but only applies to resources with webhooks. Could use this to disable resource checking of resources that use webhooks by setting it to a large value like 99h.\n\n","depth":5,"section_tag":"concourse_resource_with_webhook_checking_interval"},"config-basics":{"location":"config-basics.html","title":"Config Basics","text":"Concourse configuration for things like Pipelines and Tasks is done through declarative YAML files.\n\nConcourse configuration supports basic variable substitution by way of ((vars)). There is no built-in support for fancier templating constructs, e.g. loops and conditionals; users are free to use whatever templating system they like.\n\n","depth":2,"section_tag":"config-basics"},"configuration":{"location":"php-example.html#configuration","title":"Pipeline Configuration","text":"---\nresources:\n- name: laravel-git\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/laravel/laravel.git\n\njobs:\n- name: test\n  public: true\n  build_log_retention:\n    builds: 50\n  plan:\n  - get: laravel-git\n    trigger: true\n  - task: run-tests\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source: { repository: composer }\n      inputs:\n        - name: laravel-git\n      run:\n        path: /bin/sh\n        args:\n          - -ce\n          - |\n            cd laravel-git\n\n            composer install\n\n            cp .env.example .env\n            php artisan key:generate\n\n            vendor/bin/phpunit\n\n\n","depth":3,"section_tag":"configuration"},"configure-opa":{"location":"opa.html#configure-opa","title":"Configuring Concourse","text":"There are four configuration options you need to set on the concourse web nodes to have them interact with OPA.\n\n* CONCOURSE_OPA_URL: The OPA policy check endpoint. Should point to a specific package/rule that contains all Concourse rules for your cluster.\n\n  Example: http://opa-endpoint.com/v1/data/concourse/decision\n\n* CONCOURSE_POLICY_CHECK_FILTER_HTTP_METHOD: API http methods to go through policy check. You will need to make sure these match up with an API action in the next two configuration options.\n\n  Example: PUT,POST\n\n* CONCOURSE_POLICY_CHECK_FILTER_ACTION: Actions in this list will go through policy check.\n\n  Example: ListWorkers,ListContainers\n\n* CONCOURSE_POLICY_CHECK_FILTER_ACTION_SKIP: Actions in this list will not go through policy check\n\n  Example: PausePipeline,UnpausePipeline\n\nFor the last three configuration options you can refer to the this list of routes for a list of API actions and their respective HTTP method. There are also some Special Actions not directly in the API.\n\n","depth":4,"section_tag":"configure-opa"},"configuring-auth":{"location":"configuring-auth.html","title":"Configuring Auth","text":"The very first thing to configure with Concourse is how users will log in, and what those users should be able to do.\n\nThis is configured in two separate tiers:\n\n* Authentication, how users identify themselves, is configured on the Running a web node.\n\n* Authorization, how user access is determined, is configured on each team.\n\nConcourse currently supports the following auth methods:\n\nAny number of providers can be enabled at any one time. Users will be given a choice when logging in as to which one they would like to use.\n\nConcourse uses a fork of Dex for its authentication. You can find additional documentation on the supported auth providers in the Dex connectors documentation.\n\nAdding a new auth provider to Concourse is as simple as submitting a pull request to our fork of Dex and then adding a bit of configuration to the skymarshal component.\n\n","depth":3,"section_tag":"configuring-auth"},"configuring-kubernetes-rbac":{"location":"kubernetes-credential-manager.html#configuring-kubernetes-rbac","title":"Configuring Kubernetes RBAC","text":"As the Web nodes need to retrieve secrets from namespaces that are not their own, they needs extra permissions to do so.\n\nIf you have RBAC enabled, that means creating the necessary Kubernetes objects to identify the Web nodes and give them access to a predefined list of namespaces where the secrets live.\n\nRegardless of how the Kubernetes RBAC-related objects are created, the basic requirement is that web must be able to read secrets in the  namespaces where each teams' secrets live.\n\nFor instance, if you have the following teams which you want to read secrets from:\n\n* team-a\n\n* team-b\n\nAssuming the following Running a web node configuration:\n\nCONCOURSE_KUBERNETES_NAMESPACE_PREFIX=myprefix-\nweb must be able to get secrets from the following namespaces:\n\n* myprefix-team-a\n\n* myprefix-team-b\n\nTo allow web to interpolate credentials for \"team-a\" and \"team-b\", we'd then need to create a few Kubernetes RBAC objects.\n\nStarting with identifying the web service as an actor, we can use a ServiceAccount for that:\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: web\n  labels:\n    app: web\nTo allow actors to do something, in this case, retrieve secrets from a given namespace, a ClusterRole is then needed.\n\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: read-secrets\n  labels:\n    app: web\nrules:\n- apiGroups: [\"\"]\n  resources: [\"secrets\"]\n  verbs: [\"get\"]\nAs that role is useless if not bound to an actor, the next step is creating the the object that represents binding the role to the web ServiceAccount that we had created before.\n\nThis is accomplished through the RoleBinding object, which is per-namespace (thus, per-team).\n\nEven though in this example we're binding to a ClusterRole (which is not tied to any namespace), the use of such cluster role is (see metadata.namespace), making the effective  permissions restricted to the namespace applied in the RoleBinding.\n\n---\n# Role binding for the first team (`team-b`), allowing `web`\n# to consume secrets from it.\n#\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: RoleBinding\nmetadata:\n  name: web-team-a\n  namespace: myprefix-team-a\n  labels:\n    app: web\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: read-secrets\nsubjects:\n- kind: ServiceAccount\n  name: web\n  namespace: concourse\n\n---\n# Role binding for the second team (`team-b`), allowing `web`\n# to consume secrets from it.\n#\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: RoleBinding\nmetadata:\n  name: web-team-b\n  namespace: myprefix-team-b\n  labels:\n    app: web\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: read-secrets\nsubjects:\n- kind: ServiceAccount\n  name: web\n  namespace: concourse\nTo finish the example, we need to associate the web Pod with the service, granting the pod access to those namespaces through the roles that have been bound to it.\n\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: web\n  labels:\n    app: web\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: web\n    spec:\n      serviceAccountName: web\n      containers:\n        - name: web\n          image: \"concourse/concourse:5.3.0\"\n          args: [ web ]\n          env:\n            - name: CONCOURSE_KUBERNETES_NAMESPACE_PREFIX\n              value: \"myprefix-\"\n          # ...\n","depth":5,"section_tag":"configuring-kubernetes-rbac"},"configuring-ldap-group-search":{"location":"ldap-auth.html#configuring-ldap-group-search","title":"Configuring LDAP group search","text":"The LDAP provider can also be configured with group search configuration, so that users can be configured for team authorization by their 'group' in LDAP.\n\nFor example, to find groups and identify them by their ou attribute, you would configure:\n\nCONCOURSE_LDAP_GROUP_SEARCH_BASE_DN='cn=groups,dc=example,dc=com'\nCONCOURSE_LDAP_GROUP_SEARCH_NAME_ATTR=ou\nThe attributes correlating a user to a group must be specified like so:\n\nCONCOURSE_LDAP_GROUP_SEARCH_USER_ATTR=uid\nCONCOURSE_LDAP_GROUP_SEARCH_GROUP_ATTR=members\nThis specifies that the uid attribute of the user must be present in the members attribute of the group.\n\nAn additional filter may be specified, just like with users:\n\nCONCOURSE_LDAP_GROUP_SEARCH_FILTER='(objectClass=posixGroup)'\n","depth":6,"section_tag":"configuring-ldap-group-search"},"configuring-main-team-authorization":{"location":"generic-saml-auth.html#configuring-main-team-authorization","title":"Configuring main Team Authorization","text":"SAML users and groups can be added to the The main team authorization config by setting the following env on the Running a web node:\n\nCONCOURSE_MAIN_TEAM_SAML_USER=my-user\nCONCOURSE_MAIN_TEAM_SAML_GROUP=my-group\nMultiple users and groups may be specified by comma-separating them.\n\n","depth":6,"section_tag":"configuring-main-team-authorization"},"configuring-metrics":{"location":"metrics.html#configuring-metrics","title":"Configuring Metrics","text":"The Running a web node can be configured to emit metrics on start.\n\nCurrently supported metrics emitters are InfluxDB, NewRelic, Prometheus, and Datadog. There is also a dummy emitter that will just spit the metrics out in to the logs at DEBUG level, which can be enabled with the --emit-to-logs flag.\n\nRegardless of your metrics emitter, you can set CONCOURSE_METRICS_BUFFER_SIZE to determine how many metrics emissions are sent at a time. Increasing this number can be helpful if sending metrics is regularly failing (due to rate limiting or network failures) or if latency is particularly high.\n\nThere are various flags for different emitters; run concourse web --help and look for \"Metric Emitter\" to see what's available.\n\n","depth":4,"section_tag":"configuring-metrics"},"configuring-peer-to-peer-volume-streaming":{"location":"concourse-worker.html#configuring-peer-to-peer-volume-streaming","title":"Configuring Peer-to-Peer Volume Streaming","text":"Peer-to-Peer (P2P) volume streaming enables the workers to stream volumes directly to each other instead of always streaming volumes through the web node(s). This can reduce the time it takes for individual steps in a job to start and reduce the amount of network traffic used by the Concourse cluster.\n\nNOTE: This feature is experimental. It is not as robust as the default volume streaming setup which always goes through web nodes.\n\nPre-Requisites\n\n* All worker nodes need to be able to reach each other via IP address. This usually means they are on the same LAN. You can test this by trying to ping one worker from another worker. If even one worker does not meet this requirement then you cannot use P2P volume streaming.\n\n* The baggageclaim port (7788 is the default) is open to traffic on all worker nodes. You can verify the port is open and reaching the baggageclaim API server by hitting the /volumes endpoint.\n\n  curl http://\u003cworker-IP-address\u003e:7788/volumes\n\nTo enable P2P volume streaming you need to configure some settings on the web and worker nodes. Configure the worker nodes first. Configure the web node(s) last.\n\n","depth":5,"section_tag":"configuring-peer-to-peer-volume-streaming"},"configuring-rbac":{"location":"user-roles.html#configuring-rbac","title":"Configuring RBAC","text":"Configuring RBAC is experimental, and this may change in the future.\n\nIt is possible to promote or demote the roles to which actions are assigned by passing the --config-rbac to the concourse web command with a path to a .yml file, like the following:\n\nconcourse web --config-rbac=/path/to/rbac/config.yml\nThis file should be a YAML map where the keys are role names (owner, member, pipeline-operator, and viewer are valid). For each role, the value should be a list of actions. On startup, Concourse will assign each role to its associated list of actions.\n\nFor example, in the default configuration only pipeline-operators and above can abort builds. To restrict aborting builds to only members and above, you could pass this as a --config-rbac file:\n\nmember:\n- AbortBuild\nOn the other hand, only members and above can order pipelines by default. To extend this privilege down to pipeline-operators, you can use a --config-rbac file like the following:\n\npipeline-operator:\n- OrderPipelines\nYou do not need to specify a role for every possible action; if an action does not appear in the file, then the default role (as described in the sections above) will be assigned to that action. Also, please avoid specifying the same action under multiple roles in this file - it can have unpredictable results.\n\n","depth":4,"section_tag":"configuring-rbac"},"configuring-runtimes":{"location":"concourse-worker.html#configuring-runtimes","title":"Configuring Runtimes","text":"The worker can be run with multiple container runtimes - containerd, Guardian, and Houdini (an experimental and the only runtime for Darwin and Windows). Only containerd and Guardian are meant for production use. Guardian is the default runtime for Concourse.\n\nNote about architecture: The web node (ATC) talks to all 3 runtimes via a single interface called the Garden server. While Guardian comes packaged with a Garden server and its flags in Concourse are unfortunately prefixed with --garden-*, Guardian (a runtime) and Garden (an interface and server) are two separate tools. An analogy for Garden would be the Container Runtime Interface (CRI) used in Kubernetes. Kubernetes uses containerd via CRI. Concourse uses containerd via Garden.\n\n","depth":5,"section_tag":"configuring-runtimes"},"configuring-the-secrets-engine":{"location":"vault-credential-manager.html#configuring-the-secrets-engine","title":"Configuring the secrets engine","text":"Concourse is currently limited to looking under a single path, meaning enabling only one secrets engine is supported: kv, or kv_v2. This may change in the future - we're still collecting ideas in RFC #21.\n\nUsing kv version 2 enables versioned secrets and the ability to restore previous versions or deleted secrets. Concourse will read the latest version of a secret at all times and if it is deleted it will appear as if the secret does not exist. More information regarding the Vault KV backend and the differences in versions can be found here.\n\nSo, let's configure the kv secrets engine and mount it at /concourse:\n\n$ vault secrets enable -version=1 -path=concourse kv\nTo enable kv_v2 and versioned secrets: $ vault secrets enable -version=2 -path=concourse kv\n\n\nNext, you'll want to create a policy to allow Concourse to read from this path.\n\npath \"concourse/*\" {\n  capabilities = [\"read\"]\n}\nSave this to concourse-policy.hcl, and then run:\n\nvault policy write concourse ./concourse-policy.hcl\nThis configuration will allow Concourse to read all credentials under /concourse. This should match your configured path prefix.\n\n","depth":5,"section_tag":"configuring-the-secrets-engine"},"configuring-tracing":{"location":"tracing.html#configuring-tracing","title":"Configuring Tracing","text":"To export spans to Jaeger, specify the Thrift HTTP endpoint of the Jaeger collector:\n\nCONCOURSE_TRACING_JAEGER_ENDPOINT=http://jaeger:14268/api/traces\nTo export spans to Google Cloud Trace, specify the GCP Project ID:\n\nCONCOURSE_TRACING_STACKDRIVER_PROJECTID=your-gcp-project-id\nNote that suitable GCP credentials must be available, via the usual GOOGLE_APPLICATION_CREDENTIALS environment variable, the default location that the gcloud CLI expects, or from GCP's metadata server (if Concourse is deployed on GCP).\n\nTo export spans the OpenTelemetry Collector via the OTLP Exporter, specify your collector access endpoint:\n\nCONCOURSE_TRACING_OTLP_ADDRESS=otel-collector.example.com:4317\nCONCOURSE_TRACING_OTLP_USE_TLS=false\nTo export spans to Lightstep via the OTLP Exporter, specify your collector access token and endpoint:\n\nCONCOURSE_TRACING_OTLP_ADDRESS=ingest.lightstep.com:443\nCONCOURSE_TRACING_OTLP_HEADERS=lightstep-access-token:mysupersecrettoken\nTo export spans to Elastic Observability via the OTLP Exporter, specify your Elastic APM secret token and endpoint:\n\nCONCOURSE_TRACING_OTLP_ADDRESS=elastic-apm-server.example.com:443\nCONCOURSE_TRACING_OTLP_HEADERS=Authorization=Bearer your-secret-token\nTo export spans to Honeycomb.io, specify the API key, dataset and optionally the service name:\n\nCONCOURSE_TRACING_HONEYCOMB_API_KEY=your-honeycomb-api-key\nCONCOURSE_TRACING_HONEYCOMB_DATASET=your-honeycomb-dataset\nCONCOURSE_TRACING_HONEYCOMB_SERVICE_NAME=service-name-for-concourse  # NOTE: Optional. Defaults to \"concourse\"\n","depth":4,"section_tag":"configuring-tracing"},"conjur-account":{"location":"conjur-credential-manager.html#conjur-account","title":"conjur-account","text":"The Conjur account.\n\nEnvironment variable CONCOURSE_CONJUR_ACCOUNT.\n\n","depth":5,"section_tag":"configuration"},"conjur-appliance-url":{"location":"conjur-credential-manager.html#conjur-appliance-url","title":"conjur-appliance-url","text":"URL of the Conjur instance.\n\nEnvironment variable CONCOURSE_CONJUR_APPLIANCE_URL.\n\n","depth":5,"section_tag":"configuration"},"conjur-authn-api-key":{"location":"conjur-credential-manager.html#conjur-authn-api-key","title":"conjur-authn-api-key","text":"The api key that corresponds to the Conjur host username.\n\nEnvironment variable CONCOURSE_CONJUR_AUTHN_API_KEY.\n\n","depth":5,"section_tag":"configuration"},"conjur-authn-login":{"location":"conjur-credential-manager.html#conjur-authn-login","title":"conjur-authn-login","text":"A valid Conjur host username.\n\nEnvironment variable CONCOURSE_CONJUR_AUTHN_LOGIN.\n\n","depth":5,"section_tag":"configuration"},"conjur-authn-token-file":{"location":"conjur-credential-manager.html#conjur-authn-token-file","title":"conjur-authn-token-file","text":"Token file used if Conjur instance is running in k8s or iam. \n\nEnvironment variable CONCOURSE_CONJUR_AUTHN_TOKEN_FILE.\n\n","depth":5,"section_tag":"configuration"},"conjur-cert-file":{"location":"conjur-credential-manager.html#conjur-cert-file","title":"conjur-cert-file","text":"Cert file used if conjur instance is using a self signed cert.\n\nEnvironment variable CONCOURSE_CONJUR_CERT_FILE.\n\n","depth":5,"section_tag":"configuration"},"conjur-credential-manager":{"location":"conjur-credential-manager.html","title":"The Conjur credential manager","text":"","depth":4,"section_tag":"conjur-credential-manager"},"conjur-permissions":{"location":"conjur-credential-manager.html#conjur-permissions","title":"Conjur Permissions","text":"The following is an example Conjur policy that can be used to grant permissions to a Conjur host. In this example host/concourse  will have permissions to read and update all of the secrets within  the TEAM_NAME and PIPELINE_NAME policies.\n\n- !host concourse\n- !policy\n  id: concourse\n  owner: !host concourse\n  body:\n  - !policy \n    id: TEAM_NAME\n    body:\n    - !variable team-secret-variable\n    - !policy\n      id: PIPELINE_NAME\n      body:\n      - !variable pipeline-secret-variable\nNote that the TEAM_NAME and PIPELINE_NAME text above should be replaced to fit your Concourse setup.\n\nFor more information on how to create and load Conjur policies, review the official documentation.\n\n","depth":5,"section_tag":"conjur-permissions"},"conjur-pipeline-secret-template":{"location":"conjur-credential-manager.html#conjur-pipeline-secret-template","title":"conjur-pipeline-secret-template","text":"The base path used when attempting to locate a pipeline-level secret.\n\nEnvironment variable CONCOURSE_CONJUR_PIPELINE_SECRET_TEMPLATE.\n\nExample:\n\nDefault: concourse/{{.Team}}/{{.Pipeline}}/{{.Secret}}\n\n","depth":5,"section_tag":"configuration"},"conjur-secret-template":{"location":"conjur-credential-manager.html#conjur-secret-template","title":"conjur-secret-template","text":"The base path used when attempting to locate a vault or safe level secret.\n\nEnvironment variable CONCOURSE_CONJUR_SECRET_TEMPLATE.\n\nExample:\n\nDefault: vaultName/{{.Secret}}\n\n","depth":5,"section_tag":"configuration"},"conjur-team-secret-template":{"location":"conjur-credential-manager.html#conjur-team-secret-template","title":"conjur-team-secret-template","text":"The base path used when attempting to locate a team-level secret.\n\nEnvironment variable CONCOURSE_CONJUR_TEAM_SECRET_TEMPLATE.\n\nExample:\n\nDefault: concourse/{{.Team}}/{{.Secret}}\n\n","depth":5,"section_tag":"configuration"},"container-image-guides":{"location":"container-image-guides.html","title":"Container Image Guides","text":"","depth":3,"section_tag":"container-image-guides"},"container-placement":{"location":"container-placement.html","title":"Container Placement","text":"Each step in a build is executed inside a container. The Running a web node distributes containers across the worker cluster depending on the configured strategy. If no workers satisfies the configured strategy, the step will block until a worker becomes available.\n\n","depth":3,"section_tag":"container-placement"},"containerd-runtime":{"location":"concourse-worker.html#containerd-runtime","title":"containerd runtime","text":"To use the containerd runtime manually set the --runtime (CONCOURSE_RUNTIME) to containerd on the concourse worker command.\n\nThe following is a list of the containerd runtime specific flags for Concourse that can be set. They are all optional and have default values.\n\nContainerd Configuration:\n  --containerd-config=                               Path to a config file to use for the Containerd daemon. [$CONCOURSE_CONTAINERD_CONFIG]\n  --containerd-bin=                                  Path to a containerd executable (non-absolute names get resolved from $PATH). [$CONCOURSE_CONTAINERD_BIN]\n  --containerd-init-bin=                             Path to an init executable (non-absolute names get resolved from $PATH). (default: /usr/local/concourse/bin/init) [$CONCOURSE_CONTAINERD_INIT_BIN]\n  --containerd-cni-plugins-dir=                      Path to CNI network plugins. (default: /usr/local/concourse/bin) [$CONCOURSE_CONTAINERD_CNI_PLUGINS_DIR]\n  --containerd-request-timeout=                      How long to wait for requests to Containerd to complete. 0 means no timeout. (default: 5m) [$CONCOURSE_CONTAINERD_REQUEST_TIMEOUT]\n  --containerd-max-containers=                       Max container capacity. 0 means no limit. (default: 250) [$CONCOURSE_CONTAINERD_MAX_CONTAINERS]\n  --containerd-privileged-mode=                      How many privileges privileged containers get. full is equivalent to root on host. ignore means no extra privileges. fuse-only means enough to use fuse-overlayfs. (default: full) [$CONCOURSE_CONTAINERD_PRIVILEGED_MODE]\n\nContainerd Container Networking:\n  --containerd-external-ip=                          IP address to use to reach container's mapped ports. Autodetected if not specified. [$CONCOURSE_CONTAINERD_EXTERNAL_IP]\n  --containerd-dns-server=                           DNS server IP address to use instead of automatically determined servers. Can be specified multiple times. [$CONCOURSE_CONTAINERD_DNS_SERVER]\n  --containerd-restricted-network=                   Network ranges to which traffic from containers will be restricted. Can be specified multiple times. [$CONCOURSE_CONTAINERD_RESTRICTED_NETWORK]\n  --containerd-additional-hosts=                     Additional entries to add to /etc/hosts in containers. [$CONCOURSE_CONTAINERD_ADDITIONAL_HOSTS]\n  --containerd-network-pool=                         Network range to use for dynamically allocated container subnets. (default: 10.80.0.0/16) [$CONCOURSE_CONTAINERD_NETWORK_POOL]\n  --containerd-mtu=                                  MTU size for container network interfaces. Defaults to the MTU of the interface used for outbound access by the host. [$CONCOURSE_CONTAINERD_MTU]\n  --containerd-allow-host-access                     Allow containers to reach the host's network. This is turned off by default. [$CONCOURSE_CONTAINERD_ALLOW_HOST_ACCESS]\n\nDNS Proxy Configuration:\n  --containerd-dns-proxy-enable                      Enable proxy DNS server. Note: this will enable containers to access the host network. [$CONCOURSE_CONTAINERD_DNS_PROXY_ENABLE]\nMake sure to read A note on allowing host access and DNS proxy to understand the implications of using --containerd-allow-host-access and --containerd-dns-proxy-enable\n\n","depth":6,"section_tag":"containerd-runtime"},"create-the-job":{"location":"building-and-pushing-an-image.html#create-the-job","title":"Create the Job","text":"Next we will create a job that will build and push our container image.\n\nTo build the job we will need to pull in the repo where the Dockerfile is.\n\nresources: ... # omitting resource section from above\n\njobs:\n- name: build-and-push\n  plan:\n  - get: concourse-examples\n","depth":5,"section_tag":"create-the-job"},"creating-a-pipeline":{"location":"tutorial-hello-world.html#creating-a-pipeline","title":"Creating a Pipeline","text":"Let's start where all tutorials start, with a Hello World! example!\n\nIn this section you're going to create a pipeline that simply prints Hello world! to the console. While building up the pipeline we will pause to explain the core pieces of the pipeline.\n\nLet's first answer: what is a pipeline made up from?\n\nThe simplest Concourse pipeline is made of two objects:\n\n* An unordered list of Jobs which contains...\n\n* An ordered list of Steps\n\n If you've used other pipeline building tools in the past, then what you think of as a pipeline is probably most similar to a job in Concourse.\n\nFor our Hello World! pipeline we will need one job with one step. This is the smallest pipeline you can make in Concourse. The single step is what will print Hello World! to the console.\n\nCreate and open a new file called hello-world.yml. Inside that file let's add the first top-level key, jobs.\n\njobs:\nThe jobs key is where we define the list of jobs that should make up our pipeline. The order of the jobs does not matter. The order of jobs does not define the structure of the pipeline. We'll get into pipeline structure and job ordering later when we talk about Resources and passed constraints.\n\n","depth":4,"section_tag":"creating-a-pipeline"},"creating-commits-and-tags":{"location":"basic-git-operations.html#creating-commits-and-tags","title":"Creating Commits and Tags","text":"Here's a simple way to create a commit using a bash script.\n\nresources:\n- name: repo-main\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/user/my-repo\n    branch: main\n\njobs:\n- name: create-a-commit\n  plan:\n  - get: repo-main\n  - task: commit-and-tag\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: gitea/gitea # use any image that has the git cli\n      inputs:\n      - name: repo-main\n      outputs:\n      # to pass the commit to the following steps specify\n      # the \"repo-main\" as an output as well\n      - name: repo-main\n      run:\n        path: sh\n        args:\n        - -cx\n        # this is just a bash script\n        - |\n          cd repo-main\n          # edit a file / make a change\n          date +%Y-%m-%d \u003e todays-date\n          git add ./todays-date\n          git commit -m \"Add todays date\"\n          git tag v0.1.6\n  # push commit and tag\n  - put: repo-main\n    params:\n      # specify the \"repo-main\" artifact as the location\n      repository: repo-main\n","depth":5,"section_tag":"creating-commits-and-tags"},"credential-lookup-rules":{"location":"conjur-credential-manager.html#credential-lookup-rules","title":"Credential Lookup Rules","text":"When resolving a parameter such as ((foo_param)), Concourse will look in the following paths, in order:\n\n* concourse/TEAM_NAME/PIPELINE_NAME/foo_param\n\n* concourse/TEAM_NAME/foo_param\n\n* vaultName/foo_param\n\nThe leading concourse can be changed by specifying --conjur-pipeline-secret-template or --conjur-team-secret-template variables.\n\nThe leading vaultName can be changed by specifying --conjur-secret-template variable.\n\n","depth":5,"section_tag":"credential-lookup-rules"},"credhub-credential-manager":{"location":"credhub-credential-manager.html","title":"The CredHub credential manager","text":"","depth":4,"section_tag":"credhub-credential-manager"},"creds":{"location":"creds.html","title":"Credential Management","text":"Going beyond Encryption, explicit credential management will provide credentials to your builds for a brief amount of time, without being persisted anywhere. It also allows for credentials to be rotated and managed external to the pipeline or team, and prevents them from being revealed by fly get-pipeline.\n\nCredential management works by replacing the credentials with ((vars)) in your pipeline or task config. When the Concourse is about to run the step or check that is configured with vars, it will resolve them by fetching the values from the credential manager. If the values are not present, the action will error.\n\nThe following configurations can be parameterized with a credential manager:\n\n* resource.source under pipeline.resources\n\n* resource_type.source under pipeline.resource_types\n\n* resource.webhook_token under pipeline.resources\n\n* task step params on a task step in a pipeline\n\n* Tasks in their entirety - whether from task step file or task step config in a pipeline, or a config executed with Running tasks with fly execute\n\nWhere these values are looked up and how the credential manager is configured depends on the backend. Consult the relevant section below for whichever backend you want to use.\n\n","depth":3,"section_tag":"creds"},"creds-caching":{"location":"creds-caching.html","title":"Caching credentials","text":"By default, credentials are fetched each time they're used. When many pipelines are configured this can result in a ton of requests to the credential server.\n\nTo reduce load on your credential server you may want to enable caching by setting the following env on the Running a web node:\n\nCONCOURSE_SECRET_CACHE_ENABLED=true\nEnabling secret caching will cache secrets from both credential managers and from var sources.\n\nBy default, credentials will be cached for one minute at a time. This value can be increased to further reduce load on the server like so:\n\nCONCOURSE_SECRET_CACHE_DURATION=5m # increase from 1m default\nCredential cache duration can also determined by the credential manager itself - for example, if Vault returns a lease duration for a credential, the shorter value between the configured cache duration and the credential's lease duration will be used.\n\nBy default, the absence of a credential is also cached for 10 seconds so that Concourse doesn't keep looking for a misconfigured credential. This duration can be configured like so:\n\nCONCOURSE_SECRET_CACHE_DURATION_NOTFOUND=1s # decrease from 10s default\n","depth":4,"section_tag":"creds-caching"},"creds-redacting":{"location":"creds-redacting.html","title":"Redacting credentials","text":"Concourse can be configured to automatically redact credentials from build output like so:\n\nCONCOURSE_ENABLE_REDACT_SECRETS=true\nThis behavior is off by default as there is likely a CPU performance overhead on the Running a web nodes involved with enabling it. It will be on by default once we've confirmed that it performs well enough at large scale.\n\nWhen enabled, Concourse will keep track of the credential values which were used in a build. When writing build logs to the database, it will replace any occurrence of these values with the text ((redacted)).\n\nSay you're running a task which runs the following script:\n\nset -e -u -x\n\necho $SECRET \u003e some-file\nsha1sum some-file\n(Note the set -x - the root cause of many accidental credential leaks.)\n\nLet's say you have a job which runs this task, providing the $SECRET parameter using a credential manager ((var)):\n\nplan:\n- task: use-secret\n  file: # ...\n  params: {SECRET: ((some-var))}\nWith hello in some-var, this will result in the following build output:\n\n+ echo ((redacted))\n+ sha1sum some-file\nf572d396fae9206628714fb2ce00f72e94f2258f  some-file\nGoing a step further, what happens when that var has multiple lines of output, like \"hello\\ngoodbye\"?\n\n+ echo ((redacted)) ((redacted))\n+ sha1sum some-file\n638e5ebcd06a5208906960aa5fbe1d4ebd022771  some-file\nWhat happened here? Well, because we didn't quote the $SECRET var arg to echo, it squashed the lines together into arguments. This could have confused our redacting logic and resulted in leaking the credential, but because Concourse redacts secret values line-by-line, we're still OK. This will also help with JSON marshalled credential values, which get interspersed with \\n in a string literal.\n\nAlthough Concourse tries to be thorough in its redacting of credentials, the best way to prevent credential leakage is to not accidentally print them in the first place. Think of this as an airbag, not a seatbelt!\n\n","depth":4,"section_tag":"creds-redacting"},"creds-retry-logic":{"location":"creds-retry-logic.html","title":"Retrying failed fetches","text":"When a request to the credential manager fails due to an intermittent error (e.g. a timeout or connection refused), Concourse will automatically try the request again up to 5 times before giving up. After all attempts fail, the error will be surfaced in the UI for the resource check or build step that initiated the request.\n\nThe retry logic can be configured by specifying the following env on the Running a web node:\n\nCONCOURSE_SECRET_RETRY_ATTEMPTS=5   # how many times to try\nCONCOURSE_SECRET_RETRY_INTERVAL=10s # how long to wait between attempts\nNote for Vault credential manager: as Vault API client already does retry which has covered the retry conditions of this general secret fetching retry, if a deployment uses Vault credential manager, CONCOURSE_SECRET_RETRY_ATTEMPTS can be set to 0 (or a small value, like 1 or 2) in order to avoid duplicate retries.\n\n","depth":4,"section_tag":"creds-retry-logic"},"current-caveats-with-rerunning":{"location":"builds.html#current-caveats-with-rerunning","title":"Current caveats with rerunning","text":"The current implementation of rerunning is an early iteration with one key limitation: a rerun build will use the current state of the job config, instead of running the exact build plan the original build ran with.\n\nThis means that if the job.plan has changed in a way that is backwards-incompatible, the rerun build may error. For example, if a new input is added, its version will not be available as the original build did not use it.\n\nThere are future plans to have reruns execute the exact build plan from the original build. If you are interested in tracking the progress for the second pass at rerunning builds - or contributing yourself! - the project epic is called Build Lifecycle View.\n\n","depth":4,"section_tag":"current-caveats-with-rerunning"},"darwin-and-windows-workers":{"location":"upgrading-concourse.html#darwin-and-windows-workers","title":"Darwin and Windows Workers","text":"There are no additional steps for upgrading Darwin and Windows workers.\n\n","depth":5,"section_tag":"darwin-and-windows-workers"},"dashboard":{"location":"observation.html#dashboard","title":"The Dashboard","text":"The dashboard, available at the default route (/), provides a bird's-eye view of the Concourse cluster. All visible pipelines across all teams are listed here. A high-density (HD) view is available at /hd.\n\n","depth":3,"section_tag":"dashboard"},"db-prerequisites":{"location":"postgresql-node.html#db-prerequisites","title":"Prerequisites","text":"PostgreSQL v11 or above is required, though the latest available version is recommended.\n\n","depth":4,"section_tag":"db-prerequisites"},"db-resource-utilization":{"location":"postgresql-node.html#db-resource-utilization","title":"Resource utilization","text":"CPU usage: this is one of the most volatile metrics, and one we try pretty hard to keep down. There will be near-constant database queries running, and while we try to keep them very simple, there is always more work to do. Expect to feed your database with at least a couple cores, ideally four to eight. Monitor this closely as the size of your deployment and the amount of traffic it's handling increases, and scale accordingly.\n\nMemory usage: similar to CPU usage, but not quite as volatile.\n\nDisk usage: pipeline configurations and various bookkeeping metadata for keeping track of jobs, builds, resources, containers, and volumes. In addition, all build logs are stored in the database. This is the primary source of disk usage. To mitigate this, log retention can be defined by pipeline authors by using job.build_log_retention. Concourse operators can also configure a default Build log retention policy that applies to all pipelines.\n\nBandwidth usage: well, it's a database, so it most definitely uses the network. Something important to consider here is the number of simultaneous connections that the database server itself will allow. Postgres exposes a max_connections configuration variable, and depending on how many web nodes you are running and the size of their connection pool, you may need to tune these two numbers against each other.\n\nHighly available: Up to you. Clustered PostgreSQL is kind of new and probably tricky to deploy, but there are various cloud solutions for this.\n\nOutbound traffic: None\n\nInbound traffic: Only ever from the web node\n\n","depth":4,"section_tag":"db-resource-utilization"},"db-running":{"location":"postgresql-node.html#db-running","title":"Running PostgreSQL","text":"How this node is managed is up to you; Concourse doesn't actually have much of an opinion on it, it just needs a database. By default Concourse will try connecting to a database named atc.\n\nHow to install PostgreSQL is really dependent on your platform. Please refer to your Linux distribution or operating system's documentation.\n\nFor the most part, the instruction on Linux should look something like this:\n\nsudo apt install postgresql\nsudo su postgres -c \"createuser $(whoami)\"\nsudo su postgres -c \"createdb --owner=$(whoami) atc\"\nThis will install PostgreSQL (assuming your distro uses apt), create a user, and create a database that the current UNIX user can access, assuming this same user is going to be running the Running a web node. This is a reasonable default for distros like Ubuntu and Debian which default PostgreSQL to peer auth.\n\n","depth":4,"section_tag":"db-running"},"defining-pipeline-resources":{"location":"building-and-pushing-an-image.html#defining-pipeline-resources","title":"Defining Pipeline Resources","text":"Now we can start building out our pipeline. Let's declare our Resources first. We will need one resource to pull in the repo where our Dockerfile is located, and a second resource pointing to where we want to push the built container image to.\n\nThere are some Variables in this file that we will fill out when setting the pipeline.\n\nresources:\n# The repo with our Dockerfile\n- name: concourse-examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n    branch: master\n\n# Where we will push the image to\n- name: simple-image\n  type: registry-image\n  icon: docker\n  source:\n    repository: ((image-repo-name))/simple-image\n    tag: latest\n    username: ((registry-username))\n    password: ((registry-password))\n","depth":5,"section_tag":"defining-pipeline-resources"},"defining-the-build-context":{"location":"building-and-pushing-an-image.html#defining-the-build-context","title":"Defining the Build Context","text":"Next we need to tell the oci-build-task what the build context of our Dockerfile is. The README goes over a few other methods of creating your build context. We are going to use the simplest use-case. By specifying CONTEXT the oci-build-task assumes a Dockerfile and its build context are in the same directory.\n\nresources: ... # omitting resource section from above\n\njobs:\n- name: build-and-push\n  plan:\n  - get: concourse-examples\n  - task: build-image\n    privileged: true # oci-build-task must run in a privileged container\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: concourse/oci-build-task\n      inputs:\n      - name: concourse-examples\n      outputs:\n      - name: image\n      params:\n        CONTEXT: concourse-examples/Dockerfiles/simple\n      run: # binary used to build the image\n        path: build\n","depth":5,"section_tag":"defining-the-build-context"},"disable-version":{"location":"resource-versions.html#disable-version","title":"Disabling a Version","text":"A resource version can also be disabled through the web UI on the resource version history page. These disabled versions will not be used to schedule any further builds for any jobs that use the resource as an input.\n\nDisabled versions can also be re-enabled through the resource version history page.\n\nDisabling a version is useful for cases where you know that the version is broken or incompatible.\n\n","depth":4,"section_tag":"disable-version"},"disabling-encryption":{"location":"encryption.html#disabling-encryption","title":"Disabling Encryption","text":"To opt out of encryption entirely (I'm sure you have your reasons), simply pass --old-encryption-key (or old_encryption_key) alone. With no new encryption key, the Running a web node will decrypt all existing data on start.\n\n","depth":4,"section_tag":"disabling-encryption"},"do":{"location":"do-step.html#do","title":"do step","text":"Performs the given steps serially, with the same semantics as if they were at the top level step listing. Most commonly used with try step, across-step, and step-hooks. \n\n","depth":3,"section_tag":"do-step"},"do-step":{"location":"do-step.html","title":"do step","text":"Performs the given steps serially, with the same semantics as if they were at the top level step listing. Most commonly used with try step, across-step, and step-hooks. \n\n","depth":3,"section_tag":"do-step"},"docker-compose-concourse":{"location":"quick-start.html#docker-compose-concourse","title":"Docker Compose Concourse","text":"Concourse is distributed as a single concourse binary, making it easy to run just about anywhere, especially with Docker.\n\nIf you'd like to get Concourse running somewhere quickly so you can start to kick the tires, the easiest way is to use our docker-compose.yml:\n\n$ curl -O https://concourse-ci.org/docker-compose.yml\n$ docker-compose up -d\nCreating docs_concourse-db_1 ...\nCreating docs_concourse-db_1 ... done\nCreating docs_concourse_1 ...\nCreating docs_concourse_1 ... done\nConcourse will be running at localhost:8080 on your machine. You can log in with the username/password as test/test.\n\nimages/tutorial/welcome-screen.png","depth":4,"section_tag":"docker-compose-concourse"},"docs":{"location":"docs.html","title":"Docs","text":"Concourse is a pipeline-based continuous thing-doer.\n\nThe term \"pipeline\" has become widespread in CI discussions, so being precise about what this means is important; Concourse's pipelines differ significantly from others.\n\nPipelines are built around Resources, which represent all external state, and Jobs, which interact with them. Concourse pipelines function as dependency flows, similar to distributed Makefiles. Pipelines are designed to be self-contained to minimize server-wide configuration. Maximizing portability also reduces risk, making it simpler for projects to recover from CI disruptions.\n\nResources like the git resource and s3 resource are used to express source code, dependencies, deployments, and other external states. This interface also models more abstract concepts like scheduled or interval triggers, via the time resource.\n\nResource Types are defined within the pipeline itself, making the pipelines more self-sufficient while keeping Concourse lean and versatile without needing a complex plugin system.\n\nJobs are sequences of get, put, and task steps to execute. These steps determine the job's inputs and outputs. Jobs are designed to be idempotent and loosely coupled, allowing the pipeline to evolve with project needs without requiring engineers to maintain too much context simultaneously.\n\nEverything in Concourse runs in a container. Instead of modifying workers to install build tools, Tasks define their own container image (typically using Docker images via the registry-image resource).\n\n...What?Concourse admittedly has a steeper learning curve initially, and depending on your background it might seem like a lot to grasp. A key goal of this project is for that curve to flatten out shortly after and lead to greater productivity and reduced stress over time.\n\nIf this all sounds confusing, that's OK - you may want to simply continue onward, start experimenting a bit, and use the above as a quick reference of the \"big picture\" as your understanding develops.\n\n","depth":1,"section_tag":"docs"},"downgrading":{"location":"concourse-web.html#downgrading","title":"Downgrading","text":"If you're stuck in a pinch and need to downgrade from one version of Concourse to another, you can use the concourse migrate command.\n\nFirst, grab the desired migration version by running the following:\n\n# make sure this is the *old* Concourse binary\n$ concourse migrate --supported-db-version\n1551110547\nThat number (yours will be different) is the expected migration version for that version of Concourse.\n\nNext, run the following with the new Concourse binary:\n\n$ concourse migrate --migrate-db-to-version=1551110547\nThis will need the same CONCOURSE_POSTGRES_* configuration described in Running concourse web.\n\nOnce this completes, switch all web nodes back to the older concourse binary and you should be good to go.\n\n","depth":5,"section_tag":"downgrading"},"dummy-var-source":{"location":"vars.html#dummy-var-source","title":"dummy var source","text":"","depth":4,"section_tag":"var-sources"},"dynamic-vars":{"location":"vars.html#dynamic-vars","title":"Dynamic vars","text":"Concourse can read values from \"var sources\" - typically credential managers like Vault - at runtime. This keeps them out of your configuration and prevents sensitive values from being stored in your database. Values will be read from the var source and optionally cached to reduce load on the var source.\n\nThe following attributes can be parameterized through a var source:\n\n* resource.source under pipeline.resources\n\n* resource_type.source under pipeline.resources\n\n* resource.webhook_token under pipeline.resources\n\n* task step params on a task step in a pipeline\n\n* tasks configuration in their entirety - whether from task step file or task step config in a pipeline, or a config executed with Running tasks with fly execute\n\nConcourse will fetch values for vars as late as possible - i.e. when a step using them is about to execute. This allows the credentials to have limited lifetime and rapid rotation policies.\n\n","depth":3,"section_tag":"dynamic-vars"},"dynamic-vars-across-step":{"location":"vars.html#dynamic-vars-across-step","title":"Across Step \u0026 Dynamic Vars","text":"For the across more fields can be dynamically interpolated during runtime:\n\n* set_pipeline step identifier and file field\n\n* task step identifier, input_mapping, and output_mapping, in addition to the all other fields mentioned above for the task step\n\n","depth":4,"section_tag":"dynamic-vars-across-step"},"ecosystem":{"location":"ecosystem.html","title":"Ecosystem","text":"Concourse is utilized by a diverse array of businesses, government agencies, open source projects and non-profit organizations. The applications of Concourse are as varied as its user community, including CI/CD for applications, continuous delivery of infrastructure, release integration, test automation, and numerous other use cases!\n\nIf you use Concourse, or your organization offers Concourse-related services, we'd appreciate hearing from you. Please submit a pull request adding your organization's name in alphabetical order to one of the lists below, and help us showcase how many people do things continuously with Concourse.\n\n","depth":1,"section_tag":"ecosystem"},"enabling-encryption":{"location":"encryption.html#enabling-encryption","title":"Enabling Encryption","text":"To enable encryption, you'll just need to come up with a 16 or 32-byte random character sequence and configure it as --encryption-key flag to the web command. For BOSH, this is the encryption_key property.\n\nOn startup, the Running a web node will encrypt all existing plaintext data, and any new data being written will be encrypted before it's sent over the network to the database.\n\nThe initial bulk encryption shouldn't take too long, but it will scale linearly with the amount of data that you have, and if another ATC is running it'll suddenly not be able to read the data until it's also given the key. So, expect some downtime.\n\n","depth":4,"section_tag":"enabling-encryption"},"encryption":{"location":"encryption.html","title":"Encryption","text":"Automating everything means authorizing something to automate many things. This makes CI systems a high-risk target for security leaks.\n\nConcourse pipelines are loaded with credentials: resources are configured with private keys, tasks are given credentials to servers they integrate via credential manager variables, task step vars, or task step params, etc. If someone gets their hands on your config, they have access to everything.\n\nTo mitigate this, Concourse supports encrypting sensitive information before it reaches the database. This way the plaintext credentials only exist in memory for as long as they need to, and if someone gains access to your database, they can't so easily gain the keys to the kingdom.\n\nWe strongly encourage anyone running Concourse to configure encryption. Going further, it's best to have Concourse not store the credentials in the first place, in which case you may want to configure credential management as well.\n\n","depth":3,"section_tag":"encryption"},"ensure-hook":{"location":"ensure-hook.html","title":"ensure Step Hook","text":"A hook step to execute after the parent step regardless of whether the parent step succeeds, fails, or errors. The step will also be executed if the build was aborted and its parent step was interrupted.\n\nIf the parent step succeeds and the ensured step fails, the overall step fails.\n\n","depth":4,"section_tag":"ensure-hook"},"example-jwt":{"location":"idtoken-credential-manager.html#example-jwt","title":"Example JWT","text":"The generated tokens usually look something like this: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItY29uY291cnNlLmV4YW1wbGUuY29tIiwiZXhwIjoxNzUxMDE1NzM0LCJhdWQiOlsiYXBpOi8vQXp1cmVBRFRva2VuRXhjaGFuZ2UiXSwic3ViIjoibWFpbi9leGFtcGxlLXBpcGVsaW5lIiwidGVhbSI6Im1haW4iLCJwaXBlbGluZSI6ImV4YW1wbGUtcGlwZWxpbmUiLCJqb2IiOiJleGFtcGxlLWpvYiJ9.my7l44tH0wfz8vc6z3fMmzTMxZ8_orhjcsOti3BKSNo\n\n\n\nAnd after decoding, looks like this: {\n  \"aud\": \"sts.amazonaws.com\",\n  \"exp\": 1751282764,\n  \"iat\": 1751279164,\n  \"iss\": \"https://your-concourse-server.com\",\n  \"job\": \"print-creds\",\n  \"pipeline\": \"mypipeline\",\n  \"sub\": \"main/mypipeline\",\n  \"team\": \"main\"\n}\n\n\nHere is a short explanation of the different claims:\n\n* iss: Who issued the token (always contains the external URL of your Concourse)\n\n* exp: When the token will expire\n\n* aud: Who the token is intended for. (In the above example it's for Azure's Identity Federation API)\n\n* team: The team of the pipeline this token was generated for\n\n* pipeline: The pipeline this token was generated for\n\n* job: The name of the job (inside the pipeline) this token was generated for\n\n* instance_vars: Any instance vars for the pipeline (if it is an instanced pipeline). Will be a comma-separated list of key-value pairs. E.g. hello:world,my-var:my-value\n\n* sub: A combination of team + pipeline + instance_vars + job. Which parts are used here is configurable, see Subject Scope.\n\n","depth":5,"section_tag":"example-jwt"},"examples":{"location":"examples.html","title":"Examples","text":"Setting up self-contained Concourse pipelines is an excellent way to experiment before exploring the more comprehensive documentation.\n\nEach example presents a pipeline YAML snippet which can be copied to a local file and deployed to your instance via fly set-pipeline. From there you can experiment and modify parts of the configuration to better understand how everything works. All configuration options are detailed in the Docs.\n\nFor a practical real-world example, examine Concourse's own pipeline (and its configuration):\n\n","depth":1,"section_tag":"examples"},"exploring-task-input-and-output-scenarios":{"location":"exploring-task-input-and-output-scenarios.html","title":"Exploring Task Input and Output Scenarios","text":"Understanding how task inputs and outputs work in Concourse can be a little confusing initially. This guide will walk you through a few example pipelines to show you how inputs and outputs work within a single Concourse job. By the end you should understand how inputs and outputs work within the context of a single job.\n\nTo run the pipelines in the following examples yourself you can get your own Concourse running locally by following the Quick Start guide. Then use fly set-pipeline to see the pipelines in action.\n\n","depth":4,"section_tag":"exploring-task-input-and-output-scenarios"},"exposing":{"location":"exposing.html","title":"Pipeline \u0026 Build Visibility","text":"Every newly configured pipeline is hidden to anyone but the pipeline's team. To make a pipeline publicly viewable, both by other teams and unauthenticated users, see fly expose-pipeline.\n\nEven with a pipeline exposed, all build logs are hidden by default. This is because CI jobs are prone to leaking credentials and other...unsavory information. After you've determined that a job's builds should be safe for public consumption, you can set public: true on the job in your pipeline.\n\n","depth":3,"section_tag":"exposing"},"fetching-a-repository":{"location":"basic-git-operations.html#fetching-a-repository","title":"Fetching a Repository","text":"Here is how you fetch the contents of a git repository and use it in a task.\n\nresources:\n- name: concourse-examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples\n\njobs:\n- name: read-the-readme\n  plan:\n  - get: concourse-examples\n  - task: cat-readme\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      inputs: # pass concourse-examples into this task step\n      - name: concourse-examples\n      run:\n        path: cat\n        args: [\"concourse-examples/README.md\"]\n","depth":5,"section_tag":"fetching-a-repository"},"fewer-resource-checks-to-perform":{"location":"global-resources.html#fewer-resource-checks-to-perform","title":"Fewer resource checks to perform","text":"With global resources, all resources that have the same configuration will share the same version history and share only one checking interval. This reduces load on the worker and on the external services that the resources point to.\n\nFor example, prior to global resources if there were three resources with the same configuration between three team's pipelines it would result in three check containers performing three resource checks every minute to fetch the versions.\n\nWith global resources, this configuration will result in only one check container and one resource check every minute to fetch versions for all the resources.\n\nSince there will be only one resource check for all resources that have the same configuration, the resource that has the shortest resource.check_every configured will result in its pipeline running the checks for that resource configuration.\n\n","depth":5,"section_tag":"fewer-resource-checks-to-perform"},"fewest-build-containers-strategy":{"location":"container-placement.html#fewest-build-containers-strategy","title":"The fewest-build-containers strategy","text":"When using the fewest-build-containers strategy, step containers (get, put, task) are placed on the worker that has the fewest build containers (i.e. containers for other steps of other builds).\n\nContainers used for resource checks are not counted because they are long-living containers that get re-used for multiple checks, and therefore consume very little resources on the worker.\n\nTo use this strategy, set the following env var on the Running a web node:\n\nCONCOURSE_CONTAINER_PLACEMENT_STRATEGY=fewest-build-containers\n","depth":4,"section_tag":"fewest-build-containers-strategy"},"fill-in-the-task-config":{"location":"tutorial-hello-world.html#fill-in-the-task-config","title":"Fill in the Task Config","text":"Let's answer the previous three questions for our hello-world-task:\n\n* What type of worker to run the task on (linux/windows/darwin)\n\n  Linux, because our docker-composed Concourse only has one linux worker. You can verify this by running fly -t tutorial workers\n\n* What container image to use (Linux only)\n\n  We'll use the super small busybox image\n\n* What command to run inside the container\n\n  echo \"Hello world!\"\n\nYou can view the task documentation to see all configurable options for tasks. For now, you can add the following task config to the step.\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\n      # Tells Concourse which type of worker this task should run on\n      platform: linux\n      # This is one way of telling Concourse which container image to use for a\n      # task. We'll explain this more when talking about resources\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox # images are pulled from docker hub by default\n      # The command Concourse will run inside the container\n      # echo \"Hello world!\"\n      run:\n        path: echo\n        args: [\"Hello world!\"]\n","depth":4,"section_tag":"fill-in-the-task-config"},"fly":{"location":"fly.html","title":"The fly CLI","text":"The first step to getting started with Concourse is to install the fly CLI tool. You can download fly from any Concourse installation by clicking the download link in the bottom-right corner of the web UI.\n\nThroughout the Concourse documentation we'll stick to the long-form name of every command and flag. Once you've learned what the commands do, you may want to consult fly -h to learn the short forms.\n\n","depth":2,"section_tag":"fly"},"fly-abort-build":{"location":"builds.html#fly-abort-build","title":"fly abort-build","text":"To abort a build of a job, run:\n\n$ fly -t example abort-build --job my-pipeline/my-job --build 3\nThis will cancel build 3 of the my-job job in the my-pipeline pipeline.\n\n","depth":3,"section_tag":"fly-abort-build"},"fly-active-users":{"location":"managing-teams.html#fly-active-users","title":"fly active-users","text":"To list all users that have logged into your instance in the last two months, run:\n\n$ fly -t example active-users\nThe output will include the username, connector (which method they used to authenticate) and the date of their last login.\n\nYou can list users whose last login was within a different range by using:\n\n$ fly -t example active-users --since yyyy-MM-dd\nThis can be helpful to get a sense of how active your cluster is. \n\n","depth":4,"section_tag":"fly-active-users"},"fly-archive-pipeline":{"location":"managing-pipelines.html#fly-archive-pipeline","title":"fly archive-pipeline","text":"A pipeline can be archived via fly. This means that the pipeline will be paused and hidden from the web UI. The pipeline config will be deleted (so any secrets or interpolated Vars will be removed) while the build logs will be retained.\n\n$ fly -t example archive-pipeline -p pipeline-1\nTo unarchive a pipeline, simply set the pipeline again with the same name using fly set-pipeline. If a job in the new pipeline has the same name as a job in the archived pipeline, the old build logs for that job will be restored.\n\nNote that because the config is deleted, fly get-pipeline will no longer work for archived pipelines.\n\n","depth":4,"section_tag":"fly-archive-pipeline"},"fly-builds":{"location":"builds.html#fly-builds","title":"fly builds","text":"To list the most recent builds, run:\n\n$ fly -t example builds\nTo list the builds of a job, run:\n\n$ fly -t example builds -j pipeline-name/job-name\nThis can be useful for periodically monitoring the state of a job. The output also works well with tools like awk and grep.\n\nBy default the most recent 50 builds are shown. To see more builds, use the -c flag, like so:\n\n$ fly -t example builds -c 100\nTo see builds within a certain time range, you can use --since and --until. You can use one or both flags to filter builds. The flags accept a time format of yyyy-mm-dd HH:mm:ss.\n\n$ fly -t example builds --since '2006-02-06 00:00:00'\n","depth":3,"section_tag":"fly-builds"},"fly-check-resource":{"location":"managing-resources.html#fly-check-resource","title":"fly check-resource","text":"To force immediate checking for new versions of a resource, rather than waiting for the periodic checking, run:\n\n$ fly -t example check-resource --resource my-pipeline/my-resource\nTo check from a particular version, including the given version, append the --from flag like so:\n\n$ fly -t example check-resource --resource my-pipeline/my-resource \\\n    --from ref:abcdef\nThis can be useful for collecting versions that are older than the current ones, given that a newly configured resource will only start from the latest version.\n\nNote the ref: prefix is resource-dependent. For example, the bosh-io-release resource might use version:11.2 in place of ref:abcdef.\n\n","depth":4,"section_tag":"fly-check-resource"},"fly-check-resource-type":{"location":"managing-resource-types.html#fly-check-resource-type","title":"fly check-resource-type","text":"To force immediate checking for new versions of a resource type, rather than waiting for the periodic checking, run:\n\n$ fly -t example check-resource-type --resource-type my-pipeline/my-resource-type\nThis can be useful for forcing an update if you're iterating on your own resource type implementation.\n\n","depth":4,"section_tag":"fly-check-resource-type"},"fly-clear-resource-cache":{"location":"managing-resources.html#fly-clear-resource-cache","title":"fly clear-resource-cache","text":"If you've got a resource cache that you need to clear out for whatever reason, this can be done like so:\n\n$ fly -t example clear-resource-cache -r my-pipeline/my-resource\nThis will immediately invalidate all the caches related to that resource - they'll be garbage collected asynchronously and subsequent builds will run with empty caches.\n\nYou can also clear out a particular version for the given resource cache, using -v:\n\n$ fly -t example clear-resource-cache \\\n    -r my-pipeline/my-resource \\\n    -v ref:abcdef\nIf -v is not specified, all caches for the given resource will be cleared.\n\n","depth":4,"section_tag":"fly-clear-resource-cache"},"fly-clear-task-cache":{"location":"jobs.html#fly-clear-task-cache","title":"fly clear-task-cache","text":"If you've got a task cache that you need to clear out for whatever reason, this can be done like so:\n\n$ fly -t example clear-task-cache --job my-pipeline/my-job --step my-step-name\nThis will immediately invalidate the caches - they'll be garbage collected asynchronously and subsequent builds will run with empty caches.\n\nYou can also clear out a particular path for the given step's cache, using --cache-path:\n\n$ fly -t example clear-task-cache \\\n    --job my-pipeline/my-job \\\n    --step my-step-name \\\n    --cache-path go/pkg\nIf --cache-path is not specified, all caches for the given step will be cleared.\n\n","depth":4,"section_tag":"fly-clear-task-cache"},"fly-cli":{"location":"fly.html","title":"The fly CLI","text":"The first step to getting started with Concourse is to install the fly CLI tool. You can download fly from any Concourse installation by clicking the download link in the bottom-right corner of the web UI.\n\nThroughout the Concourse documentation we'll stick to the long-form name of every command and flag. Once you've learned what the commands do, you may want to consult fly -h to learn the short forms.\n\n","depth":2,"section_tag":"fly"},"fly-completion":{"location":"fly.html#fly-completion","title":"fly completion","text":"Fly can output autocomplete configuration for some shells. For example, you can add an entry to your .bashrc like this:\n\nsource \u003c(fly completion --shell bash)\nor, using the /etc/bash_completion.d directory:\n\n$ fly completion --shell bash \u003e /etc/bash_completion.d/fly\nNote that, unlike other fly commands, this command does not interact with a remote server so you do not need to provide the -t or --target flag.\n\n","depth":3,"section_tag":"fly-completion"},"fly-containers":{"location":"administration.html#fly-containers","title":"fly containers","text":"To list the active containers across all your workers, run:\n\n$ fly -t example containers\nThis can be useful when discovering the containers available for fly intercepting.\n\n","depth":4,"section_tag":"fly-containers"},"fly-curl":{"location":"administration.html#fly-curl","title":"fly curl","text":"To execute an arbirary API request, you can run something like the following:\n\n$ fly -t example curl /api/v1/info\nThis command is just a shim that runs curl under the hood. To pass flags to curl, pass a -- argument after the path so that fly can distinguish them from its own flags:\n\n$ fly -t example curl /api/v1/builds -- \\\n    -X PUT \\\n    -H \"Content-type: application/json\" \\\n    -d @plan.json\nNote: if you use this command the assumption is that you know what you're doing. If you find yourself using this command often, let us know - perhaps there's a missing command!\n\n","depth":4,"section_tag":"fly-curl"},"fly-delete-target":{"location":"fly.html#fly-delete-target","title":"fly delete-target","text":"When logging out just isn't enough, a target can be completely removed from ~/.flyrc by running:\n\n$ fly -t example delete-target\nTo delete all targets, run:\n\n$ fly delete-target -a\nNote: These two variations are mutually exclusive. If the target parameter -t and all parameter -a are both specified, an error will occur.\n\n","depth":3,"section_tag":"fly-delete-target"},"fly-destroy-pipeline":{"location":"managing-pipelines.html#fly-destroy-pipeline","title":"fly destroy-pipeline","text":"Every now and then you just don't want a pipeline to be around anymore. Running fly destroy-pipeline will stop the pipeline activity and remove all data collected by the pipeline, including build history and collected versions.\n\nFor example, to destroy the my-pipeline pipeline, you would run:\n\n$ fly -t example destroy-pipeline --pipeline my-pipeline\n","depth":4,"section_tag":"fly-destroy-pipeline"},"fly-destroy-team":{"location":"managing-teams.html#fly-destroy-team","title":"fly destroy-team","text":"To remove a team, including all of its pipelines and one-off builds, first log in as the The main team, and then run:\n\n$ fly -t example destroy-team --team-name my-team\nCurrently, if there were any workers assigned specifically to this team, they'll be orphaned, without having their containers or volumes cleaned up.\n\n","depth":4,"section_tag":"fly-destroy-team"},"fly-disable-resource-version":{"location":"managing-resources.html#fly-disable-resource-version","title":"fly disable-resource-version","text":"To disable a specific version of a resource, run:\n\n$ fly -t example disable-resource-version --resource my-pipeline/my-resource \\\n    --version ref:bceaf\nNote that the version needs to be provided as a key-value pair. For the git resource the ref: prefix is used while the registry  resource might use digest as a prefix like digest:sha256:94be7d7b.\n\nThis command is idempotent. Disabling an already disabled resource version will do nothing.\n\nYou can also disable a resource version via the UI by clicking on the check mark button next to the desired version on the resource page.\n\n","depth":4,"section_tag":"fly-disable-resource-version"},"fly-edit-target":{"location":"fly.html#fly-edit-target","title":"fly edit-target","text":"To modify a target's name, team, or URL, run:\n\n$ fly -t example edit-target \\\n    --target-name new-name \\\n    --concourse-url https://ci.example.com \\\n    --team-name my-team\nEach flag is optional - only the specified flags will be changed.\n\n","depth":3,"section_tag":"fly-edit-target"},"fly-enable-resource-version":{"location":"managing-resources.html#fly-enable-resource-version","title":"fly enable-resource-version","text":"To enable a specific version of a resource, run:\n\n$ fly -t example enable-resource-version --resource my-pipeline/my-resource \\\n    --version ref:bceaf\nNote that the version needs to be provided as a key-value pair. For the git resource the ref: prefix is used while the registry  resource might use digest as a prefix like digest:sha256:94be7d7b.\n\nThis command is idempotent. Enabling an already enabled resource version will do nothing.\n\nYou can also enable a resource version via the UI by clicking on the check mark button next to the desired version on the resource page.\n\n","depth":4,"section_tag":"fly-enable-resource-version"},"fly-execute":{"location":"tasks.html#running-tasks","title":"Running tasks with fly execute","text":"One of the most common use cases of fly is taking a local project on your computer and setting it up with a task configuration to be run inside a container in Concourse. This is useful to build Linux projects on OS X or to avoid all of those debugging commits when something is configured differently between your local and remote setup.\n\nYou can execute a task like this:\n\n$ fly -t example execute --config tests.yml\nYour files will be uploaded and the task will be executed with them. The working directory name will be used as the input name. If they do not match, you must specify -i name=. instead, where name is the input name from the task configuration.\n\nFly will automatically capture SIGINT and SIGTERM and abort the build when received. This allows it to be transparently composed with other toolchains.\n\nBy default, Running tasks with fly execute will not send extra files or large files in your current directory that would normally be ignored by your version control system. You can use the --include-ignored flag in order to send ignored files to Concourse along with those that are not ignored.\n\nIf your task needs to run as root, then you can specify the -p or --privileged flag.\n\nTasks in Concourse can take multiple inputs. Up until now we've just been submitting a single input (our current working directory) that has the same name as the directory.\n\nTasks must specify the inputs that they require as task-config.inputs. For fly to upload these inputs you can use the -i or --input arguments with name and path pairs. For example:\n\n$ fly -t example execute \\\n    --config build-stemcell.yml \\\n    --input code=. \\\n    --input stemcells=../stemcells\nThis would work together with a build-stemcell.yml if its inputs: section was as follows:\n\ninputs:\n- name: code\n- name: stemcells\nIf you specify an input, then the default input will no longer be added automatically, and you will need to explicitly list it (as with the code input above).\n\nThis feature can be used to mimic other resources and try out input combinations that would normally not be possible in a pipeline.\n\nIf the --inputs-from flag is given, the specified job will be looked up in the pipeline, and the one-off build will base its inputs on those currently configured for the job.\n\nIf any --input flags are given (see above), they will override the base set of inputs.\n\nFor example:\n\n$ fly -t example execute \\\n    --config task.yml \\\n    --inputs-from main/integration \\\n    --input foo=./foo\nThis will trigger a one-off-build using the task.yml task config, basing its inputs on the latest candidates for the integration job in the main pipeline, with the foo input overridden to specify local code to run.\n\nThis can be used to more closely replicate the state in CI when weeding out flakiness, or as a shortcut for local development so that you don't have to upload every single resource from your local machine.\n\nWhen using --inputs-from as above, you can additionally specify which input to use as the task's image by passing --image input-name.\n\nFor example, the following pipeline fetches an image via a get step and uses it for task step image:\n\nresources:\n- name: my-repo\n  type: git\n  source: {uri: https://example.com}\n\n- name: some-image\n  type: registry-image\n  source: {repository: ubuntu}\n\njobs:\n- name: integration\n  plan:\n  - get: my-repo\n  - get: some-image\n  - task: my-task\n    file: my-repo/task.yml\n    image: some-image\n...so to run the same task with the same image in a one-off build, you would run:\n\n$ fly -t example execute \\\n    --config task.yml \\\n    --inputs-from main/integration \\\n    --image some-image\nIf a task specifies outputs, then you're able to extract these back out of the build and back to your local system. For example:\n\n$ fly -t example execute \\\n    --config build-stemcell.yml \\\n    --input code=. \\\n    --output stemcell=/tmp/stemcell\nThis would work together with a build-stemcell.yml, if its outputs: section was as follows:\n\noutputs:\n- name: stemcell\nThis feature is useful to farm work out to your Concourse server to build things in a repeatable manner.\n\nAny params listed in the task configuration can be specified by using environment variables.\n\nSo, if you have a task with the following params:\n\nparams:\n  FOO: fizzbuzz\n  BAR:\n...and you run:\n\nBAR=hello fly execute\nThe task would then run with BAR as \"hello\", and FOO as \"fizzbuzz\" (its default value).\n\nTask config files can contain Vars which can can be set during fly execute by using the -v, -y and -l flags:\n\nfly -t example execute --config tests.yml \\\n  -l vars.yml \\\n  -v some_string=\"Hello World!\" \\\n  -y some_bool=true\nAny variables not satisfied via the above flags will be deferred to the configured credential manager.\n\nTo satisfy these vars when running the task in a pipeline, see task step vars.\n\nIf you want to execute a task on a worker that has a specific tag, you can do so by passing --tag:\n\nfly -t example execute --config task.yml --tag bar\nThis will execute the task specified by task.yml on a worker that has been tagged bar.\n\n","depth":3,"section_tag":"running-tasks"},"fly-expose-pipeline":{"location":"managing-pipelines.html#fly-expose-pipeline","title":"fly expose-pipeline","text":"By default, newly configured pipelines are only visible to the pipeline's team. To make a pipeline viewable by other teams and unauthenticated users, run:\n\n$ fly -t example expose-pipeline --pipeline my-pipeline\nThis feature is useful if you're using Concourse for an open source project and you'd like your community to be able to see into your build pipeline.\n\nTo undo this change, see fly hide-pipeline.\n\nExposing a pipeline reveals basically everything except for build output and resource metadata.\n\nTo expose a resource's metadata, resource.public must be set to true.\n\nTo expose a job's build output, job.public must be set to true. This will also reveal resource metadata for any get step or put steps in the build output.\n\n","depth":4,"section_tag":"fly-expose-pipeline"},"fly-format-pipeline":{"location":"setting-pipelines.html#fly-format-pipeline","title":"fly format-pipeline","text":"To format a pipeline config in a \"canonical\" form (i.e. keys are in normal order, with name first for example), run:\n\n$ fly format-pipeline --config pipeline.yml\nThis will print the formatted pipeline config to stdout. To update the file in-place, pass --write/-w.\n\n","depth":4,"section_tag":"fly-format-pipeline"},"fly-get-pipeline":{"location":"managing-pipelines.html#fly-get-pipeline","title":"fly get-pipeline","text":"Fly can be used to fetch and update the configuration for your pipelines. This is achieved by using the fly get-pipeline and fly set-pipeline commands. For example, to fetch the current configuration of your my-pipeline Concourse pipeline and print it on STDOUT run the following:\n\n$ fly -t example get-pipeline --pipeline my-pipeline\nTo get JSON instead of YAML you can use the -j or --json argument. This can be useful when inspecting your config with jq.\n\n","depth":4,"section_tag":"fly-get-pipeline"},"fly-get-team":{"location":"managing-teams.html#fly-get-team","title":"fly get-team","text":"To show a team's configuration, run: $ fly -t example get-team -n some-team\n\n\n","depth":4,"section_tag":"fly-get-team"},"fly-hide-pipeline":{"location":"managing-pipelines.html#fly-hide-pipeline","title":"fly hide-pipeline","text":"If you realize that you've made a terrible mistake in exposing your pipeline, you can run:\n\n$ fly -t example hide-pipeline --pipeline my-pipeline\nIf you're panicking you can run the command's short form, hp, instead.\n\n","depth":4,"section_tag":"fly-hide-pipeline"},"fly-intercept":{"location":"builds.html#fly-intercept","title":"fly intercept","text":"Sometimes it's helpful to connect to the machine where tasks run. This way you can either profile or inspect tasks, or see the state of the machine at the end of a run. Due to Concourse running tasks in containers on remote machines this would typically be hard to access.\n\nTo this end, there is a fly intercept command that will give you an interactive shell inside the specified container. Containers are identified by a few things, so you may need to specify a few flags to hone down the results. If there are multiple containers that the flags could refer to, an interactive prompt will show up allowing you to disambiguate.\n\nFor example, running the following will run a task and then enter the finished task's container:\n\n$ fly -t example execute\n$ fly -t example intercept --step build\nWhen intercepting a task running on a Windows worker, you will need to specifically tell fly to to run powershell:\n\n$ fly -t example intercept powershell\nContainers are around for a short time after a build finishes in order to allow people to intercept them.\n\nYou can also intercept builds that were run in your pipeline. By using --job, --build, and --step you can intercept a specific step from a build of a job in your pipeline. These flags also have short forms, like so:\n\n$ fly -t example intercept -j some-pipeline/some-job -b some-build -s some-step\nNote that --build can be omitted, and will default to the most recent build of the job. One-off builds can be reached by passing in their build ID to --build which can be found on the build list page.\n\nThe --step flag can also be omitted; this will let you pick the step interactively, if you don't know the exact name.\n\nResource checking containers can also be intercepted with --check or -c:\n\n$ fly -t example intercept --check some-pipeline/some-resource\nA specific command can also be given, e.g. fly intercept ps auxf or fly intercept htop. This allows for patterns such as watch fly intercept ps auxf, which will continuously show the process tree of the current build's task, even as the \"current build\" changes.\n\nThe working directory and any relevant environment variables (e.g. those having come from task step params) used by the original process will also be used for the process run by intercept.\n\n","depth":3,"section_tag":"fly-intercept"},"fly-jobs":{"location":"jobs.html#fly-jobs","title":"fly jobs","text":"To list the jobs configured in a pipeline, run:\n\n$ fly -t example jobs -p my-pipeline\n","depth":4,"section_tag":"fly-jobs"},"fly-land-worker":{"location":"administration.html#fly-land-worker","title":"fly land-worker","text":"To initiate landing of a worker and eventually (after draining) cause it to exit, run:\n\n$ fly -t example land-worker --worker worker-name\n","depth":4,"section_tag":"fly-land-worker"},"fly-login":{"location":"fly.html#fly-login","title":"fly login","text":"The first thing you'll want to do is authenticate with your target. This is done with the fly login command. This is also useful to save targets under a more convenient alias, so you don't have to type out the URL all the time:\n\nThe login command serves double duty: it authenticates with a given endpoint, and saves it under a more convenient name. The name and token are stored in ~/.flyrc (though you shouldn't really edit the file manually).\n\nConcourse deployments can be occupied by multiple teams. To specify the team to which to log in, specify the --team-name or -n flag. If not specified, this defaults to the The main team.\n\nSo, to log in to a team my-team an endpoint served at https://ci.example.com and save it as the more convenient name example, you would run:\n\n$ fly --target example login --team-name my-team \\\n    --concourse-url https://ci.example.com\nThe login command will see which authentication methods are available for the specified team and prompt you to choose one. For basic auth, it will ask your username and password and use them to acquire a token. For OAuth, it will give you a link to click, and after you've gone through the OAuth flow it will print an OAuth token on the page that you can then copy and paste into the prompt.\n\nNote that if no authentication methods are configured, fly will acquire a token without any prompting. You can then use the alias like normal.\n\nIn any case, a token is saved in your ~/.flyrc, which will expire after one day.\n\nIf your Concourse uses SSL but does not have a certificate signed by a trusted CA, you can use the --ca-cert flag so that fly can trust the connection, like so:\n\n$ fly -t example login -c https://ci.example.com --ca-cert ./ca.crt\nThis will read the value out of the file ./ca.crt and save it into ~/.flyrc so you don't have to pass it on every login invocation.\n\nIf your Concourse instance is protected by a proxy server requiring client certificates, you can use --client-cert and --client-key to point to where your certificate is stored. These paths will be stored in .flyrc and the certificate will by attached to every request made to that target.\n\n$ fly -t example login -c https://ci-example.com \\\n    --client-cert ./client.pem \\\n    --client-key ./client.key\nAfter you've logged in you can use --target example (or -t example for short) to run a command against the saved target example. For example, fly -t example builds will list the last few builds on the example Concourse instance.\n\nThe -t flag is intentionally stateless and must be explicitly added to each command. This reduces the risk of accidentally running a command against the wrong environment when you have multiple targets defined.\n\n","depth":3,"section_tag":"fly-login"},"fly-logout":{"location":"fly.html#fly-logout","title":"fly logout","text":"To clear out your token for a given target, run:\n\n$ fly -t example logout\nTo clear out your token for all targets, run:\n\n$ fly logout -a\nNote: These two variations are mutually exclusive. If the target parameter -t and all parameter -a are both specified, an error will occur.\n\n","depth":3,"section_tag":"fly-logout"},"fly-order-instanced-pipelines":{"location":"instanced-pipelines.html#fly-order-instanced-pipelines","title":"fly order-instanced-pipelines","text":"To configure the ordering of instanced pipelines within an individual instance group, run:\n\n$ fly -t example order-instanced-pipelines \\\n    --group group \\\n    --pipeline key1:value1 \\\n    --pipeline key2:value2 \\\n    --pipeline key3:value3\nNote that this command only ensures that the given pipelines are in the given order. If there are other pipelines that you haven't included in the command, they may appear in-between, before, or after the given set.\n\nIf you want to reorder pipelines outside of an individual instance group, you should use the fly order-pipelines command.\n\n","depth":5,"section_tag":"fly-order-instanced-pipelines"},"fly-order-pipelines":{"location":"managing-pipelines.html#fly-order-pipelines","title":"fly order-pipelines","text":"To configure the ordering of pipelines, run:\n\n$ fly -t example order-pipelines \\\n    --pipeline pipeline-1 \\\n    --pipeline pipeline-2 \\\n    --pipeline pipeline-3\nNote that this command only ensures that the given pipelines are in the given order. If there are other pipelines that you haven't included in the command, they may appear in-between, before, or after the given set.\n\nIf you want to reorder instanced pipelines within an individual instance group, you should use the fly order-instanced-pipelines command.\n\n","depth":4,"section_tag":"fly-order-pipelines"},"fly-pause-job":{"location":"jobs.html#fly-pause-job","title":"fly pause-job","text":"To prevent scheduling and running builds of a job, run:\n\n$ fly -t example pause-job --job my-pipeline/my-job\nThis will prevent pending builds of the job from being scheduled, though builds that are in-flight will still run, and pending builds will still be created as normal.\n\n","depth":4,"section_tag":"fly-pause-job"},"fly-pause-pipeline":{"location":"managing-pipelines.html#fly-pause-pipeline","title":"fly pause-pipeline","text":"To pause a pipeline, run:\n\n$ fly -t example pause-pipeline --pipeline my-pipeline\nThis will prevent jobs from being scheduled and stop the periodic checking for new versions of resources. Builds that are in-flight will still finish.\n\n","depth":4,"section_tag":"fly-pause-pipeline"},"fly-pin-resource":{"location":"managing-resources.html#fly-pin-resource","title":"fly pin-resource","text":"To pin a resource to a specific version of that resource, run:\n\n$ fly -t example pin-resource --resource my-pipeline/my-resource \\\n    --version ref:bceaf\nNote that the version needs to be provided as a key-value pair. For the git resource the ref: prefix is used while the registry  resource might use digest as a prefix like digest:sha256:94be7d7b.\n\nA comment can be provided using the --comment flag, which is then also visible in the UI :\n\n$ fly -t example pin-resource --resource my-pipeline/my-resource \\\n    --version ref:abcdef \\\n    --comment \"Some reason\"\nThis can, for example, be used to pull in a fixed version of an external dependency which might break your build in a new release. After the problem has been resolved, the pin can be removed. Another example could be running a build with a set of older inputs when needed.\n\nTo remove the pin on a resource use:\n\n$ fly -t example unpin-resource --resource my-pipeline/my-resource\nYou can also pin a resource via the UI by clicking on the pin button next to the desired version on the resource page. A default comment is automatically generated containing your username and a timestamp. This comment can be edited.\n\n","depth":4,"section_tag":"fly-pin-resource"},"fly-pipelines":{"location":"managing-pipelines.html#fly-pipelines","title":"fly pipelines","text":"To list the currently-configured pipelines and their paused state, run:\n\n$ fly -t example pipelines\nBy default, archived pipelines are not included in the output of this command. To view archived pipelines, provide --include-archived flag.\n\n","depth":4,"section_tag":"fly-pipelines"},"fly-prune-worker":{"location":"administration.html#fly-prune-worker","title":"fly prune-worker","text":"To remove a stalled, landing, landed, or retiring worker, run:\n\n$ fly -t example prune-worker --worker worker-name\nTo prune all stalled workers, run:\n\n$ fly -t example prune-worker --all-stalled\nThis is for those cases where you know a worker is not coming back. Note that running workers cannot be pruned, since they'll just re-register themselves anyway.\n\n","depth":4,"section_tag":"fly-prune-worker"},"fly-rename-pipeline":{"location":"managing-pipelines.html#fly-rename-pipeline","title":"fly rename-pipeline","text":"To rename a pipeline, run:\n\n$ fly -t example rename-pipeline \\\n    --old-name my-pipeline \\\n    --new-name my-cool-pipeline\nAll job history is retained when renaming a pipeline.\n\n","depth":4,"section_tag":"fly-rename-pipeline"},"fly-rename-team":{"location":"managing-teams.html#fly-rename-team","title":"fly rename-team","text":"To rename a team, run:\n\n$ fly -t example rename-team --old-name my-team --new-name cool-team\nThis can only be run by the main team.\n\n","depth":4,"section_tag":"fly-rename-team"},"fly-rerun-build":{"location":"jobs.html#fly-rerun-build","title":"fly rerun-build","text":"To queue a new build of a job with exactly the same inputs as a given build of the same job, run:\n\n$ fly -t example rerun-build --job my-pipeline/my-job --build 4\nThis will enqueue a new build of the my-job job in the my-pipeline pipeline, using the same input versions as build number 4.\n\nTo start watching the newly created build, append the --watch flag like so:\n\n$ fly -t example rerun-build --job my-pipeline/my-job --build 4 --watch\nYou can also rerun builds by visiting the build page for the build in question in the web UI and clicking the rerun button.\n\n","depth":4,"section_tag":"fly-rerun-build"},"fly-set-pipeline":{"location":"setting-pipelines.html#fly-set-pipeline","title":"fly set-pipeline","text":"To submit a pipeline configuration to Concourse from a file on your local disk you can use the -c or --config flag, like so:\n\n$ fly -t example set-pipeline \\\n    --pipeline my-pipeline \\\n    --config pipeline.yml\nThis will present a diff of the changes and ask you to confirm the changes. If you accept then Concourse's pipeline configuration will switch to the pipeline definition in the YAML file specified.\n\nThe -c or --config flag can also take in the value - to indicate reading from stdin:\n\n$ cat pipeline.yml | fly -t example set-pipeline \\\n    --pipeline my-pipeline \\\n    --config -\nNote that reading from stdin disables the confirmation prompt - the pipeline will be set automatically.\n\n","depth":4,"section_tag":"fly-set-pipeline"},"fly-set-team":{"location":"managing-teams.html#fly-set-team","title":"fly set-team","text":"Once you've logged in as the main team with fly, you can run fly set-team to create or update other teams. Users with a owner role can also update their own configuration with the same command.\n\nFor example, to create a new team that authorizes the local foo user, you would run:\n\nfly -t example set-team --team-name my-team \\\n  --local-user foo\nNote that each time set-team is run, the team's authorization config is set as a whole - it is not a stateful operation.\n\nThere are many different ways to configure team auth; see Configuring Auth for more information.\n\nOnce the team has been created, you can use fly login to log in:\n\n$ fly -t example login -n my-team\nAny newly configured pipelines (via fly set-pipeline) and one-off builds (via Running tasks with fly execute) will be owned by the authorized team. Commands that list content will be scoped to the current team by default, such as fly pipelines and fly builds. The web UI will reflect the same state.\n\nNewly configured pipelines are hidden by default, meaning other teams and unauthorized visitors cannot view them. To make them publicly viewable, see Pipeline \u0026 Build Visibility.\n\n","depth":4,"section_tag":"fly-set-team"},"fly-status":{"location":"fly.html#fly-status","title":"fly status","text":"To check your current authentication status with a given target, run:\n\n$ fly -t example status\nThis will let you know if the token has expired.\n\n","depth":3,"section_tag":"fly-status"},"fly-sync":{"location":"fly.html#fly-sync","title":"fly sync","text":"Occasionally we add additional features to fly or make changes to the communication between it and Concourse's API server. To make sure you're running the latest and greatest version that works with the Concourse you are targeting we provide a command called sync that will update your local fly. It can be used like so:\n\n$ fly -t example sync\nThe fly command will also warn you if it notices that your CLI version is out of sync with the server.\n\n","depth":3,"section_tag":"fly-sync"},"fly-targets":{"location":"fly.html#fly-targets","title":"fly targets","text":"To see what targets are currently known to fly, run:\n\n$ fly targets\nThis will show each target's name, URL, and when its token expires.\n\n","depth":3,"section_tag":"fly-targets"},"fly-teams":{"location":"managing-teams.html#fly-teams","title":"fly teams","text":"To list all the teams, run:\n\n$ fly -t example teams\nThis can be useful if you've forgotten your team name.\n\nfly teams -d: With Details\n\nTo list all the teams with authentication details and members, run:\n\n$ fly -t example teams -d\nThis can be helpful when debugging OAuth, OIDC groups or listing all individual members.\n\n","depth":4,"section_tag":"fly-teams"},"fly-trigger-job":{"location":"jobs.html#fly-trigger-job","title":"fly trigger-job","text":"To immediately queue a new build of a job, run:\n\n$ fly -t example trigger-job --job my-pipeline/my-job\nThis will enqueue a new build of the my-job job in the my-pipeline pipeline.\n\nTo start watching the newly created build, append the --watch flag like so:\n\n$ fly -t example trigger-job --job my-pipeline/my-job --watch\nYou can also queue new builds by clicking the + button on the job or build pages in the web UI.\n\n","depth":4,"section_tag":"fly-trigger-job"},"fly-unpause-job":{"location":"jobs.html#fly-unpause-job","title":"fly unpause-job","text":"To resume scheduling of a job, run:\n\n$ fly -t example unpause-job --job my-pipeline/my-job\nThis will resume scheduling of builds queued for the job.\n\n","depth":4,"section_tag":"fly-unpause-job"},"fly-unpause-pipeline":{"location":"managing-pipelines.html#fly-unpause-pipeline","title":"fly unpause-pipeline","text":"To unpause a pipeline, run:\n\n$ fly -t example unpause-pipeline --pipeline my-pipeline\nThis will resume job scheduling and resource checking.\n\n","depth":4,"section_tag":"fly-unpause-pipeline"},"fly-userinfo":{"location":"fly.html#fly-userinfo","title":"fly userinfo","text":"To check what user you're logged in as, as well as which teams you are currently authenticated to and which roles within each team you have, run:\n\n$ fly -t example userinfo\n","depth":3,"section_tag":"fly-userinfo"},"fly-validate-pipeline":{"location":"setting-pipelines.html#fly-validate-pipeline","title":"fly validate-pipeline","text":"To validate a local pipeline configuration without submitting it to Concourse, run validate-pipeline:\n\n$ fly validate-pipeline --config pipeline.yml\nBy default, pipeline errors will cause validate-pipeline to fail, but warnings won't. To fail on both errors and warnings, pass the `--strict` flag.\n\n","depth":4,"section_tag":"fly-validate-pipeline"},"fly-volumes":{"location":"administration.html#fly-volumes","title":"fly volumes","text":"To list the active volumes across all your workers, run:\n\n$ fly -t example volumes\nThis can be useful to observe the caches warming across your cluster, and could be a good indicator of disk use.\n\n","depth":4,"section_tag":"fly-volumes"},"fly-watch":{"location":"builds.html#fly-watch","title":"fly watch","text":"Concourse emits streaming colored logs on the website, but it can be helpful to have the logs available to the command line (e.g. so that they can be processed by other commands).\n\nThe watch command can be used to do just this. You can also view builds that are running in your pipeline, or builds that have already finished.\n\nNote that unlike Running tasks with fly execute, killing fly watch via SIGINT or SIGTERM will not abort the build.\n\nTo watch the most recent one-off build, just run fly watch with no arguments. To watch a specific build (one-off or no), pass --build with the ID of the build to watch. This ID is available at the start of Running tasks with fly execute's output or by browsing to the builds list in the web UI.\n\nBy using the --job and --build flags you can pick out a specific build of a job to watch. For example, the following command will either show the archived logs for an old build, if it has finished running, or it will stream the current logs, if the build is still in progress.\n\n$ fly -t example watch --job my-pipeline/tests --build 52\nIf the --job flag is specified and --build is omitted, the most recent build of the specified job will be selected.\n\nIf there is a mismatch between the fly and web versions, it is possible to run into failed to parse next event: unknown event type error. The --ignore-event-parsing-errors flag can be passed to ignore such errors. \n\n","depth":3,"section_tag":"fly-watch"},"fly-workers":{"location":"administration.html#fly-workers","title":"fly workers","text":"To list the currently registered workers, including additional metadata, run:\n\n$ fly -t example workers\nThis can be useful for monitoring the status of your workers, if you suspect that one keeps dropping out of the pool or getting tasked with too many containers, etc.\n\n","depth":4,"section_tag":"fly-workers"},"further-readings":{"location":"building-and-pushing-an-image.html#further-readings","title":"Further Readings","text":"Understanding what the build context is is important when building container images. You can read Dockerfile Best Practices for more details about build contexts.\n\nThe inputs section of the oci-build-task's README has examples on how to create a build context with multiple inputs and other complex build scenarios.\n\nRead the README's in the oci-build-task and registry-image resource to learn more about their other configuration options.\n\n","depth":5,"section_tag":"further-readings"},"garbage-collection":{"location":"performance-tuning.html#garbage-collection","title":"Garbage Collection","text":"When jobs fail or error out in Concourse their resources are not immediately cleaned up. The container and storage space remain on a worker for some period of time before they get garbage collected. If you want to make the garbage collector more aggressive you can change the following settings on your web node:\n\n","depth":4,"section_tag":"garbage-collection"},"garbage-collector":{"location":"garbage-collector.html","title":"Garbage Collector","text":"Concourse runs everything in isolated environments by creating fresh containers and volumes to ensure things can safely run in a repeatable environment, isolated from other workloads running on the same worker.\n\nThis introduces a new problem of knowing when Concourse should remove these containers and volumes. Safely identifying things for removal and then getting rid of them, releasing their resources, is the process of garbage collection.\n\n","depth":4,"section_tag":"garbage-collector"},"gated-pipeline-patterns":{"location":"gated-pipeline-patterns.html","title":"Gated Pipeline Patterns","text":"Gated pipelines provide control for administrators and release managers on when a given software release is deployed to a tightly protected environment (e.g. production).\n\nThe execution of jobs that perform certain tasks (e.g. deployment) targeting the downstream environment beyond the \"gate\" step is done only upon either an approval coming from an external Change Control system or an explicit manual trigger of such step.\n\n","depth":4,"section_tag":"gated-pipeline-patterns"},"generating-keys":{"location":"concourse-generate-key.html","title":"Generating Keys","text":"","depth":3,"section_tag":"concourse-generate-key"},"generating-the-keys":{"location":"concourse-generate-key.html#generating-the-keys","title":"Generating the Keys","text":"Concourse's various components use RSA keys to verify tokens and worker registration requests.\n\nA minimal deployment will require the following keys:\n\nSession Signing Key: Used by the Running a web node for signing and verifying user session tokens.\n\n\nTSA Host Key: Used by the Running a web node for the SSH worker registration gateway server (\"TSA\").\n\nThe public key is given to each Running a worker node to verify the remote host when connecting via SSH.\n\n\nWorker Key: Each Running a worker node verifies its registration with the Running a web node via a SSH key.\n\nThe public key must be listed in the Running a web node's authorized worker keys file in order for the worker to register.\n\n\n\nTo generate these keys, run:\n\nconcourse generate-key -t rsa -f ./session_signing_key\nconcourse generate-key -t ssh -f ./tsa_host_key\nconcourse generate-key -t ssh -f ./worker_key\nor use ssh-keygen:\n\nssh-keygen -t rsa -b 4096 -m PEM -f ./session_signing_key\nssh-keygen -t rsa -b 4096 -m PEM -f ./tsa_host_key\nssh-keygen -t rsa -b 4096 -m PEM -f ./worker_key\nAt this point you should have the following files:\n\n* session_signing_key\n\n* tsa_host_key\n\n* tsa_host_key.pub\n\n* worker_key\n\n* worker_key.pub\n\nYou can remove the session_signing_key.pub file if you have one, it is not needed by any process in Concourse.\n\n","depth":4,"section_tag":"generating-the-keys"},"generic-oauth":{"location":"generic-oauth.html","title":"Generic oAuth","text":"A Concourse server can authenticate against any valid OAuth auth provider, though it's a bit \"closer to the metal\" as you'll need to explicitly configure the auth, token, and user-info URLs. You may want to see if you can use Generic OIDC auth if your auth provider is compatible with OIDC.\n\n","depth":4,"section_tag":"generic-oauth"},"generic-oauth-authentication":{"location":"generic-oauth.html#generic-oauth-authentication","title":"Authentication","text":"First you'll need to create a client with your oAuth provider.\n\nThe callback URL must be the URL of your Concourse server with /sky/issuer/callback appended. This address must be reachable by your oAuth provider - it can't be localhost.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nThe Generic oAuth provider has many values to set - for a full list consult concourse web --help.\n\nA typical Running a web node env config may look something like this:\n\nCONCOURSE_OAUTH_DISPLAY_NAME=Acme\nCONCOURSE_OAUTH_CLIENT_ID=myclientid\nCONCOURSE_OAUTH_CLIENT_SECRET=myclientsecret\nCONCOURSE_OAUTH_AUTH_URL=https://oauth.example.com/oauth2/auth\nCONCOURSE_OAUTH_TOKEN_URL=https://oauth.example.com/oauth2/token\nCONCOURSE_OAUTH_USERINFO_URL=https://oauth.example.com/oauth2/userinfo\nConsult concourse web --help for a full list of flags with descriptions.\n\n","depth":5,"section_tag":"generic-oauth-authentication"},"generic-oauth-authorization":{"location":"generic-oauth.html#generic-oauth-authorization","title":"Authorization","text":"OAuth users and groups can be authorized for a team by passing the following flags to fly set-team:\n\n--oauth-user=USERNAME: Authorize an individual user.\n\n\n--oauth-group=GROUP_NAME: Authorize anyone from the group.\n\nYou may only configure groups if the auth provider exposes this information in either the token itself, or in the contents of the userinfo endpoint.\n\nYou can configure which claim points to the groups information by specifying CONCOURSE_OAUTH_GROUPS_KEY on the Running a web node.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --oauth-user my-username \\\n    --oauth-group my-group\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  oauth:\n    users: [\"my-username\"]\n    groups: [\"my-group\"]\n","depth":5,"section_tag":"generic-oauth-authorization"},"generic-oidc-auth":{"location":"generic-oidc-auth.html","title":"Generic OIDC auth","text":"A Concourse server can authenticate against any valid OIDC auth provider. This provider is similar to Generic oAuth except it only requires an issuer URL rather than auth/token/userinfo URLs.\n\n","depth":4,"section_tag":"generic-oidc-auth"},"generic-oidc-authentication":{"location":"generic-oidc-auth.html#generic-oidc-authentication","title":"Authentication","text":"First you'll need to create a client with your oAuth provider.\n\nThe callback URL must be the URL of your Concourse server with /sky/issuer/callback appended. This address must be reachable by your OIDC provider - it can't be localhost.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nA typical Running a web node env config may look something like this:\n\nCONCOURSE_OIDC_DISPLAY_NAME=Acme\nCONCOURSE_OIDC_CLIENT_ID=myclientid\nCONCOURSE_OIDC_CLIENT_SECRET=myclientsecret\nCONCOURSE_OIDC_ISSUER=https://oidc.example.com\nConsult concourse web --help for a full list of flags with descriptions.\n\n","depth":5,"section_tag":"generic-oidc-authentication"},"generic-oidc-authorization":{"location":"generic-oidc-auth.html#generic-oidc-authorization","title":"Authorization","text":"When authorizing individual users, it's up to you to ensure that the preferred_username claim and/or the claim specified by CONCOURSE_OIDC_USER_NAME_KEY is unique. If they're not, then it's possible for users to impersonate each other\n\nOIDC users and groups can be authorized for a team by passing one or more of the following flags to fly set-team:\n\n--oidc-user=USERNAME: Authorize an individual user.\n\n\n--oidc-group=GROUP_NAME: Authorize anyone from the group.\n\nYou may only configure groups if the auth provider exposes this information in either the token itself, or in the contents of the userinfo endpoint.\n\nYou can configure which claim points to the groups information by specifying CONCOURSE_OIDC_GROUPS_KEY on the Running a web node.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --oidc-user my-username \\\n    --oidc-user another-username \\\n    --oidc-group my-group \\\n    --oidc-group my-other-group\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  oidc:\n    users: [\"my-username\", \"another-username\"]\n    groups: [\"my-group\", \"my-other-group\"]\nBoth users and groups are optional. You may opt to only provide privileges based on membership to a group and not to any user explicitly and vice versa.\n\n","depth":5,"section_tag":"generic-oidc-authorization"},"generic-saml-auth":{"location":"generic-saml-auth.html","title":"Generic SAML auth","text":"A Concourse server can authenticate against any valid SAML auth provider.\n\n","depth":4,"section_tag":"generic-saml-auth"},"generic-saml-authentication":{"location":"generic-saml-auth.html#generic-saml-authentication","title":"Authentication","text":"First you'll need to create an application with your SAML provider. Note that the terminology used for configuring an application may vary between SAML providers - this document uses Okta's terminology.\n\nSAML Assertion Consumer Service (ACS) URL must be the URL of your Concourse server with /sky/issuer/callback appended.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nAudience URI (SP Entity ID) must match CONCOURSE_SAML_ENTITY_ISSUER, which defaults to the URL of your Concourse server with /sky/issuer/callback appended.\n\nAttribute statements that you define in the SAML provider can be remapped in Concourse:\n\nCONCOURSE_SAML_USERNAME_ATTR=name   # default\nCONCOURSE_SAML_EMAIL_ATTR=email     # default\nCONCOURSE_SAML_GROUPS_ATTR=groups   # default\nFinally, the SAML provider will generate a SSO URL, a CA certificate, and an Identity Provider Issuer. These values correspond with CONCOURSE_SAML_SSO_URL, CONCOURSE_SAML_CA_CERT, and CONCOURSE_SAML_SSO_ISSUER respectively.\n\nA typical Running a web node env config may look something like this:\n\nCONCOURSE_SAML_DISPLAY_NAME=Okta\nCONCOURSE_SAML_SSO_URL=https://acme.okta.com/app/Y/Z/sso/saml\nCONCOURSE_SAML_CA_CERT=/path/to/ca_cert\nCONCOURSE_SAML_SSO_ISSUER=http://www.okta.com/X\nConsult concourse web --help for a full list of flags with descriptions.\n\n","depth":5,"section_tag":"generic-saml-authentication"},"generic-saml-authorization":{"location":"generic-saml-auth.html#generic-saml-authorization","title":"Authorization","text":"SAML users and groups can be authorized for a team by passing the following flags to fly set-team:\n\n--saml-user=USERNAME: Authorize an individual user.\n\n\n--saml-group=GROUP_NAME: Authorize anyone from the group.\n\nYou may only configure groups if the auth provider exposes this information in either the token itself, or in the contents of the userinfo endpoint.\n\nYou can configure which attribute points to the groups information by specifying CONCOURSE_SAML_GROUPS_ATTR on the Running a web node.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --saml-user my-username \\\n    --saml-group my-group\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  saml:\n    users: [\"my-username\"]\n    groups: [\"my-groups\"]\n","depth":5,"section_tag":"generic-saml-authorization"},"get":{"location":"get-step.html#get","title":"get step","text":"","depth":3,"section_tag":"get-step"},"get-images-for-tasks-instead-of-using-anonymous-image-resources":{"location":"common-pipeline-practices.html#get-images-for-tasks-instead-of-using-anonymous-image-resources","title":"Get Images for Tasks Instead of using Anonymous Image Resources","text":"It is easy to let Concourse fetch images for tasks right when they are needed by using the task-config.image_resource field in a task config. It's the easy out-of-the-box solution. Another way is to pass the image for a task as an input to the job by setting the task step image field. This also allows you to track the version of the image being used by the task and also avoid getting rate-limited by configuring the resource with credentials.\n\nBefore - Anonymous Image Fetching for Tasks\n\njobs:\n- name: job\n  plan:\n  - task: simple-task\n    config:\n      platform: linux\n      image_resource: # anonymous image resource\n        type: registry-image\n        source:\n          repository: busybox\n      run:\n        path: echo\n        args: [\"Hello world!\"]\nAfter - Passing Task Image as Job Inputs\n\nresources:\n- name: busybox\n  type: registry-image\n  source:\n    repository: busybox\n    username: ((docker.user))\n    password: ((docker.password))\n\njobs:\n- name: job\n  plan:\n  - get: busybox # pass image into job\n  - task: simple-task\n    image: busybox # use image for task. Overrides anonymous image\n    config:\n      platform: linux\n      run:\n        path: echo\n        args: [\"Hello world!\"]\n","depth":5,"section_tag":"get-images-for-tasks-instead-of-using-anonymous-image-resources"},"get-step":{"location":"get-step.html","title":"get step","text":"Fetches a version of a resource. Expand each section below for more details and examples.\n\n","depth":3,"section_tag":"get-step"},"get-steps":{"location":"tutorial-resources.html#get-steps","title":"Get Steps","text":"Let's add some automation to our hello-world.yml pipeline and have it trigger on every new commit from some git repo. We will use the git resource to accomplish this.\n\nBefore proceeding, please have a git repository ready that you can push code to. The rest of the tutorial will point to github.com/concourse/examples which you should replace with your own repository or your own fork of concourse/examples.\n\nTo start, let's go back to the one step version of the pipeline.\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      run:\n        path: echo\n        args: [\"Hello World!\"]\nNow let's add the git resource to the pipeline. First we'll add the resources key to the top-level of our yaml.\n\nresources:\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      run:\n        path: echo\n        args: [\"Hello World!\"]\nThe resources key takes a list of resources. In our case, we're going to add one item to that list. We will name the resource repo. This is the name we'll use to refer to this specific instance of the resource within our pipeline. We'll define the type as git, which we got from the output of fly -t tutorial workers --details.\n\nresources:\n- name: repo\n  type: git\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      run:\n        path: echo\n        args: [\"Hello World!\"]\nThere is one last field we need to fill out, the source field.\n\nThe source field contains the configuration for the resource. By convention, documentation for each resource's configuration is found in the README of its git repository. The source field will be different for every resource type, so you'll need to refer to that resource's documentation to determine how to fill out the source field.\n\nIf we look at the README for the git resource we'll find that it requires we set the uri field. This should point to the location of the git repository. We can specify it in https:// or ssh@ format.  Let's add the uri field and set it to your repository.\n\nIf you use the ssh@ format for the uri then you'll likely need to set the private_key field as well.\n\nIf you use the https:// format and your repo is public then you don't need to set anything else. If you repository is private then you'll need to set the username and password fields to allow the git resource to authenticate. private_key can also be used for https:// uri's.\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      run:\n        path: echo\n        args: [\"Hello World!\"]\nNext we need to connect the repo resource to the hello-world-job. We connect the two objects by adding a get step to the job.\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\njobs:\n- name: hello-world-job\n  plan:\n  # Add a get step referencing the resource\n  - get: repo\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      run:\n        path: echo\n        args: [\"Hello World!\"]\nThe final piece is telling Concourse to trigger the hello-world-job whenever the repo resource emits a new version. We can do that by setting trigger to true for the get step.\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\njobs:\n- name: hello-world-job\n  plan:\n  - get: repo\n    trigger: true   # tell Concourse to trigger this job when new versions are emitted\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      run:\n        path: echo\n        args: [\"Hello World!\"]\nLet's set our pipeline and watch it automatically trigger from the web UI.\n\n$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml\n{image: images/tutorial/hello-world-trigger-job.png}\n\nIf you click the resource you'll see a list of the versions that it has emitted so far. You can expand each version to see which build it was used in and some metadata if the resource fetched any. Metadata is only populated after a version is fetched by a get step.\n\nBy default, resources will only fetch the most recent version available. At this point you can make commits to your repo and watch Concourse find them and trigger the job. If you want to populate the version history with older versions you can use fly check-resource with the --from flag.\n\n","depth":4,"section_tag":"get-steps"},"get-steps-and-inputs":{"location":"tutorial-resources.html#get-steps-and-inputs","title":"Get Steps and Inputs","text":"Let's tie together two concepts that we've learned so far. Get steps and task inputs.\n\nIn the previous section we learned that task steps can specify outputs that other task steps can then consume as inputs. Get steps generate one output that can then be consumed by tasks as an input. Get steps always generate output artifacts based on their name.\n\nTo find out the structure of the artifact generated by a get step you will have to refer to the resource's documentation. The documentation for the git resource tells us that the in script will clone the git repository.\n\nLet's add repo as an input to the hello-world-task. Let's also update the command the task runs to instead print the contents of some file in the repo.\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\njobs:\n- name: hello-world-job\n  plan:\n  - get: repo\n    trigger: true\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      inputs: # add the get step as an input to this task\n      - name: repo\n      run: # read the file from the get step\n        path: cat\n        args: [\"repo/README.md\"]\nSet the pipeline and we'll manually trigger the job.\n\n$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml\n$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch\nstarted hello-world/hello-world-job #44\n\ninitializing\nselected worker: d032d4471e67\nrunning cat repo/README.md\n# examples\nExamples of Concourse workflows\nsucceeded\nThe job should finish successfully and print out the contents of repo/README.md or whichever file you selected from your repo.\n\n","depth":4,"section_tag":"get-steps-and-inputs"},"getting-started":{"location":"getting-started.html","title":"Getting Started","text":"This tutorial will guide you through the basics of creating Concourse pipelines. You will use a local instance of Concourse running on your machine to run pipelines.\n\nBefore getting started you should have the following installed:\n\n* Docker\n\n* Docker-compose\n\nThis tutorial assumes you understand what Linux containers are and how to work with them. If you know what a Dockerfile is and how to make your own then you're probably good to jump into this tutorial. If you're not familiar with Linux containers then you may want to get started with Docker first before diving into this tutorial.\n\nIt will also help if you know how to read YAML. We have a quick Intro to YAML if you're not familiar with the syntax.\n\nIf you have any feedback for this tutorial please share it in this GitHub discussion\n\n","depth":2,"section_tag":"getting-started"},"git-guides":{"location":"git-guides.html","title":"Git Guides","text":"","depth":3,"section_tag":"git-guides"},"git-trigger-example":{"location":"git-trigger-example.html","title":"git-triggered job example","text":"The git resource can be used to trigger a job.\n\n","depth":2,"section_tag":"git-trigger-example"},"github-auth":{"location":"github-auth.html","title":"GitHub auth","text":"A Concourse server can authenticate against GitHub to leverage their permission model and other security improvements in their infrastructure.\n\n","depth":4,"section_tag":"github-auth"},"github-authentication":{"location":"github-auth.html#github-authentication","title":"Authentication","text":"First, you'll need to create an OAuth application on GitHub.\n\nThe \"Authorization callback URL\" must be the URL of your Concourse server. This address must be reachable by GitHub - it can't be localhost.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nYou will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the Running a web node by setting the following env:\n\nCONCOURSE_GITHUB_CLIENT_ID=myclientid\nCONCOURSE_GITHUB_CLIENT_SECRET=myclientsecret\nNote that the client must be created under an organization if you want to authorize users based on organization/team membership. In addition, the GitHub application must have at least read access on the organization's members. If the client is created under a personal account, only individual users can be authorized.\n\nIf you're configuring GitHub Enterprise, you'll also need to set the following env:\n\nCONCOURSE_GITHUB_HOST=github.example.com\nCONCOURSE_GITHUB_CA_CERT=/path/to/ca_cert\nThe GitHub Enterprise host must not contain a scheme, or a trailing slash.\n\n","depth":5,"section_tag":"github-authentication"},"github-authorization":{"location":"github-auth.html#github-authorization","title":"Authorization","text":"Users, teams, and entire organizations can be authorized for a team by passing the following flags to fly set-team:\n\n--github-user=LOGIN: Authorize an individual user.\n\n\n--github-org=ORG_NAME: Authorize an entire organization's members.\n\n\n--github-team=ORG_NAME:TEAM_NAME: Authorize a team's members within an organization.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --github-user my-github-login \\\n    --github-org my-org \\\n    --github-team my-other-org:my-team\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  github:\n    users: [\"my-github-login\"]\n    orgs: [\"my-org\"]\n    teams: [\"my-other-org:my-team\"]\n","depth":5,"section_tag":"github-authorization"},"gitlab-auth":{"location":"gitlab-auth.html","title":"GitLab auth","text":"A Concourse server can authenticate against GitLab to leverage their permission model.\n\n","depth":4,"section_tag":"gitlab-auth"},"gitlab-authentication":{"location":"gitlab-auth.html#gitlab-authentication","title":"Authentication","text":"First you need to create an OAuth application on GitLab with the following scopes:\n\n* read_user\n\n* openid\n\nThe \"Authorization callback URL\" must be the URL of your Concourse server with /sky/issuer/callback appended. This address must be reachable by GitLab - it can't be localhost.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nYou will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the Running a web node by setting the following env:\n\nCONCOURSE_GITLAB_CLIENT_ID=myclientid\nCONCOURSE_GITLAB_CLIENT_SECRET=myclientsecret\nIf you're configuring a self hosted GitLab instance, you'll also need to set the following flag:\n\nCONCOURSE_GITLAB_HOST=https://gitlab.example.com\nThe GitLab host must contain a scheme and not a trailing slash.\n\n","depth":5,"section_tag":"gitlab-authentication"},"gitlab-authorization":{"location":"gitlab-auth.html#gitlab-authorization","title":"Authorization","text":"Users and groups can be authorized for a team by passing the following flags to fly set-team:\n\n--gitlab-user=USERNAME: Authorize an individual user.\n\n\n--gitlab-group=GROUP_NAME: Authorize an entire groups's members.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --gitlab-user my-gitlab-user \\\n    --gitlab-group my-group\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  gitlab:\n    users: [\"my-gitlab-login\"]\n    groups: [\"my-gitlab-group\"]\n","depth":5,"section_tag":"gitlab-authorization"},"giving-your-cluster-a-name":{"location":"concourse-web.html#giving-your-cluster-a-name","title":"Giving your cluster a name","text":"If you've got many Concourse clusters that you switch between, you can make it slightly easier to notice which one you're on by giving each cluster a name:\n\nCONCOURSE_CLUSTER_NAME=production\nWhen set, this name will be shown in the top bar when viewing the dashboard.\n\n","depth":5,"section_tag":"giving-your-cluster-a-name"},"global-resources":{"location":"global-resources.html","title":"Global Resources","text":"Concourse v5.0 contains an experimental feature known as \"global resources\". It is enabled by passing the --enable-global-resources flag to the concourse web command.\n\nThe basic concept of global resources is to share detected resource versions between all resources that have the same resource.type and resource.source configuration.\n\nBefore v5.0.0, each pipeline resource had its own version history, associated to the resource by name. This meant that multiple pipelines with the same resource configs would redundantly collect the same version and metadata information.\n\nWith v5.0.0's experimental 'global resources' feature, resource versions are instead associated to an anonymous 'resource config' i.e. its resource.type and resource.source.\n\n","depth":3,"section_tag":"global-resources"},"goals":{"location":"garbage-collector.html#goals","title":"Goals","text":"Let's define our metrics for success:\n\n* Safe. There should never be a case where a build is running and a container or volume is removed out from under it, causing the build to fail. Resource checking should also never result in errors from check containers being removed. No one should even know garbage collection is happening.\n\n* Airtight. Everything Concourse creates, whether it's a container or volume on a worker or an entry in the database, should never leak. Each object should have a fully defined lifecycle such that there is a clear end to its use. The ATC should be interruptible at any point in time and at the very least be able to remove any state it had created beforehand.\n\n* Resilient. Garbage collection should never be outpaced by the workload. A single misbehaving worker should not prevent garbage collection from being performed on other workers. A slow delete of a volume should not prevent garbage collecting of other things on the same worker.\n\n","depth":5,"section_tag":"goals"},"golang-library-example":{"location":"golang-library-example.html","title":"Golang library testing example","text":"You can run the tests for a Golang library across any specified versions.\n\nThis example shows how to have multiple versions of a language, environment, or dependency fetched and integrated in to a Pipeline.\n\nFor these Docker images, defining them as Resources has two advantages for this use case. First, this enables the pipeline to be triggered when there are new versions of those images available. Second, referencing them in the task's task step image param is helpful as it will ensure consistency between the image versions fetched by the Resource and the image version running in the job.\n\n","depth":2,"section_tag":"golang-library-example"},"gracefully-removing-a-worker":{"location":"concourse-worker.html#gracefully-removing-a-worker","title":"Gracefully Removing a Worker","text":"When a worker machine is going away, it should be retired. This is similar to landing, except at the end the worker is completely unregistered, along with its volumes and containers. This should be done when a worker's VM or container is being destroyed.\n\nTo retire a worker, send SIGUSR2 to the worker process. This will switch the worker to retiring state, and Concourse will stop scheduling new work on it. When all builds running on the worker have finished, the worker will be removed and the worker process will exit.\n\nJust like with landing, you may want to enforce a timeout for draining - that way a stuck build won't prevent your workers from being upgraded. This can be enforced by common tools like start-stop-daemon:\n\nstart-stop-daemon \\\n  --pidfile worker.pid \\\n  --stop \\\n  --retry USR2/300/TERM/15/KILL\nThis will send SIGUSR2, wait up to 5 minutes, and then send SIGTERM. If it's still running, it will be killed after an additional 15 seconds.\n\n","depth":5,"section_tag":"gracefully-removing-a-worker"},"guardian-runtime":{"location":"concourse-worker.html#guardian-runtime","title":"Guardian runtime","text":"Guardian is currently the default runtime for Concourse. It can also be set by setting the --runtime flag to guardian on the concourse worker command.\n\nThe concourse worker command automatically configures and runs Guardian using the gdn binary, but depending on the environment you're running Concourse in, you may need to pop open the hood and configure a few things.\n\nThe gdn server can be configured in two ways:\n\n1. By creating a config.ini file and passing it as --garden-config (or CONCOURSE_GARDEN_CONFIG).\n\n  The .ini file should look something like this:\n\n  [server]\n  flag-name=flag-value\n  To learn which flags can be set, consult gdn server --help. Each flag listed can be set under the [server] heading.\n\n2. By setting CONCOURSE_GARDEN_* environment variables.\n\n  This is primarily supported for backwards compatibility, and these variables are not present in concourse worker --help. They are translated to flags passed to gdn server by lower-casing the * portion and replacing underscores with hyphens.\n\n","depth":6,"section_tag":"guardian-runtime"},"hello-world-example":{"location":"hello-world-example.html","title":"Hello World pipeline","text":"A single job is the simplest form of pipeline.\n\nWhile this is less of an example pipeline, this is a simple introduction to a critical primitive to form pipelines.\n\nAlso, due to the fact that there are minimal external factors (Resources) for the system to check and resolve, this is often used to test overall system health.\n\n","depth":2,"section_tag":"hello-world-example"},"hooks-example":{"location":"hooks-example.html","title":"Job \u0026 task hooks example","text":"Job hooks like job.on_success and Step hooks like on_success are available to perform actions based on the success, failure, or abortion of a job.\n\n","depth":2,"section_tag":"hooks-example"},"horizontal-vs-vertical-scaling":{"location":"concourse-worker.html#horizontal-vs-vertical-scaling","title":"Horizontal vs Vertical Scaling","text":"The answer to whether you should scale your workers horizontally or vertically depends heavily on what workloads your pipelines are running. Anecdotally though, we have seen that a lot of smaller workers (horizontal scaling) is usually better than a few large workers (vertical scaling).\n\nAgain, this is not an absolute answer! You will have to test this out against the workloads your pipelines demand and adjust based on the Metrics that you are tracking.\n\n","depth":6,"section_tag":"horizontal-vs-vertical-scaling"},"how-can-i-help":{"location":"project.html#how-can-i-help","title":"How can I help?","text":"Concourse is a free and Open Source software project that depends on the contributions of sponsors and volunteers worldwide.\n\nIf you're interested in contributing, head over to GitHub and check out the contributing docs!\n\n","depth":2,"section_tag":"how-can-i-help"},"how-does-concourse-track-artifacts":{"location":"tutorial-inputs-outputs.html#how-does-concourse-track-artifacts","title":"How does Concourse track artifacts?","text":"As Concourse is running the steps in your job, it is creating a list of named artifacts. Let's see what that looks like for the pipeline we just ran.\n\n* Concourse runs the task step hello-world-task with output the-artifact\n\n  Concourse creates an empty artifact, assigns it the name the-artifact, and mounts it inside the task container.\n\n* Concourse runs the task step read-the-artifact with input the-artifact\n\n  Concourse looks up, in its list of artifacts for the build, for an artifact named the-artifact, and mounts it inside the task container. If no input with that name is found then the build would fail.\n\nThe next section will introduce you to the concept of Resources.\n\nIf you have any feedback for this tutorial please share it in this GitHub discussion\n\n","depth":4,"section_tag":"how-does-concourse-track-artifacts"},"how-it-works":{"location":"garbage-collector.html#how-it-works","title":"How it Works","text":"The garbage collector is a batch operation that runs on an interval with a default of 30 seconds. It's important to note that the collector must be able to run frequently enough to not be outpaced by the workload producing things, and so the batch operation should be able to complete pretty quickly.\n\nThe batch operation first performs garbage collection within the database alone, removing rows that are no longer needed. The removal of rows from one stage will often result in removals in a later stage. There are individual collectors for each object, such as the volume collector or the container collector, and they are all run asynchronously.\n\nAfter the initial pass of garbage collection in the database, there should now be a set of containers and volumes that meet criteria for garbage collection. These two are a bit more complicated to garbage-collect; they both require talking to a worker, and waiting on a potentially slow delete.\n\nContainers and volumes are the costliest resources consumed by Concourse. There are also many of them created over time as builds execute and pipelines perform their resource checking. Therefore it is important to parallelize this aspect of garbage collection so that one slow delete or one slow worker does not cause them to pile up.\n\n","depth":5,"section_tag":"how-it-works"},"how-to-guides":{"location":"how-to-guides.html","title":"How-To Guides","text":"The following pages are guides that show how to accomplish certain workflows within Concourse. Most of the guides will use specific images but you are in no way limited to or forced to use these images to accomplish the same task. There are many ways to accomplish the same thing in Concourse, so don't let these guides limit you in what you think is possible with Concourse.\n\n","depth":2,"section_tag":"how-to-guides"},"iam-permissions":{"location":"aws-ssm-credential-manager.html#iam-permissions","title":"IAM Permissions","text":"The following is an example of an IAM policy that can be used to grant permissions to an IAM user or instance role. Note that the Resource section can contain a wildcard to a parameter or be restricted to an individual parameter.\n\n{\n\"Version\": \"2012-10-17\",\n\"Statement\": [\n    {\n        \"Sid\": \"AllowAccessToSsmParameters\",\n        \"Effect\": \"Allow\",\n        \"Action\": [\n            \"ssm:GetParameter\",\n            \"ssm:GetParametersByPath\"\n        ],\n        \"Resource\": [\n            \"arn:aws:ssm:::parameter/concourse/*\",\n            \"arn:aws:ssm:::parameter/concourse/TEAM_NAME/*\",\n            \"arn:aws:ssm:::parameter/concourse/TEAM_NAME/PIPELINE_NAME/*\"\n        ]\n    },\n    {\n        \"Sid\": \"AllowAccessToDecryptSsmParameters\",\n        \"Effect\": \"Allow\",\n        \"Action\": [\n            \"kms:Decrypt\",\n            \"kms:DescribeKey\"\n        ],\n        \"Resource\": \"arn:aws:kms:::key/KMS_KEY_ID\"\n    },\n    {\n        \"Sid\": \"AllowListKeys\",\n        \"Effect\": \"Allow\",\n        \"Action\": [\n            \"kms:ListAliases\",\n            \"kms:ListKeys\"\n        ],\n        \"Resource\": \"*\"\n    }\n]\n}\nNote that the TEAM_NAME, PIPELINE_NAME, and KMS_KEY_ID text above should be replaced to fit your Concourse setup.\n\nFor more information on how to use IAM roles to restrict access to SSM parameters, review the official documentation.\n\n","depth":5,"section_tag":"iam-permissions"},"idtoken-credential-manager":{"location":"idtoken-credential-manager.html","title":"The IDToken credential manager","text":"This idtoken credential manager is a bit special. It doesn't load any credentials from an external source but instead generates JWTs which are signed by concourse and contain information about the pipeline/job that is currently running. It can NOT be used as a cluster-wide credential manager, but must instead be used as a var source.\n\nThese JWTs can be used to authenticate with external services via \"identity federation\" with the identity of the pipeline.\n\nExamples for services that support authentication via JWTs are:\n\n* Vault\n\n* AWS\n\n* Azure\n\nExternal services can verify if JWTs are actually issued by your Concourse, by checking the signatures on the JWTs against the public keys published by your Concourse.\n\nThe public keys for verification are published as JWKS at: https://your-concourse-server.com/.well-known/jwks.json\n\n\nConcourse also offers a OIDC Discovery Endpoint, which allows external services to auto-discover the JWKS-URL.\n\n","depth":4,"section_tag":"idtoken-credential-manager"},"idtoken-credential-manager-config":{"location":"idtoken-credential-manager.html#idtoken-credential-manager-config","title":"Configuration","text":"You can pass several config options to the idtoken var source to customize the generated JWTs. For example, you can configure the aud claim, token expiration, or granularity of the sub claim. See idtoken var source for all config options.\n\n","depth":5,"section_tag":"idtoken-credential-manager-config"},"idtoken-key-rotation":{"location":"idtoken-credential-manager.html#idtoken-key-rotation","title":"Automatic Key Rotation","text":"Concourse will automatically rotate the signing keys used for creating the JWTs. The default rotation period is 7 days. The previously used keys are being kept around for a while (by default 24h) so that verification of currently existing JWTs doesn't fail during key rotation.\n\nThis behavior can be configured via the following ATC flags:\n\n* CONCOURSE_SIGNING_KEY_ROTATION_PERIOD: How often to rotate the signing keys. Default: 7d. A value of 0 means don't rotate at all.\n\n* CONCOURSE_SIGNING_KEY_GRACE_PERIOD: How long to keep previously used signing keys published in the JWKs after they have been rotated. Default: 24h.\n\n* CONCOURSE_SIGNING_KEY_CHECK_INTERVAL: How often to check if new keys are needed or if old ones should be removed. Default: 10m\n\n","depth":5,"section_tag":"idtoken-key-rotation"},"idtoken-subject-scope":{"location":"idtoken-credential-manager.html#idtoken-subject-scope","title":"Subject Scope","text":"Some external services (like AWS) only perform exact-matches on a token's sub-claim and ignore most other claims. To enable use-cases like \"all pipelines of a team should be able to assume an AWS-Role\", Concourse offers the option to configure how granular the sub claim's value should be.\n\nThis is configured via the subject_scope setting of the idtoken var source.\n\nDepending on the value of subject_scope, the content of the JWT's sub claim will differ:\n\n| subject_scope | sub Value in JWT |\n| team\n\n | \u003cteam_name\u003e\n\n |\n| pipeline\n\n | \u003cteam_name\u003e/\u003cpipeline_name\u003e\n\n |\n| instance\n\n | \u003cteam_name\u003e/\u003cpipeline_name\u003e/\u003cinstance_vars\u003e 1\n\n |\n| job\n\n | \u003cteam_name\u003e/\u003cpipeline_name\u003e/\u003cinstance_vars\u003e/\u003cjob_name\u003e 2\n\n |\n\n* [1]: Instance vars are rendered as comma-separated key-value pairs. E.g. my-var:my-value,hello:world \n\n* [2]: If a path element is empty (for example because you chose job on a pipeline with no instance-vars), the empty element is still added. E.g. my-team/my-pipeline//my-job. Note the double forward-slashes between the pipeline and job name, where instance vars would go. \n\nThis way all your pipelines can simply get a token with subject_scope: team and use this token to assume an AWS-Role that matches on sub: \"your_team_name\".\n\n","depth":6,"section_tag":"idtoken-subject-scope"},"idtoken-var-source":{"location":"vars.html#idtoken-var-source","title":"idtoken var source","text":"","depth":4,"section_tag":"var-sources"},"implementing-resource-types":{"location":"implementing-resource-types.html","title":"Implementing a Resource Type","text":"A resource type is implemented by a container image with three scripts:\n\n* /opt/resource/check for checking for new versions of the resource\n\n* /opt/resource/in for pulling a version of the resource down\n\n* /opt/resource/out for idempotently pushing a version up\n\nDistributing resource types as containers allows them to package their own dependencies. For example, the git resource comes with the git binary pre-installed.\n\nAll resources must implement all three actions, though the actions can just be no-ops (which still must be correctly implemented as detailed below).\n\nResources can emit logs to the user by writing to stderr. ANSI escape codes (coloring, cursor movement, etc.) will be interpreted properly by the web UI, so you should make your output pretty.\n\n","depth":3,"section_tag":"implementing-resource-types"},"in-parallel":{"location":"in-parallel-step.html#in-parallel","title":"in_parallel step","text":"Performs the given steps in parallel. If any sub-steps in a parallel result in a failure or error, the parallel step as a whole is considered to have failed or errored. Expand each section below for more details and examples.  Instead of passing in a list of steps to in_parallel you can pass in the following fields. The list of steps will fall under the steps field. \n\n\n\n","depth":3,"section_tag":"in-parallel-step"},"in-parallel-step":{"location":"in-parallel-step.html","title":"in_parallel step","text":"Performs the given steps in parallel. If any sub-steps in a parallel result in a failure or error, the parallel step as a whole is considered to have failed or errored. Expand each section below for more details and examples.  Instead of passing in a list of steps to in_parallel you can pass in the following fields. The list of steps will fall under the steps field. \n\n\n\n","depth":3,"section_tag":"in-parallel-step"},"index":{"location":"index.html","title":"Concourse","text":"Concourse is an open-source continuous thing-doer.Centered around the simple mechanics of resources, tasks, and jobs, Concourse delivers a versatile approach to automation that excels at CI/CD.\n\nQuick Start\n\nConcourse is engineered to be expressive, versatile, and secure, remaining intuitive even as your project complexity grows.\n\nCode-based configurationresources:\n- name: booklit\n  type: git\n  source: {uri: \"https://github.com/concourse/booklit\"}\n\njobs:\n- name: unit\n  plan:\n  - get: booklit\n    trigger: true\n  - task: test\n    file: booklit/ci/test.yml\nVisual verificationA Concourse pipeline functions like a distributed, continuous Makefile.\n\nEach job contains a build plan defining the job's input resources and what actions to perform with them when changes occur.\n\nYour pipeline appears visualized in the web UI, requiring just one click to move from a failed job to understanding the cause of failure.\n\nThe visualization provides immediate feedback: if it looks wrong, it probably is wrong.\n\nA more complex example...Jobs can depend on other jobs through passed constraints. The resulting network of jobs and resources creates a dependency graph that continuously advances your project forward, from source code to production.\n\nThis pipeline example can be found in the Booklit repository.\n\nAll configuration and management happens through the fly CLI.\n\nThe fly set-pipeline command uploads your configuration to Concourse. Once finalized, you can commit the file to source control, making it easy to recover your project if you migrate to a new Concourse server.\n\nEverything executes in containers, ensuring a clean environment for each run.\n\nEvery task specifies its own image, providing complete control over its dependencies, instead of managing packages on your workers.\n\nThe fly intercept command lets you access a build's containers directly, simplifying troubleshooting of problematic builds.\n\nThe Running tasks with fly execute command enables you to run builds with local modifications.\n\nThese builds execute exactly as they would in your pipeline, eliminating the need to push incomplete commits while debugging.\n\nWhen a pipeline build fails, you can use Running tasks with fly execute with the -j flag to run a one-off build with the same inputs as the failed build. You can then replace an input with your local changes using -i to test your fix.\n\nCustom integrationsresource_types:\n- name: rubygem\n  type: registry-image\n  source:\n    repository: troykinsella/concourse-rubygems-resource\n\nresources:\n- name: rspec-gem\n  type: rubygem\n  source: {gem: rspec}\n\njobs:\n- name: bundle\n  plan:\n  - get: rspec-gem\n    trigger: true\n  - # ...\nConcourse doesn't rely on a complex plugin system. Instead, it focuses on a single powerful abstraction: resource, which are implemented by resource types.\n\nThe pipeline.resources field configures external artifacts that your pipeline will monitor for changes, retrieve, and update.\n\nFor instance, a resource with type git refers to a git repository, which will be cloned in a get step and pushed to using a put step. Behind the scenes, Concourse continuously runs git fetch to check for new commits that jobs might want to trigger on.\n\nAt its foundation, Concourse has no built-in knowledge of git. It includes a git resource type by default, but you can easily integrate your own into your pipeline through the pipeline.resource_types field.\n\nTo discover available resource types, check out the Resource Types catalog!\n\n","depth":0,"section_tag":"index"},"install":{"location":"install.html","title":"Install","text":"A Concourse installation is composed of a Running a web node, a Running a worker node, and a Running a PostgreSQL node.\n\nThere are many ways to deploy Concourse, depending on your personal preference. The Quick Start guide shows how to get Concourse up and running quickly via Docker Compose, and there is also an official Concourse Helm chart.\n\nThe documentation found here will primarily focus on the concourse CLI, which is the lowest common denominator, and can also be directly used if you want to just run Concourse yourself on real hardware or your own managed VMs.\n\nThe high-level steps to follow for installing Concourse are:\n\n1. Setup a Postgres database\n\n2. Generate Secrets for the web and worker nodes\n\n3. Install the web node\n\n4. Install the worker node\n\nWe don't document every configuration option for the web and worker commands. To view all flags you can run the following docker commands.\n\ndocker run -t concourse/concourse web --help\ndocker run -t concourse/concourse worker --help\n","depth":2,"section_tag":"install"},"install-fly":{"location":"quick-start.html#install-fly","title":"Install Fly","text":"Next, install the The fly CLI by downloading it from the web UI. If you're on version \u003e=v7.14.0 of Concourse, you can visit http://localhost:8080/download-fly.\n\nOtherwise, you can follow these steps to instally fly for your OS:\n\ncurl 'http://localhost:8080/api/v1/cli?arch=amd64\u0026platform=linux' -o fly\nchmod +x ./fly\nmv ./fly /usr/local/bin/\ncurl 'http://localhost:8080/api/v1/cli?arch=amd64\u0026platform=darwin' -o fly\nchmod +x ./fly\nmv ./fly /usr/local/bin/\n$concoursePath = 'C:\\concourse\\'\nmkdir $concoursePath\n[Environment]::SetEnvironmentVariable('PATH', \"$ENV:PATH;${concoursePath}\", 'USER')\n$concourseURL = 'http://localhost:8080/api/v1/cli?arch=amd64\u0026platform=windows'\nInvoke-WebRequest $concourseURL -OutFile \"${concoursePath}\\fly.exe\"\nUse fly login to log into your local Concourse as the test user:\n\nfly -t tutorial login -c http://localhost:8080 -u test -p test\nYou've successfully logged in if you see the following output:\n\nlogging in to team 'main'\n\ntarget saved\nYou'll notice that every fly command in this tutorial has to have the target (-t tutorial) specified. This is annoying when you only have one Concourse to target, but it helps ensure you don't trigger a job on the wrong Concourse instance. It will save you from hurting yourself!\n\nOnce you've confirmed everything is up and running by logging in through fly and the web UI, you can move onto the next section.\n\nIf you have any feedback for this tutorial please share it in this GitHub discussion\n\n","depth":4,"section_tag":"install-fly"},"installing-or-upgrading-bundled-resource-types":{"location":"concourse-worker.html#installing-or-upgrading-bundled-resource-types","title":"Installing or Upgrading Bundled Resource Types","text":"You may want to upgrade the bundled resource types outside of Concourse upgrades or even install additional resource types on your workers to reduce the polling on some external image repository like Docker Hub.\n\nWe will use the git resource as our example. We will assume your Concourse installation is at /usr/local/concourse.\n\nFirst, pull and create a container of the resource you're installing/upgrading. Grab the ID of the container that Docker creates.\n\n$ docker run -d concourse/git-resource\nb253417142565cd5eb43902e94a2cf355d5354b583fbc686488c9a153584c6ba\nExport the containers file system into a gzip compressed tar archive named rootfs.tgz\n\ndocker export b253417142 | gzip \u003e rootfs.tgz\nCreate a file called resource_metadata.json and populate it with the following contents. Make sure the type does not conflict with an existing resource type when you're installing a new resource type. In our example here we're calling the type gitv2 to avoid conflicting with the pre-existing git resource.\n\n{\n  \"type\": \"gitv2\",\n  \"version\": \"1.13.0\",\n  \"privileged\": false,\n  \"unique_version_history\": false\n}\nAt this point you should have two files: rootfs.tgz and resource_metadata.json.\n\nCreate a new directory under the resource-types folder in your Concourse installation directory. By convention it should be the same name as the type.\n\nmkdir /usr/local/concourse/resource-types/gitv2\nPlace the rootfs.tgz and resource_metadata.json inside the folder. Restart your worker and verify the new resource type is on there by running one of the following commands:\n\nfly workers --details\n# or\nfly curl api/v1/workers\nYou can also verify that Concourse can create a container with the rootfs.tgz you made by running a simple pipeline:\n\nresources:\n- name: some-resource\n  type: gitv2 #change to your resource type\n  source:\n    uri: https://github.com/concourse/git-resource.git\n\njobs:\n- name: simple-job\n  plan:\n  - get: some-resource\n","depth":6,"section_tag":"installing-or-upgrading-bundled-resource-types"},"instanced-pipelines":{"location":"instanced-pipelines.html","title":"Grouping Pipelines","text":"Instanced Pipelines/Instance Groups are currently experimental, and are subject to change.\n\nTo experiment with Instanced Pipelines on your deployment, you need to set the feature flag --enable-pipeline-instances (CONCOURSE_ENABLE_PIPELINE_INSTANCES=true)\n\nAlthough pipelines operate independently of one another, it's not uncommon to have several pipelines that are highly related, and possibly derived from the same pipeline template. It's useful to be able to group these pipelines to reduce clutter and improve navigation. For this, Concourse has the concept of Instanced Pipelines and Instance Groups, where an Instance Group composes several related Instanced Pipelines.\n\nFor instance, suppose you support multiple version lines of your software (v1.0.x and v2.0.x, say), and want a pipeline for each version line in order to facilitate delivering patch releases. You create a common pipeline template that uses Vars to specialize each pipeline:\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: git@...\n    # The only difference between the pipelines is the git branch to use\n    branch: release/v((version))\n\njobs:\n- name: test\n  plan: [...]\n\n- name: deploy-to-staging\n  plan: [...]\n\n- name: release\n  plan: [...]\nBefore Concourse v7.0.0, you might set multiple pipelines with the version information encoded in the pipeline name, e.g.:\n\n$ fly -t example set-pipeline \\\n    --pipeline release-1.0.x \\\n    --config template.yml \\\n    --var version=1.0.x\n$ fly -t example set-pipeline \\\n    --pipeline release-2.0.x \\\n    --config template.yml \\\n    --var version=2.0.x\nThe downside to this approach is that things can get disorganized quickly as the number of pipelines increases, which can make the UI cluttered and hard to navigate. Additionally, not everything can easily be encoded into the pipeline name, especially with the restrictions on identifiers - while it's readable in this case, it can get unwieldy as the number of variables in the template grows.\n\nThe recommended approach is to construct an Instance Group where each version has its own Instanced Pipeline:\n\n$ fly -t example set-pipeline \\\n    --pipeline release \\\n    --config template.yml \\\n    --instance-var version=1.0.x\n$ fly -t example set-pipeline \\\n    --pipeline release \\\n    --config template.yml \\\n    --instance-var version=2.0.x\nThere are only a few differences from the previous approach in terms of creating the pipelines:\n\n1. We give each Instanced Pipeline the same name (in this case, release), and\n\n2. We use the --instance-var flag instead of --var. Doing so makes the variable name and value a part of the pipeline's identifier (Managing Instanced Pipelines describes how to work with Instanced Pipelines in fly)\n\nThe -i or --instance-var flag behaves like the -y or --yaml-var, meaning instance vars can hold arbitrary YAML/JSON data. The v or --var flag, on the other hand, only defines strings. See Static vars to learn the difference between the flags\n\nNote that there are no fly commands for constructing an Instance Group - Concourse logically groups all Instanced Pipelines with the same name into a single Instance Group. Instanced Pipelines have the same pipeline semantics as other pipelines - they are just organized and identified in a different way.\n\n","depth":3,"section_tag":"instanced-pipelines"},"intercept-admin-only":{"location":"global-resources.html#intercept-admin-only","title":"Intercepting check containers is no longer safe","text":"Now that check containers are shared across teams, it would be dangerous to allow anyone to fly intercept to check containers. For this reason, this capability is limited to admin users.\n\nWe recognize that this will make it a bit more difficult for end users to debug things like failing checks. We plan to improve this by introducing a way to provision a new check container to facilitate debugging. See 3344 for more information.\n\n","depth":5,"section_tag":"intercept-admin-only"},"internals":{"location":"internals.html","title":"Internals","text":"This section provides a deeper understanding of some of the concepts surrounding Concourse.\n\nAn understanding of the basics of Concourse concepts, such as pipelines, jobs, etc, is recommended as parts of this section might assume a level of knowledge from them. This section is not necessary for using Concourse but are more for experienced users that want to dig deeper into how Concourse works.\n\n","depth":2,"section_tag":"internals"},"intro-to-yaml":{"location":"config-basics.html#intro-to-yaml","title":"Intro to YAML","text":"YAML is a human-friendly syntax for writing structured documents. You can think of it as JSON without the sharp edges.\n\nHere's a quick example demonstrating common YAML syntax:\n\n# commented lines are prefixed with the '#' character\n\n# strings\nquoted_string: \"bar\"\nunquoted_string: hello world!\nmultiline_string: |\n  hello, world!\n  this is one big string with a trailing linebreak!\n\n# arrays\narray: [hello, world]\nmultiline_array:\n- hello\n- world\n\n# objects\nobject: {one: uno, two: dos}\nmultiline_object:\n  one: uno\n  two: dos\n\n# boolean values\nbooleans: [true, false]\n\n# numeric values\nnumeric: [1234, 12.34]\n","depth":3,"section_tag":"intro-to-yaml"},"java-example":{"location":"java-example.html","title":"Java application testing example","text":"You can run the tests for a Java application.\n\n","depth":2,"section_tag":"java-example"},"jobs":{"location":"jobs.html","title":"Jobs","text":"Jobs determine the actions of your pipeline. They determine how resources progress through it, and how the pipeline is visualized.\n\nThe most important attribute of a job is its build plan, configured as job.plan. This determines the sequence of Steps to execute in any builds of the job.\n\nA pipeline's jobs are listed under pipeline.jobs with the following schema:\n\n","depth":2,"section_tag":"jobs"},"jobs-and-resources-instanced-pipelines":{"location":"instanced-pipelines.html#jobs-and-resources-instanced-pipelines","title":"Managing Jobs and Resources","text":"Managing Jobs and Managing Resources walk you through some of the commands you can use to manage jobs and resources within pipelines. For Instanced Pipelines, we need to encode the instance vars in the --job and --resource flags. These flags now take the form:\n\n--job group/var1:value1,var2:value2/job\nand:\n\n--resource group/var1:value1,var2:value2/resource\nFor instance, to trigger the test job of release/version:1.0.x, we issue the following command:\n\n$ fly -t example trigger-job --job release/version:1.0.x/test\nTo check the repo resource of release/version:1.0.x, we issue the following command:\n\n$ fly -t example check-resource --resource release/version:1.0.x/repo\n","depth":5,"section_tag":"jobs-and-resources-instanced-pipelines"},"keeping-your-kernel-up-to-date":{"location":"security-hardening.html#keeping-your-kernel-up-to-date","title":"Keeping your kernel up-to-date","text":"Containers run in different Linux namespaces on the same Linux kernel as the host system. Vulnerabilities in the kernel version you run can allow for local privilege escalation - which in the Concourse context means allowing an escape from a Concourse task to full root privileges on the host.\n\nYou can greatly reduce the risk of container escapes by staying up to date with your kernel version, tracking either the latest release, or the latest kernel from a Linux distribution with a reputable security programme.\n\n","depth":4,"section_tag":"keeping-your-kernel-up-to-date"},"kubernetes-credential-lookup-rules":{"location":"kubernetes-credential-manager.html#kubernetes-credential-lookup-rules","title":"Credential lookup rules","text":"When resolving a parameter such as ((foo)), Concourse will lookup for it in the following order in the namespace configured for that team:\n\n* Name:         PIPELINE_NAME.foo\n  Namespace:    concourse-TEAM_NAME\n  Type:         Opaque\n\n  Data\n  ====\n  value:        32 bytes\n\n* Name:         foo\n  Namespace:    concourse-TEAM_NAME\n  Type:         Opaque\n\n  Data\n  ====\n  value:        32 bytes\n\nYou can also have nested fields, which can be accessed using . syntax, e.g. ((foo.bar)):\n\n* Name:         PIPELINE_NAME.foo\n  Namespace:    concourse-TEAM_NAME\n  Type:         Opaque\n\n  Data\n  ====\n  bar:          32 bytes\n\n* Name:         foo\n  Namespace:    concourse-TEAM_NAME\n  Type:         Opaque\n\n  Data\n  ====\n  bar:          32 bytes\n\nThe prefix prepended to the namespace used by Concourse to search for secrets (in the examples above, concourse-) can be changed by configuring the following in the Running a web node:\n\nCONCOURSE_KUBERNETES_NAMESPACE_PREFIX=some-other-prefix-\nIf an action is being run in a one-off build, Concourse will not include the pipeline name in the secret that it looks for.\n\n","depth":5,"section_tag":"kubernetes-credential-lookup-rules"},"kubernetes-credential-manager":{"location":"kubernetes-credential-manager.html","title":"Kubernetes Credential Manager","text":"Concourse can be configured to pull credentials from Kubernetes secret objects.\n\nTo configure it, either enable the in-cluster client by setting the following environment variable on the Running a web node:\n\nCONCOURSE_KUBERNETES_IN_CLUSTER=true\nor set the path to a kubeconfig file:\n\nCONCOURSE_KUBERNETES_CONFIG_PATH=~/.kube/config\n","depth":4,"section_tag":"kubernetes-credential-manager"},"ldap-auth":{"location":"ldap-auth.html","title":"LDAP auth","text":"The LDAP provider can be used for operators who wish to authenticate their users against an LDAP server.\n\n","depth":4,"section_tag":"ldap-auth"},"ldap-authentication":{"location":"ldap-auth.html#ldap-authentication","title":"Authentication","text":"The LDAP provider is configured by pointing it to an LDAP host with a read-only bind DN and password. This bind DN and password is used for authenticating with the LDAP host and querying the users.\n\nAdditionally, the base DN under which users are searched as well as the attribute of the users to associate to 'usernames' must also be configured.\n\nThese can be specified via env to the Running a web node like so:\n\nCONCOURSE_LDAP_DISPLAY_NAME=Acme # optional; default \"LDAP\"\nCONCOURSE_LDAP_HOST=ldap.example.com # port defaults to 389 or 636\nCONCOURSE_LDAP_BIND_DN='cn=read-only-admin,dc=example,dc=com'\nCONCOURSE_LDAP_BIND_PW=read-only-admin-password\nCONCOURSE_LDAP_USER_SEARCH_BASE_DN='cn=users,dc=example,dc=com'\nCONCOURSE_LDAP_USER_SEARCH_USERNAME=uid\nTo configure TLS, you may need to set a CA cert:\n\nCONCOURSE_LDAP_CA_CERT=/path/to/ca_cert\nIf your LDAP host does not use TLS, you must set:\n\nCONCOURSE_LDAP_INSECURE_NO_SSL=true\nTo fine-tune which users are queried, you can specify a user search filter like so:\n\nCONCOURSE_LDAP_USER_SEARCH_FILTER='(objectClass=person)'\nTo set which user attributes map to the token claims, you can set the following:\n\nCONCOURSE_LDAP_USER_SEARCH_ID_ATTR=uid         # default\nCONCOURSE_LDAP_USER_SEARCH_EMAIL_ATTR=mail     # default\nCONCOURSE_LDAP_USER_SEARCH_NAME_ATTR=some-attr # no default\n","depth":5,"section_tag":"ldap-authentication"},"ldap-authorization":{"location":"ldap-auth.html#ldap-authorization","title":"Authorization","text":"LDAP users and groups can be authorized for a team by passing the following flags to fly set-team:\n\n--ldap-user=USERNAME: Authorize an individual user.\n\n\n--ldap-group=GROUP_NAME: Authorize anyone from the group.\n\n\n\nFor example:\n\n$ fly set-team -n my-team \\\n    --ldap-user my-username \\\n    --ldap-group my-group\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  ldap:\n    users: [\"my-username\"]\n    groups: [\"my-groups\"]\n","depth":5,"section_tag":"ldap-authorization"},"lets-encrypt":{"location":"concourse-web.html#lets-encrypt","title":"TLS via Let's Encrypt","text":"Concourse can be configured to automatically acquire a TLS certificate via Let's Encrypt:\n\n# Enable TLS\nCONCOURSE_TLS_BIND_PORT=443\n\n# Enable Let's Encrypt\nCONCOURSE_ENABLE_LETS_ENCRYPT=true\nConcourse's Let's Encrypt integration works by storing the TLS certificate and key in the database, so it is imperative that you enable database encryption as well.\n\nBy default, Concourse will reach out to Let's Encrypt's ACME CA directory. An alernative URL can be configured like so:\n\nCONCOURSE_LETS_ENCRYPT_ACME_URL=https://acme.example.com/directory\nIn order to negotiate the certificate, your web node must be reachable by the ACME server. There are intentionally no publicly listed IP addresses to whitelist, so this typically means just making your web node publicly reachable.\n\n","depth":5,"section_tag":"lets-encrypt"},"limit-active-containers-strategy":{"location":"container-placement.html#limit-active-containers-strategy","title":"The limit-active-containers strategy","text":"limit-active-containers is an experimental feature.\n\nThe limit-active-containers placement strategy rejects workers that already have too many containers. It makes no effort to find the worker with the fewest number of containers present, and is therefore most useful when combined with other placement stragies by Chaining Placement Strategies.\n\nmax-active-containers-per-worker can be set to an integer of 1 or more, in which case a worker will not execute more than that amount of containers. If unset (or set to a value of 0), the limit-active-containers strategy has no effect - if this is your only placement strategy, workers will be chosen at random.\n\nCONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-containers\nCONCOURSE_MAX_ACTIVE_CONTAINERS_PER_WORKER=200\n","depth":4,"section_tag":"limit-active-containers-strategy"},"limit-active-tasks-strategy":{"location":"container-placement.html#limit-active-tasks-strategy","title":"The limit-active-tasks strategy","text":"limit-active-tasks is an experimental feature.\n\nWhen selecting the limit-active-tasks placement strategy, each task executed on a worker will increase the number of \"active tasks\" on that worker by one. When the task completes the number is decreased by one. The Running a web node then places get, put and task containers on the worker that currently has the least amount of active tasks.\n\nAdditionally max-active-tasks-per-worker can be set to an integer of 1 or more, in which case a worker will not execute more than that amount of tasks. A value of 0 means that there is no limit on the maximum number of active tasks on the workers. If no worker can be selected because all of them already have max-active-tasks-per-worker active tasks, then the task will wait for a free worker, periodically polling the pool. The metric concourse_steps_waiting{type=\"task\"} is emitted to monitor these events. Note that the parameter does not apply to get and put steps which will always be scheduled on the worker with the fewest active tasks.\n\nCONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-tasks\n and, optionally CONCOURSE_MAX_ACTIVE_TASKS_PER_WORKER=1\n\n\n","depth":4,"section_tag":"limit-active-tasks-strategy"},"limit-active-volumes-strategy":{"location":"container-placement.html#limit-active-volumes-strategy","title":"The limit-active-volumes strategy","text":"limit-active-volumes is an experimental feature.\n\nThe limit-active-volumes placement strategy rejects workers that already have too many volumes. It makes no effort to find the worker with the fewest number of volumes present, and is therefore most useful when combined with other placement stragies by Chaining Placement Strategies.\n\nmax-active-volumes-per-worker can be set to be an integer of 1 or more, in which case a worker will not execute more than that amount of volumes. If unset (or set to a value of 0), the limit-active-volumes strategy has no effect - if this is your only placement strategy, workers will be chosen at random.\n\nCONCOURSE_CONTAINER_PLACEMENT_STRATEGY=limit-active-volumes\nCONCOURSE_MAX_ACTIVE_VOLUMES_PER_WORKER=200\n","depth":4,"section_tag":"limit-active-volumes-strategy"},"limitations":{"location":"across-step.html#limitations","title":"Limitations","text":"The across step does not work with the get step or put step. The names of resouces are not interpolated within across steps. Trying to do the following will not work. - across:\n  - var: version\n    values: [\"1.16\", \"1.17\"]\n  do:\n    - get: go-((.:version))\n    # or this\n    - get: golang\n      resource: go-((.version))\n\n\nThe main reason this does not work is that Concourse determines the inputs for a job before the job starts. Concourse has no way of determining inputs for a job while it's in the middle of running.\n\nCurrent pipeline valdiation logic will also block you from setting the pipeline at all since Concourse validates the relationship between all resources and jobs by looking at get and put steps.\n\nThe above example will return an error like this when trying to set the pipeline: invalid jobs:\n  jobs.job.plan.do[0].across.get(go): unknown resource 'go-((.:version))'\n\n\n","depth":5,"section_tag":"limitations"},"linux-workers":{"location":"upgrading-concourse.html#linux-workers","title":"Linux Workers","text":"The Linux tarball from the GitHub release page contains extra assets that you will want to ensure are also upgraded at the same time. Make sure you overwrite the contents of the following directories:\n\n* concourse/bin/... - Other binaries like gdn, runc, and containerd are in this directory\n\n* concourse/resource-types/... - The location of the default resource-types included with each Concourse release\n\n","depth":5,"section_tag":"linux-workers"},"load-var":{"location":"load-var-step.html#load-var","title":"load_var step","text":"Load the value for a var at runtime from a file, making it available to subsequent steps as a local build var named after the given identifier. Expand each section below for more details and examples.\n\n","depth":3,"section_tag":"load-var-step"},"load-var-step":{"location":"load-var-step.html","title":"load_var step","text":"Load the value for a var at runtime from a file, making it available to subsequent steps as a local build var named after the given identifier. Expand each section below for more details and examples.\n\n","depth":3,"section_tag":"load-var-step"},"local-auth":{"location":"local-auth.html","title":"Local User auth","text":"Local User auth is a primitive username/password-based auth mechanism. All users and passwords are configured statically.\n\nIn general, we recommend configuring one of the other providers instead, but for small deployments with only a few users, local user auth may be all you need.\n\n","depth":4,"section_tag":"local-auth"},"local-authentication":{"location":"local-auth.html#local-authentication","title":"Authentication","text":"Local users are configured on the Running a web node by setting the following env:\n\nCONCOURSE_ADD_LOCAL_USER=myuser:mypass,anotheruser:anotherpass\nThis configures two users, myuser and anotheruser, with their corresponding passwords.\n\nWhen local users are configured, the log-in page in the web UI will show a username/password prompt.\n\nLocal users can also log in via fly login with the --username and --password flags.\n\n","depth":5,"section_tag":"local-authentication"},"local-authorization":{"location":"local-auth.html#local-authorization","title":"Authorization","text":"Local users are granted access to teams via fly set-team, using the --local-user flag:\n\n$ fly set-team -n my-team \\\n    --local-user some_username\n...or via --config for setting user roles:\n\nroles:\n- name: member\n  local:\n    users: [\"some_username\"]\n","depth":5,"section_tag":"local-authorization"},"local-vars":{"location":"vars.html#local-vars","title":"The \".\" var source","text":"The special var source name . refers to a \"local var source.\"\n\nThe precise scope for these \"local vars\" depends on where they're being used. Currently the only mechanism that uses the local var source is the load_var step, which sets a var in a local var source provided to all steps executed in the build.\n\n","depth":3,"section_tag":"local-vars"},"locking-down-privileged-mode":{"location":"security-hardening.html#locking-down-privileged-mode","title":"Locking down privileged mode","text":"By default, privileged mode (i.e. tasks with privileged: true on the task step) grants containers a very wide set of Linux capabilities, without any restrictions on syscalls allowed. These privileges are enough to load a kernel module (allowing arbitrary privilege escalation and container escape), as well as direct access to all host devices. As such, by default, privileged tasks are equivalent to full root access on the host.\n\nIf you are running a worker using the containerd container runtime, Concourse provides some options to reduce the risk of container escapes through privileged tasks.\n\nThe --containerd-privileged-mode=ignore (or by environment variable, CONCOURSE_CONTAINERD_PRIVILEGED_MODE=ignore) option to the worker is the most restrictive, but most secure option. It makes Concourse treat privileged tasks the same as normal tasks (i.e. grants no extra privileges, effectively disabling privileged tasks). While this is secure, it is also restrictive if you want to do things like build or run containers inside tasks.\n\nThe --containerd-privileged-mode=fuse-only (or by environment variable, CONCOURSE_CONTAINERD_PRIVILEGED_MODE=fuse-only) option to the worker makes it possible to secure privileged tasks against container escape, while still allowing privileged tasks to build container images with buildah, and run them with podman from inside the task.\n\nCaution: For the fuse-only privileged mode option to be secure against escapes from privileged tasks, you must run your worker in a container with user namespaces enabled. Privileged containers in fuse-only mode have CAP_SYS_ADMIN capability, which is harmless when in a non-default user namespace, but equivalent to full root on the host otherwise. When running the worker in a Docker or podman container, refer to the Docker or Podman docs to learn how to set up user namespaces.\n\n","depth":4,"section_tag":"locking-down-privileged-mode"},"main-team":{"location":"main-team.html","title":"The main team","text":"Out of the box, Concourse comes with a single team called main.\n\nThe main team is an admin team, meaning members (specifically, users with the owner role) can create and update other teams. Currently there is no way to promote a team to become an admin team, so main is a special-case.\n\nThe main team is different in that all flags normally passed to fly set-team are instead passed to the concourse web command, prefixed with --main-team-. The values set in these flags take effect whenever the web node starts up. This is done so that you can't get locked out.\n\nTo learn how to configure your main team, continue on to the appropriate section for your auth provider of choice under Configuring Auth.\n\n","depth":3,"section_tag":"main-team"},"managing-instanced-pipelines":{"location":"instanced-pipelines.html#managing-instanced-pipelines","title":"Managing Instanced Pipelines","text":"Instanced Pipelines can be managed via fly as described in Managing Pipelines, with one important distinction - since instance vars are a part of the pipeline's identifier, the --pipeline flag must include both the name of the Instance Group as well as the instance vars. The --pipeline flag takes the form:\n\n--pipeline group/var1:value1,var2:value2\nAs a concrete example, to pause the release Instanced Pipeline with version:1.0.x, you would issue the following command:\n\n$ fly -t example pause-pipeline --pipeline release/version:1.0.x\nLet's look at a more complicated example - suppose you have an Instanced Pipeline that was set using one of the following commands:\n\n$ fly -t example set-pipeline \\\n    --pipeline upgrade \\\n    --config template.yml \\\n    --instance-var version.from=1.0.0 \\\n    --instance-var version.to=2.0.0 \\\n    --instance-var branch=feature/foo\n# ...or equivalently\n$ fly -t example set-pipeline \\\n    --pipeline upgrade \\\n    --config template.yml \\\n    --instance-var 'version={from: 1.0.0, to: 2.0.0}' \\\n    --instance-var branch=feature/foo\nUsing dot-notation here (as in the first command) is recommended since YAML is finicky about spaces.\n\nFor instance, had we used --instance-var 'version={from:1.0.0, to:2.0.0}' (no spaces between keys and values), we would end up with the following object (represented as JSON):\n\n{\"from:1.0.0\": null, \"to:2.0.0\": null}\n\nSpecifying each field individually using dot-notation is harder to mess up.\n\nHere, there are two instance vars: version, that contains the object {\"from\": \"1.0.0\", \"to\": \"2.0.0\"}, and branch, that contains the string \"feature/foo\". In order to pause this pipeline, you could issue one of the following commands:\n\n$ fly -t example pause-pipeline \\\n    --pipeline 'upgrade/version.from:1.0.0,version.to:2.0.0,branch:\"feature/foo\"'\n# ... or equivalently\n$ fly -t example pause-pipeline \\\n    --pipeline 'upgrade/version:{from: 1.0.0, to: 2.0.0},branch:\"feature/foo\"'\n For accessing sub-fields of an object, we can either use dot-notation as described in Providing static values for vars, or we can define the object in full as valid YAML.\n\nIf the instance var name or value contains a \"special character\" (., ,, /, {, }, or whitespace), it must be surrounded by double quotes \".  Depending on your shell, this usually means the entire flag must be quoted, since otherwise your shell will try to expand the quotes.\n\n","depth":4,"section_tag":"managing-instanced-pipelines"},"managing-jobs":{"location":"jobs.html#managing-jobs","title":"Managing Jobs","text":"","depth":3,"section_tag":"managing-jobs"},"managing-pipelines":{"location":"managing-pipelines.html","title":"Managing Pipelines","text":"","depth":3,"section_tag":"managing-pipelines"},"managing-resource-types":{"location":"managing-resource-types.html","title":"Managing Resource Types","text":"","depth":3,"section_tag":"managing-resource-types"},"managing-resources":{"location":"managing-resources.html","title":"Managing Resources","text":"","depth":3,"section_tag":"managing-resources"},"managing-teams":{"location":"managing-teams.html","title":"Managing Teams","text":"","depth":3,"section_tag":"managing-teams"},"manual-approval-step":{"location":"manual-approval-step.html","title":"Manual Approval Step","text":"This is an exampe of a task step you can add to your Jobs that requires a human to approve or reject the job from running. This is probably the most minimal version of a manual approval step you can have in Concourse that doesn't require pulling in a bunch of other tech into your stack. It's definitely not the best UX since you need to use the fly CLI to approve the step.\n\nTask configuration, config.yml: platform: linux\n\ninputs:\n- name: repo\n\nparams:\n  APPROVAL_TIMEOUT: 600 #default of 10mins\n\nrun:\n  path: repo/tasks/manual-approval/run.sh\n\n\nTask script, run.sh: #!/usr/bin/env bash\n\nset -euo pipefail\n\ntimeout=$((EPOCHSECONDS+APPROVAL_TIMEOUT))\necho -n \"Waiting for manual approval...\"\nuntil [[ -f /tmp/approved || $EPOCHSECONDS -gt $timeout ]]; do\n    sleep 5\n    echo -n \".\"\ndone\n\nif [[ -f /tmp/approved ]]; then\n    echo \"Step approved!\"\nelse\n    echo \"Approval timeout reached. Aborting job.\"\n    exit 1\nfi\n\n\nTo approve the job when it gets to this step you have to create /tmp/approved on the step's container. You can do that user fly's intercept command, like so (replace PIPELINE/JOB with the name of your pipeline and job that the step resides in):\n\nfly -t ci intercept --job PIPELINE/JOB --step manual-approval touch /tmp/approved\nHere's the step added in-line to a pipeline so you can see how it works on its own.\n\njobs:\n- name: approval\n  plan:\n  - task: manual-approval\n    params:\n      APPROVAL_TIMEOUT: 600 #10mins\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source:\n          mirror_self: true\n      run:\n        path: bash\n        args:\n        - -c\n        - |\n          #!/usr/bin/env bash\n\n          set -euo pipefail\n\n          timeout=$((EPOCHSECONDS+APPROVAL_TIMEOUT))\n          echo -n \"Waiting for manual approval...\"\n          until [[ -f /tmp/approved || $EPOCHSECONDS -gt $timeout ]]; do\n              sleep 5\n              echo -n \".\"\n          done\n\n          if [[ -f /tmp/approved ]]; then\n              echo \"Step approved!\"\n          else\n              echo \"Approval timeout reached. Aborting job.\"\n              exit 1\n          fi\n","depth":4,"section_tag":"manual-approval-step"},"manual-trigger-example":{"location":"manual-trigger-example.html","title":"Manually triggered job example","text":"A job can be triggered by a resource. After it's complete, the next job can run automatically or manually.\n\n","depth":2,"section_tag":"manual-trigger-example"},"merging-branches":{"location":"basic-git-operations.html#merging-branches","title":"Merging Branches","text":"Here is how you can merge two branches. Common if you are using gitflow and need to merge a dev branch into main every so often.\n\nresources:\n- name: repo-main\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/user/my-repo\n    branch: main\n\n- name: repo-dev\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/user/my-repo\n    branch: dev\n\njobs:\n- name: merge-dev-into-main\n  plan:\n  - get: repo-dev\n  - put: repo-main\n    params:\n      repository: repo-dev\n      merge: true\n","depth":5,"section_tag":"merging-branches"},"metrics":{"location":"metrics.html","title":"Metrics","text":"Metrics are essential in understanding how any large system is behaving and performing. Concourse can emit metrics about both the system health itself and about the builds that it is running. Operators can tap into these metrics in order to observe the health of the system.\n\n","depth":3,"section_tag":"metrics"},"microsoft-auth":{"location":"microsoft-auth.html","title":"Microsoft auth","text":"A Concourse server can authenticate against Microsoft Azure AD to leverage its permission model.\n\n","depth":4,"section_tag":"microsoft-auth"},"microsoft-authentication":{"location":"microsoft-auth.html#microsoft-authentication","title":"Authentication","text":"You'll need to register a new application on Azure.\n\nThe \"Callback URL\" must be the URL of your Concourse server with /sky/issuer/callback appended. This address must be reachable by Microsoft - it can't be localhost.\n\nFor example, Concourse's own CI server's callback URL would be:\n\nhttps://ci.concourse-ci.org/sky/issuer/callback\nYou will be given a Client ID and a Client Secret for your new application. The client ID and secret must then be configured on the Running a web node by setting the following env:\n\nCONCOURSE_MICROSOFT_CLIENT_ID=myclientid\nCONCOURSE_MICROSOFT_CLIENT_SECRET=myclientsecret\nConsult concourse web --help for a full list of flags with descriptions.\n\n","depth":5,"section_tag":"microsoft-authentication"},"modifier-and-hook-steps":{"location":"modifier-and-hook-steps.html","title":"Modifier And Hook Steps","text":"The following steps can be added to any other step type.\n\n","depth":3,"section_tag":"modifier-and-hook-steps"},"multi-branch-cleaning-up":{"location":"multi-branch-workflows.html#multi-branch-cleaning-up","title":"Cleaning Up Old Workspaces","text":"With the setup described in Tracking Branches, Concourse will automatically archive any pipelines for branches that get removed. However, Concourse doesn't know that it should destroy Terraform workspaces when a branch is removed. To accomplish this, we can yet again make use of the Terraform resource to destroy these workspaces. We'll add another job to the tracker pipeline that figures out which workspaces don't belong to an active branch and destroy them.\n\nexamples/pipelines/multi-branch/tracker.yml resource_types:\n- name: git-branches\n  ...\n\n- name: terraform\n  type: registry-image\n  source:\n    repository: ljfranklin/terraform-resource\n\nresources:\n- name: feature-branches\n  ...\n\n- name: examples\n  ...\n\n- name: staging-env\n  type: terraform\n  source:\n    backend_type: gcs\n    backend_config: \u0026terraform_backend_config\n      bucket: concourse-examples\n      prefix: multi-branch/terraform\n      credentials: ((gcp_service_account_key))\n\njobs:\n- name: set-feature-pipelines\n  ...\n\n- name: cleanup-inactive-workspaces\n  plan:\n  - in_parallel:\n    - get: feature-branches\n      passed: [set-feature-pipelines]\n      trigger: true\n    - get: examples\n  - task: find-inactive-workspaces\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source: {repository: hashicorp/terraform}\n      inputs:\n      - name: feature-branches\n      outputs:\n      - name: extra-workspaces\n      params:\n        TERRAFORM_BACKEND_CONFIG:\n          gcs: *terraform_backend_config\n      run:\n        path: sh\n        args:\n        - -c\n        - |\n          set -euo pipefail\n\n          apk add -q jq\n\n          active_features=\"$(jq '[.[].groups.feature]' feature-branches/branches.json)\"\n\n          jq -n \"{terraform: {backend: $TERRAFORM_BACKEND_CONFIG}}\" \u003e backend.tf.json\n          terraform init\n\n          # List all active workspaces, ignoring the default workspace\n          active_workspaces=\"$(terraform workspace list | grep -v '^[*]' | tr -d ' ' | jq --raw-input --slurp 'split(\"\\n\") | map(select(. != \"\"))')\"\n\n          jq -n \"$active_workspaces - $active_features\" \u003e extra-workspaces/workspaces.json\n  - load_var: extra_workspaces\n    file: extra-workspaces/workspaces.json\n  - across:\n    - var: workspace\n      values: ((.:extra_workspaces))\n    put: staging-env\n    params:\n      terraform_source: examples/terraform/staging\n      env_name: ((.:workspace))\n      action: destroy\n    get_params:\n      action: destroy\n\n\n","depth":5,"section_tag":"multi-branch-cleaning-up"},"multi-branch-test-build-deploy":{"location":"multi-branch-workflows.html#multi-branch-test-build-deploy","title":"Test, Build \u0026 Deploy","text":"We'll start out by defining the pipeline that should run for each active branch. For this example, we'll be working with the following sample Go application.\n\nOur pipeline will have three stages:\n\n1. Run unit tests\n\n2. Build and upload a binary to a blobstore (in our case, we'll use Google Cloud Storage)\n\n3. Trigger a terraform apply to deploy our app to a staging environment. The Terraform module we'll use here doesn't actually provision any infrastructure, and is just used as an example\n\nSince the pipeline config is intended to be used as a template for multiple different branches, we can use Vars to parameterize the config. In particular, we'll use the vars ((feature)) and ((branch)), which represent the name of the feature and the name of the branch, respectively.\n\nBelow is the full pipeline config:\n\nexamples/pipelines/multi-branch/template.yml resource_types:\n- name: terraform\n  type: registry-image\n  source:\n    repository: ljfranklin/terraform-resource\n\n- name: gcs\n  type: registry-image\n  source:\n    repository: frodenas/gcs-resource\n\nresources:\n- name: branch\n  type: git\n  source:\n    uri: https://github.com/concourse/examples\n    branch: ((branch))\n\n- name: examples\n  type: git\n  source:\n    uri: https://github.com/concourse/examples\n\n- name: build-artifact\n  type: gcs\n  source:\n    bucket: concourse-examples\n    json_key: ((gcp_service_account_key))\n    regexp: multi-branch/features/((feature))/my-app-(.+)\\.tgz\n\n- name: staging-env\n  type: terraform\n  source:\n    env_name: ((feature))\n    backend_type: gcs\n    backend_config:\n      bucket: concourse-examples\n      prefix: multi-branch/terraform\n      credentials: ((gcp_service_account_key))\n\njobs:\n- name: test\n  build_log_retention:\n    builds: 50\n  plan:\n  - in_parallel:\n    - get: branch\n      trigger: true\n    - get: examples\n  - task: unit\n    file: examples/tasks/go-test.yml\n    input_mapping: {repo: branch}\n    params: {MODULE: apps/golang}\n\n- name: build\n  build_log_retention:\n    builds: 50\n  plan:\n  - in_parallel:\n    - get: branch\n      passed: [test]\n      trigger: true\n    - get: examples\n  - task: build\n    file: examples/tasks/go-build.yml\n    params:\n      MODULE: apps/golang\n      BINARY_NAME: my-app\n    input_mapping: {repo: branch}\n  - put: build-artifact\n    params: {file: \"binary/my-app-*.tgz\"}\n\n- name: deploy\n  build_log_retention:\n    builds: 50\n  plan:\n  - in_parallel:\n    - get: build-artifact\n      passed: [build]\n      trigger: true\n    - get: examples\n  - load_var: bundle_url\n    file: build-artifact/url\n  - put: staging-env\n    params:\n      terraform_source: examples/terraform/staging\n      vars: {bundle_url: ((.:bundle_url))}\n\n\n","depth":5,"section_tag":"multi-branch-test-build-deploy"},"multi-branch-tracking-branches":{"location":"multi-branch-workflows.html#multi-branch-tracking-branches","title":"Tracking Branches","text":"In addition to the branch pipeline template, we'll also need a pipeline to track the list of branches and set a pipeline for each one.\n\nTo track the list of branches in a repository, we can use aoldershaw/git-branches-resource. This resource_type emits a new resource version whenever a branch is created or deleted. It also lets us filter the list of branches by a regular expression. In this case, let's assume our feature branches match the regular expression feature/.*.\n\nBelow is the full pipeline config for this tracker pipeline:\n\nexamples/pipelines/multi-branch/tracker.yml resource_types:\n- name: git-branches\n  type: registry-image\n  source:\n    repository: aoldershaw/git-branches-resource\n\nresources:\n- name: feature-branches\n  type: git-branches\n  source:\n    uri: https://github.com/concourse/examples\n    # The \"(?P\u003cname\u003epattern)\" syntax defines a named capture group.\n    # aoldershaw/git-branches-resource emits the value of each named capture\n    # group under the `groups` key.\n    #\n    # e.g. feature/some-feature ==\u003e {\"groups\": {\"feature\": \"some-feature\"}}\n    branch_regex: 'feature/(?P\u003cfeature\u003e.*)'\n\n- name: examples\n  type: git\n  source:\n    uri: https://github.com/concourse/examples\n\njobs:\n- name: set-feature-pipelines\n  plan:\n  - in_parallel:\n    - get: feature-branches\n      trigger: true\n    - get: examples\n  - load_var: branches\n    file: feature-branches/branches.json\n  - across:\n    - var: branch\n      values: ((.:branches))\n    set_pipeline: dev\n    file: examples/pipelines/multi-branch/template.yml\n    instance_vars: {feature: ((.:branch.groups.feature))}\n    vars: {branch: ((.:branch.name))}\n\n\nWe set each pipeline as an instanced pipeline - this will result in Concourse grouping all of the related dev pipelines in the UI.\n\n","depth":5,"section_tag":"multi-branch-tracking-branches"},"multi-branch-workflows":{"location":"multi-branch-workflows.html","title":"Multi-Branch Workflows","text":"Teams may make use of multiple branches for their development. For instance, some teams create feature branches while working on new functionality - once this functionality is ready, the branch will be merged into the main branch and the feature branch will be deleted.\n\nWhile a feature is under development, you'll often want to run tests against the feature branch and possibly deploy to a staging environment. To model this in Concourse, you'll need to have a pipeline for each active feature branch. Manually setting (and eventually archiving) a pipeline for each feature branch would be quite a burden. For this type of workflow, Concourse has a few important tools to help you out: the set_pipeline step, across, and instanced pipelines.\n\nacross and instanced pipelines are both experimental features, and must be enabled with the feature flags CONCOURSE_ENABLE_ACROSS_STEP and CONCOURSE_ENABLE_PIPELINE_INSTANCES, respectively.\n\nIn this guide, we'll cover:\n\n1. Writing a pipeline to Test, Build \u0026 Deploy a branch to a staging environment. We'll use Terraform for our deployment\n\n2. Tracking Branches in a repository; for each branch, we'll set a pipeline (using the set_pipeline step and across)\n\n3. Automatically Cleaning Up Old Workspaces after branches get merged or deleted\n\n","depth":4,"section_tag":"multi-branch-workflows"},"multiple-worker-keys":{"location":"concourse-generate-key.html#multiple-worker-keys","title":"Multiple Worker Keys","text":"Currently you have one worker_key. You can use this one key-pair with multiple Running a worker nodes. Another good strategy is to have each worker or group of workers use a key that's unique to that one worker or group of workers.\n\nIn the second case you will end up with multiple private and public worker keys. The Running a web node needs to know about all of the public worker keys.  To pass all public worker keys to the Running a web node create a file that contains all of the worker public keys. A common name for this file is authorized_worker_keys.pub. The file should look like this, with one public key per line.\n\n$ cat authorized_worker_keys.pub\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCgKtVnbGRJ7Y63QKoO+loS...\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDU6lA4gSRYIc4MXzphJ2l5...\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDgNU7KBz/QQusPO52pNcea...\nYou should now have all the necessary keys needed to deploy Web and Worker nodes.\n\n","depth":4,"section_tag":"multiple-worker-keys"},"nodejs-example":{"location":"nodejs-example.html","title":"Nodejs application testing example","text":"You can run the tests for a Nodejs application.\n\n","depth":2,"section_tag":"nodejs-example"},"note-on-allow-host-access":{"location":"concourse-worker.html#note-on-allow-host-access","title":"A note on allowing host access and DNS proxy","text":"Setting allow-host-access will, well, allow containers to access your host VM's network. If you don't trust your container workloads, you may not want to allow this.  With host network access, containers will be able to reach out to any other locally running network processes running on the worker including the garden and baggageclaim servers which would allow them to issue commands and manipulate other containers and volumes on the same worker.\n\nSetting dns-proxy-enable will also enable allow-host-access (since the dns proxy will be run on the host, therefore requiring host access be enabled).\n\n","depth":7,"section_tag":"note-on-allow-host-access"},"observation":{"location":"observation.html","title":"Observation","text":"This section outlines everything you need to know for observing the state of your pipelines.\n\n","depth":2,"section_tag":"observation"},"on-abort-hook":{"location":"on-abort-hook.html","title":"on_abort Step Hook","text":"A hook step to execute if the build is aborted and the parent step was running and then terminated.\n\n","depth":4,"section_tag":"on-abort-hook"},"on-error-hook":{"location":"on-error-hook.html","title":"on_error Step Hook","text":"A hook step to execute after the parent step if the parent step terminates abnormally in any way other than those handled by the on_abort or on_failure. This covers scenarios as broad as configuration mistakes, temporary network issues with the workers, or running longer than a timeout.\n\n","depth":4,"section_tag":"on-error-hook"},"on-failure-hook":{"location":"on-failure-hook.html","title":"on_failure Step Hook","text":"A hook step to execute if the parent step fails.\n\nThis does not \"recover\" the failure - it will still fail even if the hook step succeeds. \n\n","depth":4,"section_tag":"on-failure-hook"},"on-success-step":{"location":"on-success-step.html","title":"on_success Step Hook","text":"A hook step to execute if the parent step succeeds.\n\n","depth":4,"section_tag":"on-success-step"},"opa":{"location":"opa.html","title":"Open Policy Agent Integration","text":"The Open Policy Agent (OPA, pronounced “oh-pa”) is an open source, general-purpose policy engine that unifies policy enforcement across the stack.\n\nOPA allows you to create arbitrary rules within Concourse without having to add a new feature to Concourse. You could even recreate Concourse's RBAC system using OPA.\n\nMore likely use-cases are to enforce rules your organization may have, such as not using certain container images or disallowing the use of privileged workloads. With OPA you can be as general or fine-grained as you want, enforcing these rules at the team or pipeline level.\n\nThe next few sections explain how to configure Concourse to talk to an OPA server and how to write OPA rules for Concourse.\n\n","depth":3,"section_tag":"opa"},"operation":{"location":"operation.html","title":"Operation","text":"The following sections describes operator-focused features and tools that Concourse provides, such as monitoring and credential management.\n\nThese concepts are not required to operate Concourse, but are for users that are looking to extend the capabilities of managing a Concourse deployment. For users that are new to these concepts, we do recommend learning how to set up Credential Management and Encryption.\n\n","depth":2,"section_tag":"operation"},"optimize-containers-placement":{"location":"performance-tuning.html#optimize-containers-placement","title":"Container Placement","text":"If you find that workers keep crashing due to high CPU and/or memory usage then you could try specifying a custom container placement strategy or strategy chain. The Container Placement page has some examples of container placement strategy chains you can use.\n\n","depth":4,"section_tag":"optimize-containers-placement"},"other-gc-grace-periods":{"location":"performance-tuning.html#other-gc-grace-periods","title":"Other GC Grace Periods","text":"Depending on what a container was used for and its exit condition, there are various flags you can adjust to make Concourse GC these resources faster or slower. The following env vars cover the cases where you probably don't need the container hanging around for very long. They have a default value of 5m.\n\n* CONCOURSE_GC_ONE_OFF_GRACE_PERIOD - Period after which one-off build containers will be garbage-collected\n\n* CONCOURSE_GC_MISSING_GRACE_PERIOD - Period after which containers and volumes that were created but went missing from the worker will be garbage-collected\n\n* CONCOURSE_GC_HIJACK_GRACE_PERIOD - Period after which hijacked containers will be garbage-collected\n\n","depth":5,"section_tag":"other-gc-grace-periods"},"overview":{"location":"tutorial-inputs-outputs.html#overview","title":"Overview","text":"This section is going to go over how to pass data between different steps in a job. We'll continue building on our hello-world.yml pipeline.\n\nIn the previous section we learned that steps are where we tell Concourse what to run (i.e. run my tests, run this bash script, build this image, etc.). We are going to expand on the concept of steps and show you how to pass artifacts/files between tasks using inputs and outputs.\n\n","depth":4,"section_tag":"overview"},"p2p-web-configuration":{"location":"concourse-worker.html#p2p-web-configuration","title":"P2P Web Configuration","text":"You need to tell the web node(s) to use P2P volume streaming.\n\nCONCOURSE_ENABLE_P2P_VOLUME_STREAMING=true\n\nOnce that flag is set and the web node is restarted, P2P volume streaming will start occurring in your Concourse cluster.\n\n","depth":6,"section_tag":"p2p-web-configuration"},"p2p-worker-configuration":{"location":"concourse-worker.html#p2p-worker-configuration","title":"P2P Worker Configuration","text":"* CONCOURSE_BAGGAGECLAIM_BIND_IP=0.0.0.0 - Required. The worker needs to listen for traffic over 127.0.0.1 (to receive info from the web node) as well as its LAN IP in a P2P setup. Therefore we need to set the IP baggageclaim binds to to 0.0.0.0.\n\n* CONCOURSE_BAGGAGECLAIM_P2P_INTERFACE_NAME_PATTERN=eth0 - Optional. Regular expression to match a network interface for P2P streaming. This is how a worker determines its own LAN IP address, by looking it up via the LAN interface specified by this flag.\n\n  You can determine the name of the LAN interface for any worker by listing all network interfaces and noting which interface has the LAN IP that you want the worker to use.\n\n  To view all available network interfaces on your worker: * On Linux run ip addr list\n\n  * On MacOS run ifconfig\n\n  * On Windows run ipconfig. Windows network interface names are very different from Unix device names. Example network interface names for Windows include: Ethernet 4\n    Local Area Connection* 2\n    Local Area Connection* 12\n    Wi-Fi 5\n    Bluetooth Network Connection 2\n    Loopback Pseudo-Interface 1\n\n* CONCOURSE_BAGGAGECLAIM_P2P_INTERFACE_FAMILY=4 - Optional. Tells the worker to use IPv4 or IPv6. Defaults to 4 for IPv4. Set to 6 for IPv6.\n\n","depth":6,"section_tag":"p2p-worker-configuration"},"parallelizing-get-steps-in-jobs":{"location":"common-pipeline-practices.html#parallelizing-get-steps-in-jobs","title":"Parallelizing Get Steps in Jobs","text":"All jobs usually have get steps as their first set of steps.\n\njobs:\n- name: awesome-job\n  plan:\n  - get: cool-code\n  - get: funny-binary\n  - get: the-weather\n  - task: business-stuff\nTo reduce the waiting time to the length of the longest running get step, put all get steps under an in_parallel step.\n\njobs:\n- name: awesome-job\n  plan:\n  - in_parallel:\n    - get: cool-code\n    - get: funny-binary\n    - get: the-weather\n  - task: business-stuff\n","depth":5,"section_tag":"parallelizing-get-steps-in-jobs"},"passing-outputs-to-another-task":{"location":"tutorial-inputs-outputs.html#passing-outputs-to-another-task","title":"Passing outputs to another task","text":"To pass artifacts from one task to another, the first task must declare an output. The second task must then declare an input with the exact same name. Let's update the pipeline to do the following:\n\n* Have the first task create a file inside the-artifact\n\n* Create a second task to read the file inside the-artifact from the previous step\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource: \u0026image # Declaring a YAML anchor\n        type: registry-image\n        source:\n          repository: busybox\n      outputs:\n      - name: the-artifact\n      run:\n        # This is a neat way of embedding a script into a task\n        path: sh\n        args:\n        - -cx\n        - |\n          ls -l .\n          echo \"hello from another step!\" \u003e the-artifact/message\n  # Add a second task that reads the contents of the-artifact/message\n  - task: read-the-artifact\n    config:\n      platform: linux\n      image_resource: *image\n      # To receive \"the-artifact\", specify it as an input\n      inputs:\n      - name: the-artifact\n      run:\n        path: sh\n        args:\n        - -cx\n        - |\n          ls -l .\n          cat the-artifact/message\nUpdate the pipeline and trigger the job: $ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml\n$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch\n\ninitializing\nselected worker: 57d7419112ca\nrunning sh -cx ls -l .\necho \"hello from another step!\" \u003e the-artifact/message\n\n+ ls -l .\ntotal 4\ndrwxr-xr-x    2 root     root          4096 Feb 26 19:09 the-artifact\n+ echo 'hello from another step!'\ninitializing\nselected worker: 57d7419112ca\nrunning sh -cx ls -l .\ncat the-artifact/message\n\n+ ls -l .\ntotal 4\ndrwxr-xr-x    1 root     root          4096 Feb 26 19:09 the-artifact\n+ cat the-artifact/message\nhello from another step!\nsucceeded\n\n\nIt's a bit hard to see when the first task stops and the second one starts in the terminal. Looking at the build from the web UI makes this clearer:\n\nimages/tutorial/hello-world-passing-artifacts.pngWith the above pipeline we can see that the file made in the first step is made available in the second step via the the-artifact.\n\n","depth":4,"section_tag":"passing-outputs-to-another-task"},"performance-tuning":{"location":"performance-tuning.html","title":"Performance Tuning","text":"By default Concourse is configured to feel very snappy. This is good for when you are first trying out Concourse or using it on a small team with a few dozen pipelines.\n\nWhen you begin trying to scale Concourse is where fires can start breaking out. This section will go over some configuration values in Concourse that you can change to make scaling easier.\n\n","depth":3,"section_tag":"performance-tuning"},"php-example":{"location":"php-example.html","title":"PHP application testing example","text":"You can run the tests for a PHP application.\n\n","depth":2,"section_tag":"php-example"},"pipeline-guides":{"location":"pipeline-guides.html","title":"Pipeline Guides","text":"","depth":3,"section_tag":"pipeline-guides"},"pipeline-management":{"location":"performance-tuning.html#pipeline-management","title":"Pipeline Management","text":"Here are some flags you can set on the web node to help manage the amount of resources pipelines consume. These flags are mostly about ensuring pipelines don't run forever without good reason.\n\n","depth":4,"section_tag":"pipeline-management"},"pipeline-static-vars":{"location":"setting-pipelines.html#pipeline-static-vars","title":"Providing static values for vars","text":"The pipeline configuration can contain Vars which may be replaced with static values or loaded at runtime. This allows for credentials to be extracted from a pipeline config, making it safe to check in to a public repository or pass around.\n\nFor example, if you have a pipeline.yml as follows:\n\nresources:\n- name: private-repo\n  type: git\n  source:\n    uri: git@...\n    branch: master\n    private_key: ((private-repo-key))\n...you could then configure this pipeline like so:\n\n$ fly -t example set-pipeline \\\n    --pipeline my-pipeline \\\n    --config pipeline.yml \\\n    --var \"private-repo-key=$(cat id_rsa)\"\nOr, if you had a vars.yml as follows:\n\nprivate-repo-key: |\n  -----BEGIN RSA PRIVATE KEY-----\n  ...\n  -----END RSA PRIVATE KEY-----\n...you could configure it like so:\n\n$ fly -t example set-pipeline \\\n    --pipeline my-pipeline \\\n    --config pipeline.yml \\\n    --load-vars-from vars.yml\nYou can use nested fields in your pipeline.yml as follows: resources:\n- name: private-repo\n  type: git\n  source:\n    uri: git@((repo.uri))\n    branch: ((repo.branch))\n    private_key: ((\"github.com\".private-repo-key))\n\n\n...you could configure it by --load-vars-from with a vars.yml as follows:\n\nrepo:\n  uri: github.com/...\n  branch: master\ngithub.com:\n  private-repo-key: |\n    -----BEGIN RSA PRIVATE KEY-----\n    ...\n    -----END RSA PRIVATE KEY-----\n...or you could also configure it by passing the vars as flags:\n\n$ fly -t example set-pipeline \\\n    --pipeline my-pipeline \\\n    --config pipeline.yml \\\n    --var \"repo.uri=github.com\" \\\n    --var \"repo.branch=master\" \\\n    --var \"\\\"github.com\\\".private-repo-key=$(cat id_rsa)\"\nWhen configuring a pipeline, any vars not provided statically will be left to resolve at runtime. To check that all vars are resolveable, you can pass the --check-creds flag:\n\n$ fly -t example set-pipeline \\\n    --pipeline my-pipeline \\\n    --config pipeline.yml \\\n    --load-vars-from vars.yml \\\n    --check-creds\nThis will fill in all statically-provided vars and then attempt to resolve all remanining vars server-side. If any fail to resolve, configuring the pipeline will fail.\n\n","depth":5,"section_tag":"pipeline-static-vars"},"pipeline-vars-example":{"location":"pipeline-vars-example.html","title":"Pipeline ((vars)) example","text":"You can use params in a pipelines configuration file.\n\n","depth":2,"section_tag":"pipeline-vars-example"},"pipeline-visibility":{"location":"observation.html#pipeline-visibility","title":"Pipeline Visibility","text":"Pipelines may be exposed so that they can be monitored without having to authenticate. For more information, see Pipeline \u0026 Build Visibility.\n\n","depth":3,"section_tag":"pipeline-visibility"},"pipelines":{"location":"pipelines.html","title":"Pipelines","text":"A pipeline is the result of configuring Jobs and Resources together. When you configure a pipeline, it takes on a life of its own, to continuously detect resource versions and automatically queue new builds for jobs as they have new available inputs.\n\nThe name of a pipeline has a few restrictions that are outlined here: identifier schema.\n\nPipelines are configured via fly set-pipeline or the set_pipeline step as declarative YAML files which conform to the following schema:\n\n","depth":2,"section_tag":"pipelines"},"pointing-to-external-dns-servers":{"location":"concourse-worker.html#pointing-to-external-dns-servers","title":"Pointing to external DNS servers","text":"If you have no need for special DNS resolution within your Concourse containers, you can configure your containers to use specific DNS server addresses external to the VM.\n\nThe Guardian and containerd runtimes can have their DNS servers configured with flags or envs vars.\n\nconcourse worker --containerd-dns-server=\"1.1.1.1\" --containerd-dns-server=\"8.8.8.8\"\n# containerd runtime\nCONCOURSE_CONTAINERD_DNS_SERVER=\"1.1.1.1,8.8.8.8\"\n# Guardian runtime\nCONCOURSE_GARDEN_DNS_SERVER=\"1.1.1.1,8.8.8.8\"\n[server]\n; configure Google DNS\ndns-server=8.8.8.8\ndns-server=8.8.4.4\nTo verify this solves your problem you can fly intercept into a container and check which nameservers are in /etc/resolv.conf:\n\n$ fly -t ci intercept -j my-pipeline/the-job\nbash-5.0$ cat /etc/resolv.conf\nnameserver 1.1.1.1\nnameserver 8.8.8.8\nbash-5.0$ ping google.com\nPING google.com (108.177.111.139): 56 data bytes\n64 bytes from 108.177.111.139: seq=0 ttl=47 time=2.672 ms\n64 bytes from 108.177.111.139: seq=1 ttl=47 time=0.911 ms\n","depth":7,"section_tag":"pointing-to-external-dns-servers"},"postgresql-node":{"location":"postgresql-node.html","title":"Running a PostgreSQL node","text":"Concourse uses PostgreSQL for storing all data and coordinating work in a multi-Running a web node installation.\n\n","depth":3,"section_tag":"postgresql-node"},"project":{"location":"project.html","title":"Project","text":"Concourse began as a side-project by @vito (hi!) and @xoebus in 2014. Since then, Concourse has evolved into a dedicated community with contributors from all around the world.\n\n","depth":1,"section_tag":"project"},"publish-the-container-image":{"location":"building-and-pushing-an-image.html#publish-the-container-image","title":"Publish the Container Image","text":"To push the container image add a put step to our job plan and tell the registry-image resource where the tarball of the container image is.\n\nThe put step will push the container image using the information defined previously in the resource's source.\n\nresources: ... # omitting resource section from above\n\njobs:\n- name: build-and-push\n  plan:\n  - get: concourse-examples\n  - task: build-image\n    privileged: true # oci-build-task must run in a privileged container\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: concourse/oci-build-task\n      inputs:\n      - name: concourse-examples\n      outputs:\n      - name: image\n      params:\n        CONTEXT: concourse-examples/Dockerfiles/simple\n      run: # binary used to build the image\n        path: build\n  - put: simple-image\n    params:\n      image: image/image.tar\n","depth":5,"section_tag":"publish-the-container-image"},"put":{"location":"put-step.html#put","title":"put step","text":"","depth":3,"section_tag":"put-step"},"put-step":{"location":"put-step.html","title":"put step","text":"Pushes to the given resource. Expand each section below for more details and examples.\n\n","depth":3,"section_tag":"put-step"},"put-steps":{"location":"tutorial-resources.html#put-steps","title":"Put Steps","text":"The last piece of the resource interface is put steps. Put steps are generally for pushing some change to the external system or object the resource represents. What this means will vary by resource, so again, you should carefully read the documentation for the specific resource you are using. Each resource is basically its own little application.\n\nIn order to \"put\" something, in the context of the git resource, we'll need to make a commit that can then be \"put\" to the repo.\n\nIf you haven't already, you'll probably need to provide the git resource with your private_key or a username and password, depending on the format of uri you provided.\n\nIf you're used to pushing code from your computer you probably have a private key in your ~/.ssh/ directory that you can use.\n\nresources:\n- name: repo\n  type: git\n  source:\n    # changed uri to ssh format\n    uri: git@github.com:concourse/examples.git\n    # specify branch because it's required for the put step\n    branch: master\n    private_key: |\n      -----BEGIN OPENSSH PRIVATE KEY-----\n      ...\n      -----END OPENSSH PRIVATE KEY-----\n\njobs:\n- name: hello-world-job\n  plan:\n  - get: repo\n    trigger: true\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      inputs:\n      - name: repo\n      run:\n        path: cat\n        args: [\"repo/README.md\"]\nNext let's change the hello-world-task to instead create a commit. Since we want the commit to propagate to future steps, specifically the put step we'll be adding soon, we will also need to add the repo as an output of the task.\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: git@github.com:concourse/examples.git\n    branch: master\n    private_key: |\n      -----BEGIN OPENSSH PRIVATE KEY-----\n      ...\n      -----END OPENSSH PRIVATE KEY-----\n\njobs:\n- name: hello-world-job\n  plan:\n  - get: repo\n    trigger: true\n  - task: create-commit # renamed task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: gitea/gitea # use any image that has the git cli\n      inputs:\n      - name: repo\n      outputs: # Add repo as an output\n      - name: repo\n      params: # Change these to match your ssh key info\n        EMAIL: person@example.com\n        GIT_AUTHOR_NAME: Person Doe\n      run:\n        path: sh\n        args:\n        - -cx\n        # this is just a bash script\n        - |\n          cd repo\n          date +%Y-%m-%d \u003e todays-date\n          git add ./todays-date\n          git config --global user.email $EMAIL\n          git config --global user.name $GIT_AUTHOR_NAME\n          git commit -m \"Update todays date\"\nLastly we can add a put step to push the commit made by the task. Put steps usually have various params that you'll need to set in order run the step correctly. If we read the documentation for the git resource we'll see that we need to specify repository field.\n\nIf you're wondering why we don't do git push from the task, that's for two reasons: 1. The newly made commit represents a new version and Concourse won't capture it correctly if it's pushed from the task, which is outside of the resource interface (check, get, put).\n\n2. The private_key is not available in the task so you would get an authentication error if you git pushed.\n\n\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: git@github.com:concourse/examples.git\n    branch: master\n    private_key: |\n      -----BEGIN OPENSSH PRIVATE KEY-----\n      ...\n      -----END OPENSSH PRIVATE KEY-----\n\njobs:\n- name: hello-world-job\n  plan:\n  - get: repo\n    trigger: true\n  - task: create-commit\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: gitea/gitea\n      inputs:\n      - name: repo\n      outputs:\n      - name: repo\n      params:\n        EMAIL: person@example.com\n        GIT_AUTHOR_NAME: Person Doe\n      run:\n        path: sh\n        args:\n        - -cx\n        - |\n          cd repo\n          date +%Y-%m-%d \u003e todays-date\n          git add ./todays-date\n          git config --global user.email $EMAIL\n          git config --global user.name $GIT_AUTHOR_NAME\n          git commit -m \"Update todays date\"\n  - put: repo\n    params:\n      repository: repo\nSet the pipeline and let's watch it trigger and run from the web UI.\n\n$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml\nThe job now has the repo resource to the left and right of the hello-world-job. This is how Concourse visually represents the inputs (get steps) and outputs (put steps) of a job.\n\nThat covers the basics of resources. It is best of think of each resource as a little application, so carefully read any documentation the resource author has provided. Every resource behaves a little differently based on the external system it is representing.\n\n","depth":4,"section_tag":"put-steps"},"putting-task-configs-in-files":{"location":"common-pipeline-practices.html#putting-task-configs-in-files","title":"Putting Task Configs in Files","text":"A lot of the pipeline examples that you will find on this site and in resource repos will embed a task step config directly in the pipeline. This is a nice way of clearly seeing what inputs/outputs the task uses. Tasks are usually designed to be used in multiple places, maybe with slightly different configuration. To support this scenario, most users store task configs in files instead of embedding the config directly in the pipeline.\n\nHere's what this looks like in practice:\n\nplatform: linux\n\nimage_resource: # define a default image for the task to use\n  type: registry-image\n  source:\n    repository: busybox\n\nrun:\n  path: date\n  args: [\"+%Y-%m-%d\"]\n \n\nUsing the task in a pipeline:\n\nresources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\njobs:\n- name: the-best-job\n  plan:\n  - get: ci\n  - task: today\n    file: ci/tasks/print-date.yml\n","depth":5,"section_tag":"putting-task-configs-in-files"},"quick-start":{"location":"quick-start.html","title":"Quick Start","text":"","depth":3,"section_tag":"quick-start"},"rails-example":{"location":"rails-example.html","title":"Rails application testing example","text":"You can run the tests for a Rails that requires a specific version of ruby and relies on a Postgres database.\n\n","depth":2,"section_tag":"rails-example"},"random-strategy":{"location":"container-placement.html#random-strategy","title":"The random strategy","text":"With the random strategy, the Running a web node places get, put and task containers on any worker, ignoring any affinity.\n\nAs this is truly random, this will be fine until one day it's not fine.\n\nTo use this strategy, set the following env var on the Running a web node:\n\nCONCOURSE_CONTAINER_PLACEMENT_STRATEGY=random\n","depth":4,"section_tag":"random-strategy"},"reducing-redundant-data":{"location":"global-resources.html#reducing-redundant-data","title":"Reducing redundant data","text":"The majority of Concourse resources will benefit from having versions shared globally because most resource versions have an external source of truth.\n\nFor example, a check for the git resource that pulls in the concourse/concourse repository will always return the same set of versions as an equivalent resource pointing to the same repository. By consolidating the checks and the versions, there will essentially only be one set of versions collected from the repository and saved into the database.\n\n","depth":5,"section_tag":"reducing-redundant-data"},"references":{"location":"php-example.html#references","title":"References","text":"* Jobs\n\n* Steps\n\n* Tasks\n\n","depth":3,"section_tag":"references"},"reliable-resource-version-history":{"location":"global-resources.html#reliable-resource-version-history","title":"Reliable Resource Version History","text":"Prior to global resources, a resource's version history was directly associated to the resource name. This meant that any changes to a resource's configuration without changing its name would basically append the versions from the new configuration after the old versions, which are no longer accurate to the current configuration.\n\nGlobal resources instead associates the resource versions to the resource's resource.type and resource.source. Therefore, whenever a resource definition changes, the versions will \"reset\" and change along with it, resulting in truthful and reliable version histories.\n\n","depth":5,"section_tag":"reliable-resource-version-history"},"reloading-worker-authorized-key":{"location":"concourse-web.html#reloading-worker-authorized-key","title":"Reloading worker authorized key","text":"While Running concourse web, the authorized worker key file, which contains all public keys for the workers, is loaded at startup. During the lifecycle of a Running a web node new worker keys might be added or old ones removed. To perform a live reload of this file you can send a SIGHUP signal to the concourse web process. The process will remain running and Concourse will reload the authorized worker key file.\n\n","depth":5,"section_tag":"reloading-worker-authorized-key"},"resource-certs":{"location":"implementing-resource-types.html#resource-certs","title":"Certificate Propagation","text":"Certificates can be automatically propagated into each resource container, if the worker is configured to do so. The BOSH release configures this automatically, while the concourse binary must be given a --certs-dir flag pointing to the path containing the CA certificate bundle.\n\nThe worker's certificate directory will then be always mounted at /etc/ssl/certs, read-only, in each resource container created on the worker. There's no single standard path for this, so we picked one that would work out of the box in most cases.\n\nThis approach to certificate configuration is similar in mindset to the propagation of http_proxy/https_proxy - certs are kind of a baseline assumption when deploying software, so Concourse should do its best to respect it out-of-the-box, especially as they're often used in tandem with a man-in-the-middle corporate SSL proxy. (In this way it doesn't feel too much like the anti-pattern of hand-tuning workers.)\n\n","depth":4,"section_tag":"resource-certs"},"resource-check":{"location":"implementing-resource-types.html#resource-check","title":"check: Check for new versions.","text":"A resource type's check script is invoked to detect new versions of the resource. It is given the configured source and current version on stdin, and must print the array of new versions, in chronological order (oldest first), to stdout, including the requested version if it's still valid.\n\nThe request body will have the following fields:\n\n* source is an arbitrary JSON object which specifies the location of the resource, including any credentials. This is passed verbatim from the resource configuration.\n\n  For the git resource this would be the repo URI, the branch, and the private key, if necessary.\n\n* version is a JSON object with string fields, used to uniquely identify an instance of the resource. For git this would be the commit's SHA.\n\n  This will be omitted from the first request, in which case the resource should return the current version (not every version since the resource's inception).\n\nFor example, here's what the input for the git resource may look like:\n\n{\n  \"source\": {\n    \"uri\": \"git://some-uri\",\n    \"branch\": \"develop\",\n    \"private_key\": \"...\"\n  },\n  \"version\": { \"ref\": \"61cbef\" }\n}\nUpon receiving this payload the git resource would probably do something like:\n\n[ -d /tmp/repo ] || git clone git://some-uri /tmp/repo\ncd /tmp/repo\ngit pull \u0026\u0026 git log 61cbef..HEAD\nNote that it conditionally clones; the container for checking versions is reused between checks, so that it can efficiently pull rather than cloning every time.\n\nAnd the output, assuming d74e01 is the commit immediately after 61cbef:\n\n[\n  { \"ref\": \"61cbef\" },\n  { \"ref\": \"d74e01\" },\n  { \"ref\": \"7154fe\" }\n]\nThe list may be empty, if there are no versions available at the source. If the given version is already the latest, an array with that version as the sole entry should be listed.\n\nIf your resource is unable to determine which versions are newer than the given version (e.g. if it's a git commit that was push -fed over), then the current version of your resource should be returned (i.e. the new HEAD).\n\n","depth":4,"section_tag":"resource-check"},"resource-checking":{"location":"performance-tuning.html#resource-checking","title":"Resource Checking","text":"By default Concourse checks any given resource every ~1min. This makes Concourse feel snappy when you first start using it. Once you start trying to scale though the amount of checks can begin to feel aggressive. The following settings can help you reduce the load caused by resource checking.\n\n","depth":4,"section_tag":"resource-checking"},"resource-defaults":{"location":"concourse-web.html#resource-defaults","title":"Configuring defaults for resource types","text":"Defaults for the \"core\" resource types (those that show up under the Concourse org) that comes with Concourse can be set cluster-wide by passing in a configuration file. The format of the file is the name of the resource type followed by an arbitrary configuration.\n\nDocumentation for each resource type's configuration is in each implementation's README.\n\nCONCOURSE_BASE_RESOURCE_TYPE_DEFAULTS=./defaults.yml\nFor example, a defaults.yml that configures the entire cluster to use a registry mirror would have: registry-image:\n  registry_mirror:\n    host: https://registry.mirror.example.com\n\n\n","depth":5,"section_tag":"resource-defaults"},"resource-in":{"location":"implementing-resource-types.html#resource-in","title":"in: Fetch a given resource.","text":"The in script is passed a destination directory as command line argument $1, and is given on stdin the configured source and a precise version of the resource to fetch.\n\nThe script must fetch the resource and place it in the given directory.\n\nIf the desired resource version is unavailable (for example, if it was deleted), the script must exit with error.\n\nThe script must emit the fetched version, and may emit metadata as a list of key-value pairs. This data is intended for public consumption and will make it upstream, intended to be shown on the build's page.\n\nThe request will contain the following fields:\n\n* source is the same value as passed to check: Check for new versions..\n\n* version is the same type of value passed to check: Check for new versions., and specifies the version to fetch.\n\n* params is an arbitrary JSON object passed along verbatim from get step params on a get step.\n\nExample request, in this case for the git resource:\n\n{\n  \"source\": {\n    \"uri\": \"git://some-uri\",\n    \"branch\": \"develop\",\n    \"private_key\": \"...\"\n  },\n  \"version\": { \"ref\": \"61cebf\" }\n}\nUpon receiving this payload the git resource would probably do something like:\n\ngit clone --branch develop git://some-uri $1\ncd $1\ngit checkout 61cebf\nAnd output:\n\n{\n  \"version\": { \"ref\": \"61cebf\" },\n  \"metadata\": [\n    { \"name\": \"commit\", \"value\": \"61cebf\" },\n    { \"name\": \"author\", \"value\": \"Hulk Hogan\" }\n  ]\n}\n","depth":4,"section_tag":"resource-in"},"resource-interface":{"location":"tutorial-resources.html#resource-interface","title":"Resource Interface","text":"Resources are container images that contain three executables. Each executable is run by a different type of step within a pipeline:\n\n* /opt/resource/check - implicitly run when a job contains a get step. Should return the latest version from the external system or object. Its responsibility is to find new versions.\n\n* /opt/resource/in - run in a get step. in is given a specific version (generated by a check or put step) and retrieves the files and information representing that version from the external system or object.\n\n* /opt/resource/out - run in a put step. Generates a new version, usually based on some input generated by another step in the job. Depending on the resource, this may mean sending something to the external system. For the git resource, this means pushing commits to the external git repository.\n\nThat's a high-level overview of the resource interface, which should help you understand what's going on with resources when we start adding them to our pipeline in the next section.\n\n","depth":4,"section_tag":"resource-interface"},"resource-metadata":{"location":"implementing-resource-types.html#resource-metadata","title":"Metadata","text":"When used in a get step or a put step, metadata about the running build is made available via the following environment variables:\n\n$BUILD_ID: The internal identifier for the build. Right now this is numeric, but it may become a UUID in the future. Treat it as an absolute reference to the build.\n\n\n$BUILD_NAME: The build number within the build's job.\n\n\n$BUILD_JOB_NAME: The name of the build's job.\n\n\n$BUILD_PIPELINE_NAME: The name of the pipeline that the build's job lives in.\n\n\n$BUILD_PIPELINE_INSTANCE_VARS: The instance vars of the instanced pipeline that the build's job lives in, serialized as JSON. See Grouping Pipelines for a definition of instanced pipelines.\n\n\n$BUILD_TEAM_NAME: The team that the build belongs to.\n\n\n$BUILD_CREATED_BY: The username that created the build. By default it is not available. See expose_build_created_by for how to opt in. This metadata field is not made available to the get step.\n\n\n$ATC_EXTERNAL_URL: The public URL for your ATC; useful for debugging.\n\n\n\nIf the build is a one-off, $BUILD_NAME, $BUILD_JOB_NAME, $BUILD_PIPELINE_NAME, and $BUILD_PIPELINE_INSTANCE_VARS will not be set.\n\nAdditionally, $BUILD_PIPELINE_INSTANCE_VARS will not be set if the build's pipeline has no instance vars (i.e. is not an instanced pipeline).\n\nNone of these variables are available to check: Check for new versions..\n\nThese variables should be used solely for annotating things with metadata for traceability, i.e. for linking to the build in an alert or annotating an automated commit to facilitate its origin discovery.\n\nThey should not be used to emulate versioning (e.g. by using the increasing build number). They are not provided to task steps to avoid this anti-pattern.\n\n","depth":4,"section_tag":"resource-metadata"},"resource-out":{"location":"implementing-resource-types.html#resource-out","title":"out: Update a resource.","text":"The out script is passed a path to the directory containing the build's full set of sources as command line argument $1, and is given on stdin the configured params and the resource's source configuration.  \n\nThe script must emit the resulting version of the resource. For example, the git resource emits the SHA of the commit that it has just pushed.\n\nAdditionally, the script may emit metadata as a list of key-value pairs. This data is intended for public consumption and will make it upstream, intended to be shown on the build's page.\n\nThe request will contain the following fields:\n\n* source is the same value as passed to check: Check for new versions..\n\n* params is an arbitrary JSON object passed along verbatim from get step params on a put step.\n\nExample request, in this case for the git resource:\n\n{\n  \"params\": {\n    \"branch\": \"develop\",\n    \"repo\": \"some-repo\"\n  },\n  \"source\": {\n    \"uri\": \"git@...\",\n    \"private_key\": \"...\"\n  }\n}\nUpon receiving this payload the git resource would probably do something like:\n\ncd $1/some-repo\ngit push origin develop\nAnd output:\n\n{\n  \"version\": { \"ref\": \"61cebf\" },\n  \"metadata\": [\n    { \"name\": \"commit\", \"value\": \"61cebf\" },\n    { \"name\": \"author\", \"value\": \"Mick Foley\" }\n  ]\n}\n","depth":4,"section_tag":"resource-out"},"resource-types":{"location":"resource-types.html","title":"Resource Types","text":"Each resource in a pipeline has a type. The resource's type determines what versions are detected, the bits that are fetched when the resource's get step runs, and the side effect that occurs when the resource's put step runs.\n\nConcourse comes with a few \"core\" resource types to cover common use cases like git and s3 - the rest are developed and supported by the Concourse community. An exhaustive list of all resource types is available in the Resource Types catalog.\n\nA pipeline's resource types are listed under pipeline.resource_types with the following schema:\n\nResource Types can be used to extend the functionality of your pipeline and provide deeper integrations. This example uses one to trigger a job whenever a new Dinosaur Comic is out.\n\n---\nresource_types:\n- name: rss\n  type: registry-image\n  source:\n    repository: suhlig/concourse-rss-resource\n    tag: latest\n\nresources:\n- name: booklit-releases\n  type: rss\n  source:\n    url: http://www.qwantz.com/rssfeed.php\n\njobs:\n- name: announce\n  plan:\n  - get: booklit-releases\n    trigger: true\n","depth":2,"section_tag":"resource-types"},"resource-versions":{"location":"resource-versions.html","title":"Resource Versions","text":"As you may know, resources represent external state that changes over time. But how do we track those changes in a generic way that will properly represent all the different resource types? That is where resource versions are introduced. Concourse uses versions to represent the exact changes of a resource over time.\n\nThe versions of a resource are directly dependent on its resource configuration and resource type. Each resource type has its own definition of what its versions should be. For example, the versions of a git resource would be the commits of the github repository and the versions of a docker image resource are the image digests.\n\nIf you want to figure out what determines the version of a resource type, it is typically outlined in the `check` behavior for the resource type. For example, the git resource uses commits as versions git resource type check behavior.\n\n","depth":3,"section_tag":"resource-versions"},"resources":{"location":"resources.html","title":"Resources","text":"Resources are the heart and soul of Concourse. They represent all external inputs to and outputs of jobs in the pipeline.\n\nEach resource represents a versioned artifact with an external source of truth. Configuring the same resource in any pipeline on any Concourse cluster will behave the exact same way. Concourse will continuously check each configured resource to discover new versions. These versions then flow through the pipeline via get steps configured on Jobs.\n\nMore concretely, resources are containers that run on your workers. See Implementing a Resource Type for more details.\n\nA pipeline's resources are listed under pipeline.resources with the following schema.\n\n","depth":2,"section_tag":"resources"},"restarting-a-worker":{"location":"concourse-worker.html#restarting-a-worker","title":"Restarting a Worker","text":"Workers can be restarted in-place by sending SIGTERM to the worker process and starting it back up. Containers will remain running and Concourse will reattach to builds that were in flight.\n\nThis is a pretty aggressive way to restart a worker, and may result in errored builds - there are a few moving parts involved and we're still working on making this airtight.\n\nA safer way to restart a worker is to land it by sending SIGUSR1 to the worker process. This will switch the worker to the landing state and Concourse will stop scheduling new work on it. When all builds running on the worker have finished, the process will exit.\n\nYou may want to enforce a timeout for draining - that way a stuck build won't prevent your workers from being upgraded. This can be enforced by common tools like start-stop-daemon:\n\nstart-stop-daemon \\\n  --pidfile worker.pid \\\n  --stop \\\n  --retry USR1/300/TERM/15/KILL\nThis will send SIGUSR1, wait up to 5 minutes, and then send SIGTERM. If it's still running, it will be killed after an additional 15 seconds.\n\nOnce the timeout is enforced, there's still a chance that builds that were running will continue when the worker comes back.\n\n","depth":5,"section_tag":"restarting-a-worker"},"restarting-and-upgrading":{"location":"concourse-web.html#restarting-and-upgrading","title":"Restarting \u0026 Upgrading","text":"The web nodes can be killed and restarted willy-nilly. No draining is necessary; if the web node was orchestrating a build it will continue where it left off when it comes back, or the build will be picked up by one of the other web nodes.\n\nTo upgrade a web node, stop its process and start a new one using the newly installed concourse. Any database migrations will be run automatically on start. If web nodes are started in parallel, only one will run the migrations.\n\nWe don't currently guarantee a lack of funny-business if you're running mixed Concourse versions - database migrations can perform modifications that confuse other web nodes. So there may be some turbulence during a rolling upgrade, but everything should stabilize once all web nodes are running the latest version.\n\nIf you want more control over when the database migrations happen and know if they were successful you can use the concourse migrate command. The migrate command accepts the same CONCOURSE_POSTGRES_* env vars as the concourse web command.\n\n","depth":5,"section_tag":"restarting-and-upgrading"},"risks-and-side-effects":{"location":"global-resources.html#risks-and-side-effects","title":"Risks and Side Effects","text":"","depth":4,"section_tag":"risks-and-side-effects"},"rotating-the-encryption-key":{"location":"encryption.html#rotating-the-encryption-key","title":"Rotating the Encryption Key","text":"To swap out the encryption key, you'll need to pass the previous key as --old-encryption-key (or old_encryption_key), and the new key as --encryption-key (or encryption_key).\n\nOn startup, the Running a web node will decrypt all existing data and re-encrypt it with the new key, in one go. If it encounters a row which is already encrypted with the new key, it will continue on (as may be the case when restarting with the flags again, or if the ATC died in the middle of rotating).\n\nIf the ATC encounters a row which cannot be decrypted with neither the old key nor the new one, it will log loudly and fail to start, telling you which row it choked on. This data must be dealt with in some way, either by re-configuring the key the row was encrypted with as the old key, or manually performing database surgery to remove the offending row. Hopefully this doesn't happen to you!\n\n","depth":4,"section_tag":"rotating-the-encryption-key"},"run-the-pipeline":{"location":"tutorial-hello-world.html#run-the-pipeline","title":"Run the pipeline","text":"That's the whole pipeline! You can now set it, unpause, and trigger it using the fly cli. You can then view it from the web ui.\n\n$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml\n# pipelines are paused when first created\n$ fly -t tutorial unpause-pipeline -p hello-world\n# trigger the job and watch it run to completion\n$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch\nYou'll see extra output than what we're showing below (the busybox image being downloaded) but the last four lines will be the task executing.\n\nselected worker: 701785fa43a1\nrunning echo Hello world!\nHello world!\nsucceeded\nYou can also view the build from the web UI by clicking on the job and expanding the hello-world-task step.\n\nimages/tutorial/hello-world-first-build.gifCongratulations on building your first Concourse pipeline!\n\nIn the next section we will build upon what we have learned about tasks and introduce inputs and outputs, which allow you to pass files between tasks.\n\nIf you have any feedback for this tutorial please share it in this GitHub discussion\n\n","depth":4,"section_tag":"run-the-pipeline"},"running-tasks":{"location":"tasks.html#running-tasks","title":"Running tasks with fly execute","text":"One of the most common use cases of fly is taking a local project on your computer and setting it up with a task configuration to be run inside a container in Concourse. This is useful to build Linux projects on OS X or to avoid all of those debugging commits when something is configured differently between your local and remote setup.\n\nYou can execute a task like this:\n\n$ fly -t example execute --config tests.yml\nYour files will be uploaded and the task will be executed with them. The working directory name will be used as the input name. If they do not match, you must specify -i name=. instead, where name is the input name from the task configuration.\n\nFly will automatically capture SIGINT and SIGTERM and abort the build when received. This allows it to be transparently composed with other toolchains.\n\nBy default, Running tasks with fly execute will not send extra files or large files in your current directory that would normally be ignored by your version control system. You can use the --include-ignored flag in order to send ignored files to Concourse along with those that are not ignored.\n\nIf your task needs to run as root, then you can specify the -p or --privileged flag.\n\nTasks in Concourse can take multiple inputs. Up until now we've just been submitting a single input (our current working directory) that has the same name as the directory.\n\nTasks must specify the inputs that they require as task-config.inputs. For fly to upload these inputs you can use the -i or --input arguments with name and path pairs. For example:\n\n$ fly -t example execute \\\n    --config build-stemcell.yml \\\n    --input code=. \\\n    --input stemcells=../stemcells\nThis would work together with a build-stemcell.yml if its inputs: section was as follows:\n\ninputs:\n- name: code\n- name: stemcells\nIf you specify an input, then the default input will no longer be added automatically, and you will need to explicitly list it (as with the code input above).\n\nThis feature can be used to mimic other resources and try out input combinations that would normally not be possible in a pipeline.\n\nIf the --inputs-from flag is given, the specified job will be looked up in the pipeline, and the one-off build will base its inputs on those currently configured for the job.\n\nIf any --input flags are given (see above), they will override the base set of inputs.\n\nFor example:\n\n$ fly -t example execute \\\n    --config task.yml \\\n    --inputs-from main/integration \\\n    --input foo=./foo\nThis will trigger a one-off-build using the task.yml task config, basing its inputs on the latest candidates for the integration job in the main pipeline, with the foo input overridden to specify local code to run.\n\nThis can be used to more closely replicate the state in CI when weeding out flakiness, or as a shortcut for local development so that you don't have to upload every single resource from your local machine.\n\nWhen using --inputs-from as above, you can additionally specify which input to use as the task's image by passing --image input-name.\n\nFor example, the following pipeline fetches an image via a get step and uses it for task step image:\n\nresources:\n- name: my-repo\n  type: git\n  source: {uri: https://example.com}\n\n- name: some-image\n  type: registry-image\n  source: {repository: ubuntu}\n\njobs:\n- name: integration\n  plan:\n  - get: my-repo\n  - get: some-image\n  - task: my-task\n    file: my-repo/task.yml\n    image: some-image\n...so to run the same task with the same image in a one-off build, you would run:\n\n$ fly -t example execute \\\n    --config task.yml \\\n    --inputs-from main/integration \\\n    --image some-image\nIf a task specifies outputs, then you're able to extract these back out of the build and back to your local system. For example:\n\n$ fly -t example execute \\\n    --config build-stemcell.yml \\\n    --input code=. \\\n    --output stemcell=/tmp/stemcell\nThis would work together with a build-stemcell.yml, if its outputs: section was as follows:\n\noutputs:\n- name: stemcell\nThis feature is useful to farm work out to your Concourse server to build things in a repeatable manner.\n\nAny params listed in the task configuration can be specified by using environment variables.\n\nSo, if you have a task with the following params:\n\nparams:\n  FOO: fizzbuzz\n  BAR:\n...and you run:\n\nBAR=hello fly execute\nThe task would then run with BAR as \"hello\", and FOO as \"fizzbuzz\" (its default value).\n\nTask config files can contain Vars which can can be set during fly execute by using the -v, -y and -l flags:\n\nfly -t example execute --config tests.yml \\\n  -l vars.yml \\\n  -v some_string=\"Hello World!\" \\\n  -y some_bool=true\nAny variables not satisfied via the above flags will be deferred to the configured credential manager.\n\nTo satisfy these vars when running the task in a pipeline, see task step vars.\n\nIf you want to execute a task on a worker that has a specific tag, you can do so by passing --tag:\n\nfly -t example execute --config task.yml --tag bar\nThis will execute the task specified by task.yml on a worker that has been tagged bar.\n\n","depth":3,"section_tag":"running-tasks"},"saving-credentials-in-aws":{"location":"aws-asm-credential-manager.html#saving-credentials-in-aws","title":"Saving credentials in AWS","text":"It seems to be best to use the 'other type of secret' option and the 'plaintext' entry (otherwise your secrets will be interpolated as JSON) for best results. Make sure your secret locations match the lookup templates exactly; include the leading /, for example.\n\n","depth":5,"section_tag":"saving-credentials-in-aws"},"scaling":{"location":"concourse-web.html#scaling","title":"Scaling","text":"The Running a web node can be scaled up for high availability. They'll also roughly share their scheduling workloads, using the database to synchronize. This is done by just running more web commands on different machines, and optionally putting them behind a load balancer.\n\nTo run a cluster of Running a web nodes, you'll first need to ensure they're all pointing to the same PostgreSQL server.\n\nNext, you'll need to configure a peer address. This is a DNS or IP address that can be used to reach this web node from other web nodes. Typically this uses a private IP, like so:\n\nCONCOURSE_PEER_ADDRESS=10.10.0.1\nThis address will be used for forwarded worker connections, which listen on the ephemeral port range.\n\nFinally, if all of these nodes are going to be accessed through a load balancer, you'll need to configure the external URL that will be used to reach your Concourse cluster:\n\nCONCOURSE_EXTERNAL_URL=https://ci.example.com\nAside from the peer URL, all configuration must be consistent across all web nodes in the cluster to ensure consistent results.\n\n","depth":5,"section_tag":"scaling"},"scaling-workers":{"location":"concourse-worker.html#scaling-workers","title":"Scaling Workers","text":"More workers should be added to accommodate more pipelines. To know when this is necessary you should probably set up Metrics and keep an eye on container counts. If average container count starts to approach 200 or so per worker, you should probably add another worker. Load average is another metric to keep an eye on.\n\nTo add a worker, just create another machine for the worker and follow the Running concourse worker instructions again.\n\nNote: it doesn't make sense to run multiple workers on one machine since they'll both be contending for the same physical resources. Workers should be given their own VMs or physical machines to maximize resource usage.\n\n","depth":5,"section_tag":"scaling-workers"},"scheduler":{"location":"scheduler.html","title":"Build Scheduler","text":"As of the v6.0.0 release, there have been many changes to the scheduler so it would be advisable to assume that this documentation should only be used for Concourse deployments v6.0.0 and above.\n\nBuilds represent each execution of a job. Figuring out when to schedule a new job build is the responsibility of the build scheduler. The scheduling of new job builds can be dependent on many different factors such as when a new version of a resource is discovered, when a dependent upstream build finishes, or when a user manually triggers a build.\n\nThe build scheduler is a global component, where it deals with all the jobs within a deployment. It runs on an interval with a default of 10 seconds. If there are multiple ATCs, only one of the ATC's scheduler component will run per interval tick in order to ensure that there will be no duplicated work between ATC nodes.\n\nThe subcomponent used to figure out whether a build can be scheduled is called the algorithm.\n\n","depth":4,"section_tag":"scheduler"},"scheduling-behavior":{"location":"scheduler.html#scheduling-behavior","title":"Scheduling behavior","text":"The scheduler will schedule a new build if any of the versions produced by the algorithm for trigger: true resources is not equal to the version used by the previous build of the job.\n\nWhat this means is if the algorithm runs and computes an input version, the scheduler will create a new build as long as that version is different than the previous build's version for that same input. Even if that version has been used by a build 2 months ago, the scheduler will schedule a new build as long as it has not been used by the previous build.\n\nIf there are any input versions that are different than the previous build, it will trigger a new build. This can affect some users that are using the pinning functionality to run older versions.\n\nLet's say you have a job that takes a resource as an input. It currently has two builds, build 1 has ran with version v1 of the resource and build 2 has ran with v2.\n\nimages/new-pinning-behavior-1.pngIf I pin the input to an older version, a new build is produced because the pinned version v1 is not equivalent to the version of the previous build v2.\n\nimages/new-pinning-behavior-3.pngThen if I unpin the version, another build would be triggered again using the latest version.\n\nimages/new-pinning-behavior-4.pngThis is because after unpinning the resource, the input version for the next build becomes the latest version v2 which is not equal to the version v1 used by the previous build.\n\nThis is to allow the current state of the builds to always reflect the current state of the versions. That being said, this behavior can be undesirable if the goal is to only run a job using an old version. In this case, build rerunning is the better choice. If you would like to learn more about build rerunning, you can read more about it in the build rerunning section.\n\n","depth":5,"section_tag":"scheduling-behavior"},"scheduling-on-demand":{"location":"scheduler.html#scheduling-on-demand","title":"Scheduling on demand","text":"The scheduler runs on an interval, but rather than scheduling all the jobs within a deployment on every tick, it only schedules the jobs that need to be scheduled.\n\nFirst, the scheduler determines which jobs need to be scheduled. Below are all the reasons why Concourse will think a job needs to be scheduled: * Detecting new versions of a resource through a check\n\n* Saving a new version through a put\n\n* A build finishes for an upstream job (through passed constraints)\n\n* Enabling/Disabling a resource version\n\n* Pinning/Unpinning a resource version\n\n* Setting a pipeline\n\n* Updating a resource's resource_config\n\n* Manually triggering a build\n\n* Rerunning a build\n\n* Multiple versions available for a version every constraint\n\n\n\nEach job that is scheduled will use the algorithm to determine what inputs its next build should have. Then the build is scheduled and picked up by the Build Tracker.\n\n","depth":5,"section_tag":"scheduling-on-demand"},"schema.across":{"location":"across-step.html#schema.across","title":"across","text":"Contains a list of across_var schema.\n\n","depth":4,"section_tag":"across-step"},"schema.across_var":{"location":"across-step.html#schema.across_var","title":"across_var schema","text":"","depth":4,"section_tag":"across-step"},"schema.across_var.max_in_flight":{"location":"across-step.html#schema.across_var.max_in_flight","title":"across_var.max_in_flight","text":"Default 1. If set to all, the substep will run with all combinations of the current var in parallel. If set to a number schema, only that number of substeps may run in parallel.\n\nIf multiple vars are configured, the effective max_in_flight is multiplicative. For instance:\n\nplan:\n- across:\n  - var: var1\n    values: [a, b, c]\n    max_in_flight: all\n  - var: var2\n    values: [1, 2]\n  - var: var3\n    values: [foo, bar]\n    max_in_flight: 2\nHere, 6 substeps will run in parallel, since all 3 of var1's values can run in parallel, and 2 of var3's values can run in parallel.\n\n","depth":4,"section_tag":"across-step"},"schema.across_var.values":{"location":"across-step.html#schema.across_var.values","title":"across_var.values","text":"The list of values that the var will iterate over when running the substep. If multiple vars are configured, all combinations of values across all vars will run.\n\nThe list of values may also be interpolated. For instance, you may use the load_var step to first load a list of value schema into a local var, and then iterate across that dynamic list of values.\n\nThe following across will run the task foo/build.yml for each package defined in foo/packages-to-build.json with Go 1.15 and 1.16.\n\nplan:\n- get: foo\n- load_var: packages\n  file: foo/packages-to-build.json\n- across:\n  - var: package\n    values: ((.:packages))\n  - var: go_version\n    values: ['1.15', '1.16']\n  task: build\n  file: foo/build.yml\n  vars:\n    go_version: ((.:go_version))\n    package: ((.:package))\nSupposing foo/packages-to-build.json had the following content: [\"./cmd/first\", \"./cmd/second\", \"./cmd/third\"]\n\n\n...then the task foo/build.yml would be run with the following var combinations:\n\n* {package: \"./cmd/first\", go_version: \"1.15\"}\n\n* {package: \"./cmd/first\", go_version: \"1.16\"}\n\n* {package: \"./cmd/second\", go_version: \"1.15\"}\n\n* {package: \"./cmd/second\", go_version: \"1.16\"}\n\n* {package: \"./cmd/third\", go_version: \"1.15\"}\n\n* {package: \"./cmd/third\", go_version: \"1.16\"}\n\n","depth":4,"section_tag":"across-step"},"schema.across_var.var":{"location":"across-step.html#schema.across_var.var","title":"across_var.var","text":"The name of the variable that will be added to the \".\" var source. This variable will only be accessible in the scope of the step - each iteration of the step gets its own scope.\n\nIf a variable of the same name already exists in the parent scope, a warning will be printed.\n\n","depth":4,"section_tag":"across-step"},"schema.anonymous_resource":{"location":"tasks.html#schema.anonymous_resource","title":"anonymous_resource schema","text":"","depth":2,"section_tag":"tasks"},"schema.anonymous_resource.params":{"location":"tasks.html#schema.anonymous_resource.params","title":"anonymous_resource.params","text":"A map of arbitrary configuration to forward to the resource. Refer to the resource type's documentation to see what it supports.\n\n","depth":2,"section_tag":"tasks"},"schema.anonymous_resource.source":{"location":"tasks.html#schema.anonymous_resource.source","title":"anonymous_resource.source","text":"The configuration for the resource; see resource.source.\n\n","depth":2,"section_tag":"tasks"},"schema.anonymous_resource.type":{"location":"tasks.html#schema.anonymous_resource.type","title":"anonymous_resource.type","text":"The type of the resource. Usually registry-image.\n\nYou can use any resource type that returns a filesystem in the correct format: a /rootfs directory containing a full filesystem, and a metadata.json file containing.\n\n","depth":2,"section_tag":"tasks"},"schema.anonymous_resource.version":{"location":"tasks.html#schema.anonymous_resource.version","title":"anonymous_resource.version","text":"A specific version of the resource to fetch. This should be a map with string keys and values. If not specified, the latest version will be fetched.\n\n","depth":2,"section_tag":"tasks"},"schema.attempts":{"location":"attempts-step.html#schema.attempts","title":"attempts","text":"The following will run the task and retry it up to 9 times (for a total of 10 attempts) if it fails:\n\nplan:\n- get: foo\n- task: unit\n  file: foo/unit.yml\n  attempts: 10\nWhen used in combination with timeout, the timeout applies to each step.\n\nThis semi-arbitary decision was made because often things either succeed in a reasonable amount of time or fail due to hanging/flakiness. In this case it seems more useful to allow each attempt the allotted timeout rather than have one very long attempt prevent more attempts.\n\nplan:\n- get: flake\n- task: flaky-tests\n  file: flake/integration.yml\n  timeout: 10m\n  attempts: 3\n","depth":4,"section_tag":"attempts-step"},"schema.boolean":{"location":"config-basics.html#schema.boolean","title":"boolean schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.build_log_retention_policy":{"location":"jobs.html#schema.build_log_retention_policy","title":"build_log_retention_policy schema","text":"","depth":2,"section_tag":"jobs"},"schema.build_log_retention_policy.builds":{"location":"jobs.html#schema.build_log_retention_policy.builds","title":"build_log_retention_policy.builds","text":"Keep logs for the last specified number of builds.\n\n","depth":2,"section_tag":"jobs"},"schema.build_log_retention_policy.days":{"location":"jobs.html#schema.build_log_retention_policy.days","title":"build_log_retention_policy.days","text":"Keep logs for builds which have finished within the specified number of days.\n\n","depth":2,"section_tag":"jobs"},"schema.build_log_retention_policy.minimum_succeeded_builds":{"location":"jobs.html#schema.build_log_retention_policy.minimum_succeeded_builds","title":"build_log_retention_policy.minimum_succeeded_builds","text":"Keep a minimum number of successful build logs that would normally be reaped.\n\nRequires builds to be set to an integer higher than 0 in order to work. For example, if builds is set to 5, and this attribute to 1, say a job has the following build history: 7(f), 6(f), 5(f), 4(f), 3(f), 2(f), 1(s), where f means failed and s means succeeded, then builds 2 and 3 will be reaped, because it retains 5 build logs, and at least 1 succeeded build log. Default is 0.\n\n","depth":2,"section_tag":"jobs"},"schema.cache":{"location":"tasks.html#schema.cache","title":"cache schema","text":"","depth":2,"section_tag":"tasks"},"schema.cache.path":{"location":"tasks.html#schema.cache.path","title":"cache.path","text":"The path to a directory to be cached.\n\nPaths are relative to the working directory of the task. Absolute paths are not respected.\n\n","depth":2,"section_tag":"tasks"},"schema.command":{"location":"tasks.html#schema.command","title":"command schema","text":"","depth":2,"section_tag":"tasks"},"schema.command.args":{"location":"tasks.html#schema.command.args","title":"command.args","text":"Arguments to pass to the command. Note that when executed with Fly, any arguments passed to Running tasks with fly execute are appended to this array.\n\n","depth":2,"section_tag":"tasks"},"schema.command.dir":{"location":"tasks.html#schema.command.dir","title":"command.dir","text":"A directory, relative to the initial working directory, to set as the working directory when running the script.\n\n","depth":2,"section_tag":"tasks"},"schema.command.path":{"location":"tasks.html#schema.command.path","title":"command.path","text":"The name of or path to the executable to run.\n\npath is relative to the working directory. If dir is specified to set the working directory, then path is relative to it.\n\nThis is commonly a path to a script provided by one of the task's inputs, e.g. my-resource/scripts/test. It could also be a command like bash (respecting standard $PATH lookup rules), or an absolute path to a file to execute, e.g. /bin/bash.\n\n","depth":2,"section_tag":"tasks"},"schema.command.user":{"location":"tasks.html#schema.command.user","title":"command.user","text":"Explicitly set the user to run as. If not specified, this defaults to the user configured by the task's image. If not specified there, it's up to the Garden backend, and may be e.g. root on Linux.\n\n","depth":2,"section_tag":"tasks"},"schema.config":{"location":"config-basics.html#schema.config","title":"config schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.container_limits":{"location":"tasks.html#schema.container_limits","title":"container_limits schema","text":"","depth":2,"section_tag":"tasks"},"schema.container_limits.cpu":{"location":"tasks.html#schema.container_limits.cpu","title":"container_limits.cpu","text":"The maximum amount of CPU available to the task container, measured in shares. 0 means unlimited.\n\nCPU shares are relative to the CPU shares of other containers on a worker. For example, if you have two containers both with a CPU limit of 2 shares then each container will get 50% of the CPU's time.\n\nContainer A: 2 shares - 50% CPU\nContainer B: 2 shares - 50% CPU\nTotal CPU shares declared: 4\nIf you introduce another container then the number of CPU time per container changes. CPU shares are relative to each other. Container A: 2 shares - 25% CPU\nContainer B: 2 shares - 25% CPU\nContainer C: 4 shares - 50% CPU\nTotal CPU shares declared: 8\n\n\n","depth":2,"section_tag":"tasks"},"schema.container_limits.memory":{"location":"tasks.html#schema.container_limits.memory","title":"container_limits.memory","text":"The maximum amount of memory available to the task container, measured in bytes. 0 means unlimited. Can use units such as KB/MB/GB.\n\n","depth":2,"section_tag":"tasks"},"schema.dir-path":{"location":"config-basics.html#schema.dir-path","title":"dir-path schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.display_config":{"location":"pipelines.html#schema.display_config","title":"display_config schema","text":"","depth":2,"section_tag":"pipelines"},"schema.display_config.background_filter":{"location":"pipelines.html#schema.display_config.background_filter","title":"display_config.background_filter","text":"Default opacity(30%) grayscale(100%). Allows users to specify custom CSS filters that are applied to the background_image.\n\n","depth":2,"section_tag":"pipelines"},"schema.display_config.background_image":{"location":"pipelines.html#schema.display_config.background_image","title":"display_config.background_image","text":"Allows users to specify a custom background image for the pipeline. Must be an http, https, or relative URL.\n\n","depth":2,"section_tag":"pipelines"},"schema.do.do":{"location":"do-step.html#schema.do.do","title":"do step do","text":"This can be used to perform multiple steps serially in a try step:\n\njobs:\n- name: with-do\n  plan:\n  - try:\n      do:\n      - get: black-ice\n      - get: control-node\n      - get: cyberdeck\n\nresources:\n- name: black-ice\n  type: mock\n- name: control-node\n  type: mock\n- name: cyberdeck\n  type: mock\n","depth":3,"section_tag":"do-step"},"schema.dummy_config":{"location":"vars.html#schema.dummy_config","title":"dummy_config schema","text":"","depth":4,"section_tag":"var-sources"},"schema.dummy_config.vars":{"location":"vars.html#schema.dummy_config.vars","title":"dummy var source vars","text":"A mapping of var name to var value.\n\n","depth":4,"section_tag":"var-sources"},"schema.duration":{"location":"config-basics.html#schema.duration","title":"duration schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.ensure":{"location":"ensure-hook.html#schema.ensure","title":"ensure","text":"The following build plan acquires a lock and then ensures that the lock is released.\n\nplan:\n- put: some-lock\n  params: {acquire: true}\n- task: integration\n  file: foo/integration.yml\n  ensure:\n    put: some-lock\n    params: {release: some-lock}\n","depth":4,"section_tag":"ensure-hook"},"schema.env-vars":{"location":"config-basics.html#schema.env-vars","title":"env-vars schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.fail_fast":{"location":"across-step.html#schema.fail_fast","title":"fail_fast","text":"Default false. When enabled, the across step will fail fast by returning as soon as any sub-step fails. This means that running steps will be interrupted and pending steps will no longer be scheduled.\n\nThe fail_fast key sits at the same level as the across key.\n\nplan:\n- across:\n  - var: var1\n    values: [a, b, c]\n  - var: var2\n    values: [1, 2]\n  fail_fast: true\n","depth":4,"section_tag":"across-step"},"schema.file-path":{"location":"config-basics.html#schema.file-path","title":"file-path schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.get.get":{"location":"get-step.html#schema.get.get","title":"get step get","text":"The fetched bits will be registered in the build's artifact namespace under the given identifier. Subsequent task step and put step which list the identifier as an input will have a copy of the bits in their working directory.\n\nAlmost every simple job will look something like this: fetch my code with a get step and do something (run tests) with it in a task step.\n\njobs:\n- name: fetch-repo\n  plan:\n  - get: repo # fetches repo under artifact name \"repo\"\n  - task: ls-repo\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source: {mirror_self: true}\n      # pass the \"repo\" artifact into the task\n      inputs:\n      - name: repo\n      run:\n        path: ls\n        args: [\"-lah\",\"repo\"]\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"get-step"},"schema.get.params":{"location":"get-step.html#schema.get.params","title":"get step params","text":"Arbitrary configuration to pass to the resource. Refer to the resource type's documentation to see what it supports.\n\njobs:\n- name: resource-params\n  plan:\n  - get: cyberdeck\n    params:\n      create_files_via_params:\n        version_to_put.txt: \"made-via-params\"\n  - put: cyberdeck\n    params:\n      file: cyberdeck/version_to_put.txt\n\n\nresources:\n- name: cyberdeck\n  type: mock\n","depth":3,"section_tag":"get-step"},"schema.get.passed":{"location":"get-step.html#schema.get.passed","title":"get step passed","text":"When specified, only the versions of the resource that made it through the given list of jobs (AND-ed together) will be considered when triggering and fetching.\n\nIf multiple gets are configured with passed constraints, all of the mentioned jobs are correlated.\n\njobs:\n- name: lvl-1-firewall\n  plan:\n  - in_parallel:\n    - get: black-ice\n    - get: control-node\n    - get: cyberdeck\n\n- name: lvl-2-unit\n  plan:\n  - in_parallel:\n    - get: black-ice\n      passed: [lvl-1-firewall]\n    - get: control-node\n      passed: [lvl-1-firewall]\n    - get: cyberdeck\n      passed: [lvl-1-firewall]\n\n- name: lvl-2-integration\n  plan:\n  - in_parallel:\n    - get: black-ice\n      passed: [lvl-1-firewall]\n    - get: control-node\n      passed: [lvl-1-firewall]\n    - get: cyberdeck\n      passed: [lvl-1-firewall]\n\n- name: lvl-3-production\n  plan:\n  - in_parallel:\n    - get: black-ice\n      passed: [lvl-2-unit,lvl-2-integration]\n    - get: control-node\n      passed: [lvl-2-unit,lvl-2-integration]\n    - get: cyberdeck\n      passed: [lvl-2-unit,lvl-2-integration]\n\nresources:\n- name: black-ice\n  type: mock\n  source:\n    initial_version: lvl4\n- name: control-node\n  type: mock\n  source:\n    initial_version: tower\n- name: cyberdeck\n  type: mock\n  source:\n    initial_version: mk3\nFor the final job, lvl-3-production, only versions that have passed the previous two jobs (lvl-2-unit and lvl-2-integration) will be passed to lvl-3-production.\n\nThis is crucial to being able to implement safe \"fan-in\" semantics as things progress through a pipeline.\n\n","depth":3,"section_tag":"get-step"},"schema.get.resource":{"location":"get-step.html#schema.get.resource","title":"get step resource","text":"Defaults to the value of get. The resource to fetch, as configured in pipeline.resources.\n\nUse this attribute to rename a resource from the overall pipeline context into the job-specific context.\n\njobs:\n- name: fetch-repo\n  plan:\n  - get: thecode # fetches \"repo\" under artifact name \"thecode\"\n    resource: repo\n  - task: ls-repo\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source: {mirror_self: true}\n      # pass the \"thecode\" artifact into the task\n      inputs:\n      - name: thecode\n      run:\n        path: ls\n        args: [\"-lah\",\"thecode\"]\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"get-step"},"schema.get.trigger":{"location":"get-step.html#schema.get.trigger","title":"get step trigger","text":"Default false. If set to true, new builds of the job will be automatically created when a new version for this input becomes available.\n\nNote: if none of a job's get steps are set to true, the job can only be manually triggered.\n\njobs:\n- name: fetch-repo\n  plan:\n  - get: repo\n    trigger: true # automatically runs the job\n  - task: ls-repo\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source: {mirror_self: true}\n      inputs:\n      - name: repo\n      run:\n        path: ls\n        args: [\"-lah\",\"repo\"]\n\nresources:\n- name: repo\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"get-step"},"schema.get.version":{"location":"get-step.html#schema.get.version","title":"get step version","text":"Default latest. The version of the resource to fetch.\n\nIf set to latest, scheduling will just find the latest available version of a resource and use it, allowing versions to be skipped.  This is usually what you want, e.g. if someone pushes 100 git commits.\n\nIf set to every, builds will walk through all available versions of the resource. Note that if passed is also configured, it will only step through the versions satisfying the constraints.\n\nIf set to a specific version (e.g. {ref: abcdef123}), only that version will be used. Note that the version must be available and detected by the resource, otherwise the input will never be satisfied. You may want to use fly check-resource to force detection of resource versions, if you need to use an older one that was never detected (as all newly configured resources start from the latest version).\n\n","depth":3,"section_tag":"get-step"},"schema.group_config":{"location":"pipelines.html#schema.group_config","title":"group_config schema","text":"","depth":2,"section_tag":"pipelines"},"schema.group_config.jobs":{"location":"pipelines.html#schema.group_config.jobs","title":"group_config.jobs","text":"A list of jobs that should appear in this group. A job may appear in multiple groups. Neighbours of jobs in the current group will also appear on the same page in order to give context of the location of the group in the pipeline.\n\nYou may also use any valid glob to represent several jobs, e.g.:\n\ngroups:\n- name: develop\n  jobs:\n  - terraform-*\n  - test\n  - deploy-{dev,staging}\n- name: ship\n  jobs:\n  - deploy-prod\n- name: all\n  jobs:\n  - \"*\"\nIn this example, the develop group will match terraform-apply, terraform-destroy, test, deploy-dev, deploy-staging. The ship group will only match deploy-prod. The all group will match all jobs in the pipeline.\n\nNote that depending on how it's used, *, {, and } have special meaning in YAML, and may need to be quoted (as was done in the all job above)\n\n","depth":2,"section_tag":"pipelines"},"schema.group_config.name":{"location":"pipelines.html#schema.group_config.name","title":"group_config.name","text":"A unique name for the group. This should be short and simple as it will be used as the tab name for navigation.\n\n","depth":2,"section_tag":"pipelines"},"schema.identifier":{"location":"config-basics.html#schema.identifier","title":"identifier schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.idtoken_config":{"location":"vars.html#schema.idtoken_config","title":"idtoken_config schema","text":"","depth":4,"section_tag":"var-sources"},"schema.idtoken_config.algorithm":{"location":"vars.html#schema.idtoken_config.algorithm","title":"idtoken var source algorithm","text":"Default RS256.\n\nThe signature algorithm to use for the token.\n\n","depth":4,"section_tag":"var-sources"},"schema.idtoken_config.audience":{"location":"vars.html#schema.idtoken_config.audience","title":"idtoken var source audience","text":"A list of audience-values to place into the token's aud-claim.\n\n","depth":4,"section_tag":"var-sources"},"schema.idtoken_config.expires_in":{"location":"vars.html#schema.idtoken_config.expires_in","title":"idtoken var source expires_in","text":"How long the token should be valid.\n\nDefault 1h. Cannot be longer than 24h.\n\n","depth":4,"section_tag":"var-sources"},"schema.idtoken_config.subject_scope":{"location":"vars.html#schema.idtoken_config.subject_scope","title":"idtoken var source subject_scope","text":"Default pipeline.\n\nDetermines what is put into the token's sub-claim. See Subject Scope for a detailed explanation.\n\n","depth":4,"section_tag":"var-sources"},"schema.in-parallel.in_parallel":{"location":"in-parallel-step.html#schema.in-parallel.in_parallel","title":"in_parallel step in_parallel","text":"Steps are either configured as a array or within an in_parallel_config schema.\n\nUsing the in_parallel step where possible is the easiest way to speeding up a builds.\n\nIt is often used to fetch all dependent resources together at the start of a build plan:\n\njobs:\n- name: get-in-parallel\n  plan:\n  - in_parallel:\n    - get: ci\n    - get: repo\n    - get: code\n\n\nresources:\n- name: repo\n  type: mock\n- name: code\n  type: mock\n- name: ci\n  type: mock\nIf any step in the in_parallel fails, the build will fail, making it useful for build matrices:\n\nplan:\n- get: some-repo\n- in_parallel:\n  - task: unit-windows\n    file: some-repo/ci/windows.yml\n  - task: unit-linux\n    file: some-repo/ci/linux.yml\n  - task: unit-darwin\n    file: some-repo/ci/darwin.yml\n","depth":3,"section_tag":"in-parallel-step"},"schema.in_parallel_config":{"location":"in-parallel-step.html#schema.in_parallel_config","title":"in_parallel_config schema","text":"","depth":3,"section_tag":"in-parallel-step"},"schema.in_parallel_config.fail_fast":{"location":"in-parallel-step.html#schema.in_parallel_config.fail_fast","title":"in_parallel step fail_fast","text":"Default false. When enabled the parallel step will fail fast by returning as soon as any sub-step fails. This means that running steps will be interrupted and pending steps will no longer be scheduled.\n\n","depth":3,"section_tag":"in-parallel-step"},"schema.in_parallel_config.limit":{"location":"in-parallel-step.html#schema.in_parallel_config.limit","title":"in_parallel step limit","text":"Default unlimited. A sempahore which limits the parallelism when executing the steps in a in_parallel step. When set, the number of running steps will not exceed the limit.\n\nWhen not specified, in_parallel will execute all steps immediately. Using limit is useful for performing parallel execution of a growing number of tasks without overloading your workers. In the example below, two tasks will be run in parallel and in order until all steps have been executed:\n\njobs:\n- name: limit-in-parallel\n  plan:\n  - get: examples\n  - in_parallel:\n      limit: 2\n      steps:\n      - task: print-date\n        file: examples/tasks/print-date.yml\n      - task: hello-world\n        file: examples/tasks/hello-world.yml\n      - task: print-var\n        file: examples/tasks/print-var.yml\n        vars:\n          my-var: hello\n          second-var: good-bye\n\n\nresources:\n- name: examples\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\n\n","depth":3,"section_tag":"in-parallel-step"},"schema.in_parallel_config.steps":{"location":"in-parallel-step.html#schema.in_parallel_config.steps","title":"in_parallel step steps","text":"The steps to perform in parallel. Using the in_parallel step where possible is the easiest way to speeding up a builds.\n\nIt is often used to fetch all dependent resources together at the start of a build plan:\n\njobs:\n- name: get-in-parallel\n  plan:\n  - in_parallel:\n      limit: 2\n      fail_fast: false\n      steps:\n      - get: ci\n      - get: repo\n      - get: code\n\n\nresources:\n- name: repo\n  type: mock\n- name: code\n  type: mock\n- name: ci\n  type: mock\n\n\n","depth":3,"section_tag":"in-parallel-step"},"schema.input":{"location":"tasks.html#schema.input","title":"input schema","text":"","depth":2,"section_tag":"tasks"},"schema.input.name":{"location":"tasks.html#schema.input.name","title":"input.name","text":"The name of the input.\n\n","depth":2,"section_tag":"tasks"},"schema.input.optional":{"location":"tasks.html#schema.input.optional","title":"input.optional","text":"Default false. If true, then the input is not required by the task. The task may run even if this input is missing.\n\nAn optional input that is missing will not appear in the current directory of the running task.\n\n","depth":2,"section_tag":"tasks"},"schema.input.path":{"location":"tasks.html#schema.input.path","title":"input.path","text":"The path where the input will be placed. If not specified, the input's name is used.\n\nPaths are relative to the working directory of the task unless an absolute path is given. An absolute path is any path that starts with a forward slash /. We recommend only using relative paths unless you have a strong technical reason to use absolute paths.\n\nAny parent directory references (../) in the path will be removed.\n\n","depth":2,"section_tag":"tasks"},"schema.job":{"location":"jobs.html#schema.job","title":"job schema","text":"","depth":2,"section_tag":"jobs"},"schema.job.build_log_retention":{"location":"jobs.html#schema.job.build_log_retention","title":"job.build_log_retention","text":"Configures the retention policy for build logs. This is useful if you have a job that runs often but after some amount of time the logs aren't worth keeping around.\n\nBuilds which are not retained by the configured policy will have their logs reaped. If this configuration is omitted, logs are kept forever (unless Build log retention is configured globally).\n\nThe following example will keep logs for any builds that have completed in the last 2 days, while also keeping the last 1000 builds and at least 1 succeeded build.\n\njobs:\n- name: smoke-tests\n  build_log_retention:\n    days: 2\n    builds: 1000\n    minimum_succeeded_builds: 1\n  plan:\n  - get: 10m\n  - task: smoke-tests\n    # ...\nIf more than 1000 builds finish in the past 2 days, all of them will be retained thanks to the days configuration. Similarly, if there are 1000 builds spanning more than 2 days, they will also be kept thanks to the builds configuration. And if they all happened to have failed, the minimum_succeeded_builds will keep around at least one successful build. All policies operate independently.\n\n","depth":2,"section_tag":"jobs"},"schema.job.build_logs_to_retain":{"location":"jobs.html#schema.job.build_logs_to_retain","title":"job.build_logs_to_retain","text":"Deprecated. Equivalent to setting job.build_log_retention.builds.\n\n","depth":2,"section_tag":"jobs"},"schema.job.disable_manual_trigger":{"location":"jobs.html#schema.job.disable_manual_trigger","title":"job.disable_manual_trigger","text":"Default false. If set to true, manual triggering of the job (via the web UI or fly trigger-job) will be disabled.\n\n","depth":2,"section_tag":"jobs"},"schema.job.ensure":{"location":"jobs.html#schema.job.ensure","title":"job.ensure","text":"Step to execute regardless of whether the job succeeds, fails, errors, or aborts. Equivalent to the ensure hook.\n\n","depth":2,"section_tag":"jobs"},"schema.job.interruptible":{"location":"jobs.html#schema.job.interruptible","title":"job.interruptible","text":"Default false. Normally, when a worker is shutting down it will wait for builds with containers running on that worker to finish before exiting. If this value is set to true, the worker will not wait on the builds of this job. You may want this if e.g. you have a self-deploying Concourse or long-running-but-low-importance jobs.\n\n","depth":2,"section_tag":"jobs"},"schema.job.max_in_flight":{"location":"jobs.html#schema.job.max_in_flight","title":"job.max_in_flight","text":"If set, specifies a maximum number of builds to run at a time. If serial or serial_groups are set, they take precedence and force this value to be 1.\n\n","depth":2,"section_tag":"jobs"},"schema.job.name":{"location":"jobs.html#schema.job.name","title":"job.name","text":"The name of the job. This should be short; it will show up in URLs. If you want to rename a job, use job.old_name.\n\n","depth":2,"section_tag":"jobs"},"schema.job.old_name":{"location":"jobs.html#schema.job.old_name","title":"job.old_name","text":"The old name of the job. If configured, the history of old job will be inherited to the new one. Once the pipeline is set, this field can be removed as the builds have been transfered.\n\nThis can be used to rename a job without losing its history, like so:\n\njobs:\n- name: new-name\n  old_name: current-name\n  plan: [get: 10m]\nAfter the pipeline is set, because the builds have been inherited, the job can have the field removed:\n\njobs:\n- name: new-name\n  plan: [get: 10m]\n","depth":2,"section_tag":"jobs"},"schema.job.on_abort":{"location":"jobs.html#schema.job.on_abort","title":"job.on_abort","text":"Step to execute when the job aborts. Equivalent to the on_abort hook.\n\n","depth":2,"section_tag":"jobs"},"schema.job.on_error":{"location":"jobs.html#schema.job.on_error","title":"job.on_error","text":"Step to execute when the job errors. Equivalent to the on_error hook.\n\n","depth":2,"section_tag":"jobs"},"schema.job.on_failure":{"location":"jobs.html#schema.job.on_failure","title":"job.on_failure","text":"Step to execute when the job fails. Equivalent to the on_failure hook.\n\n","depth":2,"section_tag":"jobs"},"schema.job.on_success":{"location":"jobs.html#schema.job.on_success","title":"job.on_success","text":"Step to execute when the job succeeds. Equivalent to the on_success hook.\n\n","depth":2,"section_tag":"jobs"},"schema.job.plan":{"location":"jobs.html#schema.job.plan","title":"job.plan","text":"The sequence of steps to execute.\n\n","depth":2,"section_tag":"jobs"},"schema.job.public":{"location":"jobs.html#schema.job.public","title":"job.public","text":"Default false. If set to true, the build log of this job will be viewable by unauthenticated users. Unauthenticated users will always be able to see the inputs, outputs, and build status history of a job. This is useful if you would like to expose your pipeline publicly without showing sensitive information in the build log.\n\nNote: when this is set to true, any get step and put steps will show the metadata for their resource version, regardless of whether the resource itself has set resource.public to true.\n\n","depth":2,"section_tag":"jobs"},"schema.job.serial":{"location":"jobs.html#schema.job.serial","title":"job.serial","text":"Default false. If set to true, builds will queue up and execute one-by-one, rather than executing in parallel.\n\n","depth":2,"section_tag":"jobs"},"schema.job.serial_groups":{"location":"jobs.html#schema.job.serial_groups","title":"job.serial_groups","text":"Default []. When set to an array of arbitrary tag-like strings, builds of this job and other jobs referencing the same tags will be serialized.\n\nThis can be used to ensure that certain jobs do not run at the same time, like so:\n\njobs:\n- name: job-a\n  serial_groups: [some-tag]\n- name: job-b\n  serial_groups: [some-tag, some-other-tag]\n- name: job-c\n  serial_groups: [some-other-tag]\nIn this example, job-a and job-c can run concurrently, but neither job can run builds at the same time as job-b.\n\nThe builds are executed in their order of creation, across all jobs with common tags.\n\n","depth":2,"section_tag":"jobs"},"schema.load-var.file":{"location":"load-var-step.html#schema.load-var.file","title":"load_var step file","text":"The path to a file whose content shall be read and used as the var's value.\n\n","depth":3,"section_tag":"load-var-step"},"schema.load-var.format":{"location":"load-var-step.html#schema.load-var.format","title":"load_var step format","text":"The format of the file's content.\n\nIf unset, Concourse will try to detect the format from the file extension. If the file format cannot be determined, Concourse will fallback to trim.\n\nIf set to json, yaml, or yml, the file content will be parsed accordingly and the resulting structure will be the value of the var.\n\nIf set to trim, the var will be set to the content of the file with any trailing and leading whitespace removed.\n\nIf set to raw, the var will be set to the content of the file without modification (i.e. with any existing whitespace).\n\nLet's say we have a file with multiple fields, like this yaml file:\n\nfirst: initial\nnumber: \"9000\"\nhello: HAL\n\n\nWe could pass these values to subsequent steps by loading it into a var with load_var, which will detect that it is in YAML format based on the file extension:\n\njobs:\n- name: loading-vars\n  plan:\n  - get: examples\n  - load_var: version\n    file: examples/pipelines/vars-file.yml\n  - put: img\n    params:\n      version: \"((.:version.hello))-((.:version.number))\"\n\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n- name: img\n  type: mock\nIf the file vars-file.yml was generated in a task and printed these values, they would be automatically redacted unless reveal: true is set.\n\n","depth":3,"section_tag":"load-var-step"},"schema.load-var.load_var":{"location":"load-var-step.html#schema.load-var.load_var","title":"load_var step load_var","text":"The identifier will be the name of var, available to subsequent steps as a local build var.\n\nThe following pipeline loads vars from a text file whose contents are used as a version number to put.\n\njobs:\n- name: loading-vars\n  plan:\n  - get: examples\n  - load_var: version\n    file: examples/misc/simple-value.txt\n  - put: img\n    params:\n      version: ((.:version))\n\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n- name: img\n  type: mock\nsimple-value.txt looks like this: 2.6.0\n\n\n","depth":3,"section_tag":"load-var-step"},"schema.load-var.reveal":{"location":"load-var-step.html#schema.load-var.reveal","title":"load_var step reveal","text":"Default false. If set to true, allow the var's content to be printed in the build output even with secret redaction enabled.\n\n","depth":3,"section_tag":"load-var-step"},"schema.number":{"location":"config-basics.html#schema.number","title":"number schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.on_abort":{"location":"on-abort-hook.html#schema.on_abort","title":"on_abort","text":"The following will perform the cleanup task only if the build is aborted while the unit task was running:\n\nplan:\n- get: foo\n- task: unit\n  file: foo/unit.yml\n  on_abort:\n    task: cleanup\n    file: foo/cleanup.yml\n","depth":4,"section_tag":"on-abort-hook"},"schema.on_error":{"location":"on-error-hook.html#schema.on_error","title":"on_error","text":"Until notifications become first-class (RFC #28, this step can be used to notify folks if their builds errored out:\n\nplan:\n- do:\n  - get: ci\n  - task: unit\n    file: ci/unit.yml\n  on_error:\n    put: slack\n","depth":4,"section_tag":"on-error-hook"},"schema.on_failure":{"location":"on-failure-hook.html#schema.on_failure","title":"on_failure","text":"The following will perform the alert task only if the unit task fails:\n\nplan:\n- get: foo\n- task: unit\n  file: foo/unit.yml\n  on_failure:\n    task: alert\n    file: foo/alert.yml\n","depth":4,"section_tag":"on-failure-hook"},"schema.on_success":{"location":"on-success-step.html#schema.on_success","title":"on_success","text":"The following will perform the second task only if the first one succeeds:\n\nplan:\n- get: foo\n- task: unit\n  file: foo/unit.yml\n  on_success:\n    task: alert\n    file: foo/alert.yml\nNote that this is semantically equivalent to the following:\n\nplan:\n- get: foo\n- task: unit\n  file: foo/unit.yml\n- task: alert\n  file: foo/alert.yml\nThe on_success hook is provided mainly for cases where there is an equivalent on_failure, and having them next to each other is more clear.\n\n","depth":4,"section_tag":"on-success-step"},"schema.output":{"location":"tasks.html#schema.output","title":"output schema","text":"","depth":2,"section_tag":"tasks"},"schema.output.name":{"location":"tasks.html#schema.output.name","title":"output.name","text":"The name of the output. The contents under path will be made available to the rest of the plan under this name.\n\n","depth":2,"section_tag":"tasks"},"schema.output.path":{"location":"tasks.html#schema.output.path","title":"output.path","text":"The path to a directory where the output will be taken from. If not specified, the output's name is used.\n\nPaths are relative to the working directory of the task unless an absolute path is given. An absolute path is any path that starts with a forward slash /. We recommend only using relative paths unless you have a strong technical reason to use absolute paths.\n\nAny parent directory references (../) in the path will be removed.\n\n","depth":2,"section_tag":"tasks"},"schema.pipeline":{"location":"pipelines.html#schema.pipeline","title":"pipeline schema","text":"","depth":2,"section_tag":"pipelines"},"schema.pipeline.display":{"location":"pipelines.html#schema.pipeline.display","title":"pipeline.display","text":"display was introduced in Concourse v6.6.0. It is considered an experimental feature.\n\nVisual configurations for personalizing your pipeline.\n\nThe following example will display an image in the background of the pipeline it is configured on.\n\ndisplay:\n  background_image: https://avatars1.githubusercontent.com/u/7809479?s=400\u0026v=4\n","depth":2,"section_tag":"pipelines"},"schema.pipeline.groups":{"location":"pipelines.html#schema.pipeline.groups","title":"pipeline.groups","text":"A list of job groups to use for organizing jobs in the web UI.\n\nGroups have no functional effect on your pipeline. They are purely for making it easier to grok large pipelines in the web UI.\n\nNote: once you have added groups to your pipeline, all jobs must be in a group.\n\nThe following example will make the \"tests\" group the default view (since it's listed first), separating the later jobs into a \"publish\" group:\n\ngroups:\n- name: test\n  jobs:\n  - unit\n  - integration\n- name: publish\n  jobs:\n  - deploy\n  - shipit\nThis would display two tabs at the top of the home page: \"test\" and \"publish\".\n\nFor a real world example of how groups can be used to simplify navigation and provide logical grouping, see the groups used at the top of the page in the Concourse pipeline.\n\n","depth":2,"section_tag":"pipelines"},"schema.pipeline.jobs":{"location":"pipelines.html#schema.pipeline.jobs","title":"pipeline.jobs","text":"A set of jobs for the pipeline to continuously schedule. At least one job is required for a pipeline to be valid.\n\n","depth":2,"section_tag":"pipelines"},"schema.pipeline.resource_types":{"location":"pipelines.html#schema.pipeline.resource_types","title":"pipeline.resource_types","text":"A set of resource types for resources within the pipeline to use.\n\n","depth":2,"section_tag":"pipelines"},"schema.pipeline.resources":{"location":"pipelines.html#schema.pipeline.resources","title":"pipeline.resources","text":"A set of resources for the pipeline to continuously check.\n\n","depth":2,"section_tag":"pipelines"},"schema.pipeline.var_sources":{"location":"pipelines.html#schema.pipeline.var_sources","title":"pipeline.var_sources","text":"A set of Var sources (experimental) for the pipeline to use.\n\n","depth":2,"section_tag":"pipelines"},"schema.put.get_params":{"location":"put-step.html#schema.put.get_params","title":"put step get_params","text":"Arbitrary configuration to pass to the resource during the implicit get step. Refer to the resource type's documentation to see what it supports.\n\nYou can control the settings of the implicit get step by setting get_params. For example, if you did not want a put step utilizing the  registry-image resource type to download the image, you would implement your put step as such:\n\nplan:\n- put: app-image\n  params:\n    build: git-resource\n  get_params:\n    skip_download: true\n","depth":3,"section_tag":"put-step"},"schema.put.inputs":{"location":"put-step.html#schema.put.inputs","title":"put step inputs","text":"Default all. When not set, or set to all, all artifacts will be provided. This can result in slow performance if the prior steps in the build plan register a bunch of large artifacts before this step, so you may want to consider being explicit.\n\nIf configured as a list of identifiers, only the listed artifacts will be provided to the container.\n\nIf set to detect, the artifacts are detected based on the configured put step params by looking for all string values and using the first path segment as an identifier. (This may become the default in the future.)\n\njobs:\n- name: put-input-methods\n  plan:\n  - in_parallel:\n    - get: repo-dev\n    - get: repo-master\n    - get: app-image\n    - get: ci\n  - put: all-inputs\n    resource: repo\n    inputs: all # default option\n    params:\n      file: ci/version.txt\n  - put: detect-inputs\n    resource: repo\n    inputs: detect # will only stream the \"ci\" artifact\n    params:\n      file: ci/version.txt\n  - put: explicit-inputs\n    resource: repo\n    inputs: # explicitly list artifacts to stream to put step\n      - ci\n    params:\n      file: ci/version.txt\n\nresources:\n- name: repo\n  type: mock\n- name: repo-dev\n  type: mock\n- name: repo-master\n  type: mock\n- name: app-image\n  type: mock\n- name: ci\n  type: mock\n  source:\n    create_files:\n      version.txt: \"42\"\n","depth":3,"section_tag":"put-step"},"schema.put.no_get":{"location":"put-step.html#schema.put.no_get","title":"put step no_get","text":"Skips the get step that usually follows the completion of the put step.\n\n","depth":3,"section_tag":"put-step"},"schema.put.params":{"location":"put-step.html#schema.put.params","title":"put step params","text":"Arbitrary configuration to pass to the resource. Refer to the resource type's documentation to see what it supports.\n\njobs:\n- name: resource-params\n  plan:\n  - put: cyberdeck\n    params:\n      version: \"made-via-params\"\n\nresources:\n- name: cyberdeck\n  type: mock\n","depth":3,"section_tag":"put-step"},"schema.put.put":{"location":"put-step.html#schema.put.put","title":"put step put","text":"When the step succeeds, the version by the step will be immediately fetched via an additional implicit get step. This is so that later steps in your plan can use the artifact that was produced. The artifact will be available under the identifier put specifies.\n\nThe following plan fetches a version using get and pushes it to another resource using put:\n\njobs:\n- name: get-and-pull\n  plan:\n  - get: the-ice\n  - put: cyberdeck\n    params:\n      file: the-ice/version.txt\n\nresources:\n- name: the-ice\n  type: mock\n  source:\n    create_files:\n      version.txt: \"made-via-source\"\n- name: cyberdeck\n  type: mock\n","depth":3,"section_tag":"put-step"},"schema.put.resource":{"location":"put-step.html#schema.put.resource","title":"put step resource","text":"Defaults to the value of put. The resource to update, as configured in pipeline.resources.\n\njobs:\n- name: fetch-repo\n  plan:\n    # puts to \"repo\" and fetches new version under artifact name \"thecode\"\n  - put: thecode\n    resource: repo\n    params:\n      version: put-only\n  - task: ls-repo\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source: {mirror_self: true}\n      # pass the \"thecode\" artifact into the task\n      inputs:\n      - name: thecode\n      run:\n        path: ls\n        args: [\"-lah\",\"thecode\"]\n\nresources:\n- name: repo\n  type: mock\n","depth":3,"section_tag":"put-step"},"schema.resource":{"location":"resources.html#schema.resource","title":"resource schema","text":"","depth":2,"section_tag":"resources"},"schema.resource.check_every":{"location":"resources.html#schema.resource.check_every","title":"resource.check_every","text":"Default 1m. The interval on which to check for new versions of the resource. Acceptable interval options are defined by the time.ParseDuration function.\n\nIf set to never the resource will not be automatically checked. The resource can still be checked manually via the web UI, fly, or webhooks.\n\n","depth":2,"section_tag":"resources"},"schema.resource.check_timeout":{"location":"resources.html#schema.resource.check_timeout","title":"resource.check_timeout","text":"Default 1h. The time limit on checking new versions of resources. Acceptable interval options are defined by the time.ParseDuration function.\n\n","depth":2,"section_tag":"resources"},"schema.resource.expose_build_created_by":{"location":"resources.html#schema.resource.expose_build_created_by","title":"resource.expose_build_created_by","text":"Default false. If set to true, environment variable BUILD_CREATED_BY will be available in the metadata of a put step. This field is not made available to the get step.\n\n","depth":2,"section_tag":"resources"},"schema.resource.icon":{"location":"resources.html#schema.resource.icon","title":"resource.icon","text":"The name of a Material Design icon to show next to the resource name in the web UI. For example, github.\n\n","depth":2,"section_tag":"resources"},"schema.resource.name":{"location":"resources.html#schema.resource.name","title":"resource.name","text":"The name of the resource. This should be short and simple. This name will be referenced by build plans of jobs in the pipeline.\n\n","depth":2,"section_tag":"resources"},"schema.resource.old_name":{"location":"resources.html#schema.resource.old_name","title":"resource.old_name","text":"The old name of the resource. If configured, the history of the old resource will be inherited to the new one. Once the pipeline is set, this field can be removed as the history has been transferred.\n\nThis can be used to rename a resource without losing its history, like so:\n\nresources:\n- name: new-name\n  old_name: current-name\n  type: git\n  source: uri: \"https://github.com/vito/booklit\"\nAfter the pipeline is set, the resource was successfully renamed, so the `old_name` field can be removed from the resource:\n\nresources:\n- name: new-name\n  type: git\n  source: uri: \"https://github.com/vito/booklit\"\n","depth":2,"section_tag":"resources"},"schema.resource.public":{"location":"resources.html#schema.resource.public","title":"resource.public","text":"Default false. If set to true, the metadata for each version of the resource will be viewable by unauthenticated users (assuming the pipeline has been exposed).\n\nResource metadata should never contain credentials or secret information, but this is off by default just to be safe in case users don't want to show things like commit messages and authors to the public.\n\nNote: even when set to false, the versions identifiers will be visible. In addition, if a resource is fetched in a build whose job is marked job.public, metadata will be visible in the build output.\n\n","depth":2,"section_tag":"resources"},"schema.resource.source":{"location":"resources.html#schema.resource.source","title":"resource.source","text":"The configuration for the resource. This varies by resource type, and is a black box to Concourse; it is blindly passed to the resource at runtime.\n\nTo use git as an example, the source may contain the repo URI, the branch of the repo to track, and a private key to use when pushing/pulling.\n\nBy convention, documentation for each resource type's configuration is in each implementation's README.\n\nYou can find the source for the resource types provided with Concourse at the Concourse GitHub organization.\n\n","depth":2,"section_tag":"resources"},"schema.resource.tags":{"location":"resources.html#schema.resource.tags","title":"resource.tags","text":"Default []. A list of tags to determine which workers the checks will be performed on. You'll want to specify this if the source is internal to a worker's network, for example.\n\nThis does not apply tags to all get steps or put steps that use the resource. If you want these steps to use tags, you must set tags for each step.\n\n","depth":2,"section_tag":"resources"},"schema.resource.type":{"location":"resources.html#schema.resource.type","title":"resource.type","text":"The resource type implementing the resource.\n\n","depth":2,"section_tag":"resources"},"schema.resource.version":{"location":"resources.html#schema.resource.version","title":"resource.version","text":"A version to pin the resource to across the pipeline. This has the same effect as setting get step version on every get step referencing the resource.\n\nResources can also be temporarily pinned to a version via the API and web UI. However this functionality is disabled if the resource is pinned via configuration, and if a pipeline is configured to have a version pinned while also pinned in the web UI, the configuration takes precedence and will clear out the temporary pin.\n\n","depth":2,"section_tag":"resources"},"schema.resource.webhook_token":{"location":"resources.html#schema.resource.webhook_token","title":"resource.webhook_token","text":"If specified, web hooks can be sent to trigger an immediate check of the resource, specifying this value as a primitive form of authentication via query params.\n\nAfter configuring this value, you would then configure your hook sender with the following painfully long path appended to your external URL:\n\n/api/v1/teams/TEAM_NAME/pipelines/PIPELINE_NAME/resources/RESOURCE_NAME/check/webhook?webhook_token=WEBHOOK_TOKEN\nFor instance pipelines you will need to include the pipeline vars for a single pipeline instance. Currently you can not have webhooks for all instances of a pipeline.\n\nThe pipeline vars should be added to the webhook URL as URL parameters with the format vars.MY-VAR=\"SOME-VALUE\". A webhook URL for a pipeline instance may look like this:\n\n/api/v1/teams/TEAM_NAME/pipelines/PIPELINE_NAME/resources/RESOURCE_NAME/check/webhook?webhook_token=WEBHOOK_TOKEN\u0026vars.my-var=\"some-value\"\u0026vars.second-var=\"two\"\nNote that the request payload sent to this API endpoint is entirely ignored.  You should configure the resource as if you're not using web hooks, as the resource config is still the \"source of truth.\"\n\n","depth":2,"section_tag":"resources"},"schema.resource_type":{"location":"resource-types.html#schema.resource_type","title":"resource_type schema","text":"","depth":2,"section_tag":"resource-types"},"schema.resource_type.check_every":{"location":"resource-types.html#schema.resource_type.check_every","title":"resource_type.check_every","text":"Default 1m. The interval on which to check for new versions of the resource type. Acceptable interval options are defined by the time.ParseDuration function.\n\n","depth":2,"section_tag":"resource-types"},"schema.resource_type.defaults":{"location":"resource-types.html#schema.resource_type.defaults","title":"resource_type.defaults","text":"The default configuration for the resource type. This varies by resource type, and is a black box to Concourse; it is merged with (duplicate fields are overwritten by) resource.source and passed to the resource at runtime.\n\nresource_types:\n- name: gcs\n  type: registry-image\n  source:\n    repository: frodenas/gcs-resource\n  defaults:\n    json_key: ((default_key))\n\nresources:\n- name: bucket-a\n  type: gcs\n  source:\n    bucket: a\n\n- name: bucket-b\n  type: gcs\n  source:\n    bucket: b\n\n- name: bucket-c\n  type: gcs\n  source:\n    bucket: c\n    json_key: ((different_key))\nSince it's possible to overwrite the base resource types, it can be used to give defaults to resources at the pipeline level.\n\nresource_types:\n- name: registry-image\n  type: registry-image\n  source:\n    repository: concourse/registry-image-resource\n  defaults:\n    registry_mirror:\n      host: https://registry.mirror.example.com\n\nresources:\n- name: mirrored-image\n  type: registry-image\n  source:\n    repository: busybox\nAlternatively, the web node can be configured to use defaults for base resource types\n\n","depth":2,"section_tag":"resource-types"},"schema.resource_type.name":{"location":"resource-types.html#schema.resource_type.name","title":"resource_type.name","text":"The name of the resource type. This should be short and simple. This name will be referenced by pipeline.resources defined within the same pipeline, and task-config.image_resources used by tasks running in the pipeline.\n\nPipeline-provided resource types can override the core resource types by specifying the same name.\n\n","depth":2,"section_tag":"resource-types"},"schema.resource_type.params":{"location":"resource-types.html#schema.resource_type.params","title":"resource_type.params","text":"Arbitrary config to pass when running the get step to fetch the resource type's image. This is equivalent to get step params.\n\n","depth":2,"section_tag":"resource-types"},"schema.resource_type.privileged":{"location":"resource-types.html#schema.resource_type.privileged","title":"resource_type.privileged","text":"Default false. If set to true, the resource's containers will be run with full capabilities, as determined by the worker backend the task runs on.\n\nFor Linux-based backends it typically determines whether or not the container will run in a separate user namespace, and whether the root user is \"actual\" root (if set to true) or a user namespaced root (if set to false, the default).\n\nThis is a gaping security hole; only configure it if the resource type needs it (which should be called out in its documentation). This is not up to the resource type to decide dynamically, so as to prevent privilege escalation via third-party resource type exploits.\n\n","depth":2,"section_tag":"resource-types"},"schema.resource_type.source":{"location":"resource-types.html#schema.resource_type.source","title":"resource_type.source","text":"The configuration for the resource type's resource. This varies by resource type, and is a black box to Concourse; it is blindly passed to the resource at runtime.\n\nTo use registry-image as an example, the source would contain something like repository: username/reponame. See the Registry Image resource (or whatever resource type your resource type uses) for more information.\n\n","depth":2,"section_tag":"resource-types"},"schema.resource_type.tags":{"location":"resource-types.html#schema.resource_type.tags","title":"resource_type.tags","text":"Default []. A list of tags to determine which workers the checks will be performed on. You'll want to specify this if the source is internal to a worker's network, for example. See also tags.\n\n","depth":2,"section_tag":"resource-types"},"schema.resource_type.type":{"location":"resource-types.html#schema.resource_type.type","title":"resource_type.type","text":"The type of the resource used to provide the resource type's container image.\n\nThis is a bit meta. Usually this value will be registry-image as the resource type must result in a container image.\n\nA resource type's type can refer to other resource types, and can also use the core type that it's overriding. This is useful for bringing in a newer or forked registry-image resource.\n\n","depth":2,"section_tag":"resource-types"},"schema.set-pipeline.file":{"location":"set-pipeline-step.html#schema.set-pipeline.file","title":"set_pipeline step file","text":"The path to the pipeline's configuration file.\n\nfile points at a .yml file containing the pipeline configuration, which allows this to be tracked with your resources or generated by a task step.\n\nThe first segment in the path should refer to another artifact from the plan, and the rest of the path is relative to that artifact.\n\nThe get step can be used to fetch your configuration from a git repo and auto-configure it using a set_pipeline step:\n\njobs:\n- name: set-pipeline\n  plan:\n  - get: examples\n    trigger: true\n  - set_pipeline: hello-world  # pipeline's name\n    file: examples/pipelines/hello-world.yml  # pipeline's config\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"set-pipeline-step"},"schema.set-pipeline.instance_vars":{"location":"set-pipeline-step.html#schema.set-pipeline.instance_vars","title":"set_pipeline step instance_vars","text":"A map of instance vars used to identify instanced pipelines. These vars will also be interpolated into the pipeline config.\n\nNote that variables set with this field will not propagate to tasks configured via task step file. If you want those variables to be determined at the time the pipeline is set, use task step vars as well.\n\nInstance pipelines are experimental and need to be enabled by setting the --enable-pipeline-instances flag on the Running a web node.\n\nThe following pipeline will create one instance group with three pipelines. The instance group is called my-bots and each pipeline has a different set of instance_vars making it distinct from the other pipelines in the instance group. jobs:\n- name: set-pipeline-instance-group\n  plan:\n  - get: examples\n  - in_parallel:\n    - set_pipeline: my-bots\n      file: examples/pipelines/pipeline-vars.yml\n      instance_vars:\n        first: initial\n        number: \"9000\"\n        hello: HAL\n    - set_pipeline: my-bots\n      file: examples/pipelines/pipeline-vars.yml\n      instance_vars:\n        first: second\n        number: \"3000\"\n        hello: WALLY-E\n    - set_pipeline: my-bots\n      file: examples/pipelines/pipeline-vars.yml\n      instance_vars:\n        first: the-third\n        number: \"6000\"\n        hello: R2D2\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n\n\n Both instance_vars and vars may be statically. The difference between the two fields is that instance_vars are used to identify a pipeline and render the pipeline config. vars are only used for rendering the pipeline config:\n\njobs:\n- name: set-pipeline-vars-and-instance-vars\n  plan:\n  - get: examples\n  - set_pipeline: my-bots\n    file: examples/pipelines/pipeline-vars.yml\n    instance_vars:\n      first: initial\n      number: \"9000\"\n    vars:\n      hello: HAL\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n\n\n","depth":3,"section_tag":"set-pipeline-step"},"schema.set-pipeline.set_pipeline":{"location":"set-pipeline-step.html#schema.set-pipeline.set_pipeline","title":"set_pipeline step set_pipeline","text":"The identifier specifies the name of the pipeline to configure. Unless set_pipeline step team is set, it will be configured within the current team and be created unpaused. If set to self, the current pipeline will update its own config.\n\nThis is a way to ensure a pipeline stays up to date with its definition in a source code repository, eliminating the need to manually run fly set-pipeline.\n\njobs:\n- name: set-pipeline\n  plan:\n  - get: examples\n    trigger: true\n  - set_pipeline: hello-world  # pipeline's name\n    file: examples/pipelines/hello-world.yml  # pipeline's config\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"set-pipeline-step"},"schema.set-pipeline.team":{"location":"set-pipeline-step.html#schema.set-pipeline.team","title":"set_pipeline step team","text":"By default, the set_pipeline step sets the pipeline for the same team that is running the build.\n\nThe team attribute can be used to specify another team.\n\nOnly the The main team is allowed to set another team's pipeline.  Any team other than the The main team using the team attribute will error, unless they reference their own team.\n\njobs:\n- name: set-pipeline\n  plan:\n  - get: examples\n    trigger: true\n  - set_pipeline: hello-world\n    file: examples/pipelines/hello-world.yml\n    team: other-team  # name of the team goes here\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"set-pipeline-step"},"schema.set-pipeline.var_files":{"location":"set-pipeline-step.html#schema.set-pipeline.var_files","title":"set_pipeline step var_files","text":"A list of paths to .yml files that will be passed to the pipeline config in the same manner as the --load-vars-from flag to fly set-pipeline. This means that if a variable appears in multiple files, the value from a file that is passed later in the list will override the values from files earlier in the list.\n\nWhere the vars file looks like: first: initial\nnumber: \"9000\"\nhello: HAL\n\n\nAnd the pipeline config is:\n\njobs:\n- name: set-pipeline-vars-only\n  plan:\n  - get: examples\n  - set_pipeline: pipeline-set-with-vars\n    file: examples/pipelines/pipeline-vars.yml\n    var_files:\n      - examples/pipelines/vars-file.yml\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"set-pipeline-step"},"schema.set-pipeline.vars":{"location":"set-pipeline-step.html#schema.set-pipeline.vars","title":"set_pipeline step vars","text":"A map of template variables to pass to the pipeline config. Unlike instance_vars, vars are solely used to for interpolation, and do not become a part of the pipeline's identifier.\n\nNote that variables set with this field will not propagate to tasks configured via task step file. If you want those variables to be determined at the time the pipeline is set, use task step vars as well.\n\njobs:\n- name: set-pipeline-vars-only\n  plan:\n  - get: examples\n  - set_pipeline: pipeline-set-with-vars\n    file: examples/pipelines/pipeline-vars.yml\n    vars:\n      first: initial\n      number: \"9000\"\n      hello: HAL\n\nresources:\n- name: examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"set-pipeline-step"},"schema.ssm_config":{"location":"vars.html#schema.ssm_config","title":"ssm_config schema","text":"","depth":4,"section_tag":"var-sources"},"schema.ssm_config.region":{"location":"vars.html#schema.ssm_config.region","title":"ssm var source region","text":"The AWS region to read secrets from.\n\n","depth":4,"section_tag":"var-sources"},"schema.step":{"location":"steps.html#schema.step","title":"step schema","text":"","depth":2,"section_tag":"steps"},"schema.string":{"location":"config-basics.html#schema.string","title":"string schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.tags":{"location":"tags-step.html#schema.tags","title":"tags","text":"Default [].\n\nYou may have a private cluster only reachable by special workers running on-premises. To run steps against those workers, just provide a matching tag:\n\nplan:\n- get: my-repo\n- put: my-site\n  tags: [private]\n  params: {path: my-repo}\n- task: acceptance-tests\n  tags: [private]\n  file: my-repo/ci/acceptance.yml\n","depth":4,"section_tag":"tags-step"},"schema.task-config":{"location":"tasks.html#schema.task-config","title":"task-config schema","text":"","depth":2,"section_tag":"tasks"},"schema.task-config.caches":{"location":"tasks.html#schema.task-config.caches","title":"task-config.caches","text":"The cached directories shared between task runs.\n\nOn the task's first run, all cache directories will be empty. It is the responsibility of the task to populate these directories with any artifacts to be cached. On subsequent runs, the cached directories will contain those artifacts.\n\nCaches are scoped to the worker the task is run on, so you will not get a cache hit when subsequent builds run on different workers. This also means that caching is not intended to share state between workers, and your task should be able to run whether or not the cache is warmed.\n\nCaches are also scoped to a particular task name inside of a pipeline's job. As a consequence, if the job name, step name or cache path are changed, the cache will not be used. This also means that caches do not exist for one-off builds.\n\n","depth":2,"section_tag":"tasks"},"schema.task-config.container_limits":{"location":"tasks.html#schema.task-config.container_limits","title":"task-config.container_limits","text":"CPU and memory limits to enforce on the task container.\n\nNote that these values, when specified, will override any limits set by passing the --default-task-cpu-limit or --default-task-memory-limit flags to the concourse web command.\n\n","depth":2,"section_tag":"tasks"},"schema.task-config.image_resource":{"location":"tasks.html#schema.task-config.image_resource","title":"task-config.image_resource","text":"The container image to run with, as provided by an anonymous resource definition.\n\nWhenever the task runs, the anonymous resource will be checked to discover the latest version available. The image will then be fetched onto the worker, if necessary, just prior to running the task.\n\nTo use an image provided by a previous step within your build plan, set task step image on the task step instead.\n\nNOTE: This field is only required for tasks targeting the Linux platform. This field will be ignored for Windows and Darwin workers. Windows containers are currently not supported and Darwin does not have native containers. The task will run inside a clean temporary directory on the Windows/Darwin worker with any inputs and outputs copied into the same directory. Any dependencies should be pre-installed on the worker.\n\nThe following task config will use the golang Docker image to run go version:\n\nplatform: linux\n\nimage_resource:\n  type: registry-image\n  source: {repository: golang}\n\nrun:\n  path: go\n  args: [version]\n","depth":2,"section_tag":"tasks"},"schema.task-config.inputs":{"location":"tasks.html#schema.task-config.inputs","title":"task-config.inputs","text":"The set of artifacts used by task, determining which artifacts will be available in the current directory when the task runs.\n\nThese are satisfied by get steps or task-config.outputs of a previous task. These can also be provided by -i with Running tasks with fly execute.\n\nIf any required inputs are missing at run-time, then the task will error immediately.\n\n","depth":2,"section_tag":"tasks"},"schema.task-config.outputs":{"location":"tasks.html#schema.task-config.outputs","title":"task-config.outputs","text":"The artifacts produced by the task.\n\nEach output configures a directory to make available to later steps in the build plan. The directory will be automatically created before the task runs, and the task should place any artifacts it wants to export in the directory.\n\n","depth":2,"section_tag":"tasks"},"schema.task-config.params":{"location":"tasks.html#schema.task-config.params","title":"task-config.params","text":"A key-value mapping of string keys and values that are exposed to the task via environment variables.\n\nPipelines can override these params by setting task step params on the task step. This is a common method of providing credentials to a task.\n\n","depth":2,"section_tag":"tasks"},"schema.task-config.platform":{"location":"tasks.html#schema.task-config.platform","title":"task-config.platform","text":"The platform the task should run on. This determines the pool of workers that the task can run against.\n\nTechnically any string value is allowed so long as a worker advertises the same platform, but in practice only linux, darwin, and windows are in use.\n\n","depth":2,"section_tag":"tasks"},"schema.task-config.rootfs_uri":{"location":"tasks.html#schema.task-config.rootfs_uri","title":"task-config.rootfs_uri","text":"A string specifying the rootfs uri of the container, as interpreted by your worker's Garden backend.\n\ntask-config.image_resource is the preferred way to specify base image. You should only use this if you have no other option and you really know what you're doing.\n\n","depth":2,"section_tag":"tasks"},"schema.task-config.run":{"location":"tasks.html#schema.task-config.run","title":"task-config.run","text":"The command to execute in the container.\n\nNote that this is not provided as a script blob, but explicit path and args values; this allows fly to forward arguments to the script, and forces your config .yml to stay fairly small.\n\n","depth":2,"section_tag":"tasks"},"schema.task.config":{"location":"task-step.html#schema.task.config","title":"task step config","text":"The task config to execute. jobs:\n- name: job\n  public: true\n  plan:\n  - task: simple-task\n    config: # contains all field in a task config\n      platform: linux\n      image_resource:\n        type: registry-image\n        source: { repository: busybox }\n      run:\n        path: echo\n        args: [\"Hello world!\"]\n\n\n","depth":3,"section_tag":"task-step"},"schema.task.container_limits":{"location":"task-step.html#schema.task.container_limits","title":"task step container_limits","text":"CPU and memory limits to enforce on the task container.\n\nNote that these values, when specified, will override any limits set by passing the --default-task-cpu-limit or --default-task-memory-limit flags to the concourse web command.\n\nThese values will also override any configuration set on a task's config container_limits.\n\nThis task will only be given 10MB of memory and 2 CPU shares.\n\njobs:\n- name: limited-resources\n  plan:\n  - task: constrained-task\n    container_limits:\n      cpu: 2 # CPU shares are relative\n      memory: 10000000 # 10MB\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source: { repository: busybox }\n      run:\n        path: echo\n        args: [\"Hello world!\"]\n","depth":3,"section_tag":"task-step"},"schema.task.container_limits.cpu":{"location":"task-step.html#schema.task.container_limits.cpu","title":"task step cpu","text":"The maximum amount of CPU available to the task container, measured in shares. 0 means unlimited.\n\nCPU shares are relative to the CPU shares of other containers on a worker. For example, if you have two containers both with a CPU limit of 2 shares then each container will get 50% of the CPU's time.\n\nContainer A: 2 shares - 50% CPU\nContainer B: 2 shares - 50% CPU\nTotal CPU shares declared: 4\nIf you introduce another container then the number of CPU time per container changes. CPU shares are relative to each other. Container A: 2 shares - 25% CPU\nContainer B: 2 shares - 25% CPU\nContainer C: 4 shares - 50% CPU\nTotal CPU shares declared: 8\n\n\n","depth":3,"section_tag":"task-step"},"schema.task.container_limits.memory":{"location":"task-step.html#schema.task.container_limits.memory","title":"task step memory","text":"The maximum amount of memory available to the task container, measured in bytes. 0 means unlimited.\n\n","depth":3,"section_tag":"task-step"},"schema.task.file":{"location":"task-step.html#schema.task.file","title":"task step file","text":"A dynamic alternative to task step config.\n\nfile points at a .yml file containing the task config, which allows this to be tracked with your resources.\n\nThe first segment in the path should refer to another source from the plan, and the rest of the path is relative to that source.\n\nThe content of the config file may contain template ((vars)), which will be filled in using task step vars or a configured credential manager. Uses this config file. jobs:\n- name: task-config-in-file\n  plan:\n  - get: ci\n  - task: config-from-file\n    file: ci/tasks/hello-world.yml\n\nresources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\n\n\n\n","depth":3,"section_tag":"task-step"},"schema.task.hermetic":{"location":"task-step.html#schema.task.hermetic","title":"task step hermetic","text":"This setting is only supported by the containerd runtime on Linux. For other runtimes this setting has no effect on container networking. Please contact your Concourse operator to find out what runtime your Concourse cluster is using.\n\nDefault false. If set to true, the task will have no outbound network access. Your task will not be able to reach the internet or any local network resources that aren't also inside the container.\n\nFor macOS and Windows this field has no effect since workloads on those machines are not containerized.\n\n","depth":3,"section_tag":"task-step"},"schema.task.image":{"location":"task-step.html#schema.task.image","title":"task step image","text":"Specifies an artifact source containing an image to use for the task. This overrides any task-config.image_resource configuration present in the task configuration.\n\nThis is very useful when part of your pipeline involves building an image, possibly with dependencies pre-baked. You can then propagate that image through the rest of your pipeline, guaranteeing that the correct version (and thus a consistent set of dependencies) is used throughout your pipeline.\n\nThis can be used to explicitly keep track of dependent images. You could also modify it to build and push the image in one job and use it in later jobs. See Building and Pushing an Image.\n\nresources:\n- name: golang\n  type: registry-image\n  source:\n    repository: golang  # could also be the full URL \"docker.io/golang\"\n    tag: \"1.17\"\n\njobs:\n- name: fetch-and-run-image\n  plan:\n  - get: golang\n  - task: use-fetched-image-in-task\n    image: golang   # reference the image from the get step\n    config:\n      platform: linux\n      run:\n        path: go\n        args: [\"version\"]\nBuilding an Image and Using it in a Task\n\n","depth":3,"section_tag":"task-step"},"schema.task.input_mapping":{"location":"task-step.html#schema.task.input_mapping","title":"task step input_mapping","text":"A map from task input names to concrete names in the build plan. This allows a task with generic input names to be used multiple times in the same plan, mapping its inputs to specific resources within the plan.\n\nThe following example demonstrates a task with generic main and dev inputs being mapped to more specific artifact names, repo and repo-dev:\n\njobs:\n- name: task-input-mapping\n  plan:\n  - in_parallel:\n    - get: repo\n    - get: repo-dev\n    - get: ci\n  - task: list-inputs\n    input_mapping:\n      main: repo\n      dev: repo-dev\n    file: ci/tasks/generic-inputs.yml\n\nresources:\n- name: repo\n  type: mock\n- name: repo-dev\n  type: mock\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"task-step"},"schema.task.output_mapping":{"location":"task-step.html#schema.task.output_mapping","title":"task step output_mapping","text":"A map from task output names to concrete names to register in the build plan. This allows a task with generic output names to be used multiple times in the same plan.\n\nThis is often used together with task step input_mapping:\n\nGiven this task config: platform: linux\nimage_resource:\n  type: mock\n  source: {mirror_self: true}\n\ninputs:\n- name: main\n- name: dev\n\noutputs:\n- name: main\n- name: dev\n\nrun:\n  path: sh\n  args:\n  - -c\n  - |\n    ls -lah\n    echo \"creating versions\"\n    echo \"hello-world\" \u003e main/version\n    echo \"hey there dev\" \u003e dev/version\n\n\nThis pipeline will map the inputs and outputs of the task to match the name of the resources in the pipeline. jobs:\n- name: task-output-mapping\n  plan:\n  - in_parallel:\n    - get: repo\n    - get: repo-dev\n    - get: ci\n  - task: create-outputs\n    input_mapping:\n      main: repo\n      dev: repo-dev\n    output_mapping:\n      main: repo\n      dev: repo-dev\n    file: ci/tasks/generic-outputs.yml\n  - in_parallel:\n    - put: repo\n      params:\n        file: repo/version\n    - put: repo-dev\n      params:\n        file: repo-dev/version\n\nresources:\n- name: repo\n  type: mock\n- name: repo-dev\n  type: mock\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n\n\n","depth":3,"section_tag":"task-step"},"schema.task.params":{"location":"task-step.html#schema.task.params","title":"task step params","text":"A map of task environment variable parameters to set, overriding those configured in the task's config or file.\n\nThe difference between params and vars is that vars allows you to interpolate any template variable in an external task file, while params can be used to overwrite task parameters specifically. Also, params can have default values declared in the task.\n\nLet's say we have a task config like so:\n\nplatform: linux\n\nimage_resource:\n  type: mock\n  source: { mirror_self: true }\n\nparams:\n  ECHO_ME: \"default text to echo from task config file\"\n  ALSO_ME:\n\nrun:\n  path: sh\n  args:\n  - -c\n  - |\n    echo ${ECHO_ME} and ${ALSO_ME}\n\n\nThis indicates that there are two params which can be set: ECHO_ME, which has a default, and ALSO_ME which has no default set.\n\nA pipeline could run the task with values passed in like so:\n\njobs:\n- name: task-params\n  plan:\n  - get: ci\n  - task: constrained-task\n    file: ci/tasks/print-param.yml\n    params:\n      ECHO_ME: \"Eat your fruits\"\n      ALSO_ME: \"veggies\"\n\nresources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\njobs:\n- name: task-params\n  plan:\n  - get: ci\n  - task: constrained-task\n    file: ci/tasks/print-param.yml\n    params:\n      ECHO_ME: ((some-var))\n      ALSO_ME: ((another-var))\n\nresources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"task-step"},"schema.task.privileged":{"location":"task-step.html#schema.task.privileged","title":"task step privileged","text":"Default false. If set to true, the task will run with escalated capabilities available on the task's platform.\n\nSetting privileged: true is a gaping security hole; use wisely and only if necessary. This is not part of the task configuration in order to prevent privilege escalation via pull requests changing the task file.\n\nFor the linux platform, this determines whether or not the container will run in a separate user namespace. When set to true, the container's root user is actual root, i.e. not in a user namespace. This is not recommended, and should never be used with code you do not trust - e.g. pull requests.\n\nFor macOS and Windows this field has no effect since workloads on those machines are not containerized.\n\n","depth":3,"section_tag":"task-step"},"schema.task.task":{"location":"task-step.html#schema.task.task","title":"task step task","text":"The identifier value is just a name - short and sweet. The value is shown in the web UI but otherwise has no affect on anything. This may change in the future; RFC #32 proposes that the name be used to reference a file within the project.\n\nYou can think of tasks like functions. They have predefined inputs and outputs and can be written in idempotent ways.\n\nThe following pipeline contains a function that increments a number. You can think of the task add-one like this pseudo-function:\n\nfunc AddOne(num int) int {\n  return num + 1\n}\njobs:\n- name: idempotent-task\n  plan:\n  - get: counter\n  - task: add-one\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source: {mirror_self: true}\n      inputs:\n      - name: counter\n      outputs:\n      - name: counter\n      run:\n        path: sh\n        args:\n        - -c\n        - |\n          COUNTER=$(cat counter/version)\n          NEXT=$(($COUNTER + 1))\n          echo \"new version: $NEXT\"\n          echo $NEXT \u003e counter/next\n  - put: counter\n    params:\n      file: counter/next\n\nresources:\n- name: counter\n  type: mock\n  source:\n    initial_version: \"1\"\n","depth":3,"section_tag":"task-step"},"schema.task.vars":{"location":"task-step.html#schema.task.vars","title":"task step vars","text":"A map of template variables to pass to an external task. Not to be confused with task step params, which provides environment variables to the task.\n\nThis is to be used with external tasks defined in task step file.\n\nA var may be statically passed like so:\n\njobs:\n- name: task-vars\n  plan:\n  - get: ci\n  - task: override-task-vars\n    file: ci/tasks/print-var.yml\n    vars: # statically defined vars\n      my-var: \"Cookies are the best\"\n      second-var: \"chips are a close second\"\n\nresources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\nWhen run with the following task config:\n\nplatform: linux\n\nimage_resource:\n  type: mock\n  source: { mirror_self: true }\n\nparams:\n  MY_VAR: ((my-var))\n\nrun:\n  path: sh\n  args:\n  - -c\n  - |\n    echo ${MY_VAR} and ((second-var))\n\n\nThe \"((my-var))\" will be resolved to \"Cookies are the best\" and ((second-var)) will be resolved to \"chips are a close second\".\n\nThis can also be used in combination with Vars from a credential manager (i.e. Vault) as a way to re-map variable names to match what the task is expecting:\n\njobs:\n- name: task-vars\n  plan:\n  - get: ci\n  - task: override-task-vars\n    file: ci/tasks/print-var.yml\n    vars: # re-mapped vars\n      my-var: ((var-from-vault))\n      second-var: ((apple.type))\n\nresources:\n- name: ci\n  type: git\n  source:\n    uri: https://github.com/concourse/examples.git\n","depth":3,"section_tag":"task-step"},"schema.timeout":{"location":"timeout-step.html#schema.timeout","title":"timeout","text":"The following will run the unit task and cancel it if it takes longer than 1 hour and 30 minutes:\n\nplan:\n- get: foo\n- task: unit\n  file: foo/unit.yml\n  timeout: 1h30m\n","depth":4,"section_tag":"timeout-step"},"schema.try.try":{"location":"try-step.html#schema.try.try","title":"try step try","text":"Performs the given step, ignoring any failure and masking it with success.\n\nThis can be used when you want to perform some side-effect, but you don't really want the whole build to fail if it doesn't work.\n\nWhen emitting logs somewhere for analyzing later, if the destination flakes out it may not really be critical, so we may want to just swallow the error:\n\nplan:\n- task: run-tests\n  config: # ...\n  on_success:\n    try:\n      put: test-logs\n      params:\n        from: run-tests/*.log\n- task: do-something-else\n  config: # ...\n","depth":3,"section_tag":"try-step"},"schema.value":{"location":"config-basics.html#schema.value","title":"value schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.var_source":{"location":"vars.html#schema.var_source","title":"var_source schema","text":"","depth":4,"section_tag":"var-sources"},"schema.var_source.dummy-var-source.config":{"location":"vars.html#schema.var_source.dummy-var-source.config","title":"dummy var source config","text":"","depth":4,"section_tag":"var-sources"},"schema.var_source.dummy-var-source.type":{"location":"vars.html#schema.var_source.dummy-var-source.type","title":"dummy var source type","text":"The dummy type supports configuring a static map of vars to values.\n\nThis is really only useful if you have no better alternative for credential management but still have sensitive values that you would like to redact them from build output.\n\n","depth":4,"section_tag":"var-sources"},"schema.var_source.idtoken-var-source.config":{"location":"vars.html#schema.var_source.idtoken-var-source.config","title":"idtoken var source config","text":"","depth":4,"section_tag":"var-sources"},"schema.var_source.idtoken-var-source.type":{"location":"vars.html#schema.var_source.idtoken-var-source.type","title":"idtoken var source type","text":"The idtoken type issues JWTs which are signed by concourse and contain information about the currently running pipeline/job.\n\nThese JWTs can be used to authenticate with external services.\n\n","depth":4,"section_tag":"var-sources"},"schema.var_source.name":{"location":"vars.html#schema.var_source.name","title":"var_source.name","text":"The name of the ((var)) source. This should be short and simple. This name will be referenced ((var)) syntax throughout the config.\n\n","depth":4,"section_tag":"var-sources"},"schema.var_source.ssm-var-source.config":{"location":"vars.html#schema.var_source.ssm-var-source.config","title":"ssm var source config","text":"","depth":4,"section_tag":"var-sources"},"schema.var_source.ssm-var-source.type":{"location":"vars.html#schema.var_source.ssm-var-source.type","title":"ssm var source type","text":"The SSM type supports configuring an AWS Secrets Manager in a single region as a ((var)) source.\n\n","depth":4,"section_tag":"var-sources"},"schema.var_source.vault-var-source.config":{"location":"vars.html#schema.var_source.vault-var-source.config","title":"vault var source config","text":"Configuration for the Vault server has the following schema:\n\n","depth":4,"section_tag":"var-sources"},"schema.var_source.vault-var-source.type":{"location":"vars.html#schema.var_source.vault-var-source.type","title":"vault var source type","text":"The vault type supports configuring a Vault server as a ((var)) source.\n\n","depth":4,"section_tag":"var-sources"},"schema.vars":{"location":"config-basics.html#schema.vars","title":"vars schema","text":"","depth":3,"section_tag":"basic-schemas"},"schema.vault_config":{"location":"vars.html#schema.vault_config","title":"vault_config schema","text":"","depth":4,"section_tag":"var-sources"},"schema.vault_config.auth_backend":{"location":"vars.html#schema.vault_config.auth_backend","title":"vault var source auth_backend","text":"Authenticate using an auth backend, e.g. cert or approle.\n\nSee Using the approle auth backend or Using the cert auth backend for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.auth_max_ttl":{"location":"vars.html#schema.vault_config.auth_max_ttl","title":"vault var source auth_max_ttl","text":"Maximum duration to elapse before forcing the client to log in again.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.auth_params":{"location":"vars.html#schema.vault_config.auth_params","title":"vault var source auth_params","text":"A key-value map of parameters to pass during authentication.\n\nSee Using the approle auth backend for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.auth_retry_initial":{"location":"vars.html#schema.vault_config.auth_retry_initial","title":"vault var source auth_retry_initial","text":"When retrying during authentication, start with this retry interval. The interval will increase exponentially until auth_retry_max is reached.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.auth_retry_max":{"location":"vars.html#schema.vault_config.auth_retry_max","title":"vault var source auth_retry_max","text":"When failing to authenticate, give up after this amount of time.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.ca_cert":{"location":"vars.html#schema.vault_config.ca_cert","title":"vault var source ca_cert","text":"The PEM encoded contents of a CA certificate to use when connecting to the API.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.client_cert":{"location":"vars.html#schema.vault_config.client_cert","title":"vault var source client_cert","text":"A PEM encoded client certificate, for use with TLS based auth.\n\nSee Using the cert auth backend for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.client_key":{"location":"vars.html#schema.vault_config.client_key","title":"vault var source client_key","text":"A PEM encoded client key, for use with TLS based auth.\n\nSee Using the cert auth backend for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.client_token":{"location":"vars.html#schema.vault_config.client_token","title":"vault var source client_token","text":"Authenticate via a periodic client token.\n\nSee Using a periodic token for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.insecure_skip_verify":{"location":"vars.html#schema.vault_config.insecure_skip_verify","title":"vault var source insecure_skip_verify","text":"Skip TLS validation. Not recommended. Don't do it. No really, don't.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.lookup_templates":{"location":"vars.html#schema.vault_config.lookup_templates","title":"vault var source lookup_templates","text":"Default [\"/{{.Team}}/{{.Pipeline}}/{{.Secret}}\", \"/{{.Team}}/{{.Secret}}\"].\n\nA list of path templates to be expanded in a team and pipeline context subject to the path_prefix and namespace.\n\nSee Changing the path templates for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.namespace":{"location":"vars.html#schema.vault_config.namespace","title":"vault var source namespace","text":"A Vault namespace to operate under.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.path_prefix":{"location":"vars.html#schema.vault_config.path_prefix","title":"vault var source path_prefix","text":"Default /concourse. A prefix under which to look for all credential values.\n\nSee Changing the path prefix for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.server_name":{"location":"vars.html#schema.vault_config.server_name","title":"vault var source server_name","text":"The expected name of the server when connecting through TLS.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.shared_path":{"location":"vars.html#schema.vault_config.shared_path","title":"vault var source shared_path","text":"An additional path under which credentials will be looked up.\n\nSee Configuring a shared path for more information.\n\n","depth":4,"section_tag":"var-sources"},"schema.vault_config.url":{"location":"vars.html#schema.vault_config.url","title":"vault var source url","text":"The URL of the Vault API.\n\n","depth":4,"section_tag":"var-sources"},"schema.version":{"location":"config-basics.html#schema.version","title":"version schema","text":"","depth":3,"section_tag":"basic-schemas"},"security-contact":{"location":"project.html#security-contact","title":"Report a security issue","text":"To report a security issue, please email security@concourse-ci.org.\n\nSecurity advisories will be published as concourse/concourse GitHub Security Advisories.\n\n","depth":2,"section_tag":"security-contact"},"security-hardening":{"location":"security-hardening.html","title":"Security Hardening","text":"Concourse tasks run in containers, which provide a degree of isolation from the host. However, if inadequate attention is paid to security, anyone with the ability to update pipelines or modify a script called in a task might be able to escape from the container and take control of the host. From there, they could access other host resources, interfere with pipelines they might not otherwise have access to, and collect credentials.\n\nFollowing the guidance in this section can help you to greatly reduce the risk of a container escape.\n\n","depth":3,"section_tag":"security-hardening"},"serial-job-example":{"location":"serial-job-example.html","title":"Serial job example","text":"Setting the job.serial flag restricts a job to run one build at a time.\n\nBy default, jobs are run in parallel. For some use cases this might be ideal (ex. testing all incoming commits from a repository). For other use cases this might be less ideal (ex. deploying an application).\n\nYou can also set the job.max_in_flight value to 1 to disable parallel job runs.\n\n","depth":2,"section_tag":"serial-job-example"},"service-providers":{"location":"ecosystem.html#service-providers","title":"3rd Party Service Providers","text":"The following organizations provide various Concourse-related services, including training, consulting, support and managed solutions.\n\n* Altoros\n\n* anynines\n\n* Cycloid\n\n* Gstack\n\n* SuperOrbital\n\n","depth":2,"section_tag":"service-providers"},"set-pipeline":{"location":"set-pipeline-step.html#set-pipeline","title":"set_pipeline step","text":"Configures a pipeline. Expand each section below for more details and examples.\n\nPipelines configured with the set_pipeline step are connected to the job that configured them and will be automatically archived in the following scenarios: * When the job that previously set a pipeline runs a successful build which did not configure the pipeline (i.e.  the set_pipeline step was removed for that specific pipeline).\n\n* When the job is removed from its pipeline configuration (see job.old_name for renaming instead of removing).\n\n* When the job's pipeline is archived or destroyed.\n\n This means any job that uses set_pipeline should set all still-desired pipelines in each build, rather than setting them one-by-one through many builds.\n\nSee fly archive-pipeline for what happens when a pipeline is archived. \n\n","depth":3,"section_tag":"set-pipeline-step"},"set-pipeline-step":{"location":"set-pipeline-step.html","title":"set_pipeline step","text":"Configures a pipeline. Expand each section below for more details and examples.\n\nPipelines configured with the set_pipeline step are connected to the job that configured them and will be automatically archived in the following scenarios: * When the job that previously set a pipeline runs a successful build which did not configure the pipeline (i.e.  the set_pipeline step was removed for that specific pipeline).\n\n* When the job is removed from its pipeline configuration (see job.old_name for renaming instead of removing).\n\n* When the job's pipeline is archived or destroyed.\n\n This means any job that uses set_pipeline should set all still-desired pipelines in each build, rather than setting them one-by-one through many builds.\n\nSee fly archive-pipeline for what happens when a pipeline is archived. \n\n","depth":3,"section_tag":"set-pipeline-step"},"set-pipelines-example":{"location":"set-pipelines-example.html","title":"Set Pipelines Example","text":"You can set a static set of pipelines from another pipeline on the same team.\n\n","depth":2,"section_tag":"set-pipelines-example"},"setpipeline":{"location":"opa.html#setpipeline","title":"SetPipeline","text":"This action occurs whenever a set_pipeline step is run. The JSON payload for this action will contain the pipeline config in JSON format under the data key:\n\n{\n  \"input\": {\n    \"service\": \"concourse\",\n    \"cluster_name\": \"dev\",\n    \"cluster_version\": \"7.4.0\",\n    \"action\": \"SetPipeline\",\n    \"team\": \"main\",\n    \"pipeline\": \"simple\",\n    \"data\": {\n      \"jobs\": [\n        {\n          \"name\": \"test\",\n          \"plan\": [\n            {\n              \"get\": \"tiny\"\n            },\n            {\n              \"config\": {\n                \"image_resource\": {\n                  \"source\": {\n                    \"repository\": \"busybox\"\n                  },\n                  \"type\": \"registry-image\"\n                },\n                \"platform\": \"linux\",\n                \"run\": {\n                  \"args\": [\n                    \"-exc\",\n                    \"echo hello\"\n                  ],\n                  \"path\": \"sh\"\n                }\n              },\n              \"task\": \"a-task\" }\n] } ] } } }\n","depth":5,"section_tag":"setpipeline"},"setting-pipelines":{"location":"setting-pipelines.html","title":"Setting Pipelines","text":"Pipelines are configured entirely via the The fly CLI or the set_pipeline step. There is no GUI for configuring pipelines.\n\n","depth":3,"section_tag":"setting-pipelines"},"setting-roles":{"location":"managing-teams.html#setting-roles","title":"Setting User Roles","text":"By default, authorization config passed to set-team configures the owner role.\n\nMore advanced roles configuration can be specified through the --config or -c flag.\n\nThe -c flag expects a .yml file with a single field, roles:, pointing to a list of role authorization configs.\n\nAll of the attributes in each config will vary by provider. Consult the appropriate section for your provider under Configuring Auth for specifics.\n\nFor example, the following config sets three roles with different auth config for each role's provider:\n\nroles:\n- name: owner\n  github:\n    users: [\"admin\"]\n- name: member\n  github:\n    teams: [\"org:team\"]\n- name: viewer\n  github:\n    orgs: [\"org\"]\n  local:\n    users: [\"visitor\"]\n","depth":5,"section_tag":"setting-roles"},"sharing-versions-doesnt-work-well-for-all-resource-types":{"location":"global-resources.html#sharing-versions-doesnt-work-well-for-all-resource-types","title":"Sharing versions doesn't work well for all resource types","text":"Sharing versions isn't always a good idea. For example, the time resource is often used to generate versions on an interval so that jobs can fire periodically. If version history were to be shared for all users with e.g. a 10 minute interval, that would lead to a thundering herd of builds storming your workers, leading to load spikes and a lot of unhappy builds.\n\nWe are working toward a solution to the time resource's thundering herd problem - namely, to not model time as a resource, and instead model it as a var_source. We are tracking progress toward this goal in 5815.\n\nAnother case where version history shouldn't be shared is when resources \"automagically\" learn their auth credentials using things like IAM roles. In these cases, the credentials aren't in the resource.source. If version history were to be shared, anyone could configure the same source:, not specifying any credentials, and see the version history discovered by some other pipeline that ran its checks on workers that had access via IAM roles.\n\nFor this reason, any resource types that acquire credentials outside of source: should not share version history. Granted, the user won't be able to fetch these versions, but it's still an information leak.\n\nIAM roles are a bit of a thorn in our side when it comes to designing features like this. We're planning on introducing support for them in a way that doesn't have this problem in 3023.\n\n","depth":5,"section_tag":"sharing-versions-doesnt-work-well-for-all-resource-types"},"special-actions":{"location":"opa.html#special-actions","title":"Special Actions","text":"Most of the actions you can filter for come directly from the list of API actions. There are currently two special actions you can also filter on.\n\n","depth":4,"section_tag":"special-actions"},"specify-inputs-for-put-steps":{"location":"common-pipeline-practices.html#specify-inputs-for-put-steps","title":"Specify Inputs for Put Steps","text":"By default put step's have all artifacts from a job mounted in their resource container. This can result in long initialization times for put steps. It's likely that a put step only needs a subset of all available artifacts generated throughout the job.\n\nThere are two ways to specify which artifacts to send to a put step. You can specify detect as the put step inputs or you can pass in an exact list of all artifacts the put step needs.\n\nUsing detect: jobs:\n- name: the-job\n  plan: # Get some artifacts\n  - in_parallel:\n    - get: apples\n    - get: apple-basket\n    - get: monkeys\n  # using detect will result in \"apples-location\" and \"basket\" being passed in\n  # \"monkeys\" will not be passed in\n  - put: apples-in-basket\n    inputs: detect\n    params:\n      apples-location: apples/location # matches the first get step\n      basket: apple-basket # matches the second get step\n\n\nSpecifying the exact inputs needed for the put step: jobs:\n- name: the-job\n  plan: # Get some artifacts\n  - in_parallel:\n    - get: apples\n    - get: apple-basket\n    - get: monkeys\n  - put: apples-in-basket\n    inputs: [apples, apple-basket] # specify the exact inputs needed\n    params:\n      apples-location: apples/location\n      basket: apple-basket\n\n\n","depth":5,"section_tag":"specify-inputs-for-put-steps"},"ssm-var-source":{"location":"vars.html#ssm-var-source","title":"ssm var source","text":"","depth":4,"section_tag":"var-sources"},"static-vars":{"location":"vars.html#static-vars","title":"Static vars","text":"Var values may also be specified statically using the set_pipeline step and task step.\n\nWhen running the The fly CLI equivalent commands (fly set-pipeline and Running tasks with fly execute), var values may be provided using the following flags:\n\n* -v or --var NAME=VALUE sets the string VALUE as the value for the var NAME.\n\n* -y or --yaml-var NAME=VALUE parses VALUE as YAML and sets it as the value for the var NAME.\n\n* -i or --instance-var NAME=VALUE parses VALUE as YAML and sets it as the value for the instance var NAME. See Grouping Pipelines to learn more about instance vars.\n\n* -l or --load-vars-from FILE loads FILE, a YAML document containing mapping var names to values, and sets them all.\n\nWhen used in combination with -l, the -y and -v flags take precedence. This way a vars file may be re-used, overriding individual values by hand.\n\nLet's say we have a task config like so:\n\nplatform: linux\n\nimage_resource:\n  type: registry-image\n  source:\n    repository: golang\n    tag: ((tag))\n\ninputs:\n- name: booklit\n\nrun:\n  path: booklit/ci/unit\nWe could use vars to run this task against different versions of Go:\n\njobs:\n- name: unit\n  plan:\n  - get: booklit\n    trigger: true\n  - task: unit-1.13\n    file: booklit/ci/unit.yml\n    vars: {tag: 1.13}\n  - task: unit-1.8\n    file: booklit/ci/unit.yml\n    vars: {tag: 1.8}\nWith a pipeline template like so:\n\nresources:\n- name: booklit\n  type: booklit\n  source:\n    uri: https://github.com/concourse/booklit\n    branch: ((branch))\n    private_key: ((\"github.com\".private_key))\n\njobs:\n- name: unit\n  plan:\n  - get: booklit\n    trigger: ((trigger))\n  - task: unit\n    file: booklit/ci/unit.yml\nLet's say we have a private key in a file called private_key.\n\nThe fly validate-pipeline command may be used to test how interpolation is applied, by passing the --output flag.\n\n$ fly validate-pipeline \\\n  -c pipeline.yml \\\n  -y trigger=true \\\n  -v \\\"github.com\\\".private_key=\"$(cat private_key)\" \\\n  -v branch=master \\\n  --output\nThe above incantation should print the following:\n\njobs:\n- name: unit\n  plan:\n  - get: booklit\n    trigger: true\n  - file: booklit/ci/unit.yml\n    task: unit\nresources:\n- name: booklit\n  type: booklit\n  source:\n    branch: master\n    private_key: |\n      -----BEGIN RSA PRIVATE KEY-----\n      # ... snipped ...\n      -----END RSA PRIVATE KEY-----\n    uri: https://github.com/concourse/booklit\nNote that we had to use -y so that the trigger: true ends up with a boolean value instead of the string \"true\".\n\nWith a pipeline template like so:\n\nresources:\n- name: booklit\n  type: booklit\n  source:\n    uri: https://github.com/concourse/booklit\n    branch: ((branch))\n    private_key: ((\"github.com\".private_key))\n\njobs:\n- name: unit\n  plan:\n  - get: booklit\n    trigger: ((trigger))\n  - task: unit\n    file: booklit/ci/unit.yml\nLet's say I've put the private_key var in a file called vars.yml, since it's quite large and hard to pass through flags:\n\ngithub.com:\n  private_key: |\n    -----BEGIN RSA PRIVATE KEY-----\n    # ... snipped ...\n    -----END RSA PRIVATE KEY-----\nThe fly validate-pipeline command may be used to test how interpolation is applied, by passing the --output flag.\n\n$ fly validate-pipeline \\\n  -c pipeline.yml \\\n  -l vars.yml \\\n  -y trigger=true \\\n  -v branch=master \\\n  --output\nThe above incantation should print the following:\n\njobs:\n- name: unit\n  plan:\n  - get: booklit\n    trigger: true\n  - task: unit\n    file: booklit/ci/unit.yml\nresources:\n- name: booklit\n  type: booklit\n  source:\n    branch: master\n    private_key: |\n      -----BEGIN RSA PRIVATE KEY-----\n      # ... snipped ...\n      -----END RSA PRIVATE KEY-----\n    uri: https://github.com/concourse/booklit\nNote that we had to use -y so that the trigger: true ends up with a boolean value instead of the string \"true\".\n\n","depth":3,"section_tag":"static-vars"},"steps":{"location":"steps.html","title":"Steps","text":"Each job has a single build plan configured as job.plan. A build plan is a recipe for what to run when a build of the job is created.\n\nA build plan is a sequence of steps:\n\n* the task step runs a task\n\n* the get step fetches a resource\n\n* the put step updates a resource\n\n* the set_pipeline step configures a pipeline\n\n* the load_var step loads a value into a local var\n\n* the in_parallel step runs steps in parallel\n\n* the do step runs steps in sequence\n\n* the across step modifier runs a step multiple times; once for each combination of variable values\n\n* the try step attempts to run a step and succeeds even if the step fails\n\nWhen a new version is available for a get step with trigger: true configured, a new build of the job will be created from the build plan.\n\nWhen viewing the job in the pipeline, resources that are used as get steps appear as inputs, and resources that are used in put steps appear as outputs. Jobs are rendered downstream of any jobs they reference in passed constraints, connected by the resource.\n\nIf any step in the build plan fails, the build will fail and subsequent steps will not be executed. Additional steps may be configured to run after failure by configuring on_failure or ensure (or the job equivalents, job.on_failure and job.ensure).\n\n","depth":2,"section_tag":"steps"},"support":{"location":"support.html","title":"Support","text":"","depth":1,"section_tag":"support"},"tagging-workers":{"location":"concourse-worker.html#tagging-workers","title":"Tagging Workers","text":"If there's something special about your worker and you'd like to target builds at it specifically, you can configure tags like so:\n\nCONCOURSE_TAG=\"tag-1,tag-2\"\nA tagged worker is taken out of the default placement logic. Tagged workers will not be used for any untagged Steps.\n\nTo run build steps on a tagged worker, specify the tags on any particular step in your job.\n\nTo perform resource checks on on a tagged worker, specify tags on the resource declaration.\n\n","depth":5,"section_tag":"tagging-workers"},"tags-and-team-workers":{"location":"concourse-worker.html#tags-and-team-workers","title":"Tags and Team Workers","text":"When you have a worker configured with tag(s) and a team like so:\n\nCONCOURSE_TAG=\"tag-1,tag-2\"\nCONCOURSE_TEAM=\"lightweavers\"\nOnly steps that are tagged and from the specified team will be scheduled on such a worker. Any untagged work the team has will land on either:\n\n1. Untagged team workers belonging to the team, or\n\n2. Untagged workers not configured to a specific team\n\n","depth":6,"section_tag":"tags-and-team-workers"},"tags-step":{"location":"tags-step.html","title":"tags Step Modifier","text":"The tags by which to match workers.  The step will be placed within the a pool of workers that match all of the given set of tags.\n\nFor example, if [a, b] is specified, only workers advertising the a and b tags (in addition to any others) will be used for running the step. \n\n","depth":4,"section_tag":"tags-step"},"task":{"location":"task-step.html#task","title":"task step","text":"Executes a task. Expand each section below for more details and examples.\n\nWhen a task completes, the artifacts specified by task-config.outputs will be registered in the build's artifact namespace. This allows subsequent task steps and put steps to access the result of a task.\n\n","depth":3,"section_tag":"task-step"},"task-environment":{"location":"tasks.html#task-environment","title":"Task runtime environment","text":"A task runs in a new container every time, using the image provided by task-config.image_resource as its base filesystem (i.e. /).\n\nThe command specified by task-config.run will be executed in a working directory containing each of the task-config.inputs. If any input is missing, the task will not run (and the container will not even be created).\n\nThe working directory will also contain empty directories for each of the task-config.outputs. The task must place artifacts in the output directories for them to be exported. This meshes well with build tools with configurable destination paths.\n\nIf your build tools don't support output paths, you can configure an input and output with the same path. The directory will be populated by the input, and any changes made to the directory will propagate downstream as an output.\n\nAny task step params configured will be set in the environment for the task's command, along with any environment variables provided by the task's image (i.e. ENV rules from your Dockerfile).\n\nThe user the command runs as is determined by the image. If you're using a Docker image, this will be the user set by a USER rule in your Dockerfile, or root, if not specified.\n\nAnother relevant bit of configuration is task step privileged, which determines whether the user the task runs as will have full privileges (primarily when running as root). This is intentionally not configurable by the task itself, to prevent privilege escalation by submitting pull requests to repositories that contain task configs.\n\nPutting all this together, the following task config:\n\n---\nplatform: linux\n\nimage_resource:\n  type: registry-image\n  source:\n    repository: golang\n    tag: '1.6'\n\nparams:\n  SOME_PARAM: some-default-value\n\ninputs:\n- name: some-input\n- name: some-input-with-custom-path\n  path: some/custom/path\n\noutputs:\n- name: some-output\n\nrun:\n  path: sh\n  args:\n  - -exc\n  - |\n    whoami\n    env\n    go version\n    find .\n    touch some-output/my-built-artifact\n...will produce the following output:\n\n+ whoami\nroot\n+ env\nUSER=root\nHOME=/root\nGOLANG_DOWNLOAD_SHA256=5470eac05d273c74ff8bac7bef5bad0b5abbd1c4052efbdbc8db45332e836b0b\nPATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nGOPATH=/go\nPWD=/tmp/build/e55deab7\nGOLANG_DOWNLOAD_URL=https://golang.org/dl/go1.6.linux-amd64.tar.gz\nGOLANG_VERSION=1.6\nSOME_PARAM=some-default-value\n+ go version\ngo version go1.6 linux/amd64\n+ find .\n.\n./some-input\n./some-input/foo\n./some\n./some/custom\n./some/custom/path\n./some/custom/path/bar\n./some-output\n+ touch some-output/my-built-artifact\n...and propagate my-built-artifact to any later task steps or put steps that reference the some-output artifact, in the same way that this task had some-input as an input.\n\n","depth":3,"section_tag":"task-environment"},"task-inputs-outputs-example":{"location":"task-inputs-outputs-example.html","title":"Task inputs and outputs example","text":"A task can pass an artifacts to another task in the same job.\n\nTasks within a job have the ability to pass artifacts directly inbetween them to allow you to process artifacts in many ways.\n\nWhile you are free to create as many jobs as you'd like for your pipeline, you have to use resources to pass artifacts inbetween them.\n\nThese constructs give you the ability to design a pipeline that can process artifacts in many different ways via Tasks, and then store those processed artifacts externally via Resources.\n\n","depth":2,"section_tag":"task-inputs-outputs-example"},"task-step":{"location":"task-step.html","title":"task step","text":"Executes a task. Expand each section below for more details and examples.\n\nWhen a task completes, the artifacts specified by task-config.outputs will be registered in the build's artifact namespace. This allows subsequent task steps and put steps to access the result of a task.\n\n","depth":3,"section_tag":"task-step"},"tasks":{"location":"tasks.html","title":"Tasks","text":"The smallest configurable unit in a Concourse pipeline is a single task. A task can be thought of as a function from task-config.inputs to task-config.outputs that can either succeed or fail.\n\nGoing a bit further, ideally tasks are pure functions: given the same set of inputs, it should either always succeed with the same outputs or always fail. This is entirely up to your script's level of discipline, however. Flaky tests or dependencies on the internet are the most common source of impurity.\n\nOnce you have a running Concourse deployment, you can start configuring your tasks and executing them interactively from your terminal with the Fly commandline tool.\n\nOnce you've figured out your task's configuration, you can reuse it for a Job in your Pipeline.\n\nConventionally a task's configuration is placed in the same repository as the code it's testing, possibly under some ci directory.\n\nA task's configuration specifies the following:\n\nThis configuration specifies that the task must run with the ruby:2.1 Docker image with a my-app input, and when the task is executed it will run the scripts/test script in the same repo.\n\n---\nplatform: linux\n\nimage_resource:\n  type: registry-image\n  source:\n    repository: ruby\n    tag: '2.1'\n\ninputs:\n- name: my-app\n\nrun:\n  path: my-app/scripts/test\nA task can configure task-config.outputs to produce artifacts that can then be propagated to a put step or another task step in the same plan. They can also be downloaded with Running tasks with fly execute by passing -o.\n\n---\nplatform: linux\n\nimage_resource: # ...\n\ninputs:\n- name: project-src\n\noutputs:\n- name: built-project\n\nrun:\n  path: project-src/ci/build\n...assuming project-src/ci/build looks something like:\n\n#!/bin/bash\n\nset -e -u -x\n\nexport GOPATH=$PWD/project-src\n\ngo build -o built-project/my-project \\\n  github.com/concourse/my-project\n...this task could then be used in a build plan like so:\n\nplan:\n- get: project-src\n- task: build-bin\n  file: project-src/ci/build.yml\n- put: project-bin\n  params: file: built-project/my-project\nThe following task and script could be used by a Node project to cache the node_modules directory:\n\n---\nplatform: linux\n\nimage_resource: # ...\n\ninputs:\n- name: project-src\n\ncaches:\n- path: project-src/node_modules\n\nrun:\n  path: project-src/ci/build\n...assuming project-src/ci/build looks something like:\n\n#!/bin/bash\n\nset -e -u -x\n\ncd project-src\nnpm install\n\n# ...\n...this task would cache the contents of project-src/node_modules between runs of this task on the same worker.\n\nThe following external task uses an image from a private registry. Assuming the CA is configured properly on the workers, SSL should Just Work™.\n\nExternal tasks are now fully interpolated using credential manager variables and task step vars, so you can use template variables in an external task:\n\n---\nplatform: linux\n\nimage_resource:\n  type: registry-image\n  source:\n    repository: my.local.registry:8080/my/image\n    username: ((myuser))\n    password: ((mypass))\n\ninputs:\n- name: my-app\n\nrun:\n  path: my-app/scripts/test\n  args: [\"Hello, world!\", \"((myparam))\"]\n","depth":2,"section_tag":"tasks"},"team-member-role":{"location":"user-roles.html#team-member-role","title":"member role","text":"Team members can operate within their team in a read \u0026 write fashion, but they can not change the configuration of their team.\n\nActions assigned to the member role by default:\n\nmember:\n- SaveConfig\n- CreateBuild\n- DeletePipeline\n- OrderPipelines\n- OrderPipelinesWithinGroup\n- ExposePipeline\n- HidePipeline\n- RenamePipeline\n- ArchivePipeline\n- CreatePipelineBuild\n- RegisterWorker\n- LandWorker\n- RetireWorker\n- PruneWorker\n- HeartbeatWorker\n- DeleteWorker\n- HijackContainer\n- ReportWorkerContainers\n- ReportWorkerVolumes\n- CreateArtifact\n- GetArtifact\n","depth":4,"section_tag":"team-member-role"},"team-owner-role":{"location":"user-roles.html#team-owner-role","title":"owner role","text":"Team owners have read, write and auth management capabilities within the scope of their team, and can rename or destroy the team.\n\nActions assigned to the owner role by default:\n\nowner:\n- SetTeam\n- RenameTeam\n- DestroyTeam\n","depth":4,"section_tag":"team-owner-role"},"team-pipeline-operator-role":{"location":"user-roles.html#team-pipeline-operator-role","title":"pipeline-operator role","text":"Team pipeline operators can perform pipeline operations such as triggering builds and pinning resources, however they cannot update pipeline configurations.\n\nActions assigned to the pipeline-operator role by default:\n\npipeline-operator:\n- AbortBuild\n- RerunJobBuild\n- CreateJobBuild\n- PauseJob\n- UnpauseJob\n- ClearTaskCache\n- UnpinResource\n- SetPinCommentOnResource\n- CheckResource\n- CheckResourceWebHook\n- CheckResourceType\n- EnableResourceVersion\n- DisableResourceVersion\n- PinResourceVersion\n- PausePipeline\n- UnpausePipeline\n- ClearResourceCache\n","depth":4,"section_tag":"team-pipeline-operator-role"},"team-viewer-role":{"location":"user-roles.html#team-viewer-role","title":"viewer role","text":"Team viewers have \"read-only\" access to a team and its pipelines. This locks everything down, preventing users from doing a fly set-pipeline or fly intercept.\n\nActions assigned to the viewer role by default:\n\nviewer:\n- GetConfig\n- GetCC\n- GetBuild\n- GetCheck\n- GetBuildPlan\n- ListBuilds\n- BuildEvents\n- BuildResources\n- GetBuildPreparation\n- GetJob\n- ListAllJobs\n- ListJobs\n- ListJobBuilds\n- ListJobInputs\n- GetJobBuild\n- GetVersionsDB\n- JobBadge\n- MainJobBadge\n- ListAllResources\n- ListResources\n- ListResourceTypes\n- GetResource\n- ListResourceVersions\n- GetResourceVersion\n- ListBuildsWithVersionAsInput\n- ListBuildsWithVersionAsOutput\n- GetResourceCausality\n- ListAllPipelines\n- ListPipelines\n- GetPipeline\n- ListPipelineBuilds\n- PipelineBadge\n- ListWorkers\n- DownloadCLI\n- GetInfo\n- ListContainers\n- GetContainer\n- ListDestroyingContainers\n- ListVolumes\n- ListDestroyingVolumes\n- ListTeams\n- GetTeam\n- ListTeamBuilds\n- ListBuildArtifacts\n","depth":4,"section_tag":"team-viewer-role"},"team-workers":{"location":"concourse-worker.html#team-workers","title":"Team Workers","text":"If you want to isolate all workloads for a team then you can configure a worker to belong to a single team like so:\n\nCONCOURSE_TEAM=\"lightweavers\"\nOnce an untagged team worker is registered Concourse will schedule all untagged builds for that team on its team worker(s). Builds for this team will no longer be scheduled on any untagged, non-team workers.\n\nIt is possible to have a Concourse cluster made up of only team workers and have zero non-team workers, though this is not a common setup because resource utilization across all workers ends up underutilized. It is useful though if you have a particular team with heavy workloads that usually bothers other teams pipelines.\n\n","depth":5,"section_tag":"team-workers"},"teams":{"location":"auth.html","title":"Auth \u0026 Teams","text":"A single Concourse installation can accomodate many projects and users.\n\nPipelines, builds, and all other user data are owned by teams. A team is just a conceptual owner and a separate namespace, tied to an authorization config. For example, a team may authorize all members of the concourse GitHub organization to be a member.\n\nWhen a user authenticates, each team's authorization config is checked against the user to determine which role, if any, to grant for the team. This information is then stored in the user's token to determine access control for future requests.\n\n","depth":2,"section_tag":"auth"},"teams-caveats":{"location":"teams-caveats.html","title":"Security Caveats","text":"At present, teams only provide trusted multi-tenancy. This means it should be used for cases where you know and trust who you're allowing access into your Concourse cluster.\n\nThere are a few reasons it'd be a bad idea to do otherwise:\n\n* Any team can run builds with task step privileged tasks. A bad actor in the mix could easily use this to harm your workers and your cluster. You can lock down privileged mode if you use the containerd runtime and avoid this issue all together.\n\n* There are no networking restrictions in place, and traffic to and from the worker's Garden and Baggageclaim endpoints is currently unencrypted and unauthorized. Anyone could run a task that does horrible things to your worker's containers, possibly stealing sensitive information.\n\n  This can be remedied with configuration specified on Garden to restrict access to the internal network, but this is not detailed in our docs, and we'll probably want to find a better answer than configuration in the future.\n\n  You could put firewall rules in place between workers to mitigate this issue as well.\n\n","depth":3,"section_tag":"teams-caveats"},"test-resource-with-docker":{"location":"implementing-resource-types.html#test-resource-with-docker","title":"Testing resources locally using docker","text":"To test an already packaged resource (a docker image) outside concourse, you need to: 1. If, for instance, you are testing the out behaviour of the git resource, create a json file with source configuration of the resource and the params the put step expects. Such a file for the git resource would contain the following (or similar): {\n    \"source\": {\n      \"uri\": \"git://some-uri\",\n      \"branch\": \"develop\",\n      \"private_key\": \"...\"\n    },\n    \"params\": {\n      \"repository\": \".\",\n      \"rebase\": true\n    }\n  }\n   Save this file to out-config.json in your working directory.\n\n2. Then run the /opt/resource/out script with its inputs provided via stdin like so (using the docker cli as an example): docker run --rm -i -v \"${PWD}:${PWD}\" -w \"${PWD}\" concourse/git-resource /opt/resource/out . \u003c out-config.json\n\n This example needs modification depending on the resource you are testing and your local environment. See the notes below for details. 1. If you use the exact configuration in this example, the git resource will print an error about the format of the private key being invalid. Adjust the content out-config.json as necessary to get it working with your resource.\n\n2. If the resource you are testing uses Metadata, you will need to provide the required metadata as environment variables to your docker run command like so: docker run --rm -i -e ATC_EXTERNAL_URL=\"https://concourse.example.com\" -e BUILD_NAME=620 -v \"${PWD}:${PWD}\" -w \"${PWD}\" concourse/git-resource /opt/resource/out . \u003c out-config.json\n\n\n\n","depth":4,"section_tag":"test-resource-with-docker"},"thanks":{"location":"project.html#thanks","title":"Thanks!","text":"It's been a long journey and we're grateful to many people for our continued success. We are deeply indebted to all who help sustain this project, but the extraordinary efforts of the following organizations deserve special recognition.\n\nPivotal: Concourse wouldn't be what it is today without Pivotal. This extends beyond the sponsorship, which began in early 2015 - without the experiences we gained and the practices we learned while working on Cloud Foundry and BOSH, we would have neither the technical expertise nor the strong opinions that led to Concourse's creation.\n\n\n\n","depth":2,"section_tag":"thanks"},"the-big-caveat":{"location":"performance-tuning.html#the-big-caveat","title":"The Big Caveat","text":"Track Metrics! Everything you read next could be all for nothing if you don't have metrics to track where the bottlenecks are in your Concourse system. We highly suggest tracking metrics so you have a clear before and after picture for any changes you make and to clearly see if you're moving things in the right direction.\n\n","depth":4,"section_tag":"the-big-caveat"},"the-dockerfile":{"location":"building-and-pushing-an-image.html#the-dockerfile","title":"The Dockerfile","text":"FROM busybox\n\nRUN echo \"I'm simple!\"\nCOPY ./stranger /stranger\nRUN cat /stranger\n","depth":5,"section_tag":"the-dockerfile"},"the-entire-pipeline":{"location":"building-and-pushing-an-image.html#the-entire-pipeline","title":"The Entire Pipeline","text":"Putting all the pieces together, here is our pipeline that builds and pushes a container image.\n\nresources:\n# The repo with our Dockerfile\n- name: concourse-examples\n  type: git\n  icon: github\n  source:\n    uri: https://github.com/concourse/examples.git\n    branch: master\n\n# Where we will push the image\n- name: simple-image\n  type: registry-image\n  icon: docker\n  source:\n    repository: ((image-repo-name))/simple-image\n    tag: latest\n    username: ((registry-username))\n    password: ((registry-password))\n\njobs:\n- name: build-and-push\n  plan:\n  - get: concourse-examples\n  - task: build-task-image\n    privileged: true\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: concourse/oci-build-task\n      inputs:\n      - name: concourse-examples\n      outputs:\n      - name: image\n      params:\n        CONTEXT: concourse-examples/Dockerfiles/simple\n      run:\n        path: build\n  - put: simple-image\n    params:\n      image: image/image.tar\n \n\nYou can set the pipeline with the following fly command, updating the variable values with real values the pipeline can use to run.\n\nfly -t \u003ctarget\u003e set-pipeline -p build-and-push-image \\\n  -c ./examples/pipelines/build-and-push-simple-image.yml \\\n  --var image-repo-name=\u003crepo-name\u003e \\\n  --var registry-username=\u003cuser\u003e \\\n  --var registry-password=\u003cpassword\u003e\n","depth":5,"section_tag":"the-entire-pipeline"},"the-heart-of-concourse":{"location":"tutorial-resources.html#the-heart-of-concourse","title":"The Heart of Concourse","text":"Resources are the heart of Concourse. Resources make Concourse tick and are the source of automation within all Concourse pipelines. Resources are how Concourse interacts with the outside world. Here's a short list of things that resources can do:\n\n* Run a job every five minutes: Time resource.\n\n* Run tests on new commits to the main branch: Git resource.\n\n* Publish a new release of your app on Github: Github Release resource.\n\n* Pull or push the latest image of your app: Registry-image resource\n\nResources can do a lot of things! The main goal of resources is to represent some external system or object in your pipeline. That external thing can then be used as a trigger for your Jobs or your Jobs can push back and modify the external system or object. It all depends on the resource you use and what features its author has implemented.\n\nResources are also how Concourse tries to stay as technology agnostic as possible. For example: Concourse doesn't care what version control system you store your code in, if you deploy apps with Helm or Terraform, or what language your apps are built in.  If you can put your latest and hottest tech behind the resource interface then Concourse can understand your workflow.\n\nThe Concourse team bundles a few basic resource types that come with the Linux release that you can download from Github. You'll notice that the Linux tarball is much larger than the macOS or Windows tarball because of all the bundled resources.\n\nYou can find out which resources a worker has by running: $ fly -t tutorial workers --details\n\n\nResources only run on Linux workers because resources are distributed as Linux container images. There are currently no resources for macOS or Windows. Only task steps can run on macOS or Windows workers.\n\n","depth":4,"section_tag":"the-heart-of-concourse"},"time-to-takeoff":{"location":"tutorial-resources.html#time-to-takeoff","title":"Time For Takeoff ✈️","text":"This brings us to the end of the tutorial. You should have a basic understanding about how to read Concourse pipelines and start creating your own. Here are some other parts of the site to help you take off with Concourse:\n\n* How-To Guides - Contains tips for writing pipelines and examples of common pipeline workflows\n\n* Check out all the reference documentation: * Jobs\n\n  * Tasks\n\n  * Resources\n\n  * Resource Types\n\n* Implement your own resource type\n\n* Find other resources at resource-types.concourse-ci.org or put something concourse resource into your favorite search engine.\n\nBest of luck on your automation journey!\n\nIf you have any feedback for this tutorial please share it in this GitHub discussion\n\n","depth":4,"section_tag":"time-to-takeoff"},"time-trigger-example":{"location":"time-trigger-example.html","title":"time-triggered job example","text":"The time resource can be used to trigger a job.\n\n","depth":2,"section_tag":"time-trigger-example"},"time-triggered-pipeline-patterns":{"location":"time-triggered-pipeline-patterns.html","title":"Time Triggered Pipeline Patterns","text":"The time resource produces a new version for the time interval that was declared in its definition in the pipeline configuration file.\n\nThe two most common usages are having the time resource trigger on an interval:\n\nresources:\n- name: trigger-every-3-minutes\n  type: time\n  source:\n    interval: 3m\nOr trigger once within a certain time range: resources:\n- name: trigger-daily-between-1am-and-2am\n  type: time\n  source:\n    start: 1:00 AM\n    stop: 2:00 AM\n    location: America/Toronto\n\n\nCheck the README of the time resource for more details.\n\n","depth":4,"section_tag":"time-triggered-pipeline-patterns"},"timeout-step":{"location":"timeout-step.html","title":"timeout Step Modifier","text":"The amount of time to limit the step's execution to, e.g. 30m for 30 minutes.\n\nWhen exceeded, the step will be interrupted, with the same semantics as aborting the build (except the build will be errored, not aborted, to distinguish between human intervention and timeouts being enforced).\n\n","depth":4,"section_tag":"timeout-step"},"trace-context-propagation":{"location":"tracing.html#trace-context-propagation","title":"Trace context propagation","text":"When tracing is enabled, trace context propagation is activated in pipeline tasks thanks to the  injection of the environment variable TRACEPARENT in run commands. The environment variable TRACEPARENT complies with the  W3C Trace Context specification.\n\n","depth":4,"section_tag":"trace-context-propagation"},"tracing":{"location":"tracing.html","title":"Tracing","text":"This is an experimental feature.\n\nTracing in Concourse enables the delivery of traces related to the internal processes that go into running builds, and other internal operations, breaking them down by time, and component.\n\nIt leverages the (OpenTelemetry) SDK to allow support for many platforms. Currently tracing can be configured to integrates with:\n\n* Jaeger\n\n* Google Cloud Trace (Stackdriver)\n\n* Honeycomb.io\n\n* OpenTelemetry Protocol Exporter\n\n","depth":3,"section_tag":"tracing"},"transitioning-from-guardian-to-containerd":{"location":"concourse-worker.html#transitioning-from-guardian-to-containerd","title":"Transitioning from Guardian to containerd","text":"If you are transitioning from Guardian to containerd you will need to convert any --garden-* (CONCOURSE_GARDEN_*) flags to their containerd (CONCOURSE_CONTAINERD_*) counterparts:\n\n| Guardian Flags | Containerd Flags |\n| --garden-request-timeout CONCOURSE_GARDEN_REQUEST_TIMEOUT\n\n | --containerd-request-timeout CONCOURSE_CONTAINERD_REQUEST_TIMEOUT\n\n |\n| --garden-dns-proxy-enable CONCOURSE_GARDEN_DNS_PROXY_ENABLE\n\n | --containerd-dns-proxy-enable CONCOURSE_CONTAINERD_DNS_PROXY_ENABLE\n\n |\n| No equivalent CLI flag CONCOURSE_GARDEN_ALLOW_HOST_ACCESS\n\n | --containerd-allow-host-access CONCOURSE_CONTAINERD_ALLOW_HOST_ACCESS\n\n |\n| --garden-network-pool CONCOURSE_GARDEN_NETWORK_POOL\n\n | --containerd-network-pool CONCOURSE_CONTAINERD_NETWORK_POOL\n\n |\n| --garden-max-containers CONCOURSE_GARDEN_MAX_CONTAINERS\n\n | --containerd-max-containers CONCOURSE_CONTAINERD_MAX_CONTAINERS\n\n |\n| No equivalent CLI flag CONCOURSE_GARDEN_DENY_NETWORKS\n\n | --containerd-restricted-network CONCOURSE_CONTAINERD_RESTRICTED_NETWORK\n\n |\n| No equivalent CLI flag or ENV option. Configured through gardenconfig.ini\n\n | --containerd-additional-hosts CONCOURSE_CONTAINERD_ADDITIONAL_HOSTS\n\n |\n| No equivalent CLI flag CONCOURSE_GARDEN_DNS_SERVER\n\n | --containerd-dns-server CONCOURSE_CONTAINERD_DNS_SERVER\n\n |\n| No equivalent CLI flag CONCOURSE_GARDEN_EXTERNAL_IP\n\n | --containerd-external-ip CONCOURSE_CONTAINERD_EXTERNAL_IP\n\n |\n| No equivalent CLI flag CONCOURSE_GARDEN_MTU\n\n | --containerd-mtu CONCOURSE_CONTAINERD_MTU\n\n |\n\n","depth":6,"section_tag":"transitioning-from-guardian-to-containerd"},"troubleshooting-and-fixing-dns-resolution":{"location":"concourse-worker.html#troubleshooting-and-fixing-dns-resolution","title":"Troubleshooting and fixing DNS resolution","text":"Note: The Guardian runtime took care of a lot of container creation operations for Concourse in the past. It was very user-friendly for the project to use as a container runtime. While implementing the containerd runtime most reported bugs were actually a difference in containerd's default behaviour compared to Guardian's. Currently Concourse's containerd runtime mostly behaves like the Guardian runtime did. Most of the following DNS section should apply to both runtimes.\n\nBy default, containers created by the Guardian or containerd (will refer to both as runtime) runtime will carry over the /etc/resolv.conf from the host into the container. This is often fine, but some Linux distributions configure a special 127.x.x.x DNS resolver (e.g. systemd-resolved).\n\nWhen the runtime copies the resolv.conf over, it removes these entries as they won't be reachable from the container's network namespace. As a result, your containers may not have any valid nameservers configured.\n\nTo diagnose this problem you can fly intercept into a failing container and check which nameservers are in /etc/resolv.conf:\n\n$ fly -t ci intercept -j concourse/concourse\nbash-5.0$ grep nameserver /etc/resolv.conf\nbash-5.0$\nIn this case it is empty, as the host only listed a single 127.0.0.53 address which was then stripped out. To fix this you'll need to explicitly configure DNS instead of relying on the default runtime behavior.\n\n","depth":6,"section_tag":"troubleshooting-and-fixing-dns-resolution"},"try":{"location":"try-step.html#try","title":"try step","text":"","depth":3,"section_tag":"try-step"},"try-step":{"location":"try-step.html","title":"try step","text":"","depth":3,"section_tag":"try-step"},"tutorial-hello-world":{"location":"tutorial-hello-world.html","title":"Hello World Pipeline","text":"","depth":3,"section_tag":"tutorial-hello-world"},"tutorial-inputs-outputs":{"location":"tutorial-inputs-outputs.html","title":"Inputs and Outputs","text":"","depth":3,"section_tag":"tutorial-inputs-outputs"},"tutorial-resources":{"location":"tutorial-resources.html","title":"Resources","text":"","depth":3,"section_tag":"tutorial-resources"},"upgrading-concourse":{"location":"upgrading-concourse.html","title":"Upgrading Concourse","text":"Be careful to check the \"Breaking Changes\" in the release notes - in particular, you'll want to look for any flags that have changed.\n\n","depth":3,"section_tag":"upgrading-concourse"},"upgrading-the-web-node":{"location":"upgrading-concourse.html#upgrading-the-web-node","title":"Upgrading the Web Node","text":"The web node is upgraded by stopping the Concourse process, swapping out the concourse binary with the new one, and re-starting it.\n\nEach Running a web node will automatically run database migrations on start-up and lock via the database to ensure only one of the web nodes runs the migrations. We currently do not guarantee zero-downtime upgrades, as migrations may make changes that confuse the older web nodes. This should resolve as each web node is upgraded, and shouldn't result in any inconsistent state.\n\nTypically, Concourse can be upgraded from any version to any other version, though around 3.x and 4.x we made some changes to how migrations are run, and as a result the following upgrade paths must be followed:\n\n| Current Version | Upgrade Path |\n| \u003c v3.6.0 | v3.6.0 -\u003e v4.0.0 -\u003e latest |\n| = v3.6.0 | v4.0.0 -\u003e latest |\n\nWe'll try to minimize this kind of thing in the future.\n\nLastly, you will want to overwrite the contents of concourse/fly-assets with the contents from the GitHub release tarball so users can fly sync to the correct version.\n\n","depth":4,"section_tag":"upgrading-the-web-node"},"upgrading-the-worker-node":{"location":"upgrading-concourse.html#upgrading-the-worker-node","title":"Upgrading the Worker Node","text":"The worker node is upgraded by stopping the Concourse process, swapping out the concourse binary with the new one, and re-starting it.\n\n","depth":4,"section_tag":"upgrading-the-worker-node"},"usage":{"location":"idtoken-credential-manager.html#usage","title":"Usage","text":"You create a var source of type idtoken with the configuration you want (see Configuration) in your pipeline. That var source then exposes a single variable with a single field, token, which contains the JWT and can be used in any step of your pipeline.\n\nYou can also have multiple idtoken var sources in the same pipeline, each with different audiences, lifetimes etc.\n\nvar_sources:\n- name: myidtoken\n  type: idtoken\n  config:\n    audience: [\"sts.amazonaws.com\"]\n\njobs:\n- name: print-creds\n  plan:\n  - task: print\n    config:\n      platform: linux\n      image_resource:\n        type: mock\n        source: {mirror_self: true}\n      run:\n        path: bash\n        args:\n        - -c\n        - |\n          echo myidtoken: ((myidtoken:token))\n","depth":5,"section_tag":"usage"},"use-the-image":{"location":"building-an-image-and-using-it-in-a-task.html#use-the-image","title":"Use the Image","text":"Next we want to add a second task to this job which will use the image generated from the first task as its container image. To use the image from the previous step add the top-level image key to the task step.\n\nresources: ...  # omitting for brevity\n\njobs:\n- name: build-and-run\n  plan:\n  - get: concourse-examples\n  - task: build-image\n    privileged: true\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: concourse/oci-build-task\n      inputs:\n      - name: concourse-examples\n      outputs:\n      - name: image\n      params:\n        CONTEXT: concourse-examples/Dockerfiles/simple\n        UNPACK_ROOTFS: true\n      run:\n        path: build\n  - task: use-built-image-in-task  # add a new task step\n    image: image  # using the image built in the previous step\n    config:\n      platform: linux\n      run:\n        path: cat\n        args: [\"/stranger\"]\n \n\nYou can set the pipeline with the following fly command.\n\nfly -t \u003ctarget\u003e set-pipeline -p build-and-use-image \\\n  -c ./build-and-use-image.yml \\\n","depth":5,"section_tag":"use-the-image"},"useimage":{"location":"opa.html#useimage","title":"UseImage","text":"Before Concourse starts a container you can check what image it is going to use to create the container. Depending on the image_type the image_source field may contain other fields. The JSON payload for this action will look similar to the following example:\n\n{\n  \"input\": {\n    \"service\": \"concourse\",\n    \"cluster_name\": \"dev\",\n    \"cluster_version\": \"7.4.0\",\n    \"action\": \"UseImage\",\n    \"team\": \"main\",\n    \"pipeline\": \"simple\",\n    \"data\": {\n      \"image_type\": \"registry-image\",\n      \"privileged\": true,\n      \"image_source\": {\n        \"repository\": \"alpine\",\n        \"tag\": \"latest\"\n      }\n    }\n  }\n}\n","depth":5,"section_tag":"useimage"},"user-roles":{"location":"user-roles.html","title":"User Roles \u0026 Permissions","text":"Concourse comes with five roles:\n\n1. Concourse Admin\n\n2. Team Owner\n\n3. Team Member\n\n4. Pipeline Operator\n\n5. Team Viewer\n\nThese roles are strictly ordered, so that each role always has all the permissions of any other role lower on the list. This means that a Pipeline Operator can always do anything a Team Viewer can, and so on.\n\nIn this document we say an action is assigned to a role if that role is capable of performing the action, but any less-privileged role is not. For example, the SaveConfig action is assigned to the member role, so owners and members can set a pipeline config, but pipeline operators and viewers cannot.\n\n","depth":3,"section_tag":"user-roles"},"using-a-local-dns-server":{"location":"concourse-worker.html#using-a-local-dns-server","title":"Using a local DNS server","text":"If you would like to use Consul, dnsmasq, or some other DNS server running on the worker VM, you'll have to configure the LAN address of the VM as the DNS server and allow the containers to reach the address, like so:\n\nconcourse worker --containerd-dns-server=\"10.0.1.3\" --containerd-allow-host-access=\"true\"\n# containerd runtime\nCONCOURSE_CONTAINERD_DNS_SERVER=\"10.0.1.3\"\nCONCOURSE_CONTAINERD_ALLOW_HOST_ACCESS=\"true\"\n# Guardian runtime\nCONCOURSE_GARDEN_DNS_SERVER=\"10.0.1.3\"\nCONCOURSE_GARDEN_ALLOW_HOST_ACCESS=\"true\"\n[server]\n; internal IP of the worker machine\ndns-server=10.0.1.3\n\n; allow containers to reach the above IP\nallow-host-access=true\nMake sure to read A note on allowing host access and DNS proxy to understand the implications of using allow-host-access\n\nTo validate whether the changes have taken effect, you can fly intercept into any container and check /etc/resolv.conf once again:\n\n$ fly -t ci intercept -j my-pipeline/the-job\nbash-5.0$ cat /etc/resolv.conf\nnameserver 10.1.2.3\nbash-5.0$ nslookup concourse-ci.org\nServer:         10.1.2.3\nAddress:        10.1.2.3#53\n\nNon-authoritative answer:\nName:   concourse-ci.org\nAddress: 185.199.108.153\nName:   concourse-ci.org\nAddress: 185.199.109.153\nName:   concourse-ci.org\nAddress: 185.199.110.153\nName:   concourse-ci.org\nAddress: 185.199.111.153\nIf nslookup times out or fails, you may need to open up firewalls or security group configuration so that the worker VM can send UDP/TCP packets to itself.\n\n","depth":7,"section_tag":"using-a-local-dns-server"},"using-external-resource-types":{"location":"tutorial-resources.html#using-external-resource-types","title":"Using External Resource Types","text":"Concourse comes bundled with a lot of resources that are enough for most people to start using Concourse with. However, users will want to extend Concourse to work with all sorts of systems and that means bringing your own Resource Types.\n\nAdding a resource type to your pipeline looks very similar to adding a resource. You can even override the bundled resource types by re-declaring them in your pipeline.\n\nRemember, a resource is a container image. So to pull in a new resource type you need to tell Concourse where to pull the image from. This is done by using the built-in registry-image resource. The process of adding a resource type is just like adding a regular resource.\n\nHere's an example of using an external resource type to read an rss feed.\n\nresource_types:\n# declare the new resource type\n- name: rss\n  type: registry-image\n  source:\n    repository: suhlig/concourse-rss-resource\n    tag: latest\n\nresources:\n# use the resource as usual\n- name: dino-feed\n  type: rss\n  source:\n    url: http://www.qwantz.com/rssfeed.php\n\njobs:\n- name: announce\n  plan:\n  - get: dino-feed\n    trigger: true\nThat's how you add external resource types to your pipeline. If you're looking for more resource types there's a catalog of them at resource-types.concourse-ci.org.\n\n","depth":4,"section_tag":"using-external-resource-types"},"var-interpolation":{"location":"vars.html#var-interpolation","title":"Interpolation","text":"Values for vars are substituted structurally. That is, if you have foo: ((bar)), whatever value ((bar)) resolves to will become the value of the foo field in the object. This can be a value of any type and structure: a boolean, a simple string, a multiline credential like a certificate, or a complicated data structure like an array of objects.\n\nThis differs from text-based substitution in that it's impossible for a value to result in broken YAML syntax, and it relieves the template author from having to worry about things like whitespace alignment.\n\nWhen a ((var)) appears adjacent to additional string content, e.g. foo: hello-((bar))-goodbye, its value will be concatenated with the surrounding content. If the ((var)) resolves to a non-string value, an error will be raised.\n\nIf you are using the YAML operator for merging \u003c\u003c, you will need to wrap it in double quotes like so \"\u003c\u003c\": ((foobars)), to avoid a cryptic error message such as \"error: yaml: map merge requires map or sequence of maps as the value\". This will allow you to merge in values from various vars. See YAML merge specification for more information on how this normally works.\n\n","depth":3,"section_tag":"var-interpolation"},"var-sources":{"location":"vars.html#var-sources","title":"Var sources (experimental)","text":"var_sources was introduced in Concourse v5.8.0. It is considered an experimental feature until its associated RFC is resolved.\n\nVar sources can be configured for a pipeline via pipeline.var_sources.\n\nEach var source has a name which is then referenced as the source-name in var syntax, e.g. ((my-vault:test-user.username)) to fetch the test-user var from the my-vault var source. See ((var)) syntax for a detailed explanation of this syntax.\n\nCurrently, only these types are supported: * vault\n\n* dummy\n\n* ssm\n\n* secretmanager (since v7.7.0)\n\n* idtoken (since v7.14.0)\n\n\n\nIn the future we want to make use of something like the Prototypes (RFC #37) so that third-party credential managers can be used just like resource types.\n\n","depth":4,"section_tag":"var-sources"},"var-syntax":{"location":"vars.html#var-syntax","title":"((var)) syntax","text":"The full syntax for vars is ((source-name:secret-path.secret-field)).\n\nThe optional source-name identifies the var source from which the value will be read. If omitted (along with the : delimiter), the cluster-wide credential manager will be used, or the value may be provided statically. The special name . refers to the local var source, while any other name refers to a var source.\n\nThe required secret-path identifies the location of the credential. The interpretation of this value depends on the var source type. For example, with Vault this may be a path like path/to/cred. For the Kubernetes secret manager this may just be the name of a secret. For credential managers which support path-based lookup, a secret-path without a leading / may be queried relative to a predefined set of path prefixes. This is how the Vault credential manager currently works; foo will be queried under /concourse/(team name)/(pipeline name)/foo.\n\nThe optional secret-field specifies a field on the fetched secret to read. If omitted, the credential manager may choose to read a 'default field' from the fetched credential if the field exists. For example, the Vault credential manager will return the value of the value field if present. This is useful for simple single-value credentials where typing ((foo.value)) would feel verbose.\n\nThe secret-path and secret-field may be surrounded by double quotes \"...\" if they contain special characters like . and :. For instance, ((source:\"my.secret\".\"field:1\")) will set the secret-path to my.secret and the secret-field to field:1.\n\n","depth":3,"section_tag":"var-syntax"},"variables":{"location":"pipeline-vars-example.html#variables","title":"Variables","text":"---\nfirst: initial\nnumber: \"9000\"\nhello: HAL\n","depth":3,"section_tag":"variables"},"vars":{"location":"vars.html","title":"Vars","text":"Concourse supports value substitution in YAML configuration by way of ((vars)).\n\nAutomation entails the use of all kinds of credentials. It's important to keep these values separate from the rest of your configuration by using vars instead of hardcoding values. This allows your configuration to be placed under source control and allows credentials to be tucked safely away into a secure credential manager like Vault instead of the Concourse database.\n\nAside from credentials, vars may also be used for generic parameterization of pipeline configuration templates, allowing a single pipeline config file to be configured multiple times with different parameters - e.g. ((branch_name)).\n\n","depth":2,"section_tag":"vars"},"vault-approle-auth":{"location":"vault-credential-manager.html#vault-approle-auth","title":"Using the approle auth backend","text":"The approle backend allows for an app (in this case, Concourse) to authenticate with a role pre-configured in Vault.\n\nWith this backend, the Running a web node is configured with a role_id corresponding to a pre-configured role, and a secret_id which is used to authenticate and acquire a token.\n\nThe approle backend must first be configured in Vault. Vault's approle backend allows for a few parameters which you may want to set to determine the permissions and lifecycle of its issued tokens:\n\npolicies=names: This determines the policies (comma-separated) to set on each token. Be sure to set one that has access to the secrets path - see Configuring the secrets engine for more information.\n\n\ntoken_ttl=duration: This determines the TTL for each token granted. The token can be continuously renewed, as long as it is renewed before the TTL elapses.\n\n\ntoken_max_ttl=duration: This sets a maximum lifetime for each token, after which the token can no longer be renewed.\n\nIf configured, be sure to set the same value on the web node so that it can re-auth before this duration is reached:\n\nCONCOURSE_VAULT_AUTH_BACKEND_MAX_TTL=1h\n\nperiod=duration: If configured, tokens issued will be periodic. Periodic tokens are not bound by any configured max TTL, and can be renewed continuously. It does not make sense to configure both period and token_max_ttl as the max TTL will be ignored.\n\n\ntoken_num_uses=count: This sets a limit on how often a token can be used. We do not recommend setting this value, as it will effectively hamstring Concourse after a few credential acquisitions. The web node does not currently know to re-acquire a token when this limit is reached.\n\n\nsecret_id_ttl=duration and secret_id_num_uses=count: These two configurations will result in the secret ID expiring after the configured time or configured number of log-ins, respectively.\n\nYou should only set these if you have something periodically re-generating secret IDs and re-configuring your web nodes accordingly.\n\n\n\nGiven all that, a typical configuration may look something like this:\n\n$ vault auth enable approle\nSuccess! Enabled approle auth method at: approle/\n$ vault write auth/approle/role/concourse policies=concourse period=1h\nSuccess! Data written to: auth/approle/role/concourse\nNow that the backend is configured, we'll need to obtain the role_id and generate a secret_id:\n\n$ vault read auth/approle/role/concourse/role-id\nKey        Value\n---        -----\nrole_id    5f3420cd-3c66-2eff-8bcc-0e8e258a7d18\n$ vault write -f auth/approle/role/concourse/secret-id\nKey                   Value\n---                   -----\nsecret_id             f7ec2ac8-ad07-026a-3e1c-4c9781423155\nsecret_id_accessor    1bd17fc6-dae1-0c82-d325-3b8f9b5654ee\nThese should then be set on the Running a web node like so:\n\nCONCOURSE_VAULT_AUTH_BACKEND=\"approle\"\nCONCOURSE_VAULT_AUTH_PARAM=\"role_id:5f3420cd-3c66-2eff-8bcc-0e8e258a7d18,secret_id:f7ec2ac8-ad07-026a-3e1c-4c9781423155\"\n","depth":6,"section_tag":"vault-approle-auth"},"vault-cert-auth":{"location":"vault-credential-manager.html#vault-cert-auth","title":"Using the cert auth backend","text":"The cert auth method allows authentication using SSL/TLS client certificates.\n\nWith this backend, the Running a web node is configured with a client cert and a client key. Vault must be configured with TLS, which you should be almost certainly be doing anyway.\n\nThe cert backend must first be configured in Vault. The backend is associated to a policy and a CA cert used to verify the client certificate. It may also be given the client certificate itself.\n\nThe cert backend must first be configured in Vault. Vault's cert backend allows for a few parameters which you may want to set to determine the lifecycle of its issued tokens:\n\npolicies=names: This determines the policies (comma-separated) to set on each token. Be sure to set one that has access to the secrets path - see Configuring the secrets engine for more information.\n\n\nttl=duration: This determines the TTL for each token granted. The token can be continuously renewed, as long as it is renewed before the TTL elapses.\n\n\nmax_ttl=duration: This sets a maximum lifetime for each token, after which the token can no longer be renewed.\n\nIf configured, be sure to set the same value on the web node so that it can re-auth before this duration is reached:\n\nCONCOURSE_VAULT_AUTH_BACKEND_MAX_TTL=1h\n\nperiod=duration: If configured, tokens issued will be periodic. Periodic tokens are not bound by any configured max TTL, and can be renewed continuously. It does not make sense to configure both period and max_ttl as the max TTL will be ignored.\n\n\n\n$ vault auth enable cert\nSuccess! Enabled cert auth method at: cert/\n$ vault write auth/cert/certs/concourse policies=concourse certificate=@out/vault-ca.crt ttl=1h\nSuccess! Data written to: auth/cert/certs/concourse\nOnce that's all set up, you'll just need to configure the client cert and key on the web node like so:\n\nCONCOURSE_VAULT_AUTH_BACKEND=\"cert\"\nCONCOURSE_VAULT_CLIENT_CERT=vault-certs/concourse.crt\nCONCOURSE_VAULT_CLIENT_KEY=vault-certs/concourse.key\nIn this case no additional auth params are necessary, as the Vault's TLS auth backend will check the certificate against all roles if no name is specified.\n\n","depth":6,"section_tag":"vault-cert-auth"},"vault-credential-lookup-rules":{"location":"vault-credential-manager.html#vault-credential-lookup-rules","title":"Credential lookup rules","text":"Vault lets you organize secrets into hierarchies, which is useful for when they should be accessible for particular pipelines or teams. When you have a parameter like ((foo)) in a pipeline definition, Concourse will (by default) look for it in the following paths, in order:\n\n* /concourse/TEAM_NAME/PIPELINE_NAME/foo\n\n* /concourse/TEAM_NAME/foo\n\nVault credentials are actually key-value, so for ((foo)) Concourse will default to the field name value. You can specify the field to grab via . syntax, e.g. ((foo.bar)).\n\nIf you have multiple, intermediate levels in your path, you can use the / separator to reach your intended field, e.g. ((foo/bar/baz.qux)).\n\nWhen executing a one-off task, there is no pipeline: so in this case, only the team path /concourse/TEAM_NAME/foo is searched.\n\nThere are several ways to customize the lookup logic:\n\n1. Add a \"shared path\", for secrets common to all teams.\n\n2. Change the team- and pipeline-dependent path templates.\n\n3. Change the path prefix from /concourse to something else.\n\n4. Set a Vault namespace for isolation within a Vault Enterprise installation.\n\nEach of these can be controlled by Concourse command line flags, or environment variables.\n\n","depth":5,"section_tag":"vault-credential-lookup-rules"},"vault-credential-manager":{"location":"vault-credential-manager.html","title":"The Vault credential manager","text":"Concourse can be configured to pull credentials from a Vault instance.\n\nTo configure this, first configure the URL of your Vault server by setting the following env on the Running a web node:\n\nCONCOURSE_VAULT_URL=https://vault.example.com:8200\nYou may also need to configure the CA cert for Vault:\n\nCONCOURSE_VAULT_CA_CERT=path/to/ca.crt\nYou'll also need to configure how the web node authenticates with Vault - see Authenticating with Vault for more details as that step is quite involved.\n\n","depth":4,"section_tag":"vault-credential-manager"},"vault-lookup-templates":{"location":"vault-credential-manager.html#vault-lookup-templates","title":"Changing the path templates","text":"You can choose your own list of templates, which will expand to team- or pipeline-specific paths. These are subject to the path prefix. By default, the templates used are:\n\nCONCOURSE_VAULT_LOOKUP_TEMPLATES=/{{.Team}}/{{.Pipeline}}/{{.Secret}},/{{.Team}}/{{.Secret}}\nWhen secrets are to be looked up, these are evaluated subject to the configured path prefix, where {{.Team}} expands to the current team, {{.Pipeline}} to the current pipeline (if any), and {{.Secret}} to the name of the secret. So if the settings are:\n\nCONCOURSE_VAULT_PATH_PREFIX=/secrets\nCONCOURSE_VAULT_LOOKUP_TEMPLATES=/{{.Team}}/concourse/{{.Pipeline}}/{{.Secret}},/{{.Team}}/concourse/{{.Secret}},/common/{{.Secret}}\nand ((password)) is used in team myteam and pipeline mypipeline, Concourse will look for the following, in order:\n\n1. /secrets/myteam/concourse/mypipeline/password\n\n2. /secrets/myteam/concourse/password\n\n3. /secrets/common/password\n\n","depth":6,"section_tag":"vault-lookup-templates"},"vault-namespace":{"location":"vault-credential-manager.html#vault-namespace","title":"Using a Vault namespace","text":"If you are using Vault Enterprise, you can make secret lookups and authentication happen under a namespace.\n\nCONCOURSE_VAULT_NAMESPACE=chosen/namespace/path\nThis setting applies to all teams equally.\n\n","depth":6,"section_tag":"vault-namespace"},"vault-path-prefix":{"location":"vault-credential-manager.html#vault-path-prefix","title":"Changing the path prefix","text":"The leading /concourse can be changed by specifying the following:\n\nCONCOURSE_VAULT_PATH_PREFIX=/some-other-prefix\n","depth":6,"section_tag":"vault-path-prefix"},"vault-periodic-token":{"location":"vault-credential-manager.html#vault-periodic-token","title":"Using a periodic token","text":"The simplest way to authenticate is by generating a periodic token:\n\n$ vault token create --policy concourse --period 1h\nKey                Value\n---                -----\ntoken              s.mSNnbhGAqxK2ZbMasOQ91rIA\ntoken_accessor     0qsib5YcYvROm86cT08IFxIT\ntoken_duration     1h\ntoken_renewable    true\ntoken_policies     [concourse default]\nChoose your --period wisely, as the timer starts counting down as soon as the token is created. You should also use a duration long enough to account for any planned web node downtime.\n\nOnce you have the token, just set the following env on the web node:\n\nCONCOURSE_VAULT_CLIENT_TOKEN=s.mSNnbhGAqxK2ZbMasOQ91rIA\nPeriodic tokens are the quickest way to get started, but they have one fatal flaw: if the web node is down for longer than the token's configured period, the token will expire and a new one will have to be created and configured. This can be avoided by using the approle auth backend.\n\n","depth":6,"section_tag":"vault-periodic-token"},"vault-shared-path":{"location":"vault-credential-manager.html#vault-shared-path","title":"Configuring a shared path","text":"A \"shared path\" can also be configured for credentials that you would like to share across all teams and pipelines, foregoing the default team/pipeline namespacing. Use with care!\n\nCONCOURSE_VAULT_SHARED_PATH=some-shared-path\nThis path must exist under the configured path prefix. The above configuration would correspond to /concourse/some-shared-path with the default /concourse prefix.\n\n","depth":6,"section_tag":"vault-shared-path"},"vault-var-source":{"location":"vars.html#vault-var-source","title":"vault var source","text":"","depth":4,"section_tag":"var-sources"},"version-pinning":{"location":"resource-versions.html#version-pinning","title":"Version Pinning","text":"A common job workflow is to use the latest version of a resource in order to trigger new builds. This works most of the time until you run into a situation where you need to run the job using an old version of a resource. Concourse provides a solution to this, which is called resource pinning.\n\nThere are two different ways to pin a resource: through the pipeline config and through the web UI. Within the pipeline config, you can either pin the resource to a version through the resource configuration or through a get step version configuration. If you would like to pin through the web UI, the functionality can be found in the resource version history page which is accessed through clicking into the resource within the pipeline page.\n\nPinning through the pipeline config is useful for a more permanent pinned state. If a resource is pinned through the pipeline config, it cannot be modified through the web UI and can only be changed through modifiying and resetting the pipeline config.\n\nPinning through the web UI is useful for reactionary pinning of a resource. For example, it can be used in the event of a broken upstream dependency.\n\nIf you had a version pinned in the web UI and then pinned it through the pipeline config, the pipeline config pinned version will take precendence.\n\nA pinned version is associated to a resource and can be viewed in the resource page (excluding the case that the version was pinned on a get step). This pinned version will be propagated throughout the pipeline and used by the jobs that take that pinned resource as an input. If there is a job that has a passed constraint on a pinned resource, this means that the input is only valid if that pinned version has been used by the passed constraint job.\n\nLet's say we have a pipeline with two jobs and one resource that is being used as a passed constraint between the two jobs. If that resource is pinned to a version, the first job will produce a build using the pinned version of the resource. After that build succeeds, the second job that has a passed constraint on the first will then be able to trigger off a build because the pinned version has been successfully used by the first job.\n\n","depth":4,"section_tag":"version-pinning"},"version-unpinning":{"location":"resource-versions.html#version-unpinning","title":"Unpinning","text":"When a version is unpinned, Concourse will go back to using the latest available version. This means a new build will be queued up if the most recent build used the old pinned version and the input has trigger: true.\n\nIf you would like to learn more about how version pinning and unpinning works with the build scheduler, you can read more about it in the scheduling behavior section.\n\n","depth":5,"section_tag":"version-unpinning"},"versions":{"location":"tutorial-resources.html#versions","title":"Versions","text":"Resources represent the external system or object to Concourse by emitting versions. When a new version is emitted by a resource, that is how Concourse knows to start jobs connected to the resource.\n\nA version is any way that a resource can uniquely identify the state of the external system or object.\n\nFor example, the git resource emits versions based on the SHA of new commits it finds. A single version from the git resource will look like this to Concourse.\n\n{ \"ref\": \"04194bfc880c457a5b00f07db78d0532620414cc\" }\nLet's start digging into resources a bit more by going over the resource interface.\n\n","depth":4,"section_tag":"versions"},"volume-locality-strategy":{"location":"container-placement.html#volume-locality-strategy","title":"The volume-locality strategy","text":"When using volume-locality, the Running a web node places task step and put step containers on workers where a majority of their inputs are already present. This is the default strategy.\n\nThe advantage of this approach is that it reduces the likelihood that large artifacts will have to be streamed from one Running a worker node, through the Running a web node, and to the target Running a worker node. For large artifacts, this can result in quite a bit of overhead.\n\nThe disadvantage of this approach is that it can sometimes result in builds \"gravitating\" to a particular worker and overloading it, at least until the resource caches warm across the worker pool. This disadvantage can be partially mitigated using the (currently experimental) The limit-active-volumes strategy in conjunction with Chaining Placement Strategies.\n\nIf your builds tend to be light on artifacts and heavy on task execution, you may want to try the The fewest-build-containers strategy or the (currently experimental) The limit-active-tasks strategy.\n\n","depth":4,"section_tag":"volume-locality-strategy"},"web-configuration":{"location":"concourse-web.html#web-configuration","title":"Configuring the web node","text":"","depth":4,"section_tag":"web-configuration"},"web-connection-pooling":{"location":"concourse-web.html#web-connection-pooling","title":"Database connection pooling","text":"You may wish to configure the max number of parallel database connections that each node makes. There are two pools to configure: one for serving API requests, and one used for all the backend work such as pipeline scheduling.\n\nCONCOURSE_API_MAX_CONNS=10     # default\nCONCOURSE_BACKEND_MAX_CONNS=50 # default\nThere are some non-configurable connection pools. They take up the following number of connections per pool: * Garbage Collection: 5\n\n* Lock: 1\n\n* Worker Registration: 1\n\n\n\nThe sum of these numbers across all web nodes should not be greater than the maximum number of simultaneous connections your Postgres server will allow. See db node resource utilization for more information.\n\nFor example, if 3 web nodes are configured with the values shown above then your PostgreSQL server should be configured with a connection limit of at least 201: (10 + 50 + 5 + 1 + 1) * 3 web nodes.\n\n","depth":6,"section_tag":"web-connection-pooling"},"web-ingress":{"location":"concourse-web.html#web-ingress","title":"Configuring ingress traffic","text":"If your web nodes are going to be accessed multiple network layers, you will need to set CONCOURSE_EXTERNAL_URL to a URL accessible by your Concourse users. If you don't set this property, logging in will incorrectly redirect to its default value of 127.0.0.1.\n\nIf your web node(s) will be behind a load balancer or reverse proxy then you will need to ensure connctions made by fly intercept are properly handled by upgrading the connection. Here is a sample nginx configuration that upgrades connections made by fly intercept.\n\nserver {\n  server_name ci.example.com;\n\n  add_header Strict-Transport-Security \"max-age=31536000\" always;\n  ssl_stapling on;\n  ssl_stapling_verify on;\n\n  # Proxy main concourse traffic\n  location / {\n      proxy_pass http://concourse.local:8080/;\n      proxy_set_header Host $host;\n      proxy_set_header X-Real-IP $remote_addr;\n      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n      proxy_set_header X-Forwarded-Proto $scheme;\n      proxy_set_header X-Forwarded-Protocol $scheme;\n      proxy_set_header X-Forwarded-Host $http_host;\n  }\n\n  # Proxy fly intercept traffic\n  location ~ /hijack$ {\n      proxy_pass http://concourse.local:8080;\n      proxy_set_header Host $host;\n      proxy_set_header X-Real-IP $remote_addr;\n      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n      proxy_set_header X-Forwarded-Proto $scheme;\n      proxy_set_header X-Forwarded-Protocol $scheme;\n      proxy_set_header X-Forwarded-Host $http_host;\n      # Upgrade connection\n      proxy_set_header Upgrade $http_upgrade;\n      proxy_set_header Connection \"upgrade\";\n  }\n}\n","depth":5,"section_tag":"web-ingress"},"web-node":{"location":"concourse-web.html","title":"Running a web node","text":"The web node is responsible for running the web UI, API, and as well as performing all pipeline scheduling. It's basically the brain of Concourse.\n\n","depth":3,"section_tag":"concourse-web"},"web-operation":{"location":"concourse-web.html#web-operation","title":"Operating a web node","text":"The web nodes themselves are stateless - they don't store anything on disk, and coordinate entirely using the database.\n\n","depth":4,"section_tag":"web-operation"},"web-prerequisites":{"location":"concourse-web.html#web-prerequisites","title":"Prerequisites","text":"Nothing special - the web node is a pretty simple Go application that can be run like a 12-factor app.\n\n","depth":4,"section_tag":"web-prerequisites"},"web-resource-utilization":{"location":"concourse-web.html#web-resource-utilization","title":"Resource utilization","text":"CPU usage: peaks during pipeline scheduling, primarily when scheduling Jobs. Mitigated by adding more web nodes. In this regard, web nodes can be considered compute-heavy more than anything else at large scale.\n\nMemory usage: not very well classified at the moment as it's not generally a concern. Give it a few gigabytes and keep an eye on it.\n\nDisk usage: none\n\nBandwidth usage: aside from handling external traffic, the web node will at times have to stream bits out from one worker and into another while executing Steps.\n\nHighly available: yes; web nodes can all be configured the same (aside from --peer-address) and placed behind a load balancer. Periodic tasks like garbage-collection will not be duplicated for each node.\n\nHorizontally scalable: yes; they will coordinate workloads using the database, resulting in less work for each node and thus lower CPU usage.\n\nOutbound traffic:\n\n* db on its configured port for persistence\n\n* db on its configured port for locking and coordinating in a multi-web node deployment\n\n* other web nodes (possibly itself) on an ephemeral port when a worker is forwarded through the web node's TSA\n\nInbound traffic:\n\n* worker connects to the TSA on port 2222 for registration\n\n* worker downloads inputs from the ATC during Running tasks with fly execute via its external URL\n\n* external traffic to the ATC API via the web UI and The fly CLI\n\n","depth":5,"section_tag":"web-resource-utilization"},"web-running":{"location":"concourse-web.html#web-running","title":"Running concourse web","text":"The concourse CLI can run as a web node via the web subcommand.\n\nBefore running it, let's configure a local user so we can log in:\n\nCONCOURSE_ADD_LOCAL_USER=myuser:mypass\nCONCOURSE_MAIN_TEAM_LOCAL_USER=myuser\nThis will configure a single user, myuser, with the password mypass. You'll probably want to change those to sensible values, and later you may want to configure a proper auth provider - check out Auth \u0026 Teams whenever you're ready.\n\nNext, you'll need to configure the session signing key, the SSH key for the worker gateway, and the authorized worker key. Check Generating Keys to learn what these are and how they are created.\n\nCONCOURSE_SESSION_SIGNING_KEY=path/to/session_signing_key\nCONCOURSE_TSA_HOST_KEY=path/to/tsa_host_key\nCONCOURSE_TSA_AUTHORIZED_KEYS=path/to/authorized_worker_keys.pub\nFinally, web needs to know how to reach your Postgres database. This can be set like so:\n\nCONCOURSE_POSTGRES_HOST=127.0.0.1 # default\nCONCOURSE_POSTGRES_PORT=5432      # default\nCONCOURSE_POSTGRES_DATABASE=atc   # default\nCONCOURSE_POSTGRES_USER=my-user\nCONCOURSE_POSTGRES_PASSWORD=my-password\nIf you're running PostgreSQL locally, you can probably just point it to the socket and rely on the peer auth:\n\nCONCOURSE_POSTGRES_SOCKET=/var/run/postgresql\nNow that everything's set, run:\n\nconcourse web\nAll logs will be emitted to stdout, with any panics or lower-level errors being emitted to stderr.\n\n","depth":4,"section_tag":"web-running"},"web-to-worker-ratio":{"location":"performance-tuning.html#web-to-worker-ratio","title":"Web To Worker Ratio","text":"This is anecdotal and you should adjust based on your metrics of your web nodes. A starting ratio of web to workers is 1:6; one web instance for every six workers.\n\nThe core Concourse team runs two web nodes and 16 workers, a 1:8 ratio. We can get away with this lower web to worker ratio because we don't have that many users actively interacting with the web UI on a daily basis; less than 10 active users. Since we're only one team using the instance we have fewer pipelines than an instance supporting multiple teams would.\n\n","depth":4,"section_tag":"web-to-worker-ratio"},"what-are-inputs-and-outputs":{"location":"tutorial-inputs-outputs.html#what-are-inputs-and-outputs","title":"What are inputs and outputs?","text":"The simple answer is that inputs and outputs are directories that get passed between steps. We'll refer to both inputs and outputs as artifacts.\n\nLet's start exploring how artifacts work by adding a task-config.outputs to our hello-world-task.\n\njobs:\n- name: hello-world-job\n  plan:\n  - task: hello-world-task\n    config:\n      platform: linux\n      image_resource:\n        type: registry-image\n        source:\n          repository: busybox\n      # Adds a \"the-artifact\" directory to our task\n      outputs:\n      - name: the-artifact\n      run:\n        # Change the command to `ls -lF` to see\n        # what the task sees in its working directory\n        path: ls\n        args: [\"-lF\"]\nUpdate the pipeline and trigger the job: $ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml\n$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch\n...\nselected worker: 57d7419112ca\nrunning ls -lF\ntotal 4\ndrwxr-xr-x    2 root     root          4096 Apr  8 16:42 the-artifact/\nsucceeded\n\n\nWe can see that in the task's current working directory there is now a folder called the-artifact. Concourse makes output directories for you and will pass any contents inside the folder onto later steps. Let's see how that works next.\n\n","depth":4,"section_tag":"what-are-inputs-and-outputs"},"what-is-a-step":{"location":"tutorial-hello-world.html#what-is-a-step","title":"What is a step?","text":"A step is a single container running on a Concourse worker. Each step in a job plan runs in its own container. You can run anything you want inside the container (i.e. run my tests, run this bash script, build this image, etc.).\n\nSo if you have a job with five steps Concourse will create five containers, one for each step. Therefore, we need to tell Concourse the following about each step:\n\n* What type of worker to run the task on (linux/windows/darwin)\n\n* What container image to use (Linux only)\n\n* What command to run inside the container\n\nConcourse currently only supports Linux containers. Concourse does not yet run Windows containers. Darwin does not have native containers.\n\n","depth":4,"section_tag":"what-is-a-step"},"what-resources-produce":{"location":"checker.html#what-resources-produce","title":"What do resource checks produce?","text":"The whole point of running checks is to produce versions. Concourse's Build Scheduler is centered around the idea of resource versions. It's how Concourse determines that something is new and a new build needs to be triggered.\n\nThe versions produced by each resource are unique to the underlying resource type. For instance, the git resource type uses commit SHAs as versions. The registry-image resource uses the image digest and tag in the version.\n\n","depth":5,"section_tag":"what-resources-produce"},"whats-emitted":{"location":"tracing.html#whats-emitted","title":"What's emitted?","text":"Below is a summary of the various operations that Concourse currently traces. They are arranged like a call tree, so that for each operation described, its sub-operations are described indented immediately below.\n\n* scanner.Run -- An execution of the Resource Checker, responsible for determining which resources need to be checked. * scanner.check -- This operation simply represents inserting the check in the database.\n\n* scheduler.Run -- This represents one tick of the Build Scheduler. * schedule-job -- this is the same operation scoped to a single job. * Algorithm.Compute -- this is where the Algorithm determines inputs for a job. Each of the resolvers below describes a different strategy for determining inputs, depending on the job's config. * individualResolver.Resolve -- This is used to determine versions input to a get step without passed constraints.\n\n      * groupResolver.Resolve -- This is the juicy part of the algorithm, which deals with passed constraints.\n\n      * pinnedResolver.Resolve -- This operation is used to determine inputs when Version Pinning is at play.\n\n    * job.EnsurePendingBuildExists -- This is where a new build, if deemed necessary by scheduling constraints, will be inserted into the database. This operation follows from checker.Run above and will appear under the same trace as the check which produced the resource version responsible for triggering the new build.\n\n* build -- this is the primary operation performed by the Build Tracker. When a build is automatically triggered, this span follows from the job.EnsurePendingBuildExists operation which created the build, appearing in the same trace. * get -- this tracks the execution of a get step.\n\n  * put -- this tracks the execution of a put step.\n\n  * task -- this tracks the execution of a task step.\n\n  * set_pipeline -- this tracks the execution of a set_pipeline step.\n\n  * load_var -- this tracks the execution of a load_var step.\n\n","depth":4,"section_tag":"whats-emitted"},"whats-encrypted":{"location":"encryption.html#whats-encrypted","title":"What's encrypted?","text":"The following values are expected to contain credentials, and so will be encrypted:\n\n* Resource resource.sources, as they often contain private keys and other credentials for writing to (or simply granting access to) the resource.\n\n* Resource type resource_type.sources, for the same reason as above, though this is probably a less common use case.\n\n* Pipeline task step vars and task step params, in case they contain sensitive information such as usernames and/or passwords.\n\n* Put step put step params and get step get step params are also encrypted, even though they rarely should contain credentials (they're usually in resource.source).\n\n* Team auth configurations, as they often contain things like GitHub or other oAuth client secrets.\n\nNote that the actual implementation encrypts things in a more heavy-handed way than the above list implies. For example, pipeline configs are actually encrypted as one large blob.\n\nNotably, the following things are NOT encrypted:\n\n* Build logs. If your jobs are outputting credentials, encryption won't help you. We have chosen not to tackle this initially as it would introduce a performance burden for what is not as much of an obvious win.\n\n* Resource versions. These should never contain credentials, and are often meaningless on their own.\n\n* Resource metadata. These are visible to anyone if your pipeline is exposed, and should never contain credentials.\n\n* Pipeline names, job names, etc. - anything else that is not a high-risk target for credential leakage, as opposed to regular information leaks.\n\n  Resources and jobs in particular exist in their own tables, with their names in plaintext, and only their config encrypted. In this way, names are not protected, even though the pipeline config itself is also stored as one big encrypted blob.\n\n","depth":4,"section_tag":"whats-encrypted"},"when-are-resources-checked":{"location":"checker.html#when-are-resources-checked","title":"When are resources checked?","text":"The component that schedules resource checks is called the resource checker. The rate at which these checks happen is called the check interval (configurable via CONCOURSE_LIDAR_SCANNER_INTERVAL).  There's an obvious tradeoff, whereby the more frequently you poll, the bigger the strain on Concourse (as well as the external source). However, if you want to pick up those new commits as quickly as possible, then you need to poll as often as possible.\n\nThe resource checker uses the resource.check_every interval in order to figure out if a resource needs to be checked. A resource's check_every interval dictates how often it should be checked for new versions, with a default of 1 minute. If that seems like a lot of checking, it is, but it's how Concourse keeps everything snappy. You can configure this interval independently for each resource using check_every.\n\nIf your external service supports it, you can set resource.webhook_token to eliminate the need for periodic checking altogether. If a webhook_token is configured, the external service can notify Concourse when to check for new versions. Note that configuring a webhook_token will not stop Concourse from periodically checking your resource. If you wish to rely solely on webhooks for detecting new versions, you can set check_every to never.\n\nOn every interval tick, the resource checker will see if there are any resources that need to be checked. It does this by first finding resources which are used as inputs to jobs, and then comparing the current time against the last time each resource was checked. If it has been longer than a resource's configured check_every interval, a new check will be scheduled. In practice this means that if a resource has a check_every of 1m, it is not guaranteed to be checked precisely every 60 seconds. check_every simply sets a lower bound on the time between checks.\n\nWhen the resource checker finds a resource to check (either because its check_every interval elapsed, or because its configured webhook_token was triggered), it schedules a new build that invokes the check script of the resource's underlying resource type.\n\n","depth":5,"section_tag":"when-are-resources-checked"},"where-and-what-versions":{"location":"resource-versions.html#where-and-what-versions","title":"Where do they come from and what are they used for?","text":"The resource checker is responsible for checking for new versions of a resource. These versions are then saved to the database and can be viewed from the resource page in the web UI.\n\nResource versions are used by the build scheduler in order to schedule new builds for a job.\n\n","depth":4,"section_tag":"where-and-what-versions"},"where-is-everything":{"location":"project.html#where-is-everything","title":"Where is everything?","text":"* The Concourse repo houses the main codebase, where planning happens, and where issues are tracked. It is overseen by the maintainers team.\n\n* The Docs repo contains the source for the website you're reading now! It is overseen by the community team.\n\n* GitHub Discussions are used for support, announcements, idea sharing, and general conversations.\n\n* The Concourse blog features tutorials and updates from the development perspective.\n\n* The Concourse Discord server offers a great space to chat with other contributors.\n\n","depth":2,"section_tag":"where-is-everything"},"who-uses-concourse":{"location":"ecosystem.html#who-uses-concourse","title":"Who Uses Concourse?","text":"These organizations have either added themselves to this list, or whose use of Concourse is publicly known. There are many additional Concourse users who cannot publicly disclose information about their technology stack (typically financial institutions and security firms).\n\n1. Altoros\n\n2. anynines\n\n3. Aptomi\n\n4. Armakuni\n\n5. boclips\n\n6. Cerner\n\n7. cloud.gov\n\n8. Cloud Foundry Foundation\n\n9. Comcast\n\n10. Cycloid\n\n11. Electric UI\n\n12. EngineerBetter\n\n13. Express Scripts\n\n14. Fauna\n\n15. Fidelity International\n\n16. Gardener\n\n17. (United Kingdom) Government Digital Services\n\n18. Gstack\n\n19. The Home Depot\n\n20. IBM\n\n21. LeapYear\n\n22. Napoleon Sports \u0026 Casino\n\n23. Nasdaq\n\n24. Nokogiri\n\n25. RabbitMQ\n\n26. Resilient Scale\n\n27. SAP\n\n28. Smarsh\n\n29. Springer Nature\n\n30. Stark \u0026 Wayne\n\n31. SUSE\n\n32. SuperOrbital\n\n33. Unit 2 Games\n\n34. United States Air Force - Kessel Run\n\n35. Varian\n\n36. Verizon\n\n37. VMware\n\n38. Webfleet Solutions\n\n39. Yahoo!\n\n40. Zipcar\n\n","depth":2,"section_tag":"who-uses-concourse"},"why-make-concourse":{"location":"project.html#why-make-concourse","title":"Why make Concourse?","text":"When working on a substantial project, having a pipeline to reliably test, deploy, and publish the product is essential for rapid iteration.\n\nBut with every CI system we tried, we found ourselves repeatedly facing the same problems: complex configs buried in many pages of the web UI, uncertainty about who changed what \u0026 when, managing dependencies and state on the workers, build contamination, frustrating UX...\n\nOur project was expanding, and with every box we checked and for every worker we manually configured, the anxiety of having to rebuild everything if something failed grew increasingly. We began writing software to manage our CI instead of creating the software for the product we intended to build.\n\nWe created Concourse to be a CI system that provides peace of mind. A CI that's straightforward enough to fully understand and easy to maintain as your project grows; both in the complexity of the product and the size of your team. We aimed to build a CI with robust abstractions and fewer concepts to learn, making it easier to comprehend and allowing Concourse to evolve gracefully.\n\n","depth":2,"section_tag":"why-make-concourse"},"worker-configuration":{"location":"concourse-worker.html#worker-configuration","title":"Configuring the worker node","text":"","depth":4,"section_tag":"worker-configuration"},"worker-healthcheck-endpoint":{"location":"concourse-worker.html#worker-healthcheck-endpoint","title":"Healthcheck Endpoint","text":"The worker will automatically listen on port 8888 as its healthcheck endpoint. It will return a HTTP 200 status code with an empty body on a successful check. A successful check means the worker can reach the Garden and BaggageClaim servers.\n\nThe healthcheck endpoint is configurable through three variables: --healthcheck-bind-ip=\nIP address on which to listen for health checking requests. (default: 0.0.0.0)\n\n--healthcheck-bind-port\nPort on which to listen for health checking requests. (default: 8888)\n\n--healthcheck-timeout\nHTTP timeout for the full duration of health checking. (default: 5s)\n\n\n","depth":5,"section_tag":"worker-healthcheck-endpoint"},"worker-heartbeating-and-stalling":{"location":"concourse-worker.html#worker-heartbeating-and-stalling","title":"Worker Heartbeating \u0026 Stalling","text":"Workers will continuously heartbeat to the Concourse cluster in order to remain registered and healthy. If a worker hasn't checked in after a while, possibly due to a network error, being overloaded, or having crashed, the web node will transition its state to stalled and new workloads will not be scheduled on that worker until it recovers.\n\nIf the worker remains in this state and cannot be recovered, it can be removed using the fly prune-worker command.\n\n","depth":5,"section_tag":"worker-heartbeating-and-stalling"},"worker-lifecycle":{"location":"internals.html#worker-lifecycle","title":"The worker lifecycle","text":"","depth":4,"section_tag":"worker-lifecycle"},"worker-node":{"location":"concourse-worker.html","title":"Running a worker node","text":"The worker node registers with the Running a web node and is then used for executing builds and performing resource checks. It doesn't really decide much on its own.\n\n","depth":3,"section_tag":"concourse-worker"},"worker-operation":{"location":"concourse-worker.html#worker-operation","title":"Operating a worker node","text":"The worker nodes are designed to be stateless and as interchangeable as possible. Tasks and Resources bring their own Docker images, so you should never have to install dependencies on the worker. Windows and Darwin workers are the exception to this. Any dependencies should be pre-installed on Windows and Darwin workers.\n\nIn Concourse, all important data is represented by Resources, so the workers themselves are dispensible. Any data in the work-dir is ephemeral and should go away when the worker machine is removed - it should not be persisted between worker VM or container re-creates.\n\n","depth":4,"section_tag":"worker-operation"},"worker-prerequisites":{"location":"concourse-worker.html#worker-prerequisites","title":"Prerequisites","text":"* Linux: We test and support the following distributions. Minimum kernel version tested is 5.15.\n\n  * Ubuntu 22.04\n\n  * Ubuntu 24.04\n\n  Other Requirements: * User namespaces must be enabled.\n\n  * To enforce memory limits on tasks, memory + swap accounting must be enabled.\n\n* Windows/Darwin: no special requirements (that we know of).\n\n  NOTE: Windows containers are currently not supported and Darwin does not have native containers. Steps will run inside a temporary directory on the Windows/Darwin worker. Any dependencies needed for your tasks (e.g. git, .NET, golang, ssh) should be pre-installed on the worker. Windows/Darwin workers do not come with any resource types.\n\n","depth":4,"section_tag":"worker-prerequisites"},"worker-resource-types":{"location":"concourse-worker.html#worker-resource-types","title":"Resource Types","text":"The following section only applies to Linux workers. Resource types are simply Linux container images and therefore can't be run on Windows or Darwin workers.\n\n","depth":5,"section_tag":"worker-resource-types"},"worker-resource-utilization":{"location":"concourse-worker.html#worker-resource-utilization","title":"Resource utilization","text":"CPU usage: almost entirely subject to pipeline workloads. More resources configured will result in more checking, and in-flight builds will use as much CPU as they want.\n\nMemory usage: also subject to pipeline workloads. Expect usage to increase with the number of containers on the worker and spike as builds run.\n\nBandwidth usage: again, almost entirely subject to pipeline workloads. Expect spikes from periodic checking, though the intervals should spread out over enough time. Resource fetching and pushing will also use arbitrary bandwidth.\n\nDisk usage: arbitrary data will be written as builds run, and resource caches will be kept and garbage collected on their own life cycle. We suggest going for a larger disk size if it's not too much trouble. All state on disk must not outlive the worker itself; it is all ephemeral. If the worker is re-created (i.e. fresh VM/container and all processes were killed), it should be brought back with an empty disk.\n\nHighly available: not applicable. Workers are inherently singletons, as they're being used as drivers running entirely different workloads.\n\nHorizontally scalable: yes; workers directly correlate to your capacity required by however many pipelines, resources, and in-flight builds you want to run. It makes sense to scale them up and down with demand.\n\nOutbound traffic: * External traffic to arbitrary locations as a result of periodic resource checking and running builds\n\n* External traffic to the web node's configured external URL when downloading the inputs for a Running tasks with fly execute\n\n* External traffic to the web node's TSA port (2222) for registering the worker\n\n* If P2P streaming is enabled there will be traffic to other workers.\n\n\n\nInbound traffic: * From the Running a web node on port 7777 (Garden) and 7788 (BaggageClaim). These ports do not need to be exposed, they are forwarded to the web node via the ssh connection on port 2222.\n\n* If P2P streaming is enabled there will be traffic to other workers.\n\n\n\n","depth":5,"section_tag":"worker-resource-utilization"},"worker-running":{"location":"concourse-worker.html#worker-running","title":"Running concourse worker","text":"The concourse CLI can run as a worker node via the worker subcommand.\n\nFirst, you'll need to configure a directory for the worker to store data:\n\nCONCOURSE_WORK_DIR=/opt/concourse/worker\nThis is where all the builds run, and where all resources are fetched in to, so make sure it's backed by enough storage.\n\nNext, point the worker at your Running a web node like so:\n\nCONCOURSE_TSA_HOST=10.0.2.15:2222\nCONCOURSE_TSA_PUBLIC_KEY=path/to/tsa_host_key.pub\nCONCOURSE_TSA_WORKER_PRIVATE_KEY=path/to/worker_key\nFinally start the worker:\n\n# run with -E to forward env config, or just set it all as root\nsudo -E concourse worker\nNote that the worker must be run as root because it orchestrates containers.\n\nAll logs will be emitted to stdout, with any panics or lower-level errors being emitted to stderr.\n\n","depth":4,"section_tag":"worker-running"},"writing-opa-rules":{"location":"opa.html#writing-opa-rules","title":"Writing OPA Rules","text":"On the OPA server you'll need to create a package and policy for Concourse. This should match up with the endpoint provided to Concourse. The OPA documentation has a good guide explaining how to generally write OPA rules and setup an OPA server.\n\nFor any actions that Concourse has been configured to filter it will send a JSON request to the OPA server with the following details. Top-level data directly under the input key will be present for most actions. The information under the data key will differ based on the action being checked.\n\nThis sample JSON payload is what OPA is sent when a user sets a pipeline. The data key contains the pipeline in JSON format. {\n  \"input\": {\n    \"service\": \"concourse\",\n    \"cluster_name\": \"dev\",\n    \"cluster_version\": \"7.4.0\",\n    \"http_method\": \"PUT\",\n    \"action\": \"SaveConfig\",\n    \"user\": \"test\",\n    \"team\": \"main\",\n    \"pipeline\": \"check-pipeline\",\n    \"data\": {\n      \"jobs\": [\n        {\n          \"name\": \"test\",\n          \"plan\": [\n            {\n              \"get\": \"tiny\"\n            },\n            {\n              \"config\": {\n                \"image_resource\": {\n                  \"source\": {\n                    \"repository\": \"busybox\"\n                  },\n                  \"type\": \"registry-image\"\n                },\n                \"platform\": \"linux\",\n                \"run\": {\n                  \"args\": [\n                    \"-exc\",\n                    \"echo hello\"\n                  ],\n                  \"path\": \"sh\"\n                }\n              },\n              \"task\": \"a-task\" }\n] } ] } } }\n\n\nAn OPA rule can respond to Concourse with three fields:\n\n* allowed (required): Boolean type. Setting to False will deny the action unless the block field is False.\n\n* block (optional): Boolean type. If set to False and allowed is True this creates a soft-policy enforcement. The action will be allowed and the reasons will still be printed to the web UI like a warning message.\n\n  Not setting block is the same as setting \"block\": true.\n\n* reasons (optional): List of string type. If an action is denied based on the allowed field then the reason(s) will be displayed in the UI.\n\nHere is an example OPA policy. By default it will allow whatever action it has been sent. It will deny the action if one or more of the three deny rules are true.\n\npackage concourse\n\ndefault decision = {\"allowed\": true}\n\ndecision = {\"allowed\": false, \"reasons\": reasons} {\n  count(deny) \u003e 0\n  reasons := deny\n}\n\ndeny[\"cannot use docker-image types\"] {\n  input.action == \"UseImage\"\n  input.data.image_type == \"docker-image\"\n}\n\ndeny[\"cannot run privileged tasks\"] {\n  input.action == \"SaveConfig\"\n  input.data.jobs[_].plan[_].privileged\n}\n\ndeny[\"cannot use privileged resource types\"] {\n  input.action == \"SaveConfig\"\n  input.data.resource_types[_].privileged\n}\n","depth":4,"section_tag":"writing-opa-rules"},"yaml-quirks":{"location":"config-basics.html#yaml-quirks","title":"YAML Quirks","text":"YAML has some weird parts. For example, all of the following terms are acceptable boolean values: true, false, yes, no, on, off.\n\nYAML is also whitespace-sensitive. For the most part, this is really handy because it keeps you from having to count curly-braces in deeply nested parts of configuration such as job.plan. Sometimes, though, it can be hard to keep track of the correct indentation level.\n\n","depth":4,"section_tag":"yaml-quirks"},"yaml-tips-and-tricks":{"location":"config-basics.html#yaml-tips-and-tricks","title":"YAML Tips \u0026 Tricks","text":"YAML anchor syntax can be used to avoid repetition within configuration.\n\nFor example, the following YAML document...:\n\nlarge_value: \u0026my_anchor\n  do_the_thing: true\n  with_these_values: [1, 2, 3]\n\nduplicate_value: *my_anchor\n...is exactly equivalent to:\n\nlarge_value:\n  do_the_thing: true\n  with_these_values: [1, 2, 3]\n\nduplicate_value:\n  do_the_thing: true\n  with_these_values: [1, 2, 3]\nIf you find yourself repeating configuration throughout your pipeline, it may be a sign that Concourse is missing some kind of abstraction to make your pipeline less verbose. If you have the time and are interested in helping out with Concourse's design, feedback of this sort is welcome in GitHub Discussions!\n\nWe do want to avoid implementing an entire YAML templating engine within Concourse. We encoruage you to reach for your favourite templating tool if you're eager about DRYing up your pipelines as much as possible.\n\n","depth":4,"section_tag":"yaml-tips-and-tricks"}}
diff --git a/security-hardening.html b/security-hardening.html
new file mode 100644
index 00000000..48070964
--- /dev/null
+++ b/security-hardening.html
@@ -0,0 +1,350 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Security Hardening - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html"  class="self">Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.5</span><a href="security-hardening.html"  class="self">Security Hardening</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.5.1</td>
+            <td class="title-cell"><a href="security-hardening.html#keeping-your-kernel-up-to-date" >Keeping your kernel up-to-date</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5.2</td>
+            <td class="title-cell"><a href="security-hardening.html#locking-down-privileged-mode" >Locking down privileged mode</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_security-hardening">
+  
+  <h1 class="section-header"><a class="anchor-target" name="security-hardening" href="#security-hardening"></a><span class="section-number">1.15.5 </span>Security Hardening</h1>
+  
+
+  <p>Concourse tasks run in containers, which provide a degree of isolation from the host. However, if inadequate attention is paid to security, anyone with the ability to update pipelines or modify a script called in a task might be able to escape from the container and take control of the host. From there, they could access other host resources, interfere with pipelines they might not otherwise have access to, and collect credentials.</p><p>Following the guidance in this section can help you to greatly reduce the risk of a container escape.</p>
+
+  
+    
+      <div class="section" id="section_keeping-your-kernel-up-to-date">
+  
+  <h2 class="section-header"><a class="anchor-target" name="keeping-your-kernel-up-to-date" href="#keeping-your-kernel-up-to-date"></a>Keeping your kernel up-to-date</h2>
+  
+
+  <p>Containers run in different Linux namespaces on the same Linux kernel as the host system. Vulnerabilities in the kernel version you run can allow for local privilege escalation - which in the Concourse context means allowing an escape from a Concourse task to full root privileges on the host.</p><p>You can greatly reduce the risk of container escapes by staying up to date with your kernel version, tracking either the latest release, or the latest kernel from a Linux distribution with a reputable security programme.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_locking-down-privileged-mode">
+  
+  <h2 class="section-header"><a class="anchor-target" name="locking-down-privileged-mode" href="#locking-down-privileged-mode"></a>Locking down privileged mode</h2>
+  
+
+  <p>By default, privileged mode (i.e. tasks with <code>privileged: true</code> on the task step) grants containers a very wide set of Linux capabilities, without any restrictions on syscalls allowed. These privileges are enough to load a kernel module (allowing arbitrary privilege escalation and container escape), as well as direct access to all host devices. As such, by default, privileged tasks are equivalent to full root access on the host.</p><p>If you are running a worker using the containerd container runtime, Concourse provides some options to reduce the risk of container escapes through privileged tasks.</p><p>The <code>--containerd-privileged-mode=ignore</code> (or by environment variable, <code>CONCOURSE_CONTAINERD_PRIVILEGED_MODE=ignore</code>) option to the worker is the most restrictive, but most secure option. It makes Concourse treat privileged tasks the same as normal tasks (i.e. grants no extra privileges, effectively disabling privileged tasks). While this is secure, it is also restrictive if you want to do things like build or run containers inside tasks.</p><p>The <code>--containerd-privileged-mode=fuse-only</code> (or by environment variable, <code>CONCOURSE_CONTAINERD_PRIVILEGED_MODE=fuse-only</code>) option to the worker makes it possible to secure privileged tasks against container escape, while still allowing privileged tasks to build container images with buildah, and run them with podman from inside the task.</p><p><strong>Caution:</strong> For the fuse-only privileged mode option to be secure against escapes from privileged tasks, you must run your worker in a container with user namespaces enabled. Privileged containers in fuse-only mode have <code>CAP_SYS_ADMIN</code> capability, which is harmless when in a non-default user namespace, but equivalent to full root on the host otherwise. When running the worker in a Docker or podman container, refer to the <a href="https://docs.docker.com/engine/security/userns-remap/#enable-userns-remap-on-the-daemon">Docker</a> or <a href="https://docs.podman.io/en/latest/markdown/podman-run.1.html#subuidname-name">Podman</a> docs to learn how to set up user namespaces.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4</span>
+              
+
+              <a href="creds.html">Credential Management</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.6</span>
+              
+
+              <a href="container-placement.html">Container Placement</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/serial-job-example.html b/serial-job-example.html
new file mode 100644
index 00000000..2c3b4172
--- /dev/null
+++ b/serial-job-example.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Serial job example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html"  class="self">Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_serial-job-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="serial-job-example" href="#serial-job-example"></a><span class="section-number">2.2 </span>Serial job example</h1>
+  
+
+  <p>Setting the <a href="jobs.html#schema.job.serial"><code class="schema-attribute-name"><bold>job<wbr />.serial</bold></code></a> flag restricts a job to run one build at a time.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/serial-job"></iframe></p><p>By default, jobs are run in parallel. For some use cases this might be ideal (ex. testing all incoming commits from a repository). For other use cases this might be less ideal (ex. deploying an application).</p><p>You can also set the <a href="jobs.html#schema.job.max_in_flight"><code class="schema-attribute-name"><bold>job<wbr />.max_in_flight</bold></code></a> value to 1 to disable parallel job runs.</p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+jobs:
+# Try to trigger the job multiple times and see what happens
+- name: serial-job
+  public: true
+  serial: true
+  plan:
+  - task: simple-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: echo
+        args: [&#34;Hello, world!&#34;]
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.1</span>
+              
+
+              <a href="hello-world-example.html">Hello World pipeline</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.3</span>
+              
+
+              <a href="pipeline-vars-example.html">Pipeline <code>((vars))</code> example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/set-pipeline-step.html b/set-pipeline-step.html
new file mode 100644
index 00000000..f0429866
--- /dev/null
+++ b/set-pipeline-step.html
@@ -0,0 +1,590 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>set_pipeline step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html"  class="self"><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="set-pipeline-step.html#schema.set-pipeline.set_pipeline"><code>set_pipeline</code> step <strong><code>set_pipeline</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="set-pipeline-step.html#schema.set-pipeline.file"><code>set_pipeline</code> step <strong><code>file</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="set-pipeline-step.html#schema.set-pipeline.instance_vars"><code>set_pipeline</code> step <strong><code>instance_vars</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="set-pipeline-step.html#schema.set-pipeline.vars"><code>set_pipeline</code> step <strong><code>vars</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="set-pipeline-step.html#schema.set-pipeline.var_files"><code>set_pipeline</code> step <strong><code>var_files</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="set-pipeline-step.html#schema.set-pipeline.team"><code>set_pipeline</code> step <strong><code>team</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="set-pipeline-step.html#set-pipeline"><code>set_pipeline</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_set-pipeline-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="set-pipeline-step" href="#set-pipeline-step"></a><span class="section-number">1.11.4 </span><code>set_pipeline</code> step</h1>
+  
+
+  <div class="schema-group">
+  <a id="set-pipeline"></a>
+  <p>Configures a <a href="pipelines.html">pipeline</a>. Expand each section below for more details and examples.</p><p>Pipelines configured with the <code>set_pipeline</code> step are connected to the <a href="jobs.html">job</a> that configured them and will be automatically archived in the following scenarios: <ul>
+
+  <li><p>When the job that previously set a pipeline runs a successful build which did not configure the pipeline (i.e.  the <code>set_pipeline</code> step was removed for that specific pipeline).</p></li>
+
+  <li><p>When the job is removed from its pipeline configuration (see <a href="jobs.html#schema.job.old_name"><code class="schema-attribute-name"><bold>job<wbr />.old_name</bold></code></a> for renaming instead of removing).</p></li>
+
+  <li><p>When the job&#39;s pipeline is archived or destroyed.</p></li>
+
+</ul> This means any job that uses <code>set_pipeline</code> should set all still-desired pipelines in each build, rather than setting them one-by-one through many builds.</p><p>See <a href="managing-pipelines.html#fly-archive-pipeline"><code>fly archive-pipeline</code></a> for what happens when a pipeline is archived. <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.set-pipeline.set_pipeline" type="checkbox" class="toggle" />
+  <label for="toggle-schema.set-pipeline.set_pipeline" class="toggle-title">
+    <a id="schema.set-pipeline.set_pipeline"></a>
+
+    <code><a class="attribute-name" href="#schema.set-pipeline.set_pipeline">set_pipeline</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a> | <span class="schema-scalar">self</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The identifier specifies the name of the pipeline to configure. Unless <a href="set-pipeline-step.html#schema.set-pipeline.team"><code>set_pipeline</code> step <strong><code>team</code></strong></a> is set, it will be configured within the current team and be created <em>unpaused</em>. If set to <code>self</code>, the current pipeline will update its own config.</p><div class="toggleable example">
+  <input id="toggle-da161b43d940b315e9e1aa440c40920d6ff71091" type="checkbox" class="toggle" />
+  <label for="toggle-da161b43d940b315e9e1aa440c40920d6ff71091" class="toggle-title">One pipeline configuring another</label>
+  <div class="toggle-content">
+    <p>This is a way to ensure a pipeline stays up to date with its definition in a source code repository, eliminating the need to manually run <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>.</p><pre><code class="language-yaml">jobs:
+- name: set-pipeline
+  plan:
+  - get: examples
+    trigger: true
+  - set_pipeline: hello-world  # pipeline&#39;s name
+    file: examples/pipelines/hello-world.yml  # pipeline&#39;s config
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div></p><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.set-pipeline.file" type="checkbox" class="toggle" />
+  <label for="toggle-schema.set-pipeline.file" class="toggle-title">
+    <a id="schema.set-pipeline.file"></a>
+
+    <code><a class="attribute-name" href="#schema.set-pipeline.file">file</a>: <span class="attribute-type"><a href="config-basics.html#schema.file-path"><strong>file-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The path to the pipeline&#39;s configuration file.</p><p><code>file</code> points at a <code>.yml</code> file containing the pipeline configuration, which allows this to be tracked with your resources or generated by a <a href="task-step.html"><code>task</code> step</a>.</p><p>The first segment in the path should refer to another artifact from the plan, and the rest of the path is relative to that artifact.</p><div class="toggleable example">
+  <input id="toggle-1ab516562759e71eb8ee13b122e4eab6b60e9079" type="checkbox" class="toggle" />
+  <label for="toggle-1ab516562759e71eb8ee13b122e4eab6b60e9079" class="toggle-title">Fetching and configuring a pipeline</label>
+  <div class="toggle-content">
+    <p>The <a href="get-step.html"><code>get</code> step</a> can be used to fetch your configuration from a <code>git</code> repo and auto-configure it using a <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>:</p><pre><code class="language-yaml">jobs:
+- name: set-pipeline
+  plan:
+  - get: examples
+    trigger: true
+  - set_pipeline: hello-world  # pipeline&#39;s name
+    file: examples/pipelines/hello-world.yml  # pipeline&#39;s config
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.set-pipeline.instance_vars" type="checkbox" class="toggle" />
+  <label for="toggle-schema.set-pipeline.instance_vars" class="toggle-title">
+    <a id="schema.set-pipeline.instance_vars"></a>
+
+    <code><a class="attribute-name" href="#schema.set-pipeline.instance_vars">instance_vars</a>: <span class="attribute-type"><a href="config-basics.html#schema.vars"><strong>vars</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A map of instance vars used to identify <a href="instanced-pipelines.html">instanced pipelines</a>. These vars will also be <a href="setting-pipelines.html#pipeline-static-vars">interpolated into the pipeline config</a>.</p><p>Note that variables set with this field will not propagate to tasks configured via <a href="task-step.html#schema.task.file"><code>task</code> step <strong><code>file</code></strong></a>. If you want those variables to be determined at the time the pipeline is set, use <a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a> as well.</p><div class="warning">
+  <p><a href="instanced-pipelines.html">Instance pipelines</a> are experimental and need to be enabled by setting the <code>--enable-pipeline-instances</code> flag on the <a href="concourse-web.html"><code>web</code> node</a>.</p>
+</div><p><div class="toggleable example">
+  <input id="toggle-84359d1569082b31f89a6ef9f469d2ff061bd9a3" type="checkbox" class="toggle" />
+  <label for="toggle-84359d1569082b31f89a6ef9f469d2ff061bd9a3" class="toggle-title">Configuring instance vars</label>
+  <div class="toggle-content">
+    <p>The following pipeline will create one instance group with three pipelines. The instance group is called <code>my-bots</code> and each pipeline has a different set of <code>instance_vars</code> making it distinct from the other pipelines in the instance group. <pre><code class="language-yaml">jobs:
+- name: set-pipeline-instance-group
+  plan:
+  - get: examples
+  - in_parallel:
+    - set_pipeline: my-bots
+      file: examples/pipelines/pipeline-vars.yml
+      instance_vars:
+        first: initial
+        number: &#34;9000&#34;
+        hello: HAL
+    - set_pipeline: my-bots
+      file: examples/pipelines/pipeline-vars.yml
+      instance_vars:
+        first: second
+        number: &#34;3000&#34;
+        hello: WALLY-E
+    - set_pipeline: my-bots
+      file: examples/pipelines/pipeline-vars.yml
+      instance_vars:
+        first: the-third
+        number: &#34;6000&#34;
+        hello: R2D2
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre></p>
+  </div>
+</div> <div class="toggleable example">
+  <input id="toggle-0ee5804b19ec6a175ce7ecbd771eb5ddfef0da47" type="checkbox" class="toggle" />
+  <label for="toggle-0ee5804b19ec6a175ce7ecbd771eb5ddfef0da47" class="toggle-title">Configuring instance vars and vars</label>
+  <div class="toggle-content">
+    <p>Both <code>instance_vars</code> and <code>vars</code> may be statically. The difference between the two fields is that <code>instance_vars</code> are used to identify a pipeline and render the pipeline config. <code>vars</code> are only used for rendering the pipeline config:</p><pre><code class="language-yaml">jobs:
+- name: set-pipeline-vars-and-instance-vars
+  plan:
+  - get: examples
+  - set_pipeline: my-bots
+    file: examples/pipelines/pipeline-vars.yml
+    instance_vars:
+      first: initial
+      number: &#34;9000&#34;
+    vars:
+      hello: HAL
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div></p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.set-pipeline.vars" type="checkbox" class="toggle" />
+  <label for="toggle-schema.set-pipeline.vars" class="toggle-title">
+    <a id="schema.set-pipeline.vars"></a>
+
+    <code><a class="attribute-name" href="#schema.set-pipeline.vars">vars</a>: <span class="attribute-type"><a href="config-basics.html#schema.vars"><strong>vars</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A map of template variables to pass to the pipeline config. Unlike <a href="set-pipeline-step.html#schema.set-pipeline.instance_vars"><code>instance_vars</code></a>, <code>vars</code> are solely used to for <a href="setting-pipelines.html#pipeline-static-vars">interpolation</a>, and do not become a part of the pipeline&#39;s identifier.</p><p>Note that variables set with this field will not propagate to tasks configured via <a href="task-step.html#schema.task.file"><code>task</code> step <strong><code>file</code></strong></a>. If you want those variables to be determined at the time the pipeline is set, use <a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a> as well.</p><div class="toggleable example">
+  <input id="toggle-601c84c5a6fd108cab71f3b9f9b9f70412680876" type="checkbox" class="toggle" />
+  <label for="toggle-601c84c5a6fd108cab71f3b9f9b9f70412680876" class="toggle-title">Configuring static vars</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: set-pipeline-vars-only
+  plan:
+  - get: examples
+  - set_pipeline: pipeline-set-with-vars
+    file: examples/pipelines/pipeline-vars.yml
+    vars:
+      first: initial
+      number: &#34;9000&#34;
+      hello: HAL
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.set-pipeline.var_files" type="checkbox" class="toggle" />
+  <label for="toggle-schema.set-pipeline.var_files" class="toggle-title">
+    <a id="schema.set-pipeline.var_files"></a>
+
+    <code><a class="attribute-name" href="#schema.set-pipeline.var_files">var_files</a>: <span class="attribute-type">[<a href="config-basics.html#schema.file-path"><strong>file-path</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A list of paths to <code>.yml</code> files that will be passed to the pipeline config in the same manner as the <code>--load-vars-from</code> flag to <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>. This means that if a variable appears in multiple files, the value from a file that is passed later in the list will override the values from files earlier in the list.</p><div class="toggleable example">
+  <input id="toggle-4102f261f23ebb3a394289b4547f1e38fc963609" type="checkbox" class="toggle" />
+  <label for="toggle-4102f261f23ebb3a394289b4547f1e38fc963609" class="toggle-title">Configuring static vars with a vars file</label>
+  <div class="toggle-content">
+    <p>Where the vars file looks like: <pre><code class="language-yaml">first: initial
+number: &#34;9000&#34;
+hello: HAL
+</code></pre></p><p>And the pipeline config is:</p><pre><code class="language-yaml">jobs:
+- name: set-pipeline-vars-only
+  plan:
+  - get: examples
+  - set_pipeline: pipeline-set-with-vars
+    file: examples/pipelines/pipeline-vars.yml
+    var_files:
+      - examples/pipelines/vars-file.yml
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.set-pipeline.team" type="checkbox" class="toggle" />
+  <label for="toggle-schema.set-pipeline.team" class="toggle-title">
+    <a id="schema.set-pipeline.team"></a>
+
+    <code><a class="attribute-name" href="#schema.set-pipeline.team">team</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>By default, the <code>set_pipeline</code> step sets the pipeline for the same <a href="auth.html">team</a> that is running the build.</p><p>The <code>team</code> attribute can be used to specify another team.</p><p>Only the <a href="main-team.html"><code>main</code> team</a> is allowed to set another team&#39;s pipeline.  Any team other than the <a href="main-team.html"><code>main</code> team</a> using the <code>team</code> attribute will error, unless they reference their own team.</p><div class="toggleable example">
+  <input id="toggle-fd7db4db2e7ba9dbe873767bb0ac9fd8e5521e67" type="checkbox" class="toggle" />
+  <label for="toggle-fd7db4db2e7ba9dbe873767bb0ac9fd8e5521e67" class="toggle-title">Setting a pipeline on another team</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: set-pipeline
+  plan:
+  - get: examples
+    trigger: true
+  - set_pipeline: hello-world
+    file: examples/pipelines/hello-world.yml
+    team: other-team  # name of the team goes here
+
+resources:
+- name: examples
+  type: git
+  icon: github
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.3</span>
+              
+
+              <a href="task-step.html"><code>task</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.5</span>
+              
+
+              <a href="load-var-step.html"><code>load_var</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/set-pipelines-example.html b/set-pipelines-example.html
new file mode 100644
index 00000000..ee0c9cc3
--- /dev/null
+++ b/set-pipelines-example.html
@@ -0,0 +1,360 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Set Pipelines Example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html"  class="self">Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_set-pipelines-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="set-pipelines-example" href="#set-pipelines-example"></a><span class="section-number">2.4 </span>Set Pipelines Example</h1>
+  
+
+  <p>You can set a static set of pipelines from another pipeline on the same team.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/set-pipelines"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: concourse-examples
+  type: git
+  icon: github
+  check_every: 30m
+  source:
+    uri: https://github.com/concourse/examples
+
+jobs:
+# update this pipeline before updating child pipelines
+- name: set-self
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: concourse-examples
+    trigger: true
+  - set_pipeline: self
+    file: concourse-examples/pipelines/set-pipelines.yml
+
+- name: set-example-pipelines
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: concourse-examples
+    trigger: true
+    passed: [set-self]
+  - set_pipeline: job
+    file: concourse-examples/pipelines/hello-world.yml
+  - set_pipeline: separate-task-config
+    file: concourse-examples/pipelines/separate-task-config.yml
+  - set_pipeline: serial-job
+    file: concourse-examples/pipelines/serial-job.yml
+  - set_pipeline: pipeline-vars
+    file: concourse-examples/pipelines/pipeline-vars.yml
+    vars:
+      first: initial
+      number: &#34;9000&#34;
+      hello: HAL
+  - set_pipeline: pipeline-vars-file
+    file: concourse-examples/pipelines/pipeline-vars.yml
+    var_files:
+      - concourse-examples/pipelines/vars-file.yml
+  - set_pipeline: instance-groups
+    file: concourse-examples/pipelines/pipeline-vars.yml
+    # instance_vars is currently experimental and requires the feature flag
+    # --enable-pipeline-instances
+    instance_vars:
+      first: initial
+      number: &#34;9000&#34;
+      hello: HAL
+  - set_pipeline: instance-groups
+    file: concourse-examples/pipelines/pipeline-vars.yml
+    instance_vars:
+      first: second
+      number: &#34;3000&#34;
+      hello: WALLY-E
+  - set_pipeline: task-passing-artifact
+    file: concourse-examples/pipelines/task-passing-artifact.yml
+  - set_pipeline: time-triggered
+    file: concourse-examples/pipelines/time-triggered.yml
+  - set_pipeline: git-triggered
+    file: concourse-examples/pipelines/git-triggered.yml
+  - set_pipeline: manual-trigger
+    file: concourse-examples/pipelines/manually-triggered.yml
+  - set_pipeline: hooks
+    file: concourse-examples/pipelines/job-and-task-hooks.yml
+  - set_pipeline: golang-lib
+    file: concourse-examples/pipelines/golang-lib.yml
+  - set_pipeline: rails
+    file: concourse-examples/pipelines/rails-app-testing.yml
+  - set_pipeline: nodejs
+    file: concourse-examples/pipelines/nodejs-app-testing.yml
+  - set_pipeline: php
+    file: concourse-examples/pipelines/php-larvel-app-testing.yml
+  - set_pipeline: java
+    file: concourse-examples/pipelines/java.yml
+
+- name: set-rendered-pipelines
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: concourse-examples
+    trigger: true
+    passed: [set-self]
+  - task: render-pipelines
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: taylorsilva/carvel-ytt
+      inputs:
+      - name: concourse-examples
+      outputs:
+      - name: pipeline
+      run:
+        path: sh
+        args:
+        - -cx
+        - |
+          ytt -f ./concourse-examples/pipelines/templates/simple &gt; hello-world-rendered.yml
+          ytt -f ./concourse-examples/pipelines/templates/multiple-files &gt; multi-files-rendered.yml
+          mv *.yml ./pipeline/
+  - set_pipeline: hello-world-rendered
+    file: pipeline/hello-world-rendered.yml
+  - set_pipeline: multi-files-rendered
+    file: pipeline/multi-files-rendered.yml
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="set-pipeline-step.html"><code>set_pipeline</code> step</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.3</span>
+              
+
+              <a href="pipeline-vars-example.html">Pipeline <code>((vars))</code> example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.5</span>
+              
+
+              <a href="task-inputs-outputs-example.html">Task inputs and outputs example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/setting-pipelines.html b/setting-pipelines.html
new file mode 100644
index 00000000..9c259a01
--- /dev/null
+++ b/setting-pipelines.html
@@ -0,0 +1,385 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Setting Pipelines - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html"  class="active">Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.6</span><a href="pipelines.html"  class="active">Pipelines</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.6.1</td>
+            <td class="title-cell"><a href="setting-pipelines.html"  class="self">Setting Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.2</td>
+            <td class="title-cell"><a href="managing-pipelines.html" >Managing Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.3</td>
+            <td class="title-cell"><a href="instanced-pipelines.html" >Grouping Pipelines</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.6.1</span><a href="setting-pipelines.html"  class="self">Setting Pipelines</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.6.1.1</td>
+            <td class="title-cell"><a href="setting-pipelines.html#fly-set-pipeline" ><code>fly set-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.1.2</td>
+            <td class="title-cell"><a href="setting-pipelines.html#fly-validate-pipeline" ><code>fly validate-pipeline</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6.1.3</td>
+            <td class="title-cell"><a href="setting-pipelines.html#fly-format-pipeline" ><code>fly format-pipeline</code></a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_setting-pipelines">
+  
+  <h1 class="section-header"><a class="anchor-target" name="setting-pipelines" href="#setting-pipelines"></a><span class="section-number">1.6.1 </span>Setting Pipelines</h1>
+  
+
+  <p>Pipelines are configured entirely via the <a href="fly.html"><code>fly</code> CLI</a> or the <a href="set-pipeline-step.html#set-pipeline"><code>set_pipeline</code> step</a>. There is no GUI for configuring pipelines.</p>
+
+  
+    
+      <div class="section" id="section_fly-set-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-set-pipeline" href="#fly-set-pipeline"></a><code>fly set-pipeline</code></h2>
+  
+
+  <p>To submit a pipeline configuration to Concourse from a file on your local disk you can use the <code>-c</code> or <code>--config</code> flag, like so:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline my-pipeline \
+    --config pipeline.yml</code></pre><p>This will present a diff of the changes and ask you to confirm the changes. If you accept then Concourse&#39;s pipeline configuration will switch to the pipeline definition in the YAML file specified.</p><p>The <code>-c</code> or <code>--config</code> flag can also take in the value <code>-</code> to indicate reading from <code>stdin</code>:</p><pre><code class="language-bash">$ cat pipeline.yml | fly -t example set-pipeline \
+    --pipeline my-pipeline \
+    --config -</code></pre><p>Note that reading from <code>stdin</code> disables the confirmation prompt - the pipeline will be set automatically.</p>
+
+  
+    
+      <div class="section" id="section_pipeline-static-vars">
+  
+  <h3 class="section-header"><a class="anchor-target" name="pipeline-static-vars" href="#pipeline-static-vars"></a>Providing static values for vars</h3>
+  
+
+  <p>The pipeline configuration can contain <a href="vars.html">Vars</a> which may be <a href="vars.html#static-vars">replaced with static values</a> or <a href="vars.html#dynamic-vars">loaded at runtime</a>. This allows for credentials to be extracted from a pipeline config, making it safe to check in to a public repository or pass around.</p><p>For example, if you have a <code>pipeline.yml</code> as follows:</p><pre><code class="language-yaml">resources:
+- name: private-repo
+  type: git
+  source:
+    uri: git@...
+    branch: master
+    private_key: ((private-repo-key))</code></pre><p>...you could then configure this pipeline like so:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline my-pipeline \
+    --config pipeline.yml \
+    --var &#34;private-repo-key=$(cat id_rsa)&#34;</code></pre><p>Or, if you had a <code>vars.yml</code> as follows:</p><pre><code class="language-yaml">private-repo-key: |
+  -----BEGIN RSA PRIVATE KEY-----
+  ...
+  -----END RSA PRIVATE KEY-----</code></pre><p>...you could configure it like so:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline my-pipeline \
+    --config pipeline.yml \
+    --load-vars-from vars.yml</code></pre><p>You can use nested fields in your <code>pipeline.yml</code> as follows: <pre><code class="language-yaml">resources:
+- name: private-repo
+  type: git
+  source:
+    uri: git@((repo.uri))
+    branch: ((repo.branch))
+    private_key: ((&#34;github.com&#34;.private-repo-key))</code></pre></p><p>...you could configure it by <code>--load-vars-from</code> with a <code>vars.yml</code> as follows:</p><pre><code class="language-yaml">repo:
+  uri: github.com/...
+  branch: master
+github.com:
+  private-repo-key: |
+    -----BEGIN RSA PRIVATE KEY-----
+    ...
+    -----END RSA PRIVATE KEY-----</code></pre><p>...or you could also configure it by passing the vars as flags:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline my-pipeline \
+    --config pipeline.yml \
+    --var &#34;repo.uri=github.com&#34; \
+    --var &#34;repo.branch=master&#34; \
+    --var &#34;\&#34;github.com\&#34;.private-repo-key=$(cat id_rsa)&#34;</code></pre><p>When configuring a pipeline, any vars not provided statically will be left to resolve <a href="vars.html#dynamic-vars">at runtime</a>. To check that all vars are resolveable, you can pass the <code>--check-creds</code> flag:</p><pre><code class="language-bash">$ fly -t example set-pipeline \
+    --pipeline my-pipeline \
+    --config pipeline.yml \
+    --load-vars-from vars.yml \
+    --check-creds</code></pre><p>This will fill in all statically-provided vars and then attempt to resolve all remanining vars server-side. If any fail to resolve, configuring the pipeline will fail.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-validate-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-validate-pipeline" href="#fly-validate-pipeline"></a><code>fly validate-pipeline</code></h2>
+  
+
+  <p>To validate a local pipeline configuration without submitting it to Concourse, run <code>validate-pipeline</code>:</p><pre><code class="language-bash">$ fly validate-pipeline --config pipeline.yml</code></pre><p>By default, pipeline errors will cause <code>validate-pipeline</code> to fail, but warnings won&#39;t. To fail on both errors and warnings, pass the `--strict` flag.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fly-format-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fly-format-pipeline" href="#fly-format-pipeline"></a><code>fly format-pipeline</code></h2>
+  
+
+  <p>To format a pipeline config in a &#34;canonical&#34; form (i.e. keys are in normal order, with <code>name</code> first for example), run:</p><pre><code class="language-bash">$ fly format-pipeline --config pipeline.yml</code></pre><p>This will print the formatted pipeline config to <code>stdout</code>. To update the file in-place, pass <code>--write/-w</code>.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.6</span>
+              
+
+              <a href="pipelines.html">Pipelines</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.6.2</span>
+              
+
+              <a href="managing-pipelines.html">Managing Pipelines</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/steps.html b/steps.html
new file mode 100644
index 00000000..91a92474
--- /dev/null
+++ b/steps.html
@@ -0,0 +1,510 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Steps - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="self">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="self">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="steps.html#schema.step"><strong><code>step</code></strong> schema</a></td>
+      </tr>
+      
+
+      
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_steps">
+  
+  <h1 class="section-header"><a class="anchor-target" name="steps" href="#steps"></a><span class="section-number">1.11 </span>Steps</h1>
+  
+
+  <p>Each <a href="jobs.html">job</a> has a single build plan configured as <a href="jobs.html#schema.job.plan"><code class="schema-attribute-name"><bold>job<wbr />.plan</bold></code></a>. A build plan is a recipe for what to run when a build of the job is created.</p><p>A build plan is a sequence of <em>steps</em>:</p><ul>
+
+  <li><p>the <a href="task-step.html"><code>task</code> step</a> runs a <a href="tasks.html">task</a></p></li>
+
+  <li><p>the <a href="get-step.html"><code>get</code> step</a> fetches a <a href="resources.html">resource</a></p></li>
+
+  <li><p>the <a href="put-step.html"><code>put</code> step</a> updates a <a href="resources.html">resource</a></p></li>
+
+  <li><p>the <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a> configures a <a href="pipelines.html">pipeline</a></p></li>
+
+  <li><p>the <a href="load-var-step.html"><code>load_var</code> step</a> loads a value into a <a href="vars.html#local-vars">local var</a></p></li>
+
+  <li><p>the <a href="in-parallel-step.html"><code>in_parallel</code> step</a> runs steps in parallel</p></li>
+
+  <li><p>the <a href="do-step.html"><code>do</code> step</a> runs steps in sequence</p></li>
+
+  <li><p>the <a href="across-step.html#schema.across"><code>across</code> step modifier</a> runs a step multiple times; once for each combination of variable values</p></li>
+
+  <li><p>the <a href="try-step.html"><code>try</code> step</a> attempts to run a step and succeeds even if the step fails</p></li>
+
+</ul><p>When a new version is available for a <code>get</code> step with <a href="get-step.html#schema.get.trigger"><code>trigger: true</code></a> configured, a new build of the job will be created from the build plan.</p><p>When viewing the job in the pipeline, resources that are used as <code>get</code> steps appear as inputs, and resources that are used in <code>put</code> steps appear as outputs. Jobs are rendered downstream of any jobs they reference in <a href="get-step.html#schema.get.passed"><code>passed</code></a> constraints, connected by the resource.</p><p>If any step in the build plan fails, the build will fail and subsequent steps will not be executed. Additional steps may be configured to run after failure by configuring <a href="on-failure-hook.html#schema.on_failure"><code class="schema-attribute-name"><bold>on_failure</bold></code></a> or <a href="ensure-hook.html#schema.ensure"><code class="schema-attribute-name"><bold>ensure</bold></code></a> (or the job equivalents, <a href="jobs.html#schema.job.on_failure"><code class="schema-attribute-name"><bold>job<wbr />.on_failure</bold></code></a> and <a href="jobs.html#schema.job.ensure"><code class="schema-attribute-name"><bold>job<wbr />.ensure</bold></code></a>).</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.step" href="#schema.step"></a><code>step</code> schema</h2>
+
+  <div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.11.1</span>
+      <a href="get-step.html"><code>get</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.2</span>
+      <a href="put-step.html"><code>put</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.3</span>
+      <a href="task-step.html"><code>task</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.4</span>
+      <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.5</span>
+      <a href="load-var-step.html"><code>load_var</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.6</span>
+      <a href="in-parallel-step.html"><code>in_parallel</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.7</span>
+      <a href="do-step.html"><code>do</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.8</span>
+      <a href="try-step.html"><code>try</code> step</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9</span>
+      <a href="modifier-and-hook-steps.html">Modifier And Hook Steps</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.11.9.1</span>
+      <a href="across-step.html"><code>across</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.2</span>
+      <a href="timeout-step.html"><code>timeout</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.3</span>
+      <a href="attempts-step.html"><code>attempts</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.4</span>
+      <a href="tags-step.html"><code>tags</code> Step Modifier</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.5</span>
+      <a href="on-success-step.html"><code>on_success</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.6</span>
+      <a href="on-failure-hook.html"><code>on_failure</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.7</span>
+      <a href="on-abort-hook.html"><code>on_abort</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.8</span>
+      <a href="on-error-hook.html"><code>on_error</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.11.9.9</span>
+      <a href="ensure-hook.html"><code>ensure</code> Step Hook</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+</div>
+
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.10</span>
+              
+
+              <a href="jobs.html">Jobs</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.1</span>
+              
+
+              <a href="get-step.html"><code>get</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/support.html b/support.html
new file mode 100644
index 00000000..fede7e3d
--- /dev/null
+++ b/support.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Support - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link active" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">5</span><a href="support.html"  class="self">Support</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">5.1</td>
+            <td class="title-cell"><a href="support.html#community-support" >Community Support</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">5.2</td>
+            <td class="title-cell"><a href="support.html#commercial-support" >Commercial Support</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_support">
+  
+  <h1 class="section-header"><a class="anchor-target" name="support" href="#support"></a><span class="section-number">5 </span>Support</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_community-support">
+  
+  <h2 class="section-header"><a class="anchor-target" name="community-support" href="#community-support"></a>Community Support</h2>
+  
+
+  <p>You can ask the community for support either on <a href="https://discord.gg/MeRxXKW">Discord</a> or <a href="https://github.com/concourse/concourse/discussions/categories/help-support">GitHub Discussions</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_commercial-support">
+  
+  <h2 class="section-header"><a class="anchor-target" name="commercial-support" href="#commercial-support"></a>Commercial Support</h2>
+  
+
+  <p>The maintainers of Concourse provide commercial support for Concourse through <a href="https://pixelair.io/">Pixel Air</a>. If you&#39;re interested in commercial support you can <a href="https://pixelair.io/contact/">book a call</a> with us.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">4</span>
+              
+
+              <a href="ecosystem.html">Ecosystem</a>
+            </div>
+          
+
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tags-step.html b/tags-step.html
new file mode 100644
index 00000000..33a9271e
--- /dev/null
+++ b/tags-step.html
@@ -0,0 +1,409 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>tags Step Modifier - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html" ><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html"  class="self"><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tags-step.html#schema.tags"><code class="schema-attribute-name"><bold>tags</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_tags-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="tags-step" href="#tags-step"></a><span class="section-number">1.11.9.4 </span><code>tags</code> Step Modifier</h1>
+  
+
+  <p>The tags by which to match workers.  The step will be placed within the a pool of workers that match all of the given set of tags.</p><p>For example, if <code>[a, b]</code> is specified, only workers advertising the <code>a</code> and <code>b</code> tags (in addition to any others) will be used for running the step. <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.tags" type="checkbox" class="toggle" />
+  <label for="toggle-schema.tags" class="toggle-title">
+    <a id="schema.tags"></a>
+
+    <code><a class="attribute-name" href="#schema.tags">tags</a>: <span class="attribute-type">[<a href="config-basics.html#schema.string"><strong>string</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>[]</code>.</em></p><div class="toggleable example">
+  <input id="toggle-812c39c2da7e376fbf7f88d84f5048c1baf0df53" type="checkbox" class="toggle" />
+  <label for="toggle-812c39c2da7e376fbf7f88d84f5048c1baf0df53" class="toggle-title">Running in a private network</label>
+  <div class="toggle-content">
+    <p>You may have a private cluster only reachable by special workers running on-premises. To run steps against those workers, just provide a matching tag:</p><pre><code class="language-yaml">plan:
+- get: my-repo
+- put: my-site
+  tags: [private]
+  params: {path: my-repo}
+- task: acceptance-tests
+  tags: [private]
+  file: my-repo/ci/acceptance.yml</code></pre>
+  </div>
+</div>
+  </div>
+</div></p>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.3</span>
+              
+
+              <a href="attempts-step.html"><code>attempts</code> Step Modifier</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.5</span>
+              
+
+              <a href="on-success-step.html"><code>on_success</code> Step Hook</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/task-inputs-outputs-example.html b/task-inputs-outputs-example.html
new file mode 100644
index 00000000..8f865080
--- /dev/null
+++ b/task-inputs-outputs-example.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Task inputs and outputs example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html"  class="self">Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html" ><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_task-inputs-outputs-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="task-inputs-outputs-example" href="#task-inputs-outputs-example"></a><span class="section-number">2.5 </span>Task inputs and outputs example</h1>
+  
+
+  <p>A task can pass an artifacts to another task in the same job.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/task-passing-artifact/jobs/create-and-consume/builds/latest"></iframe></p><p>Tasks within a job have the ability to pass artifacts directly inbetween them to allow you to process artifacts in many ways.</p><p>While you are free to create as many jobs as you&#39;d like for your pipeline, you have to use resources to pass artifacts inbetween them.</p><p>These constructs give you the ability to design a pipeline that can process artifacts in many different ways via <a href="tasks.html">Tasks</a>, and then store those processed artifacts externally via <a href="resources.html">Resources</a>.</p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+jobs:
+- name: create-and-consume
+  public: true
+  plan:
+  - task: make-a-file
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: sh
+        args:
+          - -exc
+          - ls -la; echo &#34;Created a file on $(date)&#34; &gt; ./files/created_file
+      outputs:
+        - name: files
+  - task: consume-the-file
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      inputs:
+        - name: files
+      run:
+        path: cat
+        args:
+          - ./files/created_file
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.4</span>
+              
+
+              <a href="set-pipelines-example.html">Set Pipelines Example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.6</span>
+              
+
+              <a href="time-trigger-example.html"><code>time</code>-triggered job example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/task-step.html b/task-step.html
new file mode 100644
index 00000000..4dda979f
--- /dev/null
+++ b/task-step.html
@@ -0,0 +1,854 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>task step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html"  class="self"><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.task"><code>task</code> step <strong><code>task</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.config"><code>task</code> step <strong><code>config</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.file"><code>task</code> step <strong><code>file</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.image"><code>task</code> step <strong><code>image</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.privileged"><code>task</code> step <strong><code>privileged</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.container_limits.cpu"><code>task</code> step <strong><code>cpu</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.container_limits.memory"><code>task</code> step <strong><code>memory</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.container_limits"><code>task</code> step <strong><code>container_limits</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.hermetic"><code>task</code> step <strong><code>hermetic</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.input_mapping"><code>task</code> step <strong><code>input_mapping</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#schema.task.output_mapping"><code>task</code> step <strong><code>output_mapping</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="task-step.html#task"><code>task</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_task-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="task-step" href="#task-step"></a><span class="section-number">1.11.3 </span><code>task</code> step</h1>
+  
+
+  <div class="schema-group">
+  <a id="task"></a>
+  <p>Executes a <a href="tasks.html">task</a>. Expand each section below for more details and examples.</p><p>When a task completes, the artifacts specified by <a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a> will be registered in the build&#39;s artifact namespace. This allows subsequent <a href="task-step.html"><code>task</code> step</a>s and <a href="put-step.html"><code>put</code> step</a>s to access the result of a task.</p><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.task.task" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.task" class="toggle-title">
+    <a id="schema.task.task"></a>
+
+    <code><a class="attribute-name" href="#schema.task.task">task</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The identifier value is just a name - short and sweet. The value is shown in the web UI but otherwise has no affect on anything. This may change in the future; <a href="https://github.com/concourse/rfcs/pull/32">RFC #32</a> proposes that the name be used to reference a file within the project.</p><div class="toggleable example">
+  <input id="toggle-1a42722963f6a5a8c7ae866a6dd84f68e55f30ff" type="checkbox" class="toggle" />
+  <label for="toggle-1a42722963f6a5a8c7ae866a6dd84f68e55f30ff" class="toggle-title">Functions from inputs to outputs</label>
+  <div class="toggle-content">
+    <p>You can think of tasks like functions. They have predefined inputs and outputs and can be written in idempotent ways.</p><p>The following pipeline contains a function that increments a number. You can think of the task <code>add-one</code> like this pseudo-function:</p><pre><code class="language-">func AddOne(num int) int {
+  return num &#43; 1
+}</code></pre><pre><code class="language-yaml">jobs:
+- name: idempotent-task
+  plan:
+  - get: counter
+  - task: add-one
+    config:
+      platform: linux
+      image_resource:
+        type: mock
+        source: {mirror_self: true}
+      inputs:
+      - name: counter
+      outputs:
+      - name: counter
+      run:
+        path: sh
+        args:
+        - -c
+        - |
+          COUNTER=$(cat counter/version)
+          NEXT=$(($COUNTER &#43; 1))
+          echo &#34;new version: $NEXT&#34;
+          echo $NEXT &gt; counter/next
+  - put: counter
+    params:
+      file: counter/next
+
+resources:
+- name: counter
+  type: mock
+  source:
+    initial_version: &#34;1&#34;</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.config" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.config" class="toggle-title">
+    <a id="schema.task.config"></a>
+
+    <code><a class="attribute-name" href="#schema.task.config">config</a>: <span class="attribute-type"><a href="tasks.html#schema.task-config"><strong>task-config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The <a href="tasks.html">task config</a> to execute. <div class="toggleable example">
+  <input id="toggle-696cf01363be89cbfd7c542585b1a1b36e93e032" type="checkbox" class="toggle" />
+  <label for="toggle-696cf01363be89cbfd7c542585b1a1b36e93e032" class="toggle-title">Task config</label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: job
+  public: true
+  plan:
+  - task: simple-task
+    config: # contains all field in a task config
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: echo
+        args: [&#34;Hello world!&#34;]</code></pre>
+  </div>
+</div></p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.file" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.file" class="toggle-title">
+    <a id="schema.task.file"></a>
+
+    <code><a class="attribute-name" href="#schema.task.file">file</a>: <span class="attribute-type"><a href="config-basics.html#schema.file-path"><strong>file-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A dynamic alternative to <a href="task-step.html#schema.task.config"><code>task</code> step <strong><code>config</code></strong></a>.</p><p><code>file</code> points at a <code>.yml</code> file containing the <a href="tasks.html">task config</a>, which allows this to be tracked with your resources.</p><p>The first segment in the path should refer to another source from the plan, and the rest of the path is relative to that source.</p><p>The content of the config file may contain template <code>((vars))</code>, which will be filled in using <a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a> or a configured <a href="creds.html">credential manager</a>. <div class="toggleable example">
+  <input id="toggle-ec5e7d1edfc8e7e2478a0da8d815a0922e035d5c" type="checkbox" class="toggle" />
+  <label for="toggle-ec5e7d1edfc8e7e2478a0da8d815a0922e035d5c" class="toggle-title">Using a task config file</label>
+  <div class="toggle-content">
+    <p>Uses <a href="https://github.com/concourse/examples/blob/master/tasks/hello-world.yml">this config file</a>. <pre><code class="language-yaml">jobs:
+- name: task-config-in-file
+  plan:
+  - get: ci
+  - task: config-from-file
+    file: ci/tasks/hello-world.yml
+
+resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre></p>
+  </div>
+</div></p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.image" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.image" class="toggle-title">
+    <a id="schema.task.image"></a>
+
+    <code><a class="attribute-name" href="#schema.task.image">image</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Specifies an artifact source containing an image to use for the task. This overrides any <a href="tasks.html#schema.task-config.image_resource"><code class="schema-attribute-name"><bold>task-config<wbr />.image_resource</bold></code></a> configuration present in the task configuration.</p><p>This is very useful when part of your pipeline involves building an image, possibly with dependencies pre-baked. You can then propagate that image through the rest of your pipeline, guaranteeing that the correct version (and thus a consistent set of dependencies) is used throughout your pipeline.</p><div class="toggleable example">
+  <input id="toggle-18f79fb35486a56f696ebf92848de516bbebe388" type="checkbox" class="toggle" />
+  <label for="toggle-18f79fb35486a56f696ebf92848de516bbebe388" class="toggle-title">Fetching and using an image</label>
+  <div class="toggle-content">
+    <p>This can be used to explicitly keep track of dependent images. You could also modify it to build and push the image in one job and use it in later jobs. See <a href="building-and-pushing-an-image.html">Building and Pushing an Image</a>.</p><pre><code class="language-yaml">resources:
+- name: golang
+  type: registry-image
+  source:
+    repository: golang  # could also be the full URL &#34;docker.io/golang&#34;
+    tag: &#34;1.17&#34;
+
+jobs:
+- name: fetch-and-run-image
+  plan:
+  - get: golang
+  - task: use-fetched-image-in-task
+    image: golang   # reference the image from the get step
+    config:
+      platform: linux
+      run:
+        path: go
+        args: [&#34;version&#34;]</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-93277e7085def79873c9dfc6826fafc6bcd37cb6" type="checkbox" class="toggle" />
+  <label for="toggle-93277e7085def79873c9dfc6826fafc6bcd37cb6" class="toggle-title">Building and using an image</label>
+  <div class="toggle-content">
+    <p><a href="building-an-image-and-using-it-in-a-task.html">Building an Image and Using it in a Task</a></p>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.privileged" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.privileged" class="toggle-title">
+    <a id="schema.task.privileged"></a>
+
+    <code><a class="attribute-name" href="#schema.task.privileged">privileged</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If set to <code>true</code>, the task will run with escalated capabilities available on the task&#39;s platform.</p><div class="warning">
+  <p>Setting <code>privileged: true</code> is a gaping security hole; use wisely and only if necessary. This is not part of the task configuration in order to prevent privilege escalation via pull requests changing the task file.</p>
+</div><p>For the <code>linux</code> platform, this determines whether or not the container will run in a separate user namespace. When set to <code>true</code>, the container&#39;s <code>root</code> user is <em>actual</em> <code>root</code>, i.e. not in a user namespace. This is not recommended, and should <em>never</em> be used with code you do not trust - e.g. pull requests.</p><p>For macOS and Windows this field has no effect since workloads on those machines are not containerized.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.vars" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.vars" class="toggle-title">
+    <a id="schema.task.vars"></a>
+
+    <code><a class="attribute-name" href="#schema.task.vars">vars</a>: <span class="attribute-type"><a href="config-basics.html#schema.vars"><strong>vars</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A map of template variables to pass to an external task. Not to be confused with <a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a>, which provides <em>environment variables</em> to the task.</p><p>This is to be used with external tasks defined in <a href="task-step.html#schema.task.file"><code>task</code> step <strong><code>file</code></strong></a>.</p><div class="toggleable example">
+  <input id="toggle-63ab29786db83d73680ae30eb6e2d138987b8a94" type="checkbox" class="toggle" />
+  <label for="toggle-63ab29786db83d73680ae30eb6e2d138987b8a94" class="toggle-title">Parameterizing a task config file with vars</label>
+  <div class="toggle-content">
+    <p>A var may be statically passed like so:</p><pre><code class="language-yaml">jobs:
+- name: task-vars
+  plan:
+  - get: ci
+  - task: override-task-vars
+    file: ci/tasks/print-var.yml
+    vars: # statically defined vars
+      my-var: &#34;Cookies are the best&#34;
+      second-var: &#34;chips are a close second&#34;
+
+resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre><p>When run with the following <a href="tasks.html">task config</a>:</p><p><pre><code class="language-yaml">platform: linux
+
+image_resource:
+  type: mock
+  source: { mirror_self: true }
+
+params:
+  MY_VAR: ((my-var))
+
+run:
+  path: sh
+  args:
+  - -c
+  - |
+    echo ${MY_VAR} and ((second-var))
+</code></pre></p><p>The <code>&#34;((my-var))&#34;</code> will be resolved to <code>&#34;Cookies are the best&#34;</code> and <code>((second-var))</code> will be resolved to <code>&#34;chips are a close second&#34;</code>.</p><p>This can also be used in combination with <a href="vars.html">Vars</a> from a <a href="creds.html">credential manager</a> (i.e. Vault) as a way to re-map variable names to match what the task is expecting:</p><pre><code class="language-yaml">jobs:
+- name: task-vars
+  plan:
+  - get: ci
+  - task: override-task-vars
+    file: ci/tasks/print-var.yml
+    vars: # re-mapped vars
+      my-var: ((var-from-vault))
+      second-var: ((apple.type))
+
+resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.params" class="toggle-title">
+    <a id="schema.task.params"></a>
+
+    <code><a class="attribute-name" href="#schema.task.params">params</a>: <span class="attribute-type"><a href="config-basics.html#schema.env-vars"><strong>env-vars</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A map of task environment variable parameters to set, overriding those configured in the task&#39;s <code>config</code> or <code>file</code>.</p><p>The difference between <a href="task-step.html#schema.task.params"><code>params</code></a> and <a href="task-step.html#schema.task.vars"><code>vars</code></a> is that <a href="task-step.html#schema.task.vars"><code>vars</code></a> allows you to interpolate any template variable in an external task file, while <a href="task-step.html#schema.task.params"><code>params</code></a> can be used to overwrite task parameters specifically. Also, <a href="task-step.html#schema.task.params"><code>params</code></a> can have default values declared in the task.</p><div class="toggleable example">
+  <input id="toggle-78300ac6cf8c2c4ec0e11d8e8fc435139020768c" type="checkbox" class="toggle" />
+  <label for="toggle-78300ac6cf8c2c4ec0e11d8e8fc435139020768c" class="toggle-title">Running a task with env var params</label>
+  <div class="toggle-content">
+    <p>Let&#39;s say we have a <a href="tasks.html#schema.task-config">task config</a> like so:</p><p><pre><code class="language-yaml">platform: linux
+
+image_resource:
+  type: mock
+  source: { mirror_self: true }
+
+params:
+  ECHO_ME: &#34;default text to echo from task config file&#34;
+  ALSO_ME:
+
+run:
+  path: sh
+  args:
+  - -c
+  - |
+    echo ${ECHO_ME} and ${ALSO_ME}
+</code></pre></p><p>This indicates that there are two params which can be set: <code>ECHO_ME</code>, which has a default, and <code>ALSO_ME</code> which has no default set.</p><p>A pipeline could run the task with values passed in like so:</p><pre><code class="language-yaml">jobs:
+- name: task-params
+  plan:
+  - get: ci
+  - task: constrained-task
+    file: ci/tasks/print-param.yml
+    params:
+      ECHO_ME: &#34;Eat your fruits&#34;
+      ALSO_ME: &#34;veggies&#34;
+
+resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-84d41361e8b998e7cf238de2e4f76ef86ed55a06" type="checkbox" class="toggle" />
+  <label for="toggle-84d41361e8b998e7cf238de2e4f76ef86ed55a06" class="toggle-title">Using with <code>((vars))</code></label>
+  <div class="toggle-content">
+    <pre><code class="language-yaml">jobs:
+- name: task-params
+  plan:
+  - get: ci
+  - task: constrained-task
+    file: ci/tasks/print-param.yml
+    params:
+      ECHO_ME: ((some-var))
+      ALSO_ME: ((another-var))
+
+resources:
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.container_limits" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.container_limits" class="toggle-title">
+    <a id="schema.task.container_limits"></a>
+
+    <code><a class="attribute-name" href="#schema.task.container_limits">container_limits</a>: <span class="attribute-type"><a href="tasks.html#schema.container_limits"><strong>container_limits</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>CPU and memory limits to enforce on the task container.</p><p>Note that these values, when specified, will override any limits set by passing the <code>--default-task-cpu-limit</code> or <code>--default-task-memory-limit</code> flags to the <code>concourse web</code> command.</p><p>These values will also override any configuration set on a <a href="tasks.html#schema.task-config.container_limits">task&#39;s config <code>container_limits</code></a>.</p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.container_limits.cpu" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.container_limits.cpu" class="toggle-title">
+    <a id="schema.task.container_limits.cpu"></a>
+
+    <code><a class="attribute-name" href="#schema.task.container_limits.cpu">cpu</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The maximum amount of CPU available to the task container, measured in shares. 0 means unlimited.</p><p>CPU shares are relative to the CPU shares of other containers on a worker. For example, if you have two containers both with a CPU limit of 2 shares then each container will get 50% of the CPU&#39;s time.</p><pre><code class="language-">Container A: 2 shares - 50% CPU
+Container B: 2 shares - 50% CPU
+Total CPU shares declared: 4</code></pre><p>If you introduce another container then the number of CPU time per container changes. CPU shares are relative to each other. <pre><code class="language-">Container A: 2 shares - 25% CPU
+Container B: 2 shares - 25% CPU
+Container C: 4 shares - 50% CPU
+Total CPU shares declared: 8</code></pre></p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.container_limits.memory" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.container_limits.memory" class="toggle-title">
+    <a id="schema.task.container_limits.memory"></a>
+
+    <code><a class="attribute-name" href="#schema.task.container_limits.memory">memory</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The maximum amount of memory available to the task container, measured in bytes. 0 means unlimited.</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-04fceafe9a0f6cef0d8e8b4ab7def7d0889e7e83" type="checkbox" class="toggle" />
+  <label for="toggle-04fceafe9a0f6cef0d8e8b4ab7def7d0889e7e83" class="toggle-title">Setting CPU and Memory limits</label>
+  <div class="toggle-content">
+    <p>This task will only be given 10MB of memory and 2 CPU shares.</p><pre><code class="language-yaml">jobs:
+- name: limited-resources
+  plan:
+  - task: constrained-task
+    container_limits:
+      cpu: 2 # CPU shares are relative
+      memory: 10000000 # 10MB
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: echo
+        args: [&#34;Hello world!&#34;]</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.hermetic" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.hermetic" class="toggle-title">
+    <a id="schema.task.hermetic"></a>
+
+    <code><a class="attribute-name" href="#schema.task.hermetic">hermetic</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="warning">
+  <p>This setting is only supported by the <code>containerd</code> runtime on Linux. For other runtimes this setting has no effect on container networking. Please contact your Concourse operator to find out what runtime your Concourse cluster is using.</p>
+</div><p><em>Default <code>false</code>.</em> If set to <code>true</code>, the task will have no outbound network access. Your task will not be able to reach the internet or any local network resources that aren&#39;t also inside the container.</p><p>For macOS and Windows this field has no effect since workloads on those machines are not containerized.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.input_mapping" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.input_mapping" class="toggle-title">
+    <a id="schema.task.input_mapping"></a>
+
+    <code><a class="attribute-name" href="#schema.task.input_mapping">input_mapping</a>: <span class="attribute-type">{<a href="tasks.html#schema.input.name"><strong>input.name</strong></a>: <a href="config-basics.html#schema.identifier"><strong>identifier</strong></a>}</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A map from task input names to concrete names in the build plan. This allows a task with generic input names to be used multiple times in the same plan, mapping its inputs to specific resources within the plan.</p><div class="toggleable example">
+  <input id="toggle-52e3c8a64748838a3a9e0610c148120385b35fd3" type="checkbox" class="toggle" />
+  <label for="toggle-52e3c8a64748838a3a9e0610c148120385b35fd3" class="toggle-title">Generic task input names</label>
+  <div class="toggle-content">
+    <p>The following example demonstrates a task with generic <code>main</code> and <code>dev</code> inputs being mapped to more specific artifact names, <code>repo</code> and <code>repo-dev</code>:</p><pre><code class="language-yaml">jobs:
+- name: task-input-mapping
+  plan:
+  - in_parallel:
+    - get: repo
+    - get: repo-dev
+    - get: ci
+  - task: list-inputs
+    input_mapping:
+      main: repo
+      dev: repo-dev
+    file: ci/tasks/generic-inputs.yml
+
+resources:
+- name: repo
+  type: mock
+- name: repo-dev
+  type: mock
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre>
+  </div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task.output_mapping" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task.output_mapping" class="toggle-title">
+    <a id="schema.task.output_mapping"></a>
+
+    <code><a class="attribute-name" href="#schema.task.output_mapping">output_mapping</a>: <span class="attribute-type">{<a href="tasks.html#schema.output.name"><strong>output.name</strong></a>: <a href="config-basics.html#schema.identifier"><strong>identifier</strong></a>}</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A map from task output names to concrete names to register in the build plan. This allows a task with generic output names to be used multiple times in the same plan.</p><div class="toggleable example">
+  <input id="toggle-db41c602c04e55a653a83fe2cadea494c33da0d1" type="checkbox" class="toggle" />
+  <label for="toggle-db41c602c04e55a653a83fe2cadea494c33da0d1" class="toggle-title">Using with <code>input_mapping</code></label>
+  <div class="toggle-content">
+    <p>This is often used together with <a href="task-step.html#schema.task.input_mapping"><code>task</code> step <strong><code>input_mapping</code></strong></a>:</p><p>Given this task config: <pre><code class="language-yaml">platform: linux
+image_resource:
+  type: mock
+  source: {mirror_self: true}
+
+inputs:
+- name: main
+- name: dev
+
+outputs:
+- name: main
+- name: dev
+
+run:
+  path: sh
+  args:
+  - -c
+  - |
+    ls -lah
+    echo &#34;creating versions&#34;
+    echo &#34;hello-world&#34; &gt; main/version
+    echo &#34;hey there dev&#34; &gt; dev/version
+</code></pre></p><p>This pipeline will map the inputs and outputs of the task to match the name of the resources in the pipeline. <pre><code class="language-yaml">jobs:
+- name: task-output-mapping
+  plan:
+  - in_parallel:
+    - get: repo
+    - get: repo-dev
+    - get: ci
+  - task: create-outputs
+    input_mapping:
+      main: repo
+      dev: repo-dev
+    output_mapping:
+      main: repo
+      dev: repo-dev
+    file: ci/tasks/generic-outputs.yml
+  - in_parallel:
+    - put: repo
+      params:
+        file: repo/version
+    - put: repo-dev
+      params:
+        file: repo-dev/version
+
+resources:
+- name: repo
+  type: mock
+- name: repo-dev
+  type: mock
+- name: ci
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git</code></pre></p>
+  </div>
+</div>
+  </div>
+</div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.2</span>
+              
+
+              <a href="put-step.html"><code>put</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.4</span>
+              
+
+              <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tasks.html b/tasks.html
new file mode 100644
index 00000000..7719abd2
--- /dev/null
+++ b/tasks.html
@@ -0,0 +1,1055 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Tasks - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html"  class="self">Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.12</span><a href="tasks.html"  class="self">Tasks</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.12.1</td>
+            <td class="title-cell"><a href="tasks.html#running-tasks" >Running tasks with <code>fly execute</code></a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12.2</td>
+            <td class="title-cell"><a href="tasks.html#task-environment" >Task runtime environment</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config"><strong><code>task-config</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.anonymous_resource"><strong><code>anonymous_resource</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.input"><strong><code>input</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.output"><strong><code>output</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.cache"><strong><code>cache</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.command"><strong><code>command</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.container_limits"><strong><code>container_limits</code></strong> schema</a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.platform"><code class="schema-attribute-name"><bold>task-config<wbr />.platform</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.anonymous_resource.type"><code class="schema-attribute-name"><bold>anonymous_resource<wbr />.type</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.anonymous_resource.source"><code class="schema-attribute-name"><bold>anonymous_resource<wbr />.source</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.anonymous_resource.params"><code class="schema-attribute-name"><bold>anonymous_resource<wbr />.params</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.anonymous_resource.version"><code class="schema-attribute-name"><bold>anonymous_resource<wbr />.version</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.image_resource"><code class="schema-attribute-name"><bold>task-config<wbr />.image_resource</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.input.name"><code class="schema-attribute-name"><bold>input<wbr />.name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.input.path"><code class="schema-attribute-name"><bold>input<wbr />.path</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.input.optional"><code class="schema-attribute-name"><bold>input<wbr />.optional</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.inputs"><code class="schema-attribute-name"><bold>task-config<wbr />.inputs</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.output.name"><code class="schema-attribute-name"><bold>output<wbr />.name</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.output.path"><code class="schema-attribute-name"><bold>output<wbr />.path</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.cache.path"><code class="schema-attribute-name"><bold>cache<wbr />.path</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.caches"><code class="schema-attribute-name"><bold>task-config<wbr />.caches</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.params"><code class="schema-attribute-name"><bold>task-config<wbr />.params</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.command.path"><code class="schema-attribute-name"><bold>command<wbr />.path</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.command.args"><code class="schema-attribute-name"><bold>command<wbr />.args</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.command.dir"><code class="schema-attribute-name"><bold>command<wbr />.dir</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.command.user"><code class="schema-attribute-name"><bold>command<wbr />.user</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.run"><code class="schema-attribute-name"><bold>task-config<wbr />.run</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.rootfs_uri"><code class="schema-attribute-name"><bold>task-config<wbr />.rootfs_uri</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.container_limits.cpu"><code class="schema-attribute-name"><bold>container_limits<wbr />.cpu</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.container_limits.memory"><code class="schema-attribute-name"><bold>container_limits<wbr />.memory</bold></code></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="tasks.html#schema.task-config.container_limits"><code class="schema-attribute-name"><bold>task-config<wbr />.container_limits</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.12.1</td>
+        <td class="title-cell"><a href="tasks.html#running-tasks" >Running tasks with <code>fly execute</code></a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.12.2</td>
+        <td class="title-cell"><a href="tasks.html#task-environment" >Task runtime environment</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_tasks">
+  
+  <h1 class="section-header"><a class="anchor-target" name="tasks" href="#tasks"></a><span class="section-number">1.12 </span>Tasks</h1>
+  
+
+  <p>The smallest configurable unit in a Concourse pipeline is a single task. A task can be thought of as a function from <a href="tasks.html#schema.task-config.inputs"><code class="schema-attribute-name"><bold>task-config<wbr />.inputs</bold></code></a> to <a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a> that can either succeed or fail.</p><p>Going a bit further, ideally tasks are <em>pure</em> functions: given the same set of inputs, it should either always succeed with the same outputs or always fail. This is entirely up to your script&#39;s level of discipline, however. Flaky tests or dependencies on the internet are the most common source of impurity.</p><p>Once you have a running Concourse deployment, you can start configuring your tasks and executing them interactively from your terminal with the <a href="fly.html">Fly</a> commandline tool.</p><p>Once you&#39;ve figured out your task&#39;s configuration, you can reuse it for a <a href="jobs.html">Job</a> in your <a href="pipelines.html">Pipeline</a>.</p><p>Conventionally a task&#39;s configuration is placed in the same repository as the code it&#39;s testing, possibly under some <code>ci</code> directory.</p><p>A task&#39;s configuration specifies the following:</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.task-config" href="#schema.task-config"></a><code>task-config</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.task-config.platform" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.platform" class="toggle-title">
+    <a id="schema.task-config.platform"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.platform">platform</a>: <span class="attribute-type"><span class="schema-scalar">linux</span> | <span class="schema-scalar">darwin</span> | <span class="schema-scalar">windows</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The platform the task should run on. This determines the pool of workers that the task can run against.</p><p>Technically any string value is allowed so long as a worker advertises the same platform, but in practice only <code>linux</code>, <code>darwin</code>, and <code>windows</code> are in use.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.task-config.image_resource" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.image_resource" class="toggle-title">
+    <a id="schema.task-config.image_resource"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.image_resource">image_resource</a>: <span class="attribute-type"><a href="tasks.html#schema.anonymous_resource"><strong>anonymous_resource</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The container image to run with, as provided by an anonymous <a href="resources.html">resource</a> definition.</p><p>Whenever the task runs, the anonymous resource will be <code>check</code>ed to discover the latest version available. The image will then be fetched onto the worker, if necessary, just prior to running the task.</p><p>To use an image provided by a previous step within your build plan, set <a href="task-step.html#schema.task.image"><code>task</code> step <strong><code>image</code></strong></a> on the <a href="task-step.html"><code>task</code> step</a> instead.</p><blockquote class="aside"><p><strong>NOTE:</strong> This field is only required for tasks targeting the <a href="tasks.html#schema.task-config.platform">Linux platform</a>. This field will be ignored for Windows and Darwin workers. Windows containers are currently not supported and Darwin does not have native containers. The task will run inside a clean temporary directory on the Windows/Darwin worker with any inputs and outputs copied into the same directory. Any dependencies should be pre-installed on the worker.</p></blockquote><div class="toggleable example">
+  <input id="toggle-461a576b1284b5c560cab9c763a43e89a7d4eb44" type="checkbox" class="toggle" />
+  <label for="toggle-461a576b1284b5c560cab9c763a43e89a7d4eb44" class="toggle-title">Using the <code>golang</code> Docker image</label>
+  <div class="toggle-content">
+    <p>The following task config will use the <a href="https://hub.docker.com/_/golang"><code>golang</code> Docker image</a> to run <code>go version</code>:</p><pre><code class="language-yaml">platform: linux
+
+image_resource:
+  type: registry-image
+  source: {repository: golang}
+
+run:
+  path: go
+  args: [version]</code></pre>
+  </div>
+</div><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.anonymous_resource" href="#schema.anonymous_resource"></a><code>anonymous_resource</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.anonymous_resource.type" type="checkbox" class="toggle" />
+  <label for="toggle-schema.anonymous_resource.type" class="toggle-title">
+    <a id="schema.anonymous_resource.type"></a>
+
+    <code><a class="attribute-name" href="#schema.anonymous_resource.type">type</a>: <span class="attribute-type"><a href="resource-types.html#schema.resource_type.name"><strong>resource_type.name</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The type of the resource. Usually <code>registry-image</code>.</p><p>You can use any resource type that returns a filesystem in the correct format: a <code>/rootfs</code> directory containing a full filesystem, and a <code>metadata.json</code> file containing.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.anonymous_resource.source" type="checkbox" class="toggle" />
+  <label for="toggle-schema.anonymous_resource.source" class="toggle-title">
+    <a id="schema.anonymous_resource.source"></a>
+
+    <code><a class="attribute-name" href="#schema.anonymous_resource.source">source</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The configuration for the resource; see <a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.anonymous_resource.params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.anonymous_resource.params" class="toggle-title">
+    <a id="schema.anonymous_resource.params"></a>
+
+    <code><a class="attribute-name" href="#schema.anonymous_resource.params">params</a>: <span class="attribute-type"><a href="config-basics.html#schema.config"><strong>config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A map of arbitrary configuration to forward to the resource. Refer to the resource type&#39;s documentation to see what it supports.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.anonymous_resource.version" type="checkbox" class="toggle" />
+  <label for="toggle-schema.anonymous_resource.version" class="toggle-title">
+    <a id="schema.anonymous_resource.version"></a>
+
+    <code><a class="attribute-name" href="#schema.anonymous_resource.version">version</a>: <span class="attribute-type"><a href="config-basics.html#schema.version"><strong>version</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A specific version of the resource to fetch. This should be a map with string keys and values. If not specified, the latest version will be fetched.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task-config.inputs" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.inputs" class="toggle-title">
+    <a id="schema.task-config.inputs"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.inputs">inputs</a>: <span class="attribute-type">[<a href="tasks.html#schema.input"><strong>input</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The set of artifacts used by task, determining which artifacts will be available in the current directory when the task runs.</p><p>These are satisfied by <a href="get-step.html"><code>get</code> step</a>s or <a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a> of a previous task. These can also be provided by <code>-i</code> with <a href="tasks.html#running-tasks"><code>fly execute</code></a>.</p><p>If any required inputs are missing at run-time, then the task will error immediately.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.input" href="#schema.input"></a><code>input</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.input.name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.input.name" class="toggle-title">
+    <a id="schema.input.name"></a>
+
+    <code><a class="attribute-name" href="#schema.input.name">name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of the input.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.input.path" type="checkbox" class="toggle" />
+  <label for="toggle-schema.input.path" class="toggle-title">
+    <a id="schema.input.path"></a>
+
+    <code><a class="attribute-name" href="#schema.input.path">path</a>: <span class="attribute-type"><a href="config-basics.html#schema.dir-path"><strong>dir-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The path where the input will be placed. If not specified, the input&#39;s <code>name</code> is used.</p><p>Paths are relative to the working directory of the task unless an absolute path is given. An absolute path is any path that starts with a forward slash <code>/</code>. We recommend only using relative paths unless you have a strong technical reason to use absolute paths.</p><p>Any parent directory references (<code>../</code>) in the path will be removed.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.input.optional" type="checkbox" class="toggle" />
+  <label for="toggle-schema.input.optional" class="toggle-title">
+    <a id="schema.input.optional"></a>
+
+    <code><a class="attribute-name" href="#schema.input.optional">optional</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>false</code>.</em> If <code>true</code>, then the input is not required by the task. The task may run even if this input is missing.</p><p>An <code>optional</code> input that is missing will not appear in the current directory of the running task.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task-config.outputs" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.outputs" class="toggle-title">
+    <a id="schema.task-config.outputs"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.outputs">outputs</a>: <span class="attribute-type">[<a href="tasks.html#schema.output"><strong>output</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The artifacts produced by the task.</p><p>Each output configures a directory to make available to later steps in the <a href="steps.html">build plan</a>. The directory will be automatically created before the task runs, and the task should place any artifacts it wants to export in the directory.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.output" href="#schema.output"></a><code>output</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.output.name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.output.name" class="toggle-title">
+    <a id="schema.output.name"></a>
+
+    <code><a class="attribute-name" href="#schema.output.name">name</a>: <span class="attribute-type"><a href="config-basics.html#schema.identifier"><strong>identifier</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of the output. The contents under <code>path</code> will be made available to the rest of the plan under this name.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.output.path" type="checkbox" class="toggle" />
+  <label for="toggle-schema.output.path" class="toggle-title">
+    <a id="schema.output.path"></a>
+
+    <code><a class="attribute-name" href="#schema.output.path">path</a>: <span class="attribute-type"><a href="config-basics.html#schema.dir-path"><strong>dir-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The path to a directory where the output will be taken from. If not specified, the output&#39;s <code>name</code> is used.</p><p>Paths are relative to the working directory of the task unless an absolute path is given. An absolute path is any path that starts with a forward slash <code>/</code>. We recommend only using relative paths unless you have a strong technical reason to use absolute paths.</p><p>Any parent directory references (<code>../</code>) in the path will be removed.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task-config.caches" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.caches" class="toggle-title">
+    <a id="schema.task-config.caches"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.caches">caches</a>: <span class="attribute-type">[<a href="tasks.html#schema.cache"><strong>cache</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The cached directories shared between task runs.</p><p>On the task&#39;s first run, all cache directories will be empty. It is the responsibility of the task to populate these directories with any artifacts to be cached. On subsequent runs, the cached directories will contain those artifacts.</p><p>Caches are scoped to the worker the task is run on, so you will not get a cache hit when subsequent builds run on different workers. This also means that caching is not intended to share state between workers, and your task should be able to run whether or not the cache is warmed.</p><p>Caches are also scoped to a particular task name inside of a pipeline&#39;s job. As a consequence, if the job name, step name or cache path are changed, the cache will not be used. This also means that caches do not exist for one-off builds.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.cache" href="#schema.cache"></a><code>cache</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.cache.path" type="checkbox" class="toggle" />
+  <label for="toggle-schema.cache.path" class="toggle-title">
+    <a id="schema.cache.path"></a>
+
+    <code><a class="attribute-name" href="#schema.cache.path">path</a>: <span class="attribute-type"><a href="config-basics.html#schema.dir-path"><strong>dir-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The path to a directory to be cached.</p><p>Paths are relative to the working directory of the task. Absolute paths are not respected.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task-config.params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.params" class="toggle-title">
+    <a id="schema.task-config.params"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.params">params</a>: <span class="attribute-type"><a href="config-basics.html#schema.env-vars"><strong>env-vars</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A key-value mapping of string keys and values that are exposed to the task via environment variables.</p><p>Pipelines can override these params by setting <a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a> on the <a href="task-step.html"><code>task</code> step</a>. This is a common method of providing credentials to a task.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.task-config.run" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.run" class="toggle-title">
+    <a id="schema.task-config.run"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.run">run</a>: <span class="attribute-type"><a href="tasks.html#schema.command"><strong>command</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The command to execute in the container.</p><p>Note that this is <em>not</em> provided as a script blob, but explicit <code>path</code> and <code>args</code> values; this allows <code>fly</code> to forward arguments to the script, and forces your config <code>.yml</code> to stay fairly small.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.command" href="#schema.command"></a><code>command</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.command.path" type="checkbox" class="toggle" />
+  <label for="toggle-schema.command.path" class="toggle-title">
+    <a id="schema.command.path"></a>
+
+    <code><a class="attribute-name" href="#schema.command.path">path</a>: <span class="attribute-type"><a href="config-basics.html#schema.file-path"><strong>file-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of or path to the executable to run.</p><p><code>path</code> is relative to the working directory. If <code>dir</code> is specified to set the working directory, then <code>path</code> is relative to it.</p><p>This is commonly a path to a script provided by one of the task&#39;s inputs, e.g. <code>my-resource/scripts/test</code>. It could also be a command like <code>bash</code> (respecting standard <code>$PATH</code> lookup rules), or an absolute path to a file to execute, e.g. <code>/bin/bash</code>.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.command.args" type="checkbox" class="toggle" />
+  <label for="toggle-schema.command.args" class="toggle-title">
+    <a id="schema.command.args"></a>
+
+    <code><a class="attribute-name" href="#schema.command.args">args</a>: <span class="attribute-type">[<a href="config-basics.html#schema.string"><strong>string</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Arguments to pass to the command. Note that when executed with <a href="fly.html">Fly</a>, any arguments passed to <a href="tasks.html#running-tasks"><code>fly execute</code></a> are appended to this array.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.command.dir" type="checkbox" class="toggle" />
+  <label for="toggle-schema.command.dir" class="toggle-title">
+    <a id="schema.command.dir"></a>
+
+    <code><a class="attribute-name" href="#schema.command.dir">dir</a>: <span class="attribute-type"><a href="config-basics.html#schema.dir-path"><strong>dir-path</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A directory, relative to the initial working directory, to set as the working directory when running the script.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.command.user" type="checkbox" class="toggle" />
+  <label for="toggle-schema.command.user" class="toggle-title">
+    <a id="schema.command.user"></a>
+
+    <code><a class="attribute-name" href="#schema.command.user">user</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Explicitly set the user to run as. If not specified, this defaults to the user configured by the task&#39;s image. If not specified there, it&#39;s up to the Garden backend, and may be e.g. <code>root</code> on Linux.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task-config.rootfs_uri" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.rootfs_uri" class="toggle-title">
+    <a id="schema.task-config.rootfs_uri"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.rootfs_uri">rootfs_uri</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A string specifying the rootfs uri of the container, as interpreted by your worker&#39;s Garden backend.</p><p><a href="tasks.html#schema.task-config.image_resource"><code class="schema-attribute-name"><bold>task-config<wbr />.image_resource</bold></code></a> is the preferred way to specify base image. You should only use this if you have no other option and you really know what you&#39;re doing.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.task-config.container_limits" type="checkbox" class="toggle" />
+  <label for="toggle-schema.task-config.container_limits" class="toggle-title">
+    <a id="schema.task-config.container_limits"></a>
+
+    <code><a class="attribute-name" href="#schema.task-config.container_limits">container_limits</a>: <span class="attribute-type"><a href="tasks.html#schema.container_limits"><strong>container_limits</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>CPU and memory limits to enforce on the task container.</p><p>Note that these values, when specified, will override any limits set by passing the <code>--default-task-cpu-limit</code> or <code>--default-task-memory-limit</code> flags to the <code>concourse web</code> command.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.container_limits" href="#schema.container_limits"></a><code>container_limits</code> schema</h2>
+
+  <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.container_limits.cpu" type="checkbox" class="toggle" />
+  <label for="toggle-schema.container_limits.cpu" class="toggle-title">
+    <a id="schema.container_limits.cpu"></a>
+
+    <code><a class="attribute-name" href="#schema.container_limits.cpu">cpu</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The maximum amount of CPU available to the task container, measured in shares. 0 means unlimited.</p><p>CPU shares are relative to the CPU shares of other containers on a worker. For example, if you have two containers both with a CPU limit of 2 shares then each container will get 50% of the CPU&#39;s time.</p><pre><code class="language-">Container A: 2 shares - 50% CPU
+Container B: 2 shares - 50% CPU
+Total CPU shares declared: 4</code></pre><p>If you introduce another container then the number of CPU time per container changes. CPU shares are relative to each other. <pre><code class="language-">Container A: 2 shares - 25% CPU
+Container B: 2 shares - 25% CPU
+Container C: 4 shares - 50% CPU
+Total CPU shares declared: 8</code></pre></p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.container_limits.memory" type="checkbox" class="toggle" />
+  <label for="toggle-schema.container_limits.memory" class="toggle-title">
+    <a id="schema.container_limits.memory"></a>
+
+    <code><a class="attribute-name" href="#schema.container_limits.memory">memory</a>: <span class="attribute-type"><a href="config-basics.html#schema.number"><strong>number</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The maximum amount of memory available to the task container, measured in bytes. 0 means unlimited. Can use units such as <code>KB/MB/GB</code>.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div>
+</div><div class="toggleable example">
+  <input id="toggle-de537edfde1e28da0a38cde50242df455da426e1" type="checkbox" class="toggle" />
+  <label for="toggle-de537edfde1e28da0a38cde50242df455da426e1" class="toggle-title">Testing a Ruby app</label>
+  <div class="toggle-content">
+    <p>This configuration specifies that the task must run with the <code>ruby:2.1</code> Docker image with a <code>my-app</code> input, and when the task is executed it will run the <code>scripts/test</code> script in the same repo.</p><pre><code class="language-yaml">---
+platform: linux
+
+image_resource:
+  type: registry-image
+  source:
+    repository: ruby
+    tag: &#39;2.1&#39;
+
+inputs:
+- name: my-app
+
+run:
+  path: my-app/scripts/test</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-3e2549dbb0e4e84631bbdd416b5556e27ff22355" type="checkbox" class="toggle" />
+  <label for="toggle-3e2549dbb0e4e84631bbdd416b5556e27ff22355" class="toggle-title">Producing outputs from a task</label>
+  <div class="toggle-content">
+    <p>A task can configure <a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a> to produce artifacts that can then be propagated to a <a href="put-step.html"><code>put</code> step</a> or another <a href="task-step.html"><code>task</code> step</a> in the same plan. They can also be downloaded with <a href="tasks.html#running-tasks"><code>fly execute</code></a> by passing <code>-o</code>.</p><pre><code class="language-yaml">---
+platform: linux
+
+image_resource: # ...
+
+inputs:
+- name: project-src
+
+outputs:
+- name: built-project
+
+run:
+  path: project-src/ci/build</code></pre><p>...assuming <code>project-src/ci/build</code> looks something like:</p><pre><code class="language-bash">#!/bin/bash
+
+set -e -u -x
+
+export GOPATH=$PWD/project-src
+
+go build -o built-project/my-project \
+  github.com/concourse/my-project</code></pre><p>...this task could then be used in a <a href="steps.html">build plan</a> like so:</p><pre><code class="language-yaml">plan:
+- get: project-src
+- task: build-bin
+  file: project-src/ci/build.yml
+- put: project-bin
+  params: file: built-project/my-project</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-0cb9a039ace2fc94b1b7d9a0b5ef3e7d2f03f7eb" type="checkbox" class="toggle" />
+  <label for="toggle-0cb9a039ace2fc94b1b7d9a0b5ef3e7d2f03f7eb" class="toggle-title">Caching ephemeral state</label>
+  <div class="toggle-content">
+    <p>The following task and script could be used by a Node project to cache the <code>node_modules</code> directory:</p><pre><code class="language-yaml">---
+platform: linux
+
+image_resource: # ...
+
+inputs:
+- name: project-src
+
+caches:
+- path: project-src/node_modules
+
+run:
+  path: project-src/ci/build</code></pre><p>...assuming <code>project-src/ci/build</code> looks something like:</p><pre><code class="language-bash">#!/bin/bash
+
+set -e -u -x
+
+cd project-src
+npm install
+
+# ...</code></pre><p>...this task would cache the contents of <code>project-src/node_modules</code> between runs of this task on the same worker.</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-3aa0db94142151b23eb277ddf8bb8bf55d9d2b86" type="checkbox" class="toggle" />
+  <label for="toggle-3aa0db94142151b23eb277ddf8bb8bf55d9d2b86" class="toggle-title">Using an image from a private Docker registry</label>
+  <div class="toggle-content">
+    <p>The following external task uses an image from a private registry. Assuming the CA is configured properly on the workers, SSL should Just Work™.</p><p>External tasks are now fully interpolated using <a href="creds.html">credential manager variables</a> and <a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a>, so you can use template variables in an external task:</p><pre><code class="language-yaml">---
+platform: linux
+
+image_resource:
+  type: registry-image
+  source:
+    repository: my.local.registry:8080/my/image
+    username: ((myuser))
+    password: ((mypass))
+
+inputs:
+- name: my-app
+
+run:
+  path: my-app/scripts/test
+  args: [&#34;Hello, world!&#34;, &#34;((myparam))&#34;]</code></pre>
+  </div>
+</div><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.12.1</span>
+      <a href="tasks.html#running-tasks">Running tasks with <code>fly execute</code></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.12.2</span>
+      <a href="tasks.html#task-environment">Task runtime environment</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_running-tasks">
+  
+  <h2 class="section-header"><a class="anchor-target" name="running-tasks" href="#running-tasks"></a>Running tasks with <code>fly execute</code></h2>
+  
+
+  <p>One of the most common use cases of <code>fly</code> is taking a local project on your computer and setting it up with a task configuration to be run inside a container in Concourse. This is useful to build Linux projects on OS X or to avoid all of those debugging commits when something is configured differently between your local and remote setup.</p><p>You can execute a task like this:</p><pre><code class="language-bash">$ fly -t example execute --config tests.yml</code></pre><p>Your files will be uploaded and the task will be executed with them. The working directory name will be used as the input name. If they do not match, you must specify <code>-i name=.</code> instead, where <code>name</code> is the input name from the task configuration.</p><p><a href="fly.html">Fly</a> will automatically capture <code>SIGINT</code> and <code>SIGTERM</code> and abort the build when received. This allows it to be transparently composed with other toolchains.</p><p>By default, <a href="tasks.html#running-tasks"><code>fly execute</code></a> will not send extra files or large files in your current directory that would normally be ignored by your version control system. You can use the <code>--include-ignored</code> flag in order to send ignored files to Concourse along with those that are not ignored.</p><p>If your task needs to run as <code>root</code>, then you can specify the <code>-p</code> or <code>--privileged</code> flag.</p><div class="toggleable example">
+  <input id="toggle-b56665b124db029db6b069a5c2f73da19909824f" type="checkbox" class="toggle" />
+  <label for="toggle-b56665b124db029db6b069a5c2f73da19909824f" class="toggle-title">Providing multiple inputs</label>
+  <div class="toggle-content">
+    <p>Tasks in Concourse can take multiple inputs. Up until now we&#39;ve just been submitting a single input (our current working directory) that has the same name as the directory.</p><p>Tasks must specify the inputs that they require as <a href="tasks.html#schema.task-config.inputs"><code class="schema-attribute-name"><bold>task-config<wbr />.inputs</bold></code></a>. For <code>fly</code> to upload these inputs you can use the <code>-i</code> or <code>--input</code> arguments with name and path pairs. For example:</p><pre><code class="language-bash">$ fly -t example execute \
+    --config build-stemcell.yml \
+    --input code=. \
+    --input stemcells=../stemcells</code></pre><p>This would work together with a <code>build-stemcell.yml</code> if its <code>inputs:</code> section was as follows:</p><pre><code class="language-yaml">inputs:
+- name: code
+- name: stemcells</code></pre><p>If you specify an input, then the default input will no longer be added automatically, and you will need to explicitly list it (as with the <code>code</code> input above).</p><p>This feature can be used to mimic other resources and try out input combinations that would normally not be possible in a pipeline.</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-5fd4fe67cdc57768e785666ba809f0c80defc4fd" type="checkbox" class="toggle" />
+  <label for="toggle-5fd4fe67cdc57768e785666ba809f0c80defc4fd" class="toggle-title">Basing inputs on a job in your pipeline with <code>--inputs-from</code></label>
+  <div class="toggle-content">
+    <p>If the <code>--inputs-from</code> flag is given, the specified job will be looked up in the pipeline, and the one-off build will base its inputs on those currently configured for the job.</p><p>If any <code>--input</code> flags are given (see above), they will override the base set of inputs.</p><p>For example:</p><pre><code class="language-bash">$ fly -t example execute \
+    --config task.yml \
+    --inputs-from main/integration \
+    --input foo=./foo</code></pre><p>This will trigger a one-off-build using the <code>task.yml</code> task config, basing its inputs on the latest candidates for the <code>integration</code> job in the <code>main</code> pipeline, with the <code>foo</code> input overridden to specify local code to run.</p><p>This can be used to more closely replicate the state in CI when weeding out flakiness, or as a shortcut for local development so that you don&#39;t have to upload every single resource from your local machine.</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-2e46a698de65b5e796e557ccf7905d30cce72e3c" type="checkbox" class="toggle" />
+  <label for="toggle-2e46a698de65b5e796e557ccf7905d30cce72e3c" class="toggle-title">Using an image from a job in your pipeline with <code>--image</code></label>
+  <div class="toggle-content">
+    <p>When using <code>--inputs-from</code> as above, you can additionally specify which input to use as the task&#39;s image by passing <code>--image input-name</code>.</p><p>For example, the following pipeline fetches an image via a <a href="get-step.html"><code>get</code> step</a> and uses it for <a href="task-step.html#schema.task.image"><code>task</code> step <strong><code>image</code></strong></a>:</p><pre><code class="language-yaml">resources:
+- name: my-repo
+  type: git
+  source: {uri: https://example.com}
+
+- name: some-image
+  type: registry-image
+  source: {repository: ubuntu}
+
+jobs:
+- name: integration
+  plan:
+  - get: my-repo
+  - get: some-image
+  - task: my-task
+    file: my-repo/task.yml
+    image: some-image</code></pre><p>...so to run the same task with the same image in a one-off build, you would run:</p><pre><code class="language-bash">$ fly -t example execute \
+    --config task.yml \
+    --inputs-from main/integration \
+    --image some-image</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-83d5dc17a91b94725f09a3a017858f3d1c9e31b1" type="checkbox" class="toggle" />
+  <label for="toggle-83d5dc17a91b94725f09a3a017858f3d1c9e31b1" class="toggle-title">Taking artifacts from the build with <code>--output</code></label>
+  <div class="toggle-content">
+    <p>If a task specifies outputs, then you&#39;re able to extract these back out of the build and back to your local system. For example:</p><pre><code class="language-bash">$ fly -t example execute \
+    --config build-stemcell.yml \
+    --input code=. \
+    --output stemcell=/tmp/stemcell</code></pre><p>This would work together with a <code>build-stemcell.yml</code>, if its <code>outputs:</code> section was as follows:</p><pre><code class="language-yaml">outputs:
+- name: stemcell</code></pre><p>This feature is useful to farm work out to your Concourse server to build things in a repeatable manner.</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-6fd3718bb754f4d00f9e73d64415cbb81ab32a2a" type="checkbox" class="toggle" />
+  <label for="toggle-6fd3718bb754f4d00f9e73d64415cbb81ab32a2a" class="toggle-title">Providing values for <code>params</code></label>
+  <div class="toggle-content">
+    <p>Any params listed in the task configuration can be specified by using environment variables.</p><p>So, if you have a task with the following params:</p><pre><code class="language-yaml">params:
+  FOO: fizzbuzz
+  BAR:</code></pre><p>...and you run:</p><pre><code class="language-bash">BAR=hello fly execute</code></pre><p>The task would then run with <code>BAR</code> as <code>&#34;hello&#34;</code>, and <code>FOO</code> as <code>&#34;fizzbuzz&#34;</code> (its default value).</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-eddbf2550a94b7e8d4749612f3e9da54a8f44e81" type="checkbox" class="toggle" />
+  <label for="toggle-eddbf2550a94b7e8d4749612f3e9da54a8f44e81" class="toggle-title">Providing values for vars</label>
+  <div class="toggle-content">
+    <p>Task config files can contain <a href="vars.html">Vars</a> which can can be set during <code>fly execute</code> by using the <code>-v</code>, <code>-y</code> and <code>-l</code> flags:</p><pre><code class="language-bash">fly -t example execute --config tests.yml \
+  -l vars.yml \
+  -v some_string=&#34;Hello World!&#34; \
+  -y some_bool=true</code></pre><p>Any variables not satisfied via the above flags will be deferred to the configured <a href="creds.html">credential manager</a>.</p><p>To satisfy these vars when running the task in a pipeline, see <a href="task-step.html#schema.task.vars"><code>task</code> step <strong><code>vars</code></strong></a>.</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-747c85ef4bbb300b7591f7e0da39f7e5adaa61d5" type="checkbox" class="toggle" />
+  <label for="toggle-747c85ef4bbb300b7591f7e0da39f7e5adaa61d5" class="toggle-title">Targeting a specific worker with <code>--tag</code></label>
+  <div class="toggle-content">
+    <p>If you want to execute a task on a worker that has a specific tag, you can do so by passing <code>--tag</code>:</p><pre><code class="language-bash">fly -t example execute --config task.yml --tag bar</code></pre><p>This will execute the task specified by <code>task.yml</code> on a worker that has been tagged <code>bar</code>.</p>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_task-environment">
+  
+  <h2 class="section-header"><a class="anchor-target" name="task-environment" href="#task-environment"></a>Task runtime environment</h2>
+  
+
+  <p>A task runs in a new container every time, using the image provided by <a href="tasks.html#schema.task-config.image_resource"><code class="schema-attribute-name"><bold>task-config<wbr />.image_resource</bold></code></a> as its base filesystem (i.e. <code>/</code>).</p><p>The command specified by <a href="tasks.html#schema.task-config.run"><code class="schema-attribute-name"><bold>task-config<wbr />.run</bold></code></a> will be executed in a working directory containing each of the <a href="tasks.html#schema.task-config.inputs"><code class="schema-attribute-name"><bold>task-config<wbr />.inputs</bold></code></a>. If any input is missing, the task will not run (and the container will not even be created).</p><p>The working directory will also contain empty directories for each of the <a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a>. The task must place artifacts in the output directories for them to be exported. This meshes well with build tools with configurable destination paths.</p><blockquote class="aside"><p>If your build tools don&#39;t support output paths, you can configure an input and output with the same path. The directory will be populated by the input, and any changes made to the directory will propagate downstream as an output.</p></blockquote><p>Any <a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a> configured will be set in the environment for the task&#39;s command, along with any environment variables provided by the task&#39;s image (i.e. <code>ENV</code> rules from your <code>Dockerfile</code>).</p><p>The user the command runs as is determined by the image. If you&#39;re using a Docker image, this will be the user set by a <code>USER</code> rule in your <code>Dockerfile</code>, or <code>root</code>, if not specified.</p><p>Another relevant bit of configuration is <a href="task-step.html#schema.task.privileged"><code>task</code> step <strong><code>privileged</code></strong></a>, which determines whether the user the task runs as will have full privileges (primarily when running as <code>root</code>). This is intentionally <em>not</em> configurable by the task itself, to prevent privilege escalation by submitting pull requests to repositories that contain task configs.</p><p>Putting all this together, the following task config:</p><pre><code class="language-yaml">---
+platform: linux
+
+image_resource:
+  type: registry-image
+  source:
+    repository: golang
+    tag: &#39;1.6&#39;
+
+params:
+  SOME_PARAM: some-default-value
+
+inputs:
+- name: some-input
+- name: some-input-with-custom-path
+  path: some/custom/path
+
+outputs:
+- name: some-output
+
+run:
+  path: sh
+  args:
+  - -exc
+  - |
+    whoami
+    env
+    go version
+    find .
+    touch some-output/my-built-artifact</code></pre><p>...will produce the following output:</p><pre><code class="language-bash">&#43; whoami
+root
+&#43; env
+USER=root
+HOME=/root
+GOLANG_DOWNLOAD_SHA256=5470eac05d273c74ff8bac7bef5bad0b5abbd1c4052efbdbc8db45332e836b0b
+PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+GOPATH=/go
+PWD=/tmp/build/e55deab7
+GOLANG_DOWNLOAD_URL=https://golang.org/dl/go1.6.linux-amd64.tar.gz
+GOLANG_VERSION=1.6
+SOME_PARAM=some-default-value
+&#43; go version
+go version go1.6 linux/amd64
+&#43; find .
+.
+./some-input
+./some-input/foo
+./some
+./some/custom
+./some/custom/path
+./some/custom/path/bar
+./some-output
+&#43; touch some-output/my-built-artifact</code></pre><p>...and propagate <code>my-built-artifact</code> to any later <a href="task-step.html"><code>task</code> step</a>s or <a href="put-step.html"><code>put</code> step</a>s that reference the <code>some-output</code> artifact, in the same way that this task had <code>some-input</code> as an input.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11</span>
+              
+
+              <a href="steps.html">Steps</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.13</span>
+              
+
+              <a href="builds.html">Builds</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/teams-caveats.html b/teams-caveats.html
new file mode 100644
index 00000000..341cb59f
--- /dev/null
+++ b/teams-caveats.html
@@ -0,0 +1,288 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Security Caveats - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html" >Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html" >User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html"  class="self">Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_teams-caveats">
+  
+  <h1 class="section-header"><a class="anchor-target" name="teams-caveats" href="#teams-caveats"></a><span class="section-number">1.3.6 </span>Security Caveats</h1>
+  
+
+  <p>At present, teams only provide <em>trusted multi-tenancy</em>. This means it should be used for cases where you know and trust who you&#39;re allowing access into your Concourse cluster.</p><p>There are a few reasons it&#39;d be a bad idea to do otherwise:</p><ul>
+
+  <li><p>Any team can run builds with <a href="task-step.html#schema.task.privileged"><code>task</code> step <strong><code>privileged</code></strong></a> tasks. A bad actor in the mix could easily use this to harm your workers and your cluster. You can <a href="security-hardening.html#locking-down-privileged-mode">lock down privileged mode</a> if you use the containerd runtime and avoid this issue all together.</p></li>
+
+  <li><p>There are no networking restrictions in place, and traffic to and from the worker&#39;s Garden and Baggageclaim endpoints is currently unencrypted and unauthorized. Anyone could run a task that does horrible things to your worker&#39;s containers, possibly stealing sensitive information.</p><p>This can be remedied with configuration specified on Garden to restrict access to the internal network, but this is not detailed in our docs, and we&#39;ll probably want to find a better answer than configuration in the future.</p><p>You could put firewall rules in place between workers to mitigate this issue as well.</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.5</span>
+              
+
+              <a href="exposing.html">Pipeline &amp; Build Visibility</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.4</span>
+              
+
+              <a href="fly.html">The <code>fly</code> CLI</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/time-trigger-example.html b/time-trigger-example.html
new file mode 100644
index 00000000..6db21be0
--- /dev/null
+++ b/time-trigger-example.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>time-triggered job example - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link" href="docs.html">Docs</a>
+    
+    <a class="top-link active" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">2</span><a href="examples.html"  class="active">Examples</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">2.1</td>
+            <td class="title-cell"><a href="hello-world-example.html" >Hello World pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.2</td>
+            <td class="title-cell"><a href="serial-job-example.html" >Serial job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.3</td>
+            <td class="title-cell"><a href="pipeline-vars-example.html" >Pipeline <code>((vars))</code> example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.4</td>
+            <td class="title-cell"><a href="set-pipelines-example.html" >Set Pipelines Example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.5</td>
+            <td class="title-cell"><a href="task-inputs-outputs-example.html" >Task inputs and outputs example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.6</td>
+            <td class="title-cell"><a href="time-trigger-example.html"  class="self"><code>time</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.7</td>
+            <td class="title-cell"><a href="git-trigger-example.html" ><code>git</code>-triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.8</td>
+            <td class="title-cell"><a href="manual-trigger-example.html" >Manually triggered job example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.9</td>
+            <td class="title-cell"><a href="hooks-example.html" >Job &amp; task hooks example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.10</td>
+            <td class="title-cell"><a href="golang-library-example.html" >Golang library testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.11</td>
+            <td class="title-cell"><a href="rails-example.html" >Rails application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.12</td>
+            <td class="title-cell"><a href="java-example.html" >Java application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.13</td>
+            <td class="title-cell"><a href="nodejs-example.html" >Nodejs application testing example</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">2.14</td>
+            <td class="title-cell"><a href="php-example.html" >PHP application testing example</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_time-trigger-example">
+  
+  <h1 class="section-header"><a class="anchor-target" name="time-trigger-example" href="#time-trigger-example"></a><span class="section-number">2.6 </span><code>time</code>-triggered job example</h1>
+  
+
+  <p>The <a href="https://github.com/concourse/time-resource"><code>time</code> resource</a> can be used to trigger a job.</p><p><iframe class="frame" frameborder="0" width="100%" height="300px" src="https://ci.concourse-ci.org/teams/examples/pipelines/time-triggered"></iframe></p>
+
+  
+    
+      <div class="section" id="section_configuration">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuration" href="#configuration"></a>Pipeline Configuration</h2>
+  
+
+  <p><pre><code class="language-yaml">---
+resources:
+- name: every-30s
+  type: time
+  icon: clock-outline
+  source:
+    interval: 30s
+
+jobs:
+- name: job
+  public: true
+  build_log_retention:
+    builds: 50
+  plan:
+  - get: every-30s
+    trigger: true
+  - task: simple-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source: { repository: busybox }
+      run:
+        path: echo
+        args: [&#34;Hello, world!&#34;]
+</code></pre></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_references">
+  
+  <h2 class="section-header"><a class="anchor-target" name="references" href="#references"></a>References</h2>
+  
+
+  <ul>
+
+  <li><p><a href="resources.html">Resources</a></p></li>
+
+  <li><p><a href="jobs.html">Jobs</a></p></li>
+
+  <li><p><a href="steps.html">Steps</a></p></li>
+
+  <li><p><a href="tasks.html">Tasks</a></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">2.5</span>
+              
+
+              <a href="task-inputs-outputs-example.html">Task inputs and outputs example</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">2.7</span>
+              
+
+              <a href="git-trigger-example.html"><code>git</code>-triggered job example</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/time-triggered-pipeline-patterns.html b/time-triggered-pipeline-patterns.html
new file mode 100644
index 00000000..e2c44dc4
--- /dev/null
+++ b/time-triggered-pipeline-patterns.html
@@ -0,0 +1,414 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Time Triggered Pipeline Patterns - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html"  class="active">How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14</span><a href="how-to-guides.html"  class="active">How-To Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1</td>
+            <td class="title-cell"><a href="pipeline-guides.html"  class="active">Pipeline Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.2</td>
+            <td class="title-cell"><a href="git-guides.html" >Git Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.3</td>
+            <td class="title-cell"><a href="container-image-guides.html" >Container Image Guides</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.14.1</span><a href="pipeline-guides.html"  class="active">Pipeline Guides</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.14.1.1</td>
+            <td class="title-cell"><a href="common-pipeline-practices.html" >Common Pipeline Practices</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.2</td>
+            <td class="title-cell"><a href="exploring-task-input-and-output-scenarios.html" >Exploring Task Input and Output Scenarios</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.3</td>
+            <td class="title-cell"><a href="gated-pipeline-patterns.html" >Gated Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.4</td>
+            <td class="title-cell"><a href="time-triggered-pipeline-patterns.html"  class="self">Time Triggered Pipeline Patterns</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14.1.5</td>
+            <td class="title-cell"><a href="manual-approval-step.html" >Manual Approval Step</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_time-triggered-pipeline-patterns">
+  
+  <h1 class="section-header"><a class="anchor-target" name="time-triggered-pipeline-patterns" href="#time-triggered-pipeline-patterns"></a><span class="section-number">1.14.1.4 </span>Time Triggered Pipeline Patterns</h1>
+  
+
+  <p>The <a href="https://github.com/concourse/time-resource/">time resource</a> produces a new <a href="tutorial-resources.html#versions">version</a> for the time interval that was declared in its definition in the pipeline configuration file.</p><p>The two most common usages are having the time resource trigger on an interval:</p><pre><code class="language-yaml">resources:
+- name: trigger-every-3-minutes
+  type: time
+  source:
+    interval: 3m</code></pre><p>Or trigger once within a certain time range: <pre><code class="language-yaml">resources:
+- name: trigger-daily-between-1am-and-2am
+  type: time
+  source:
+    start: 1:00 AM
+    stop: 2:00 AM
+    location: America/Toronto</code></pre></p><p>Check the README of the <a href="https://github.com/concourse/time-resource/">time resource</a> for more details.</p>
+
+  
+    
+      <div class="section" id="section_1---single-time-trigger">
+  
+  <h2 class="section-header"><a class="anchor-target" name="1---single-time-trigger" href="#1---single-time-trigger"></a>#1 - Single Time Trigger</h2>
+  
+
+  <p>The following is an example of a pipeline that is triggered by a time resource on a pre-determined interval.</p><p><pre><code class="language-yaml">resources:
+- name: trigger-every-3-minutes
+  type: time
+  source:
+    interval: 3m
+
+jobs:
+- name: run-forrest-run
+  plan:
+  - get: trigger-every-3-minutes
+    trigger: true
+  # can add other steps to run in this job
+
+- name: run-bubba-run
+  plan:
+  - get: trigger-every-3-minutes
+    trigger: true
+    passed:
+      - run-forrest-run
+  # can add other steps to run in this job</code></pre> <a href="images/how-to-guides/pipelines/time-triggered-01.png"><div class="diagram">
+  <img src="images/how-to-guides/pipelines/time-triggered-01.png" alt="diagram" width="100%" />
+</div></a></p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_2---multiple-time-triggers">
+  
+  <h2 class="section-header"><a class="anchor-target" name="2---multiple-time-triggers" href="#2---multiple-time-triggers"></a>#2 - Multiple Time Triggers</h2>
+  
+
+  <p>As an enhancement to the previous sample with a single time trigger, this pipeline example implements two time resource triggers and the ability to manually kick it off outside of the time resources schedules.</p><p>The first time you set up a pipeline like this you will need to manually trigger it in order to satisfy the passed constraint of the <code>manual-trigger</code> resource. Once one version is available that satisfies the passed constraint all future triggers by the other resources will work as expected.</p><pre><code class="language-yaml">resources:
+- name: trigger-every-4-minutes
+  type: time
+  source:
+    interval: 4m
+- name: trigger-every-10-minutes
+  type: time
+  source:
+    interval: 10m
+- name: manual-trigger
+  type: time
+  source:
+    interval: 1m
+
+jobs:
+- name: manual-trigger
+  plan:
+  - put: manual-trigger
+
+- name: run-forrest-run
+  plan:
+  - get: trigger-every-4-minutes
+    trigger: true
+  - get: trigger-every-10-minutes
+    trigger: true
+  - get: manual-trigger
+    trigger: true
+    passed:
+      - manual-trigger
+  # can add other steps to run in this job
+
+- name: run-bubba-run
+  plan:
+  - get: trigger-every-4-minutes
+    trigger: true
+    passed:
+      - run-forrest-run
+  - get: trigger-every-10-minutes
+    trigger: true
+    passed:
+      - run-forrest-run
+  - get: manual-trigger
+    trigger: true
+    passed:
+      - run-forrest-run
+  # can add other steps to run in this job</code></pre><a href="images/how-to-guides/pipelines/time-triggered-02.png"><div class="diagram">
+  <img src="images/how-to-guides/pipelines/time-triggered-02.png" alt="diagram" width="100%" />
+</div></a>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.14.1.3</span>
+              
+
+              <a href="gated-pipeline-patterns.html">Gated Pipeline Patterns</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.14.1.5</span>
+              
+
+              <a href="manual-approval-step.html">Manual Approval Step</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/timeout-step.html b/timeout-step.html
new file mode 100644
index 00000000..f5efa668
--- /dev/null
+++ b/timeout-step.html
@@ -0,0 +1,406 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>timeout Step Modifier - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html" ><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11.9</span><a href="modifier-and-hook-steps.html"  class="active">Modifier And Hook Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.9.1</td>
+            <td class="title-cell"><a href="across-step.html" ><code>across</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.2</td>
+            <td class="title-cell"><a href="timeout-step.html"  class="self"><code>timeout</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.3</td>
+            <td class="title-cell"><a href="attempts-step.html" ><code>attempts</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.4</td>
+            <td class="title-cell"><a href="tags-step.html" ><code>tags</code> Step Modifier</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.5</td>
+            <td class="title-cell"><a href="on-success-step.html" ><code>on_success</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.6</td>
+            <td class="title-cell"><a href="on-failure-hook.html" ><code>on_failure</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.7</td>
+            <td class="title-cell"><a href="on-abort-hook.html" ><code>on_abort</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.8</td>
+            <td class="title-cell"><a href="on-error-hook.html" ><code>on_error</code> Step Hook</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9.9</td>
+            <td class="title-cell"><a href="ensure-hook.html" ><code>ensure</code> Step Hook</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="timeout-step.html#schema.timeout"><code class="schema-attribute-name"><bold>timeout</bold></code></a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_timeout-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="timeout-step" href="#timeout-step"></a><span class="section-number">1.11.9.2 </span><code>timeout</code> Step Modifier</h1>
+  
+
+  <p>The amount of time to limit the step&#39;s execution to, e.g. <code>30m</code> for 30 minutes.</p><p>When exceeded, the step will be interrupted, with the same semantics as aborting the build (except the build will be <code>errored</code>, not <code>aborted</code>, to distinguish between human intervention and timeouts being enforced).</p><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.timeout" type="checkbox" class="toggle" />
+  <label for="toggle-schema.timeout" class="toggle-title">
+    <a id="schema.timeout"></a>
+
+    <code><a class="attribute-name" href="#schema.timeout">timeout</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="toggleable example">
+  <input id="toggle-d83d8c904f6ab32aa772dffe18f5a678e1b6c2d5" type="checkbox" class="toggle" />
+  <label for="toggle-d83d8c904f6ab32aa772dffe18f5a678e1b6c2d5" class="toggle-title">Giving up</label>
+  <div class="toggle-content">
+    <p>The following will run the <code>unit</code> task and cancel it if it takes longer than 1 hour and 30 minutes:</p><pre><code class="language-yaml">plan:
+- get: foo
+- task: unit
+  file: foo/unit.yml
+  timeout: 1h30m</code></pre>
+  </div>
+</div>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.9.1</span>
+              
+
+              <a href="across-step.html"><code>across</code> Step Modifier</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9.3</span>
+              
+
+              <a href="attempts-step.html"><code>attempts</code> Step Modifier</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tracing.html b/tracing.html
new file mode 100644
index 00000000..25cbcb0c
--- /dev/null
+++ b/tracing.html
@@ -0,0 +1,426 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Tracing - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html"  class="self">Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html" >Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.2</span><a href="tracing.html"  class="self">Tracing</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.2.1</td>
+            <td class="title-cell"><a href="tracing.html#configuring-tracing" >Configuring Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2.2</td>
+            <td class="title-cell"><a href="tracing.html#trace-context-propagation" >Trace context propagation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2.3</td>
+            <td class="title-cell"><a href="tracing.html#whats-emitted" >What&#39;s emitted?</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_tracing">
+  
+  <h1 class="section-header"><a class="anchor-target" name="tracing" href="#tracing"></a><span class="section-number">1.15.2 </span>Tracing</h1>
+  
+
+  <p><div class="warning">
+  This is an <strong>experimental</strong> feature.
+</div></p><p>Tracing in Concourse enables the delivery of traces related to the internal processes that go into running builds, and other internal operations, breaking them down by time, and component.</p><p>It leverages the (<a href="https://opentelemetry.io/">OpenTelemetry</a>) SDK to allow support for many platforms. Currently tracing can be configured to integrates with:</p><ul>
+
+  <li><p><a href="https://www.jaegertracing.io/">Jaeger</a></p></li>
+
+  <li><p><a href="https://cloud.google.com/trace">Google Cloud Trace</a> (Stackdriver)</p></li>
+
+  <li><p><a href="https://honeycomb.io">Honeycomb.io</a></p></li>
+
+  <li><p><a href="https://github.com/open-telemetry/opentelemetry-go/tree/master/exporters/otlp">OpenTelemetry Protocol Exporter</a></p></li>
+
+</ul>
+
+  
+    
+      <div class="section" id="section_configuring-tracing">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuring-tracing" href="#configuring-tracing"></a>Configuring Tracing</h2>
+  
+
+  <p>To export spans to Jaeger, specify the Thrift HTTP endpoint of the Jaeger collector:</p><pre><code class="language-bash">CONCOURSE_TRACING_JAEGER_ENDPOINT=http://jaeger:14268/api/traces</code></pre><p>To export spans to Google Cloud Trace, specify the GCP Project ID:</p><pre><code class="language-bash">CONCOURSE_TRACING_STACKDRIVER_PROJECTID=your-gcp-project-id</code></pre><p>Note that suitable GCP credentials must be available, via the usual <a href="https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable"><code>GOOGLE_APPLICATION_CREDENTIALS</code> environment variable</a>, the default location that the <code>gcloud</code> CLI expects, or from GCP&#39;s metadata server (if Concourse is deployed on GCP).</p><p>To export spans the <a href="https://github.com/open-telemetry/opentelemetry-collector">OpenTelemetry Collector</a> via the OTLP Exporter, specify your collector access endpoint:</p><pre><code class="language-bash">CONCOURSE_TRACING_OTLP_ADDRESS=otel-collector.example.com:4317
+CONCOURSE_TRACING_OTLP_USE_TLS=false</code></pre><p>To export spans to <a href="https://opentelemetry.lightstep.com/">Lightstep</a> via the OTLP Exporter, specify your collector access token and endpoint:</p><pre><code class="language-bash">CONCOURSE_TRACING_OTLP_ADDRESS=ingest.lightstep.com:443
+CONCOURSE_TRACING_OTLP_HEADERS=lightstep-access-token:mysupersecrettoken</code></pre><p>To export spans to <a href="https://www.elastic.co/guide/en/apm/get-started/current/open-telemetry-elastic.html">Elastic Observability</a> via the OTLP Exporter, specify your Elastic APM secret token and endpoint:</p><pre><code class="language-bash">CONCOURSE_TRACING_OTLP_ADDRESS=elastic-apm-server.example.com:443
+CONCOURSE_TRACING_OTLP_HEADERS=Authorization=Bearer your-secret-token</code></pre><p>To export spans to Honeycomb.io, specify the API key, dataset and optionally the service name:</p><pre><code class="language-bash">CONCOURSE_TRACING_HONEYCOMB_API_KEY=your-honeycomb-api-key
+CONCOURSE_TRACING_HONEYCOMB_DATASET=your-honeycomb-dataset
+CONCOURSE_TRACING_HONEYCOMB_SERVICE_NAME=service-name-for-concourse  # NOTE: Optional. Defaults to &#34;concourse&#34;</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_trace-context-propagation">
+  
+  <h2 class="section-header"><a class="anchor-target" name="trace-context-propagation" href="#trace-context-propagation"></a>Trace context propagation</h2>
+  
+
+  <p>When tracing is enabled, trace context propagation is activated in pipeline tasks thanks to the  injection of the environment variable <code>TRACEPARENT</code> in <code>run</code> commands. The environment variable <code>TRACEPARENT</code> complies with the  <a href="https://www.w3.org/TR/trace-context/">W3C Trace Context</a> specification.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_whats-emitted">
+  
+  <h2 class="section-header"><a class="anchor-target" name="whats-emitted" href="#whats-emitted"></a>What&#39;s emitted?</h2>
+  
+
+  <p>Below is a summary of the various operations that Concourse currently traces. They are arranged like a call tree, so that for each operation described, its sub-operations are described indented immediately below.</p><ul>
+
+  <li><p><code>scanner.Run</code> -- An execution of the <a href="checker.html">Resource Checker</a>, responsible for determining which resources need to be checked. <ul>
+
+  <li><p><code>scanner.check</code> -- This operation simply represents inserting the check in the database.</p></li>
+
+</ul></p></li>
+
+  <li><p><code>scheduler.Run</code> -- This represents one tick of the <a href="scheduler.html">Build Scheduler</a>. <ul>
+
+  <li><p><code>schedule-job</code> -- this is the same operation scoped to a single job. <ul>
+
+  <li><p><code>Algorithm.Compute</code> -- this is where the <a href="scheduler.html#algorithm">Algorithm</a> determines inputs for a job. Each of the resolvers below describes a different strategy for determining inputs, depending on the job&#39;s config. <ul>
+
+  <li><p><code>individualResolver.Resolve</code> -- This is used to determine versions input to a <a href="get-step.html"><code>get</code> step</a> without <a href="get-step.html#schema.get.passed"><code>passed</code></a> constraints.</p></li>
+
+  <li><p><code>groupResolver.Resolve</code> -- This is the juicy part of the algorithm, which deals with <a href="get-step.html#schema.get.passed"><code>passed</code></a> constraints.</p></li>
+
+  <li><p><code>pinnedResolver.Resolve</code> -- This operation is used to determine inputs when <a href="resource-versions.html#version-pinning">Version Pinning</a> is at play.</p></li>
+
+</ul></p></li>
+
+  <li><p><code>job.EnsurePendingBuildExists</code> -- This is where a new build, if deemed necessary by scheduling constraints, will be inserted into the database. This operation follows from <code>checker.Run</code> above and will appear under the same trace as the check which produced the resource version responsible for triggering the new build.</p></li>
+
+</ul></p></li>
+
+</ul></p></li>
+
+  <li><p><code>build</code> -- this is the primary operation performed by the <a href="build-tracker.html">Build Tracker</a>. When a build is automatically triggered, this span follows from the <code>job.EnsurePendingBuildExists</code> operation which created the build, appearing in the same trace. <ul>
+
+  <li><p><code>get</code> -- this tracks the execution of a <a href="get-step.html"><code>get</code> step</a>.</p></li>
+
+  <li><p><code>put</code> -- this tracks the execution of a <a href="put-step.html"><code>put</code> step</a>.</p></li>
+
+  <li><p><code>task</code> -- this tracks the execution of a <a href="task-step.html"><code>task</code> step</a>.</p></li>
+
+  <li><p><code>set_pipeline</code> -- this tracks the execution of a <a href="set-pipeline-step.html"><code>set_pipeline</code> step</a>.</p></li>
+
+  <li><p><code>load_var</code> -- this tracks the execution of a <a href="load-var-step.html"><code>load_var</code> step</a>.</p></li>
+
+</ul></p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.1</span>
+              
+
+              <a href="metrics.html">Metrics</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.3</span>
+              
+
+              <a href="encryption.html">Encryption</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/try-step.html b/try-step.html
new file mode 100644
index 00000000..0924aad9
--- /dev/null
+++ b/try-step.html
@@ -0,0 +1,354 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>try step - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html"  class="active">Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.11</span><a href="steps.html"  class="active">Steps</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.11.1</td>
+            <td class="title-cell"><a href="get-step.html" ><code>get</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.2</td>
+            <td class="title-cell"><a href="put-step.html" ><code>put</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.3</td>
+            <td class="title-cell"><a href="task-step.html" ><code>task</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.4</td>
+            <td class="title-cell"><a href="set-pipeline-step.html" ><code>set_pipeline</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.5</td>
+            <td class="title-cell"><a href="load-var-step.html" ><code>load_var</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.6</td>
+            <td class="title-cell"><a href="in-parallel-step.html" ><code>in_parallel</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.7</td>
+            <td class="title-cell"><a href="do-step.html" ><code>do</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.8</td>
+            <td class="title-cell"><a href="try-step.html"  class="self"><code>try</code> step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11.9</td>
+            <td class="title-cell"><a href="modifier-and-hook-steps.html" >Modifier And Hook Steps</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="try-step.html#schema.try.try"><code>try</code> step <strong><code>try</code></strong></a></td>
+      </tr>
+      
+      <tr>
+        <td class="number-cell"><code>#</code></td>
+        <td class="title-cell"><a href="try-step.html#try"><code>try</code> step</a></td>
+      </tr>
+      
+
+      
+  
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_try-step">
+  
+  <h1 class="section-header"><a class="anchor-target" name="try-step" href="#try-step"></a><span class="section-number">1.11.8 </span><code>try</code> step</h1>
+  
+
+  <div class="schema-group">
+  <a id="try"></a>
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.try.try" type="checkbox" class="toggle" />
+  <label for="toggle-schema.try.try" class="toggle-title">
+    <a id="schema.try.try"></a>
+
+    <code><a class="attribute-name" href="#schema.try.try">try</a>: <span class="attribute-type"><a href="steps.html#schema.step"><strong>step</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Performs the given step, ignoring any failure and masking it with success.</p><p>This can be used when you want to perform some side-effect, but you don&#39;t really want the whole build to fail if it doesn&#39;t work.</p><div class="toggleable example">
+  <input id="toggle-310c7c5406c4fde83625982080f1589acc91a01d" type="checkbox" class="toggle" />
+  <label for="toggle-310c7c5406c4fde83625982080f1589acc91a01d" class="toggle-title">Allowing non-critical behavior to fail</label>
+  <div class="toggle-content">
+    <p>When emitting logs somewhere for analyzing later, if the destination flakes out it may not really be critical, so we may want to just swallow the error:</p><pre><code class="language-yaml">plan:
+- task: run-tests
+  config: # ...
+  on_success:
+    try:
+      put: test-logs
+      params:
+        from: run-tests/*.log
+- task: do-something-else
+  config: # ...</code></pre>
+  </div>
+</div>
+  </div>
+</div>
+</div>
+
+  
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.11.7</span>
+              
+
+              <a href="do-step.html"><code>do</code> step</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.11.9</span>
+              
+
+              <a href="modifier-and-hook-steps.html">Modifier And Hook Steps</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tutorial-hello-world.html b/tutorial-hello-world.html
new file mode 100644
index 00000000..af231d7c
--- /dev/null
+++ b/tutorial-hello-world.html
@@ -0,0 +1,446 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Hello World Pipeline - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html"  class="active">Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1</span><a href="getting-started.html"  class="active">Getting Started</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.1</td>
+            <td class="title-cell"><a href="quick-start.html" >Quick Start</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html"  class="self">Hello World Pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html" >Inputs and Outputs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4</td>
+            <td class="title-cell"><a href="tutorial-resources.html" >Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1.2</span><a href="tutorial-hello-world.html"  class="self">Hello World Pipeline</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.2.1</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html#creating-a-pipeline" >Creating a Pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2.2</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html#add-a-job" >Add a job</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2.3</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html#add-a-step" >Add a step</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2.4</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html#what-is-a-step" >What is a step?</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2.5</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html#fill-in-the-task-config" >Fill in the Task Config</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2.6</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html#run-the-pipeline" >Run the pipeline</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_tutorial-hello-world">
+  
+  <h1 class="section-header"><a class="anchor-target" name="tutorial-hello-world" href="#tutorial-hello-world"></a><span class="section-number">1.1.2 </span>Hello World Pipeline</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_creating-a-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="creating-a-pipeline" href="#creating-a-pipeline"></a>Creating a Pipeline</h2>
+  
+
+  <p>Let&#39;s start where all tutorials start, with a <code>Hello World!</code> example!</p><p>In this section you&#39;re going to create a pipeline that simply prints <code>Hello world!</code> to the console. While building up the pipeline we will pause to explain the core pieces of the pipeline.</p><p>Let&#39;s first answer: <strong>what is a pipeline made up from?</strong></p><p>The simplest Concourse <a href="pipelines.html">pipeline</a> is made of two objects:</p><p><ul>
+
+  <li><p>An unordered list of <a href="jobs.html">Jobs</a> which contains...</p></li>
+
+  <li><p>An ordered list of <a href="steps.html">Steps</a></p></li>
+
+</ul> If you&#39;ve used other pipeline building tools in the past, then what you think of as a pipeline is probably most similar to a <a href="jobs.html">job</a> in Concourse.</p><p>For our <code>Hello World!</code> pipeline we will need <strong>one job</strong> with <strong>one step</strong>. This is the smallest pipeline you can make in Concourse. The single step is what will print <code>Hello World!</code> to the console.</p><p>Create and open a new file called <code>hello-world.yml</code>. Inside that file let&#39;s add the first top-level key, <code><a href="jobs.html">jobs</a></code>.</p><pre><code class="language-yaml">jobs:</code></pre><p>The <code><a href="jobs.html">jobs</a></code> key is where we define the list of jobs that should make up our pipeline. The order of the jobs does not matter. <strong>The order of jobs does not define the structure of the pipeline.</strong> We&#39;ll get into pipeline structure and job ordering later when we talk about <a href="resources.html">Resources</a> and passed constraints.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_add-a-job">
+  
+  <h2 class="section-header"><a class="anchor-target" name="add-a-job" href="#add-a-job"></a>Add a job</h2>
+  
+
+  <p>We only need one job right now so let&#39;s add a single job named <code>hello-world-job</code>.</p><pre><code class="language-yaml">jobs:
+- name: hello-world-job</code></pre><p>Awesome, we have a <a href="jobs.html">job</a> named <code>hello-world</code>! Now we need to add a <code><a href="steps.html">step</a></code> to our job. To define a list of <a href="steps.html">steps</a> a job should execute, we need to add the <code><a href="jobs.html#schema.job.plan">plan</a></code> key to our job.</p><pre><code class="language-yaml">jobs:
+- name: hello-world-job
+  plan:</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_add-a-step">
+  
+  <h2 class="section-header"><a class="anchor-target" name="add-a-step" href="#add-a-step"></a>Add a step</h2>
+  
+
+  <p>Unlike <a href="jobs.html">jobs</a>, the order of <a href="steps.html">steps</a> <strong>does matter!</strong> Concourse will run the <a href="steps.html">steps</a> in the order that they are listed. Let&#39;s <em>carefully</em> place a <a href="task-step.html#schema.task.task">task step</a> as the first (and only) step in our job.</p><pre><code class="language-yaml">jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task</code></pre><p>Fantastic! Now we need to tell Concourse <em>how</em> to run our task step. We do that by providing a <a href="tasks.html#schema.task-config">task config</a>.</p><pre><code class="language-yaml">jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:</code></pre><p>At this point we are going to pause to explain steps a bit more.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_what-is-a-step">
+  
+  <h2 class="section-header"><a class="anchor-target" name="what-is-a-step" href="#what-is-a-step"></a>What is a step?</h2>
+  
+
+  <p>A step is a single container running on a <a href="concourse-worker.html">Concourse worker</a>. Each <a href="steps.html">step</a> in a <a href="jobs.html#schema.job.plan">job plan</a> runs in its own container. You can run anything you want inside the container <em>(i.e. run my tests, run this bash script, build this image, etc.)</em>.</p><p>So if you have a job with five steps Concourse will create five containers, one for each step. Therefore, we need to tell Concourse the following about each step:</p><ul>
+
+  <li><p>What type of <a href="concourse-worker.html">worker</a> to run the task on (linux/windows/darwin)</p></li>
+
+  <li><p>What container image to use <em>(Linux only)</em></p></li>
+
+  <li><p>What command to run inside the container</p></li>
+
+</ul><blockquote class="aside"><p>Concourse currently only supports Linux containers. Concourse does not yet run Windows containers. Darwin does not have native containers.</p></blockquote>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_fill-in-the-task-config">
+  
+  <h2 class="section-header"><a class="anchor-target" name="fill-in-the-task-config" href="#fill-in-the-task-config"></a>Fill in the Task Config</h2>
+  
+
+  <p>Let&#39;s answer the previous three questions for our <code>hello-world-task</code>:</p><ul>
+
+  <li><p><strong>What type of <a href="concourse-worker.html">worker</a> to run the task on (linux/windows/darwin)</strong></p><p>Linux, because our docker-composed Concourse only has one linux worker. You can verify this by running <code>fly -t tutorial workers</code></p></li>
+
+  <li><p><strong>What container image to use <em>(Linux only)</em></strong></p><p>We&#39;ll use the super small <a href="https://hub.docker.com/_/busybox">busybox image</a></p></li>
+
+  <li><p><strong>What command to run inside the container</strong></p><p><code>echo &#34;Hello world!&#34;</code></p></li>
+
+</ul><p>You can view the <a href="tasks.html">task documentation</a> to see all configurable options for tasks. For now, you can add the following <a href="tasks.html#schema.task-config">task config</a> to the step.</p><pre><code class="language-yaml">jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:
+      # Tells Concourse which type of worker this task should run on
+      platform: linux
+      # This is one way of telling Concourse which container image to use for a
+      # task. We&#39;ll explain this more when talking about resources
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox # images are pulled from docker hub by default
+      # The command Concourse will run inside the container
+      # echo &#34;Hello world!&#34;
+      run:
+        path: echo
+        args: [&#34;Hello world!&#34;]</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_run-the-pipeline">
+  
+  <h2 class="section-header"><a class="anchor-target" name="run-the-pipeline" href="#run-the-pipeline"></a>Run the pipeline</h2>
+  
+
+  <p>That&#39;s the whole pipeline! You can now set it, unpause, and trigger it using the <a href="fly.html">fly cli</a>. You can then view it from the <a href="http://localhost:8080/teams/main/pipelines/hello-world/jobs/hello-world-job">web ui</a>.</p><pre><code class="language-bash">$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml
+# pipelines are paused when first created
+$ fly -t tutorial unpause-pipeline -p hello-world
+# trigger the job and watch it run to completion
+$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch</code></pre><p>You&#39;ll see extra output than what we&#39;re showing below (the busybox image being downloaded) but the last four lines will be the task executing.</p><pre><code class="language-">selected worker: 701785fa43a1
+running echo Hello world!
+Hello world!
+succeeded</code></pre><p>You can also view the build from the web UI by clicking on the job and expanding the <code>hello-world-task</code> step.</p><div class="diagram">
+  <img src="images/tutorial/hello-world-first-build.gif" alt="diagram" width="100%" />
+</div><p>Congratulations on building your first Concourse pipeline!</p><p>In the next section we will build upon what we have learned about tasks and introduce inputs and outputs, which allow you to pass files between tasks.</p><blockquote class="aside"><p>If you have any feedback for this tutorial please share it in <a href="https://github.com/concourse/concourse/discussions/7353">this GitHub discussion</a></p></blockquote>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.1.1</span>
+              
+
+              <a href="quick-start.html">Quick Start</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.1.3</span>
+              
+
+              <a href="tutorial-inputs-outputs.html">Inputs and Outputs</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tutorial-inputs-outputs.html b/tutorial-inputs-outputs.html
new file mode 100644
index 00000000..e0314b60
--- /dev/null
+++ b/tutorial-inputs-outputs.html
@@ -0,0 +1,448 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Inputs and Outputs - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html"  class="active">Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1</span><a href="getting-started.html"  class="active">Getting Started</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.1</td>
+            <td class="title-cell"><a href="quick-start.html" >Quick Start</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html" >Hello World Pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html"  class="self">Inputs and Outputs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4</td>
+            <td class="title-cell"><a href="tutorial-resources.html" >Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1.3</span><a href="tutorial-inputs-outputs.html"  class="self">Inputs and Outputs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.3.1</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html#overview" >Overview</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3.2</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html#what-are-inputs-and-outputs" >What are inputs and outputs?</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3.3</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html#passing-outputs-to-another-task" >Passing outputs to another task</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3.4</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html#how-does-concourse-track-artifacts" >How does Concourse track artifacts?</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_tutorial-inputs-outputs">
+  
+  <h1 class="section-header"><a class="anchor-target" name="tutorial-inputs-outputs" href="#tutorial-inputs-outputs"></a><span class="section-number">1.1.3 </span>Inputs and Outputs</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_overview">
+  
+  <h2 class="section-header"><a class="anchor-target" name="overview" href="#overview"></a>Overview</h2>
+  
+
+  <p>This section is going to go over how to pass data between different <a href="steps.html">steps</a> in a <a href="jobs.html">job</a>. We&#39;ll continue building on our <code>hello-world.yml</code> pipeline.</p><p>In the previous section we learned that <a href="steps.html">steps</a> are where we tell Concourse what to run <em>(i.e. run my tests, run this bash script, build this image, etc.)</em>. We are going to expand on the concept of <a href="steps.html">steps</a> and show you how to pass artifacts/files between <a href="tasks.html">tasks</a> using <code>inputs</code> and <code>outputs</code>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_what-are-inputs-and-outputs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="what-are-inputs-and-outputs" href="#what-are-inputs-and-outputs"></a>What are inputs and outputs?</h2>
+  
+
+  <p>The simple answer is that inputs and outputs are directories that get passed between steps. We&#39;ll refer to both inputs and outputs as <strong>artifacts</strong>.</p><p>Let&#39;s start exploring how artifacts work by adding a <a href="tasks.html#schema.task-config.outputs"><code class="schema-attribute-name"><bold>task-config<wbr />.outputs</bold></code></a> to our <code>hello-world-task</code>.</p><pre><code class="language-yaml">jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      # Adds a &#34;the-artifact&#34; directory to our task
+      outputs:
+      - name: the-artifact
+      run:
+        # Change the command to `ls -lF` to see
+        # what the task sees in its working directory
+        path: ls
+        args: [&#34;-lF&#34;]</code></pre><p>Update the pipeline and trigger the job: <pre><code class="language-">$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml
+$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch
+...
+selected worker: 57d7419112ca
+running ls -lF
+total 4
+drwxr-xr-x    2 root     root          4096 Apr  8 16:42 the-artifact/
+succeeded</code></pre></p><p>We can see that in the task&#39;s <a href="https://en.wikipedia.org/wiki/Working_directory">current working directory</a> there is now a folder called <code>the-artifact</code>. Concourse makes output directories for you and will pass any contents inside the folder onto later steps. Let&#39;s see how that works next.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_passing-outputs-to-another-task">
+  
+  <h2 class="section-header"><a class="anchor-target" name="passing-outputs-to-another-task" href="#passing-outputs-to-another-task"></a>Passing outputs to another task</h2>
+  
+
+  <p>To pass artifacts from one task to another, the first task must declare an output. The second task must then declare an input with the exact same name. Let&#39;s update the pipeline to do the following:</p><ul>
+
+  <li><p>Have the first task create a file inside <code>the-artifact</code></p></li>
+
+  <li><p>Create a second task to read the file inside <code>the-artifact</code> from the previous step</p></li>
+
+</ul><pre><code class="language-yaml">jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource: &amp;image # Declaring a YAML anchor
+        type: registry-image
+        source:
+          repository: busybox
+      outputs:
+      - name: the-artifact
+      run:
+        # This is a neat way of embedding a script into a task
+        path: sh
+        args:
+        - -cx
+        - |
+          ls -l .
+          echo &#34;hello from another step!&#34; &gt; the-artifact/message
+  # Add a second task that reads the contents of the-artifact/message
+  - task: read-the-artifact
+    config:
+      platform: linux
+      image_resource: *image
+      # To receive &#34;the-artifact&#34;, specify it as an input
+      inputs:
+      - name: the-artifact
+      run:
+        path: sh
+        args:
+        - -cx
+        - |
+          ls -l .
+          cat the-artifact/message</code></pre><p>Update the pipeline and trigger the job: <pre><code class="language-">$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml
+$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch
+
+initializing
+selected worker: 57d7419112ca
+running sh -cx ls -l .
+echo &#34;hello from another step!&#34; &gt; the-artifact/message
+
+&#43; ls -l .
+total 4
+drwxr-xr-x    2 root     root          4096 Feb 26 19:09 the-artifact
+&#43; echo &#39;hello from another step!&#39;
+initializing
+selected worker: 57d7419112ca
+running sh -cx ls -l .
+cat the-artifact/message
+
+&#43; ls -l .
+total 4
+drwxr-xr-x    1 root     root          4096 Feb 26 19:09 the-artifact
+&#43; cat the-artifact/message
+hello from another step!
+succeeded</code></pre></p><p>It&#39;s a bit hard to see when the first task stops and the second one starts in the terminal. Looking at the build from the web UI makes this clearer:</p><div class="diagram">
+  <img src="images/tutorial/hello-world-passing-artifacts.png" alt="diagram" width="100%" />
+</div><p>With the above pipeline we can see that the file made in the first step is made available in the second step via the <code>the-artifact</code>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_how-does-concourse-track-artifacts">
+  
+  <h2 class="section-header"><a class="anchor-target" name="how-does-concourse-track-artifacts" href="#how-does-concourse-track-artifacts"></a>How does Concourse track artifacts?</h2>
+  
+
+  <p>As Concourse is running the steps in your job, it is creating a list of <strong>named artifacts</strong>. Let&#39;s see what that looks like for the pipeline we just ran.</p><ul>
+
+  <li><p>Concourse runs the task step <code>hello-world-task</code> with <a href="tasks.html#schema.task-config.outputs">output</a> <code>the-artifact</code></p><blockquote class="aside"><p>Concourse creates an empty artifact, assigns it the name <code>the-artifact</code>, and mounts it inside the task container.</p></blockquote></li>
+
+  <li><p>Concourse runs the task step <code>read-the-artifact</code> with <a href="tasks.html#schema.task-config.inputs">input</a> <code>the-artifact</code></p><blockquote class="aside"><p>Concourse looks up, in its list of artifacts for the build, for an artifact named <code>the-artifact</code>, and mounts it inside the task container. If no input with that name is found then the build would fail.</p></blockquote></li>
+
+</ul><p>The next section will introduce you to the concept of <a href="resources.html">Resources</a>.</p><blockquote class="aside"><p>If you have any feedback for this tutorial please share it in <a href="https://github.com/concourse/concourse/discussions/7353">this GitHub discussion</a></p></blockquote>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.1.2</span>
+              
+
+              <a href="tutorial-hello-world.html">Hello World Pipeline</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.1.4</span>
+              
+
+              <a href="tutorial-resources.html">Resources</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tutorial-resources.html b/tutorial-resources.html
new file mode 100644
index 00000000..3c1ebd57
--- /dev/null
+++ b/tutorial-resources.html
@@ -0,0 +1,747 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Resources - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html"  class="active">Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1</span><a href="getting-started.html"  class="active">Getting Started</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.1</td>
+            <td class="title-cell"><a href="quick-start.html" >Quick Start</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.2</td>
+            <td class="title-cell"><a href="tutorial-hello-world.html" >Hello World Pipeline</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.3</td>
+            <td class="title-cell"><a href="tutorial-inputs-outputs.html" >Inputs and Outputs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4</td>
+            <td class="title-cell"><a href="tutorial-resources.html"  class="self">Resources</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.1.4</span><a href="tutorial-resources.html"  class="self">Resources</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1.4.1</td>
+            <td class="title-cell"><a href="tutorial-resources.html#the-heart-of-concourse" >The Heart of Concourse</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.2</td>
+            <td class="title-cell"><a href="tutorial-resources.html#versions" >Versions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.3</td>
+            <td class="title-cell"><a href="tutorial-resources.html#resource-interface" >Resource Interface</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.4</td>
+            <td class="title-cell"><a href="tutorial-resources.html#get-steps" >Get Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.5</td>
+            <td class="title-cell"><a href="tutorial-resources.html#get-steps-and-inputs" >Get Steps and Inputs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.6</td>
+            <td class="title-cell"><a href="tutorial-resources.html#checks" >Checks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.7</td>
+            <td class="title-cell"><a href="tutorial-resources.html#put-steps" >Put Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.8</td>
+            <td class="title-cell"><a href="tutorial-resources.html#using-external-resource-types" >Using External Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.1.4.9</td>
+            <td class="title-cell"><a href="tutorial-resources.html#time-to-takeoff" >Time For Takeoff ✈️</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_tutorial-resources">
+  
+  <h1 class="section-header"><a class="anchor-target" name="tutorial-resources" href="#tutorial-resources"></a><span class="section-number">1.1.4 </span>Resources</h1>
+  
+
+  
+
+  
+    
+      <div class="section" id="section_the-heart-of-concourse">
+  
+  <h2 class="section-header"><a class="anchor-target" name="the-heart-of-concourse" href="#the-heart-of-concourse"></a>The Heart of Concourse</h2>
+  
+
+  <p>Resources are the heart of Concourse. Resources make Concourse tick and are the source of automation within all Concourse pipelines. Resources are how Concourse interacts with the outside world. Here&#39;s a short list of things that resources can do:</p><ul>
+
+  <li><p>Run a job every five minutes: <a href="https://github.com/concourse/time-resource/">Time resource</a>.</p></li>
+
+  <li><p>Run tests on new commits to the main branch: <a href="https://github.com/concourse/git-resource">Git resource</a>.</p></li>
+
+  <li><p>Publish a new release of your app on Github: <a href="https://github.com/concourse/github-release-resource/">Github Release resource</a>.</p></li>
+
+  <li><p>Pull or push the latest image of your app: <a href="https://github.com/concourse/registry-image-resource/">Registry-image resource</a></p></li>
+
+</ul><p>Resources can do a lot of things! The main goal of resources is to represent some external system or object in your pipeline. That external thing can then be used as a trigger for your <a href="jobs.html">Jobs</a> or your <a href="jobs.html">Jobs</a> can push back and modify the external system or object. It all depends on the resource you use and what features its author has implemented.</p><p>Resources are also how Concourse tries to stay as technology agnostic as possible. For example: Concourse doesn&#39;t care what <a href="https://en.wikipedia.org/wiki/Version_control">version control system</a> you store your code in, if you deploy apps with <a href="https://helm.sh/">Helm</a> or <a href="https://www.terraform.io/">Terraform</a>, or what language your apps are built in.  If you can put your latest and hottest tech behind the resource interface then Concourse can understand your workflow.</p><p>The Concourse team bundles a few basic resource types that come with the Linux release that you can <a href="https://github.com/concourse/concourse/releases">download from Github</a>. You&#39;ll notice that the Linux tarball is much larger than the macOS or Windows tarball because of all the bundled resources.</p><blockquote class="aside"><p>You can find out which resources a worker has by running: <pre><code class="language-">$ fly -t tutorial workers --details</code></pre></p></blockquote><p>Resources only run on Linux workers because resources are distributed as Linux container images. There are currently no resources for macOS or Windows. Only <a href="task-step.html">task steps</a> can run on macOS or Windows workers.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_versions">
+  
+  <h2 class="section-header"><a class="anchor-target" name="versions" href="#versions"></a>Versions</h2>
+  
+
+  <p>Resources represent the external system or object to Concourse by emitting <a href="config-basics.html#schema.version"><code>versions</code></a>. When a new version is emitted by a resource, that is how Concourse knows to start jobs connected to the resource.</p><p>A version is any way that a resource can uniquely identify the state of the external system or object.</p><p>For example, the git resource emits versions based on the SHA of new commits it finds. A single version from the git resource will look like this to Concourse.</p><pre><code class="language-json">{ &#34;ref&#34;: &#34;04194bfc880c457a5b00f07db78d0532620414cc&#34; }</code></pre><p>Let&#39;s start digging into resources a bit more by going over the resource interface.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_resource-interface">
+  
+  <h2 class="section-header"><a class="anchor-target" name="resource-interface" href="#resource-interface"></a>Resource Interface</h2>
+  
+
+  <p>Resources are <a href="https://en.wikipedia.org/wiki/Open_Container_Initiative">container images</a> that contain three executables. Each executable is run by a different type of <a href="steps.html">step</a> within a pipeline:</p><ul>
+
+  <li><p><code>/opt/resource/check</code> - implicitly run when a <a href="jobs.html">job</a> contains a <a href="get-step.html">get step</a>. Should return the latest version from the external system or object. Its responsibility is to find new versions.</p></li>
+
+  <li><p><code>/opt/resource/in</code> - run in a <a href="get-step.html">get step</a>. <code>in</code> is given a specific version (generated by a <code>check</code> or <a href="put-step.html"><code>put</code> step</a>) and retrieves the files and information representing that version from the external system or object.</p></li>
+
+  <li><p><code>/opt/resource/out</code> - run in a <a href="put-step.html">put step</a>. Generates a new version, usually based on some input generated by another step in the job. Depending on the resource, this may mean sending something to the external system. For the git resource, this means pushing commits to the external git repository.</p></li>
+
+</ul><p>That&#39;s a high-level overview of the resource interface, which should help you understand what&#39;s going on with resources when we start adding them to our pipeline in the next section.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_get-steps">
+  
+  <h2 class="section-header"><a class="anchor-target" name="get-steps" href="#get-steps"></a>Get Steps</h2>
+  
+
+  <p>Let&#39;s add some automation to our <code>hello-world.yml</code> pipeline and have it <strong>trigger on every new commit from some git repo</strong>. We will use the <a href="https://github.com/concourse/git-resource/">git resource</a> to accomplish this.</p><p>Before proceeding, please have a git repository ready that you can push code to. The rest of the tutorial will point to <a href="https://github.com/concourse/examples"><code>github.com/concourse/examples</code></a> which you should replace with your own repository or your own fork of <code>concourse/examples</code>.</p><p>To start, let&#39;s go back to the one step version of the pipeline.</p><pre><code class="language-yaml">jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      run:
+        path: echo
+        args: [&#34;Hello World!&#34;]</code></pre><p>Now let&#39;s add the <a href="https://github.com/concourse/git-resource/">git resource</a> to the pipeline. First we&#39;ll add the <a href="resources.html"><code>resources</code></a> key to the top-level of our yaml.</p><pre><code class="language-yaml">resources:
+
+jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      run:
+        path: echo
+        args: [&#34;Hello World!&#34;]</code></pre><p>The <a href="resources.html"><code>resources</code></a> key takes a list of resources. In our case, we&#39;re going to add one item to that list. We will name the resource <code>repo</code>. This is the name we&#39;ll use to refer to this specific instance of the resource within our pipeline. We&#39;ll define the <a href="resources.html#schema.resource.type"><code>type</code></a> as <code>git</code>, which we got from the output of <code>fly -t tutorial workers --details</code>.</p><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+
+jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      run:
+        path: echo
+        args: [&#34;Hello World!&#34;]</code></pre><p>There is one last field we need to fill out, the <a href="resources.html#schema.resource.source"><code>source</code></a> field.</p><p>The <code>source</code> field contains the configuration for the resource. By convention, documentation for each resource&#39;s configuration is found in the <code>README</code> of its git repository. The <code>source</code> field will be different for every resource type, so you&#39;ll need to refer to that resource&#39;s documentation to determine how to fill out the <code>source</code> field.</p><p>If we look at the <a href="https://github.com/concourse/git-resource/#source-configuration"><code>README</code> for the git resource</a> we&#39;ll find that it requires we set the <code>uri</code> field. This should point to the location of the git repository. We can specify it in <code>https://</code> or <code>ssh@</code> format.  Let&#39;s add the <code>uri</code> field and set it to your repository.</p><blockquote class="aside"><p>If you use the <code>ssh@</code> format for the <code>uri</code> then you&#39;ll likely need to set the <code>private_key</code> field as well.</p><p>If you use the <code>https://</code> format and your repo is public then you don&#39;t need to set anything else. If you repository is private then you&#39;ll need to set the <code>username</code> and <code>password</code> fields to allow the git resource to authenticate. <code>private_key</code> can also be used for <code>https://</code> uri&#39;s.</p></blockquote><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+
+jobs:
+- name: hello-world-job
+  plan:
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      run:
+        path: echo
+        args: [&#34;Hello World!&#34;]</code></pre><p>Next we need to connect the <code>repo</code> resource to the <code>hello-world-job</code>. We connect the two objects by adding a <a href="get-step.html">get step</a> to the job.</p><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+
+jobs:
+- name: hello-world-job
+  plan:
+  # Add a get step referencing the resource
+  - get: repo
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      run:
+        path: echo
+        args: [&#34;Hello World!&#34;]</code></pre><p>The final piece is telling Concourse to trigger the <code>hello-world-job</code> whenever the <code>repo</code> resource emits a new version. We can do that by setting <a href="get-step.html#schema.get.trigger"><code>trigger</code></a> to <code>true</code> for the <a href="get-step.html">get step</a>.</p><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+
+jobs:
+- name: hello-world-job
+  plan:
+  - get: repo
+    trigger: true   # tell Concourse to trigger this job when new versions are emitted
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      run:
+        path: echo
+        args: [&#34;Hello World!&#34;]</code></pre><p>Let&#39;s set our pipeline and watch it automatically trigger from the <a href="http://localhost:8080/teams/main/pipelines/hello-world">web UI</a>.</p><pre><code class="language-">$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml</code></pre><p><img src="images/tutorial/hello-world-trigger-job.png" alt="" /></p><p>If you <a href="http://localhost:8080/teams/main/pipelines/hello-world/resources/repo">click the resource</a> you&#39;ll see a list of the versions that it has emitted so far. You can expand each version to see which build it was used in and some metadata if the resource fetched any. Metadata is only populated after a version is fetched by a <a href="get-step.html"><code>get</code> step</a>.</p><p>By default, resources will only fetch the most recent version available. At this point you can make commits to your repo and watch Concourse find them and trigger the job. If you want to populate the version history with older versions you can use <a href="managing-resources.html#fly-check-resource"><code>fly check-resource</code></a> with the <code>--from</code> flag.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_get-steps-and-inputs">
+  
+  <h2 class="section-header"><a class="anchor-target" name="get-steps-and-inputs" href="#get-steps-and-inputs"></a>Get Steps and Inputs</h2>
+  
+
+  <p>Let&#39;s tie together two concepts that we&#39;ve learned so far. <a href="get-step.html">Get steps</a> and <a href="tasks.html#schema.task-config.inputs">task inputs</a>.</p><p>In the previous section we learned that <a href="task-step.html">task steps</a> can specify <a href="tasks.html#schema.task-config.outputs">outputs</a> that other <a href="task-step.html">task steps</a> can then consume as <a href="tasks.html#schema.task-config.inputs">inputs</a>. <a href="get-step.html">Get steps</a> generate one output that can then be consumed by tasks as an <a href="tasks.html#schema.task-config.inputs">input</a>. <a href="get-step.html">Get steps</a> always generate output artifacts based on their name.</p><p>To find out the structure of the artifact generated by a <a href="get-step.html"><code>get</code> step</a> you will have to refer to the resource&#39;s documentation. The documentation for the <a href="https://github.com/concourse/git-resource#in-clone-the-repository-at-the-given-ref">git resource</a> tells us that the <code>in</code> script will clone the git repository.</p><p>Let&#39;s add <code>repo</code> as an input to the <code>hello-world-task</code>. Let&#39;s also update the command the task runs to instead print the contents of some file in the <code>repo</code>.</p><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    uri: https://github.com/concourse/examples.git
+
+jobs:
+- name: hello-world-job
+  plan:
+  - get: repo
+    trigger: true
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      inputs: # add the get step as an input to this task
+      - name: repo
+      run: # read the file from the get step
+        path: cat
+        args: [&#34;repo/README.md&#34;]</code></pre><p>Set the pipeline and we&#39;ll manually trigger the job.</p><pre><code class="language-">$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml
+$ fly -t tutorial trigger-job --job hello-world/hello-world-job --watch
+started hello-world/hello-world-job #44
+
+initializing
+selected worker: d032d4471e67
+running cat repo/README.md
+# examples
+Examples of Concourse workflows
+succeeded</code></pre><p>The job should finish successfully and print out the contents of <code>repo/README.md</code> or whichever file you selected from your repo.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_checks">
+  
+  <h2 class="section-header"><a class="anchor-target" name="checks" href="#checks"></a>Checks</h2>
+  
+
+  <p>Checks are how Concourse finds new versions of resources.  In order to find any new versions Concourse has to run the <code>check</code> scripts for all resources across all pipelines. By default, all resources have a <a href="resources.html#schema.resource.check_every"><code>check_every</code> interval</a> of one minute.</p><p>The default <code>check_every</code> interval helps keep Concourse feeling snappy and responsive to changes in external systems. The negative side-effect of this is that if you have a lot of resources all hitting the same system (e.g. an internal Git system) you may end up <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack">DDOS&#39;ing</a> your external system! In these cases you may want to increase the <code>check_every</code> interval of your resource or disable it and use <a href="resources.html#schema.resource.webhook_token">webhooks</a> instead.</p><p>To see the results of the last check that ran, go to the <a href="http://localhost:8080/teams/main/pipelines/hello-world/resources/every-1min">resource&#39;s page in the pipeline</a> and expand the top line that starts with <code>check: &lt;resource-name&gt;</code>.</p><p><img src="images/tutorial/view-check-status.png" alt="" /></p><p>If your resource is having trouble finding new versions or is configured incorrectly the resource will print a message that will be visible on its resource page for you to debug.</p><p>If you want to debug a check container the easiest way to do that will be to start a shell session in the container using <a href="builds.html#fly-intercept"><code>fly intercept</code></a>. You can pass in the URL to the resources page to start a shell session on the resource container.</p><pre><code class="language-">$ fly -t tutorial intercept -u http://localhost:8080/teams/main/pipelines/hello-world/resources/every-1min
+root@f5bf10f9-6a95-46e6-4e44-63594dace2e0:/tmp/build/check#</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_put-steps">
+  
+  <h2 class="section-header"><a class="anchor-target" name="put-steps" href="#put-steps"></a>Put Steps</h2>
+  
+
+  <p>The last piece of the resource interface is <a href="put-step.html">put steps</a>. Put steps are generally for pushing some change to the external system or object the resource represents. What this means will vary by resource, so again, you should carefully read the documentation for the specific resource you are using. Each resource is basically its own little application.</p><p>In order to &#34;put&#34; something, in the context of the <a href="https://github.com/concourse/git-resource">git resource</a>, we&#39;ll need to make a commit that can then be &#34;put&#34; to the repo.</p><blockquote class="aside"><p>If you haven&#39;t already, you&#39;ll probably need to provide the git resource with your <code>private_key</code> or a <code>username</code> and <code>password</code>, depending on the format of <code>uri</code> you provided.</p><p>If you&#39;re used to pushing code from your computer you probably have a private key in your <code>~/.ssh/</code> directory that you can use.</p></blockquote><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    # changed uri to ssh format
+    uri: git@github.com:concourse/examples.git
+    # specify branch because it&#39;s required for the put step
+    branch: master
+    private_key: |
+      -----BEGIN OPENSSH PRIVATE KEY-----
+      ...
+      -----END OPENSSH PRIVATE KEY-----
+
+jobs:
+- name: hello-world-job
+  plan:
+  - get: repo
+    trigger: true
+  - task: hello-world-task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: busybox
+      inputs:
+      - name: repo
+      run:
+        path: cat
+        args: [&#34;repo/README.md&#34;]</code></pre><p>Next let&#39;s change the <code>hello-world-task</code> to instead create a commit. Since we want the commit to propagate to future steps, specifically the <a href="put-step.html"><code>put</code> step</a> we&#39;ll be adding soon, we will also need to add the <code>repo</code> as an output of the task.</p><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    uri: git@github.com:concourse/examples.git
+    branch: master
+    private_key: |
+      -----BEGIN OPENSSH PRIVATE KEY-----
+      ...
+      -----END OPENSSH PRIVATE KEY-----
+
+jobs:
+- name: hello-world-job
+  plan:
+  - get: repo
+    trigger: true
+  - task: create-commit # renamed task
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: gitea/gitea # use any image that has the git cli
+      inputs:
+      - name: repo
+      outputs: # Add repo as an output
+      - name: repo
+      params: # Change these to match your ssh key info
+        EMAIL: person@example.com
+        GIT_AUTHOR_NAME: Person Doe
+      run:
+        path: sh
+        args:
+        - -cx
+        # this is just a bash script
+        - |
+          cd repo
+          date &#43;%Y-%m-%d &gt; todays-date
+          git add ./todays-date
+          git config --global user.email $EMAIL
+          git config --global user.name $GIT_AUTHOR_NAME
+          git commit -m &#34;Update todays date&#34;</code></pre><p>Lastly we can add a <a href="put-step.html"><code>put</code> step</a> to push the commit made by the task. <a href="put-step.html">Put steps</a> usually have various <code>params</code> that you&#39;ll need to set in order run the step correctly. If we read the <a href="https://github.com/concourse/git-resource#out-push-to-a-repository">documentation for the git resource</a> we&#39;ll see that we need to specify <code>repository</code> field.</p><blockquote class="aside"><p>If you&#39;re wondering why we don&#39;t do <code>git push</code> from the task, that&#39;s for two reasons: <ol>
+
+  <li><p>The newly made commit represents a new version and Concourse won&#39;t capture it correctly if it&#39;s pushed from the task, which is outside of the resource interface (check, get, put).</p></li>
+
+  <li><p>The <code>private_key</code> is not available in the task so you would get an authentication error if you <code>git push</code>ed.</p></li>
+
+</ol></p></blockquote><pre><code class="language-yaml">resources:
+- name: repo
+  type: git
+  source:
+    uri: git@github.com:concourse/examples.git
+    branch: master
+    private_key: |
+      -----BEGIN OPENSSH PRIVATE KEY-----
+      ...
+      -----END OPENSSH PRIVATE KEY-----
+
+jobs:
+- name: hello-world-job
+  plan:
+  - get: repo
+    trigger: true
+  - task: create-commit
+    config:
+      platform: linux
+      image_resource:
+        type: registry-image
+        source:
+          repository: gitea/gitea
+      inputs:
+      - name: repo
+      outputs:
+      - name: repo
+      params:
+        EMAIL: person@example.com
+        GIT_AUTHOR_NAME: Person Doe
+      run:
+        path: sh
+        args:
+        - -cx
+        - |
+          cd repo
+          date &#43;%Y-%m-%d &gt; todays-date
+          git add ./todays-date
+          git config --global user.email $EMAIL
+          git config --global user.name $GIT_AUTHOR_NAME
+          git commit -m &#34;Update todays date&#34;
+  - put: repo
+    params:
+      repository: repo</code></pre><p>Set the pipeline and let&#39;s watch it trigger and run from the <a href="http://localhost:8080/teams/main/pipelines/hello-world">web UI</a>.</p><pre><code class="language-">$ fly -t tutorial set-pipeline -p hello-world -c hello-world.yml</code></pre><p>The job now has the <code>repo</code> resource to the left and right of the <code>hello-world-job</code>. This is how Concourse visually represents the inputs (<a href="get-step.html">get steps</a>) and outputs (<a href="put-step.html">put steps</a>) of a job.</p><p>That covers the basics of resources. It is best of think of each resource as a little application, so carefully read any documentation the resource author has provided. Every resource behaves a little differently based on the external system it is representing.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_using-external-resource-types">
+  
+  <h2 class="section-header"><a class="anchor-target" name="using-external-resource-types" href="#using-external-resource-types"></a>Using External Resource Types</h2>
+  
+
+  <p>Concourse comes bundled with a lot of resources that are enough for most people to start using Concourse with. However, users will want to extend Concourse to work with all sorts of systems and that means bringing your own <a href="resource-types.html">Resource Types</a>.</p><p>Adding a <a href="resource-types.html">resource type</a> to your pipeline looks very similar to adding a resource. You can even override the bundled resource types by re-declaring them in your pipeline.</p><p>Remember, a resource is a container image. So to pull in a new resource type you need to tell Concourse <em>where</em> to pull the image from. This is done by using the built-in <a href="https://github.com/concourse/registry-image-resource/">registry-image resource</a>. The process of adding a resource type is just like adding a regular resource.</p><p>Here&#39;s an example of using an external resource type to read an <a href="https://github.com/suhlig/concourse-rss-resource">rss feed</a>.</p><pre><code class="language-yaml">resource_types:
+# declare the new resource type
+- name: rss
+  type: registry-image
+  source:
+    repository: suhlig/concourse-rss-resource
+    tag: latest
+
+resources:
+# use the resource as usual
+- name: dino-feed
+  type: rss
+  source:
+    url: http://www.qwantz.com/rssfeed.php
+
+jobs:
+- name: announce
+  plan:
+  - get: dino-feed
+    trigger: true</code></pre><p>That&#39;s how you add external resource types to your pipeline. If you&#39;re looking for more resource types there&#39;s a catalog of them at <a href="https://resource-types.concourse-ci.org/">resource-types.concourse-ci.org</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_time-to-takeoff">
+  
+  <h2 class="section-header"><a class="anchor-target" name="time-to-takeoff" href="#time-to-takeoff"></a>Time For Takeoff ✈️</h2>
+  
+
+  <p>This brings us to the end of the tutorial. You should have a basic understanding about how to read Concourse pipelines and start creating your own. Here are some other parts of the site to help you take off with Concourse:</p><ul>
+
+  <li><p><a href="how-to-guides.html">How-To Guides</a> - Contains tips for writing pipelines and examples of common pipeline workflows</p></li>
+
+  <li><p>Check out all the reference documentation: <ul>
+
+  <li><a href="jobs.html">Jobs</a></li>
+
+  <li><a href="tasks.html">Tasks</a></li>
+
+  <li><a href="resources.html">Resources</a></li>
+
+  <li><a href="resource-types.html">Resource Types</a></li>
+
+</ul></p></li>
+
+  <li><p><a href="implementing-resource-types.html">Implement your own resource type</a></p></li>
+
+  <li><p>Find other resources at <a href="https://resource-types.concourse-ci.org/">resource-types.concourse-ci.org</a> or put <code><em>something</em> concourse resource</code> into your favorite search engine.</p></li>
+
+</ul><p>Best of luck on your automation journey!</p><blockquote class="aside"><p>If you have any feedback for this tutorial please share it in <a href="https://github.com/concourse/concourse/discussions/7353">this GitHub discussion</a></p></blockquote>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.1.3</span>
+              
+
+              <a href="tutorial-inputs-outputs.html">Inputs and Outputs</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.2</span>
+              
+
+              <a href="install.html">Install</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/upgrading-concourse.html b/upgrading-concourse.html
new file mode 100644
index 00000000..6a40fd71
--- /dev/null
+++ b/upgrading-concourse.html
@@ -0,0 +1,386 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Upgrading Concourse - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html"  class="active">Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2</span><a href="install.html"  class="active">Install</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.1</td>
+            <td class="title-cell"><a href="postgresql-node.html" >Running a PostgreSQL node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.2</td>
+            <td class="title-cell"><a href="concourse-cli.html" >The <code>concourse</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.3</td>
+            <td class="title-cell"><a href="concourse-generate-key.html" >Generating Keys</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.4</td>
+            <td class="title-cell"><a href="concourse-web.html" >Running a <code>web</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.5</td>
+            <td class="title-cell"><a href="concourse-worker.html" >Running a <code>worker</code> node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6</td>
+            <td class="title-cell"><a href="upgrading-concourse.html"  class="self">Upgrading Concourse</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.2.6</span><a href="upgrading-concourse.html"  class="self">Upgrading Concourse</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.2.6.1</td>
+            <td class="title-cell"><a href="upgrading-concourse.html#upgrading-the-web-node" >Upgrading the Web Node</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2.6.2</td>
+            <td class="title-cell"><a href="upgrading-concourse.html#upgrading-the-worker-node" >Upgrading the Worker Node</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_upgrading-concourse">
+  
+  <h1 class="section-header"><a class="anchor-target" name="upgrading-concourse" href="#upgrading-concourse"></a><span class="section-number">1.2.6 </span>Upgrading Concourse</h1>
+  
+
+  <p>Be careful to check the &#34;Breaking Changes&#34; in the release notes - in particular, you&#39;ll want to look for any flags that have changed.</p>
+
+  
+    
+      <div class="section" id="section_upgrading-the-web-node">
+  
+  <h2 class="section-header"><a class="anchor-target" name="upgrading-the-web-node" href="#upgrading-the-web-node"></a>Upgrading the Web Node</h2>
+  
+
+  <p>The web node is upgraded by stopping the Concourse process, swapping out the <code>concourse</code> binary with the new one, and re-starting it.</p><p>Each <a href="concourse-web.html"><code>web</code> node</a> will automatically run database migrations on start-up and lock via the database to ensure only one of the web nodes runs the migrations. We currently do not guarantee zero-downtime upgrades, as migrations may make changes that confuse the older web nodes. This should resolve as each web node is upgraded, and shouldn&#39;t result in any inconsistent state.</p><p>Typically, Concourse can be upgraded from any version to any other version, though around 3.x and 4.x we made some changes to how migrations are run, and as a result the following upgrade paths must be followed:</p><table>
+  
+  <tr>
+    
+    <td>Current Version</td>
+    
+    <td>Upgrade Path</td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>&lt; <a href="https://github.com/concourse/concourse/releases/tag/v3.6.0">v3.6.0</a></td>
+    
+    <td><a href="https://github.com/concourse/concourse/releases/tag/v3.6.0">v3.6.0</a> -&gt; <a href="https://github.com/concourse/concourse/releases/tag/v4.0.0">v4.0.0</a> -&gt; latest</td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>= <a href="https://github.com/concourse/concourse/releases/tag/v3.6.0">v3.6.0</a></td>
+    
+    <td><a href="https://github.com/concourse/concourse/releases/tag/v4.0.0">v4.0.0</a> -&gt; latest</td>
+    
+  </tr>
+  
+</table><p>We&#39;ll try to minimize this kind of thing in the future.</p><p>Lastly, you will want to overwrite the contents of <code>concourse/fly-assets</code> with the contents from the <a href="https://github.com/concourse/concourse/releases">GitHub release tarball</a> so users can <a href="fly.html#fly-sync"><code>fly sync</code></a> to the correct version.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_upgrading-the-worker-node">
+  
+  <h2 class="section-header"><a class="anchor-target" name="upgrading-the-worker-node" href="#upgrading-the-worker-node"></a>Upgrading the Worker Node</h2>
+  
+
+  <p>The worker node is upgraded by stopping the Concourse process, swapping out the <code>concourse</code> binary with the new one, and re-starting it.</p>
+
+  
+    
+      <div class="section" id="section_linux-workers">
+  
+  <h3 class="section-header"><a class="anchor-target" name="linux-workers" href="#linux-workers"></a>Linux Workers</h3>
+  
+
+  <p>The Linux tarball from the <a href="https://github.com/concourse/concourse/releases">GitHub release page</a> contains extra assets that you will want to ensure are also upgraded at the same time. Make sure you overwrite the contents of the following directories:</p><ul>
+
+  <li><p><code>concourse/bin/...</code> - Other binaries like <code>gdn</code>, <code>runc</code>, and <code>containerd</code> are in this directory</p></li>
+
+  <li><p><code>concourse/resource-types/...</code> - The location of the default <a href="resource-types.html">resource-types</a> included with each Concourse release</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_darwin-and-windows-workers">
+  
+  <h3 class="section-header"><a class="anchor-target" name="darwin-and-windows-workers" href="#darwin-and-windows-workers"></a>Darwin and Windows Workers</h3>
+  
+
+  <p>There are no additional steps for upgrading Darwin and Windows workers.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.2.5</span>
+              
+
+              <a href="concourse-worker.html">Running a <code>worker</code> node</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3</span>
+              
+
+              <a href="auth.html">Auth &amp; Teams</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/user-roles.html b/user-roles.html
new file mode 100644
index 00000000..15e076fe
--- /dev/null
+++ b/user-roles.html
@@ -0,0 +1,1811 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>User Roles &amp; Permissions - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html"  class="active">Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3</span><a href="auth.html"  class="active">Auth &amp; Teams</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.1</td>
+            <td class="title-cell"><a href="main-team.html" >The <code>main</code> team</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.2</td>
+            <td class="title-cell"><a href="configuring-auth.html" >Configuring Auth</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.3</td>
+            <td class="title-cell"><a href="managing-teams.html" >Managing Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4</td>
+            <td class="title-cell"><a href="user-roles.html"  class="self">User Roles &amp; Permissions</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.5</td>
+            <td class="title-cell"><a href="exposing.html" >Pipeline &amp; Build Visibility</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.6</td>
+            <td class="title-cell"><a href="teams-caveats.html" >Security Caveats</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.3.4</span><a href="user-roles.html"  class="self">User Roles &amp; Permissions</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.3.4.1</td>
+            <td class="title-cell"><a href="user-roles.html#concourse-admin" >Concourse Admin</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4.2</td>
+            <td class="title-cell"><a href="user-roles.html#team-owner-role" ><code>owner</code> role</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4.3</td>
+            <td class="title-cell"><a href="user-roles.html#team-member-role" ><code>member</code> role</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4.4</td>
+            <td class="title-cell"><a href="user-roles.html#team-pipeline-operator-role" ><code>pipeline-operator</code> role</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4.5</td>
+            <td class="title-cell"><a href="user-roles.html#team-viewer-role" ><code>viewer</code> role</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4.6</td>
+            <td class="title-cell"><a href="user-roles.html#action-matrix" >Action Matrix</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3.4.7</td>
+            <td class="title-cell"><a href="user-roles.html#configuring-rbac" >Configuring RBAC</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_user-roles">
+  
+  <h1 class="section-header"><a class="anchor-target" name="user-roles" href="#user-roles"></a><span class="section-number">1.3.4 </span>User Roles &amp; Permissions</h1>
+  
+
+  <p>Concourse comes with five roles:</p><ol>
+
+  <li><p>Concourse Admin</p></li>
+
+  <li><p>Team Owner</p></li>
+
+  <li><p>Team Member</p></li>
+
+  <li><p>Pipeline Operator</p></li>
+
+  <li><p>Team Viewer</p></li>
+
+</ol><p>These roles are strictly ordered, so that each role always has all the permissions of any other role lower on the list. This means that a Pipeline Operator can always do anything a Team Viewer can, and so on.</p><p>In this document we say an action is <em>assigned</em> to a role if that role is capable of performing the action, but any less-privileged role is not. For example, the <code>SaveConfig</code> action is <em>assigned</em> to the <code>member</code> role, so owners and members can set a pipeline config, but pipeline operators and viewers cannot.</p>
+
+  
+    
+      <div class="section" id="section_concourse-admin">
+  
+  <h2 class="section-header"><a class="anchor-target" name="concourse-admin" href="#concourse-admin"></a>Concourse Admin</h2>
+  
+
+  <p><em>Admin</em> is a special user attribute granted only to <a href="user-roles.html#team-owner-role">owners</a> of the <a href="main-team.html"><code>main</code> team</a>.</p><p>Admins have the ability to administrate teams using <a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>, <a href="managing-teams.html#fly-destroy-team"><code>fly destroy-team</code></a>, <a href="managing-teams.html#fly-rename-team"><code>fly rename-team</code></a>, etc.</p><p>Admins always have permission to perform any action on any team. You cannot assign actions to the admin role using the <code>--config-rbac</code> flag.</p><p>The following actions are also assigned to admins, and cannot be reconfigured:</p><pre><code class="language-yaml">- GetLogLevel
+- ListActiveUsersSince
+- SetLogLevel
+- GetInfoCreds
+- SetWall
+- ClearWall</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_team-owner-role">
+  
+  <h2 class="section-header"><a class="anchor-target" name="team-owner-role" href="#team-owner-role"></a><code>owner</code> role</h2>
+  
+
+  <p>Team owners have read, write and auth management capabilities within the scope of their team, and can rename or destroy the team.</p><p>Actions assigned to the <code>owner</code> role by default:</p><pre><code class="language-yaml">owner:
+- SetTeam
+- RenameTeam
+- DestroyTeam</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_team-member-role">
+  
+  <h2 class="section-header"><a class="anchor-target" name="team-member-role" href="#team-member-role"></a><code>member</code> role</h2>
+  
+
+  <p>Team members can operate within their team in a read &amp; write fashion, but they can not change the configuration of their team.</p><p>Actions assigned to the <code>member</code> role by default:</p><pre><code class="language-yaml">member:
+- SaveConfig
+- CreateBuild
+- DeletePipeline
+- OrderPipelines
+- OrderPipelinesWithinGroup
+- ExposePipeline
+- HidePipeline
+- RenamePipeline
+- ArchivePipeline
+- CreatePipelineBuild
+- RegisterWorker
+- LandWorker
+- RetireWorker
+- PruneWorker
+- HeartbeatWorker
+- DeleteWorker
+- HijackContainer
+- ReportWorkerContainers
+- ReportWorkerVolumes
+- CreateArtifact
+- GetArtifact</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_team-pipeline-operator-role">
+  
+  <h2 class="section-header"><a class="anchor-target" name="team-pipeline-operator-role" href="#team-pipeline-operator-role"></a><code>pipeline-operator</code> role</h2>
+  
+
+  <p>Team pipeline operators can perform pipeline operations such as triggering builds and pinning resources, however they cannot update pipeline configurations.</p><p>Actions assigned to the <code>pipeline-operator</code> role by default:</p><pre><code class="language-yaml">pipeline-operator:
+- AbortBuild
+- RerunJobBuild
+- CreateJobBuild
+- PauseJob
+- UnpauseJob
+- ClearTaskCache
+- UnpinResource
+- SetPinCommentOnResource
+- CheckResource
+- CheckResourceWebHook
+- CheckResourceType
+- EnableResourceVersion
+- DisableResourceVersion
+- PinResourceVersion
+- PausePipeline
+- UnpausePipeline
+- ClearResourceCache</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_team-viewer-role">
+  
+  <h2 class="section-header"><a class="anchor-target" name="team-viewer-role" href="#team-viewer-role"></a><code>viewer</code> role</h2>
+  
+
+  <p>Team viewers have &#34;read-only&#34; access to a team and its pipelines. This locks everything down, preventing users from doing a <a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a> or <a href="builds.html#fly-intercept"><code>fly intercept</code></a>.</p><p>Actions assigned to the <code>viewer</code> role by default:</p><pre><code class="language-yaml">viewer:
+- GetConfig
+- GetCC
+- GetBuild
+- GetCheck
+- GetBuildPlan
+- ListBuilds
+- BuildEvents
+- BuildResources
+- GetBuildPreparation
+- GetJob
+- ListAllJobs
+- ListJobs
+- ListJobBuilds
+- ListJobInputs
+- GetJobBuild
+- GetVersionsDB
+- JobBadge
+- MainJobBadge
+- ListAllResources
+- ListResources
+- ListResourceTypes
+- GetResource
+- ListResourceVersions
+- GetResourceVersion
+- ListBuildsWithVersionAsInput
+- ListBuildsWithVersionAsOutput
+- GetResourceCausality
+- ListAllPipelines
+- ListPipelines
+- GetPipeline
+- ListPipelineBuilds
+- PipelineBadge
+- ListWorkers
+- DownloadCLI
+- GetInfo
+- ListContainers
+- GetContainer
+- ListDestroyingContainers
+- ListVolumes
+- ListDestroyingVolumes
+- ListTeams
+- GetTeam
+- ListTeamBuilds
+- ListBuildArtifacts</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_action-matrix">
+  
+  <h2 class="section-header"><a class="anchor-target" name="action-matrix" href="#action-matrix"></a>Action Matrix</h2>
+  
+
+  <p>In this table, an action is marked as <em>customizable</em> if it is possible to change its permissions by providing the <code>--config-rbac</code> flag, documented below. Assigning an action to a role that is not customizable will have no effect on its permissions.</p><table>
+  
+  <tr>
+    
+    <td>Action                       </td>
+    
+    <td><code>fly</code> commands affected                                      </td>
+    
+    <td>UI actions affected                             </td>
+    
+    <td>can be performed unauthenticated?</td>
+    
+    <td>customizable</td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetBuild                     </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view one-off build page                         </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>BuildResources               </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view build page                                 </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetBuildPreparation          </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view build page                                 </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>BuildEvents                  </td>
+    
+    <td><a href="builds.html#fly-watch"><code>fly watch</code></a>,<a href="tasks.html#running-tasks"><code>fly execute</code></a>                     </td>
+    
+    <td>view build page                                 </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetBuildPlan                 </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view build page                                 </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListBuildArtifacts           </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>AbortBuild                   </td>
+    
+    <td><a href="builds.html#fly-abort-build"><code>fly abort-build</code></a>                                       </td>
+    
+    <td>abort button on build page                      </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>PruneWorker                  </td>
+    
+    <td><a href="administration.html#fly-prune-worker"><code>fly prune-worker</code></a>                                      </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>LandWorker                   </td>
+    
+    <td><a href="administration.html#fly-land-worker"><code>fly land-worker</code></a>                                       </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>RetireWorker                 </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListDestroyingVolumes        </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListDestroyingContainers     </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ReportWorkerContainers       </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ReportWorkerVolumes          </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetPipeline                  </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view pipeline page                              </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetJobBuild                  </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view build page                                 </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>PipelineBadge                </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>JobBadge                     </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListJobs                     </td>
+    
+    <td><a href="jobs.html#fly-jobs"><code>fly jobs</code></a>                                              </td>
+    
+    <td>view pipeline page                              </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetJob                       </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view job page                                   </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListJobBuilds                </td>
+    
+    <td><a href="builds.html#fly-builds"><code>fly builds</code></a>                                            </td>
+    
+    <td>view job page                                   </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListPipelineBuilds           </td>
+    
+    <td><a href="builds.html#fly-builds"><code>fly builds</code></a>                                            </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetResource                  </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view resource page                              </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListBuildsWithVersionAsInput </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>expand version on resource page                 </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListBuildsWithVersionAsOutput</td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>expand version on resource page                 </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetResourceCausality         </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetResourceVersion           </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListResources                </td>
+    
+    <td><code>fly resources</code>                                              </td>
+    
+    <td>view pipeline page                              </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListResourceTypes            </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListResourceVersions         </td>
+    
+    <td><code>fly resource-versions</code>,<a href="managing-resources.html#fly-pin-resource"><code>fly pin-resource</code></a>         </td>
+    
+    <td>view resource page                              </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>CreateBuild                  </td>
+    
+    <td><a href="tasks.html#running-tasks"><code>fly execute</code></a>                                           </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetContainer                 </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>HijackContainer              </td>
+    
+    <td><a href="builds.html#fly-intercept"><code>fly intercept</code></a>                                         </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListContainers               </td>
+    
+    <td><a href="administration.html#fly-containers"><code>fly containers</code></a>                                        </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListWorkers                  </td>
+    
+    <td><a href="administration.html#fly-workers"><code>fly workers</code></a>                                           </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>RegisterWorker               </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>HeartbeatWorker              </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>DeleteWorker                 </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetTeam                      </td>
+    
+    <td><a href="managing-teams.html#fly-get-team"><code>fly get-team</code></a>                                          </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>SetTeam                      </td>
+    
+    <td><a href="managing-teams.html#fly-set-team"><code>fly set-team</code></a>                                          </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListTeamBuilds               </td>
+    
+    <td><a href="builds.html#fly-builds"><code>fly builds</code></a>                                            </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>RenameTeam                   </td>
+    
+    <td><a href="managing-teams.html#fly-rename-team"><code>fly rename-team</code></a>                                       </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>DestroyTeam                  </td>
+    
+    <td><a href="managing-teams.html#fly-destroy-team"><code>fly destroy-team</code></a>                                      </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListVolumes                  </td>
+    
+    <td><a href="administration.html#fly-volumes"><code>fly volumes</code></a>                                           </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>DownloadCLI                  </td>
+    
+    <td><a href="fly.html#fly-sync"><code>fly sync</code></a>                                              </td>
+    
+    <td>icons on dashboard and pipeline pages           </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>CheckResourceWebHook         </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetInfo                      </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetCheck                     </td>
+    
+    <td><a href="managing-resources.html#fly-check-resource"><code>fly check-resource</code></a>,<a href="managing-resource-types.html#fly-check-resource-type"><code>fly check-resource-type</code></a></td>
+    
+    <td>check button on resource page                   </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListTeams                    </td>
+    
+    <td><a href="managing-teams.html#fly-teams"><code>fly teams</code></a>                                             </td>
+    
+    <td>view dashboard page                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListAllPipelines             </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view dashboard page                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListPipelines                </td>
+    
+    <td><a href="managing-pipelines.html#fly-pipelines"><code>fly pipelines</code></a>                                         </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListAllJobs                  </td>
+    
+    <td><a href="managing-teams.html#fly-teams"><code>fly teams</code></a>                                             </td>
+    
+    <td>view dashboard page                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListAllResources             </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>view dashboard page                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListBuilds                   </td>
+    
+    <td><a href="builds.html#fly-builds"><code>fly builds</code></a>                                            </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>MainJobBadge                 </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetLogLevel                  </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>SetLogLevel                  </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetWall                      </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✓                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>SetWall                      </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ClearWall                    </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListActiveUsersSince         </td>
+    
+    <td><a href="managing-teams.html#fly-active-users"><code>fly active-users</code></a>                                      </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetInfoCreds                 </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✘           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>CheckResource                </td>
+    
+    <td><a href="managing-resources.html#fly-check-resource"><code>fly check-resource</code></a>                                    </td>
+    
+    <td>check button on resource page                   </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>CheckResourceType            </td>
+    
+    <td><a href="managing-resource-types.html#fly-check-resource-type"><code>fly check-resource-type</code></a>                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>CreateJobBuild               </td>
+    
+    <td><a href="jobs.html#fly-trigger-job"><code>fly trigger-job</code></a>                                       </td>
+    
+    <td>trigger button on job and build pages           </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>RerunJobBuild                </td>
+    
+    <td><a href="jobs.html#fly-rerun-build"><code>fly rerun-build</code></a>                                       </td>
+    
+    <td>rerun button on build page                      </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>CreatePipelineBuild          </td>
+    
+    <td><a href="tasks.html#running-tasks"><code>fly execute</code></a>                                           </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>DeletePipeline               </td>
+    
+    <td><a href="managing-pipelines.html#fly-destroy-pipeline"><code>fly destroy-pipeline</code></a>                                  </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>DisableResourceVersion       </td>
+    
+    <td><a href="managing-resources.html#fly-disable-resource-version"><code>fly disable-resource-version</code></a>                          </td>
+    
+    <td>version disable widget on resource page         </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>EnableResourceVersion        </td>
+    
+    <td><a href="managing-resources.html#fly-enable-resource-version"><code>fly enable-resource-version</code></a>                           </td>
+    
+    <td>version enable widget on resource page          </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>PinResourceVersion           </td>
+    
+    <td><a href="managing-resources.html#fly-pin-resource"><code>fly pin-resource</code></a>                                      </td>
+    
+    <td>pin buttons on resource page                    </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>UnpinResource                </td>
+    
+    <td><code>fly unpin-resource</code>                                         </td>
+    
+    <td>pin buttons on resource page                    </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>SetPinCommentOnResource      </td>
+    
+    <td><a href="managing-resources.html#fly-pin-resource"><code>fly pin-resource</code></a>                                      </td>
+    
+    <td>comment overlay on resource page                </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetConfig                    </td>
+    
+    <td><a href="managing-pipelines.html#fly-get-pipeline"><code>fly get-pipeline</code></a>                                      </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetCC                        </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetVersionsDB                </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ListJobInputs                </td>
+    
+    <td>n/a                                                               </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>OrderPipelines               </td>
+    
+    <td><a href="managing-pipelines.html#fly-order-pipelines"><code>fly order-pipelines</code></a>                                   </td>
+    
+    <td>drag and drop on dashboard                      </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>OrderPipelinesWithinGroup    </td>
+    
+    <td><a href="instanced-pipelines.html#fly-order-instanced-pipelines"><code>fly order-instanced-pipelines</code></a>                         </td>
+    
+    <td>drag and drop within instance group on dashboard</td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>PauseJob                     </td>
+    
+    <td><a href="jobs.html#fly-pause-job"><code>fly pause-job</code></a>                                         </td>
+    
+    <td>pause button on job page                        </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>PausePipeline                </td>
+    
+    <td><a href="managing-pipelines.html#fly-pause-pipeline"><code>fly pause-pipeline</code></a>                                    </td>
+    
+    <td>pause button on pipeline or dashboard           </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>RenamePipeline               </td>
+    
+    <td><a href="managing-pipelines.html#fly-rename-pipeline"><code>fly rename-pipeline</code></a>                                   </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>UnpauseJob                   </td>
+    
+    <td><a href="jobs.html#fly-unpause-job"><code>fly unpause-job</code></a>                                       </td>
+    
+    <td>play button on job page                         </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>UnpausePipeline              </td>
+    
+    <td><a href="managing-pipelines.html#fly-unpause-pipeline"><code>fly unpause-pipeline</code></a>                                  </td>
+    
+    <td>play button on pipeline or dashboard            </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ExposePipeline               </td>
+    
+    <td><a href="managing-pipelines.html#fly-expose-pipeline"><code>fly expose-pipeline</code></a>                                   </td>
+    
+    <td>eyeball button on dashboard                     </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>HidePipeline                 </td>
+    
+    <td><a href="managing-pipelines.html#fly-hide-pipeline"><code>fly hide-pipeline</code></a>                                     </td>
+    
+    <td>slashed eyeball button on dashboard             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>SaveConfig                   </td>
+    
+    <td><a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a>                                      </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ClearTaskCache               </td>
+    
+    <td><a href="jobs.html#fly-clear-task-cache"><code>fly clear-task-cache</code></a>                                  </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>CreateArtifact               </td>
+    
+    <td><a href="tasks.html#running-tasks"><code>fly execute</code></a>                                           </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>GetArtifact                  </td>
+    
+    <td><a href="tasks.html#running-tasks"><code>fly execute</code></a>                                           </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+  <tr>
+    
+    <td>ClearResourceCache           </td>
+    
+    <td><a href="managing-resources.html#fly-clear-resource-cache"><code>fly clear-resource-cache</code></a>                              </td>
+    
+    <td>n/a                                             </td>
+    
+    <td>✘                                </td>
+    
+    <td>✓           </td>
+    
+  </tr>
+  
+</table>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_configuring-rbac">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuring-rbac" href="#configuring-rbac"></a>Configuring RBAC</h2>
+  
+
+  <p><div class="warning">
+  Configuring RBAC is <strong>experimental</strong>, and this may change in the future.
+</div></p><p>It is possible to promote or demote the roles to which actions are assigned by passing the <code>--config-rbac</code> to the <code>concourse web</code> command with a path to a <code>.yml</code> file, like the following:</p><pre><code class="language-bash">concourse web --config-rbac=/path/to/rbac/config.yml</code></pre><p>This file should be a YAML map where the keys are role names (<code>owner</code>, <code>member</code>, <code>pipeline-operator</code>, and <code>viewer</code> are valid). For each role, the value should be a list of actions. On startup, Concourse will assign each role to its associated list of actions.</p><p>For example, in the default configuration only pipeline-operators and above can abort builds. To restrict aborting builds to only members and above, you could pass this as a <code>--config-rbac</code> file:</p><pre><code class="language-yaml">member:
+- AbortBuild</code></pre><p>On the other hand, only members and above can order pipelines by default. To extend this privilege down to pipeline-operators, you can use a <code>--config-rbac</code> file like the following:</p><pre><code class="language-yaml">pipeline-operator:
+- OrderPipelines</code></pre><p>You do not need to specify a role for every possible action; if an action does not appear in the file, then the default role (as described in the sections above) will be assigned to that action. Also, please avoid specifying the same action under multiple roles in this file - it can have unpredictable results.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.3.3</span>
+              
+
+              <a href="managing-teams.html">Managing Teams</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.3.5</span>
+              
+
+              <a href="exposing.html">Pipeline &amp; Build Visibility</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside"></div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/vars.html b/vars.html
new file mode 100644
index 00000000..e4b6ae62
--- /dev/null
+++ b/vars.html
@@ -0,0 +1,1352 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>Vars - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html"  class="self">Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html" >Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.7</span><a href="vars.html"  class="self">Vars</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.7.1</td>
+            <td class="title-cell"><a href="vars.html#var-syntax" ><code>((var))</code> syntax</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7.2</td>
+            <td class="title-cell"><a href="vars.html#local-vars" >The &#34;<code>.</code>&#34; var source</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7.3</td>
+            <td class="title-cell"><a href="vars.html#var-interpolation" >Interpolation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7.4</td>
+            <td class="title-cell"><a href="vars.html#static-vars" >Static vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7.5</td>
+            <td class="title-cell"><a href="vars.html#dynamic-vars" >Dynamic vars</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+
+
+<div class="context">
+  <div class="Top">
+    On this page:
+  </div>
+
+  <div class="children anchors">
+    <table>
+      
+
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.7.1</td>
+        <td class="title-cell"><a href="vars.html#var-syntax" ><code>((var))</code> syntax</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.7.2</td>
+        <td class="title-cell"><a href="vars.html#local-vars" >The &#34;<code>.</code>&#34; var source</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.7.3</td>
+        <td class="title-cell"><a href="vars.html#var-interpolation" >Interpolation</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.7.4</td>
+        <td class="title-cell"><a href="vars.html#static-vars" >Static vars</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.7.5</td>
+        <td class="title-cell"><a href="vars.html#dynamic-vars" >Dynamic vars</a></td>
+      </tr>
+      
+      
+  
+    
+      <tr>
+        <td class="number-cell">1.7.5.1</td>
+        <td class="title-cell"><a href="vars.html#dynamic-vars-across-step" >Across Step &amp; Dynamic Vars</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.7.5.2</td>
+        <td class="title-cell"><a href="vars.html#var-sources" >Var sources <span class="dim">(experimental)</span></a></td>
+      </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source"><strong><code>var_source</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config"><strong><code>vault_config</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.ssm_config"><strong><code>ssm_config</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.dummy_config"><strong><code>dummy_config</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.idtoken_config"><strong><code>idtoken_config</code></strong> schema</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.name"><code class="schema-attribute-name"><bold>var_source<wbr />.name</bold></code></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.vault-var-source.type"><code>vault</code> var source <strong><code>type</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.url"><code>vault</code> var source <strong><code>url</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.ca_cert"><code>vault</code> var source <strong><code>ca_cert</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.path_prefix"><code>vault</code> var source <strong><code>path_prefix</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.lookup_templates"><code>vault</code> var source <strong><code>lookup_templates</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.shared_path"><code>vault</code> var source <strong><code>shared_path</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.namespace"><code>vault</code> var source <strong><code>namespace</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.client_cert"><code>vault</code> var source <strong><code>client_cert</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.client_key"><code>vault</code> var source <strong><code>client_key</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.server_name"><code>vault</code> var source <strong><code>server_name</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.insecure_skip_verify"><code>vault</code> var source <strong><code>insecure_skip_verify</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.client_token"><code>vault</code> var source <strong><code>client_token</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.auth_backend"><code>vault</code> var source <strong><code>auth_backend</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.auth_params"><code>vault</code> var source <strong><code>auth_params</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.auth_max_ttl"><code>vault</code> var source <strong><code>auth_max_ttl</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.auth_retry_max"><code>vault</code> var source <strong><code>auth_retry_max</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.vault_config.auth_retry_initial"><code>vault</code> var source <strong><code>auth_retry_initial</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.vault-var-source.config"><code>vault</code> var source <strong><code>config</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#vault-var-source"><code>vault</code> var source</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.ssm-var-source.type"><code>ssm</code> var source <strong><code>type</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.ssm_config.region"><code>ssm</code> var source <strong><code>region</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.ssm-var-source.config"><code>ssm</code> var source <strong><code>config</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#ssm-var-source"><code>ssm</code> var source</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.dummy-var-source.type"><code>dummy</code> var source <strong><code>type</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.dummy_config.vars"><code>dummy</code> var source <strong><code>vars</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.dummy-var-source.config"><code>dummy</code> var source <strong><code>config</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#dummy-var-source"><code>dummy</code> var source</a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.idtoken-var-source.type"><code>idtoken</code> var source <strong><code>type</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.idtoken_config.audience"><code>idtoken</code> var source <strong><code>audience</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.idtoken_config.subject_scope"><code>idtoken</code> var source <strong><code>subject_scope</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.idtoken_config.expires_in"><code>idtoken</code> var source <strong><code>expires_in</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.idtoken_config.algorithm"><code>idtoken</code> var source <strong><code>algorithm</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#schema.var_source.idtoken-var-source.config"><code>idtoken</code> var source <strong><code>config</code></strong></a></td>
+        </tr>
+      
+        <tr>
+          <td class="number-cell"><code>#</code></td>
+          <td class="title-cell"><a href="vars.html#idtoken-var-source"><code>idtoken</code> var source</a></td>
+        </tr>
+      
+      
+  
+    
+  
+
+    
+      <tr>
+        <td class="number-cell">1.7.5.3</td>
+        <td class="title-cell"><a href="vars.html#cluster-wide-credential-manager" >The cluster-wide credential manager</a></td>
+      </tr>
+      
+      
+  
+    
+  
+
+    
+  
+
+    
+  
+
+    </table>
+  </div>
+</div>
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_vars">
+  
+  <h1 class="section-header"><a class="anchor-target" name="vars" href="#vars"></a><span class="section-number">1.7 </span>Vars</h1>
+  
+
+  <p>Concourse supports value substitution in YAML configuration by way of <code>((vars))</code>.</p><p>Automation entails the use of all kinds of credentials. It&#39;s important to keep these values separate from the rest of your configuration by using vars instead of hardcoding values. This allows your configuration to be placed under source control and allows credentials to be tucked safely away into a secure credential manager like Vault instead of the Concourse database.</p><p>Aside from credentials, vars may also be used for generic parameterization of pipeline configuration templates, allowing a single pipeline config file to be configured multiple times with different parameters - e.g. <code>((branch_name))</code>.</p><div class="table-of-contents">
+  <span class="toc-header">Table of contents:</span>
+
+  
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.7.1</span>
+      <a href="vars.html#var-syntax"><code>((var))</code> syntax</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.2</span>
+      <a href="vars.html#local-vars">The &#34;<code>.</code>&#34; var source</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.3</span>
+      <a href="vars.html#var-interpolation">Interpolation</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.4</span>
+      <a href="vars.html#static-vars">Static vars</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.5</span>
+      <a href="vars.html#dynamic-vars">Dynamic vars</a>
+
+      
+  
+  <ol class="toc">
+  
+    <li>
+      <span class="section-number">1.7.5.1</span>
+      <a href="vars.html#dynamic-vars-across-step">Across Step &amp; Dynamic Vars</a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.5.2</span>
+      <a href="vars.html#var-sources">Var sources <span class="dim">(experimental)</span></a>
+
+      
+  
+  
+    </li>
+  
+    <li>
+      <span class="section-number">1.7.5.3</span>
+      <a href="vars.html#cluster-wide-credential-manager">The cluster-wide credential manager</a>
+
+      
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+    </li>
+  
+  </ol>
+  
+  
+</div>
+
+  
+    
+      <div class="section" id="section_var-syntax">
+  
+  <h2 class="section-header"><a class="anchor-target" name="var-syntax" href="#var-syntax"></a><code>((var))</code> syntax</h2>
+  
+
+  <p>The full syntax for vars is <code>((<em>source-name</em>:<em>secret-path</em>.<em>secret-field</em>))</code>.</p><p>The optional <em>source-name</em> identifies the <a href="vars.html#var-sources">var source</a> from which the value will be read. If omitted (along with the <code>:</code> delimiter), the <a href="vars.html#cluster-wide-credential-manager">cluster-wide credential manager</a> will be used, or the value may be provided <a href="vars.html#static-vars">statically</a>. The special name <code>.</code> refers to the <a href="vars.html#local-vars">local var source</a>, while any other name refers to a <a href="vars.html#var-sources">var source</a>.</p><p>The required <em>secret-path</em> identifies the location of the credential. The interpretation of this value depends on the var source type. For example, with Vault this may be a path like <code>path/to/cred</code>. For the Kubernetes secret manager this may just be the name of a secret. For credential managers which support path-based lookup, a <em>secret-path</em> without a leading / may be queried relative to a predefined set of path prefixes. This is how the Vault credential manager currently works; <code>foo</code> will be queried under <code>/concourse/(team name)/(pipeline name)/foo</code>.</p><p>The optional <em>secret-field</em> specifies a field on the fetched secret to read. If omitted, the credential manager may choose to read a &#39;default field&#39; from the fetched credential if the field exists. For example, the Vault credential manager will return the value of the <code>value</code> field if present. This is useful for simple single-value credentials where typing <code>((foo.value))</code> would feel verbose.</p><p>The <em>secret-path</em> and <em>secret-field</em> may be surrounded by double quotes <code>&#34;...&#34;</code> if they contain special characters like <code>.</code> and <code>:</code>. For instance, <code>((source:&#34;my.secret&#34;.&#34;field:1&#34;))</code> will set the <em>secret-path</em> to <code>my.secret</code> and the <em>secret-field</em> to <code>field:1</code>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_local-vars">
+  
+  <h2 class="section-header"><a class="anchor-target" name="local-vars" href="#local-vars"></a>The &#34;<code>.</code>&#34; var source</h2>
+  
+
+  <p>The special var source name <code>.</code> refers to a &#34;local var source.&#34;</p><p>The precise scope for these &#34;local vars&#34; depends on where they&#39;re being used. Currently the only mechanism that uses the local var source is the <a href="load-var-step.html"><code>load_var</code> step</a>, which sets a var in a local var source provided to all steps executed in the build.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_var-interpolation">
+  
+  <h2 class="section-header"><a class="anchor-target" name="var-interpolation" href="#var-interpolation"></a>Interpolation</h2>
+  
+
+  <p>Values for vars are substituted structurally. That is, if you have <code>foo: ((bar))</code>, whatever value <code>((bar))</code> resolves to will become the value of the <code>foo</code> field in the object. This can be a value of any type and structure: a boolean, a simple string, a multiline credential like a certificate, or a complicated data structure like an array of objects.</p><p>This differs from text-based substitution in that it&#39;s impossible for a value to result in broken YAML syntax, and it relieves the template author from having to worry about things like whitespace alignment.</p><p>When a <code>((var))</code> appears adjacent to additional string content, e.g. <code>foo: hello-((bar))-goodbye</code>, its value will be concatenated with the surrounding content. If the <code>((var))</code> resolves to a non-string value, an error will be raised.</p><p>If you are using the YAML operator for merging <code>&lt;&lt;</code>, you will need to wrap it in double quotes like so <code>&#34;&lt;&lt;&#34;: ((foobars))</code>, to avoid a cryptic error message such as &#34;error: yaml: map merge requires map or sequence of maps as the value&#34;. This will allow you to merge in values from various vars. See <a href="https://yaml.org/type/merge.html">YAML merge specification</a> for more information on how this normally works.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_static-vars">
+  
+  <h2 class="section-header"><a class="anchor-target" name="static-vars" href="#static-vars"></a>Static vars</h2>
+  
+
+  <p>Var values may also be specified statically using the <a href="set-pipeline-step.html#schema.set-pipeline.vars"><code>set_pipeline</code> step</a> and <a href="task-step.html#schema.task.vars"><code>task</code> step</a>.</p><p>When running the <a href="fly.html"><code>fly</code> CLI</a> equivalent commands (<a href="setting-pipelines.html#fly-set-pipeline"><code>fly set-pipeline</code></a> and <a href="tasks.html#running-tasks"><code>fly execute</code></a>), var values may be provided using the following flags:</p><ul>
+
+  <li><p><code>-v</code> or <code>--var</code> <code>NAME=VALUE</code> sets the string <code>VALUE</code> as the value for the var <code>NAME</code>.</p></li>
+
+  <li><p><code>-y</code> or <code>--yaml-var</code> <code>NAME=VALUE</code> parses <code>VALUE</code> as YAML and sets it as the value for the var <code>NAME</code>.</p></li>
+
+  <li><p><code>-i</code> or <code>--instance-var</code> <code>NAME=VALUE</code> parses <code>VALUE</code> as YAML and sets it as the value for the instance var <code>NAME</code>. See <a href="instanced-pipelines.html">Grouping Pipelines</a> to learn more about instance vars.</p></li>
+
+  <li><p><code>-l</code> or <code>--load-vars-from</code> <code>FILE</code> loads <code>FILE</code>, a YAML document containing mapping var names to values, and sets them all.</p></li>
+
+</ul><p>When used in combination with <code>-l</code>, the <code>-y</code> and <code>-v</code> flags take precedence. This way a vars file may be re-used, overriding individual values by hand.</p><div class="toggleable example">
+  <input id="toggle-cfad2fce8bfcbbdc74051faee697c756f9881295" type="checkbox" class="toggle" />
+  <label for="toggle-cfad2fce8bfcbbdc74051faee697c756f9881295" class="toggle-title">Setting values with the <code>task</code> step</label>
+  <div class="toggle-content">
+    <p>Let&#39;s say we have a <a href="tasks.html#schema.task-config">task config</a> like so:</p><pre><code class="language-yaml">platform: linux
+
+image_resource:
+  type: registry-image
+  source:
+    repository: golang
+    tag: ((tag))
+
+inputs:
+- name: booklit
+
+run:
+  path: booklit/ci/unit</code></pre><p>We could use <a href="task-step.html#schema.task.vars"><code>vars</code></a> to run this task against different versions of Go:</p><pre><code class="language-yaml">jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: true
+  - task: unit-1.13
+    file: booklit/ci/unit.yml
+    vars: {tag: 1.13}
+  - task: unit-1.8
+    file: booklit/ci/unit.yml
+    vars: {tag: 1.8}</code></pre>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-513ec32492198937a84ef39861ffebf493af1ae2" type="checkbox" class="toggle" />
+  <label for="toggle-513ec32492198937a84ef39861ffebf493af1ae2" class="toggle-title">Setting values with <code>-v</code> and <code>y</code></label>
+  <div class="toggle-content">
+    <p>With a pipeline template like so:</p><pre><code class="language-yaml">resources:
+- name: booklit
+  type: booklit
+  source:
+    uri: https://github.com/concourse/booklit
+    branch: ((branch))
+    private_key: ((&#34;github.com&#34;.private_key))
+
+jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: ((trigger))
+  - task: unit
+    file: booklit/ci/unit.yml</code></pre><p>Let&#39;s say we have a private key in a file called <code>private_key</code>.</p><p>The <a href="setting-pipelines.html#fly-validate-pipeline"><code>fly validate-pipeline</code></a> command may be used to test how interpolation is applied, by passing the <code>--output</code> flag.</p><pre><code class="language-sh">$ fly validate-pipeline \
+  -c pipeline.yml \
+  -y trigger=true \
+  -v \&#34;github.com\&#34;.private_key=&#34;$(cat private_key)&#34; \
+  -v branch=master \
+  --output</code></pre><p>The above incantation should print the following:</p><pre><code class="language-yaml">jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: true
+  - file: booklit/ci/unit.yml
+    task: unit
+resources:
+- name: booklit
+  type: booklit
+  source:
+    branch: master
+    private_key: |
+      -----BEGIN RSA PRIVATE KEY-----
+      # ... snipped ...
+      -----END RSA PRIVATE KEY-----
+    uri: https://github.com/concourse/booklit</code></pre><p>Note that we had to use <code>-y</code> so that the <code>trigger: true</code> ends up with a boolean value instead of the string <code>&#34;true&#34;</code>.</p>
+  </div>
+</div><div class="toggleable example">
+  <input id="toggle-72d3147ae566c2d517584a4edf96ab7080320149" type="checkbox" class="toggle" />
+  <label for="toggle-72d3147ae566c2d517584a4edf96ab7080320149" class="toggle-title">Loading values from files with <code>-l</code></label>
+  <div class="toggle-content">
+    <p>With a pipeline template like so:</p><pre><code class="language-yaml">resources:
+- name: booklit
+  type: booklit
+  source:
+    uri: https://github.com/concourse/booklit
+    branch: ((branch))
+    private_key: ((&#34;github.com&#34;.private_key))
+
+jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: ((trigger))
+  - task: unit
+    file: booklit/ci/unit.yml</code></pre><p>Let&#39;s say I&#39;ve put the <code>private_key</code> var in a file called <code>vars.yml</code>, since it&#39;s quite large and hard to pass through flags:</p><pre><code class="language-yaml">github.com:
+  private_key: |
+    -----BEGIN RSA PRIVATE KEY-----
+    # ... snipped ...
+    -----END RSA PRIVATE KEY-----</code></pre><p>The <a href="setting-pipelines.html#fly-validate-pipeline"><code>fly validate-pipeline</code></a> command may be used to test how interpolation is applied, by passing the <code>--output</code> flag.</p><pre><code class="language-sh">$ fly validate-pipeline \
+  -c pipeline.yml \
+  -l vars.yml \
+  -y trigger=true \
+  -v branch=master \
+  --output</code></pre><p>The above incantation should print the following:</p><pre><code class="language-yaml">jobs:
+- name: unit
+  plan:
+  - get: booklit
+    trigger: true
+  - task: unit
+    file: booklit/ci/unit.yml
+resources:
+- name: booklit
+  type: booklit
+  source:
+    branch: master
+    private_key: |
+      -----BEGIN RSA PRIVATE KEY-----
+      # ... snipped ...
+      -----END RSA PRIVATE KEY-----
+    uri: https://github.com/concourse/booklit</code></pre><p>Note that we had to use <code>-y</code> so that the <code>trigger: true</code> ends up with a boolean value instead of the string <code>&#34;true&#34;</code>.</p>
+  </div>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_dynamic-vars">
+  
+  <h2 class="section-header"><a class="anchor-target" name="dynamic-vars" href="#dynamic-vars"></a>Dynamic vars</h2>
+  
+
+  <p>Concourse can read values from &#34;var sources&#34; - typically credential managers like Vault - at runtime. This keeps them out of your configuration and prevents sensitive values from being stored in your database. Values will be read from the var source and optionally <a href="creds-caching.html">cached</a> to reduce load on the var source.</p><p>The following attributes can be parameterized through a var source:</p><ul>
+
+  <li><p><a href="resources.html#schema.resource.source"><code class="schema-attribute-name"><bold>resource<wbr />.source</bold></code></a> under <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a></p></li>
+
+  <li><p><a href="resource-types.html#schema.resource_type.source"><code class="schema-attribute-name"><bold>resource_type<wbr />.source</bold></code></a> under <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a></p></li>
+
+  <li><p><a href="resources.html#schema.resource.webhook_token"><code class="schema-attribute-name"><bold>resource<wbr />.webhook_token</bold></code></a> under <a href="pipelines.html#schema.pipeline.resources"><code class="schema-attribute-name"><bold>pipeline<wbr />.resources</bold></code></a></p></li>
+
+  <li><p><a href="task-step.html#schema.task.params"><code>task</code> step <strong><code>params</code></strong></a> on a task step in a pipeline</p></li>
+
+  <li><p><a href="tasks.html">tasks configuration</a> in their entirety - whether from <a href="task-step.html#schema.task.file"><code>task</code> step <strong><code>file</code></strong></a> or <a href="task-step.html#schema.task.config"><code>task</code> step <strong><code>config</code></strong></a> in a pipeline, or a config executed with <a href="tasks.html#running-tasks"><code>fly execute</code></a></p></li>
+
+</ul><p>Concourse will fetch values for vars as late as possible - i.e. when a step using them is about to execute. This allows the credentials to have limited lifetime and rapid rotation policies.</p>
+
+  
+    
+      <div class="section" id="section_dynamic-vars-across-step">
+  
+  <h3 class="section-header"><a class="anchor-target" name="dynamic-vars-across-step" href="#dynamic-vars-across-step"></a>Across Step &amp; Dynamic Vars</h3>
+  
+
+  <p>For the <a href="across-step.html#schema.across"><code class="schema-attribute-name"><bold>across</bold></code></a> more fields can be dynamically interpolated during runtime:</p><ul>
+
+  <li><p><a href="set-pipeline-step.html"><code>set_pipeline</code> step</a> identifier and <a href="set-pipeline-step.html#schema.set-pipeline.file"><code>file</code></a> field</p></li>
+
+  <li><p><a href="task-step.html"><code>task</code> step</a> identifier, <a href="task-step.html#schema.task.input_mapping"><code>input_mapping</code></a>, and <a href="task-step.html#schema.task.output_mapping"><code>output_mapping</code></a>, in addition to the all other fields mentioned above for the task step</p></li>
+
+</ul>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_var-sources">
+  
+  <h3 class="section-header"><a class="anchor-target" name="var-sources" href="#var-sources"></a>Var sources <span class="dim">(experimental)</span></h3>
+  
+
+  <div class="warning">
+  <p><code>var_sources</code> was introduced in Concourse v5.8.0. It is considered an <strong>experimental</strong> feature until its associated <a href="https://github.com/concourse/rfcs/pull/39">RFC</a> is resolved.</p>
+</div><p>Var sources can be configured for a pipeline via <a href="pipelines.html#schema.pipeline.var_sources"><code class="schema-attribute-name"><bold>pipeline<wbr />.var_sources</bold></code></a>.</p><p>Each var source has a name which is then referenced as the <em>source-name</em> in var syntax, e.g. <code>((my-vault:test-user.username))</code> to fetch the <code>test-user</code> var from the <code>my-vault</code> var source. See <a href="vars.html#var-syntax"><code>((var))</code> syntax</a> for a detailed explanation of this syntax.</p><p>Currently, only these types are supported: <ul>
+
+  <li><p><a href="vault-credential-manager.html"><code>vault</code></a></p></li>
+
+  <li><p><code>dummy</code></p></li>
+
+  <li><p><a href="aws-ssm-credential-manager.html"><code>ssm</code></a></p></li>
+
+  <li><p><a href="aws-asm-credential-manager.html"><code>secretmanager</code></a> (since v7.7.0)</p></li>
+
+  <li><p><a href="idtoken-credential-manager.html"><code>idtoken</code></a> (since v7.14.0)</p></li>
+
+</ul></p><p>In the future we want to make use of something like the <a href="https://github.com/concourse/rfcs/pull/37">Prototypes (RFC #37)</a> so that third-party credential managers can be used just like resource types.</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.var_source" href="#schema.var_source"></a><code>var_source</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.name" class="toggle-title">
+    <a id="schema.var_source.name"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.name">name</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The name of the <code>((var))</code> source. This should be short and simple. This name will be referenced <a href="vars.html#var-syntax"><code>((var))</code> syntax</a> throughout the config.</p>
+  </div>
+</div><div class="schema-one-of">
+  <div class="one-of-header">one of...</div>
+
+  
+  <div class="one-of-option">
+    <div class="schema-group">
+  <a id="vault-var-source"></a>
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.vault-var-source.type" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.vault-var-source.type" class="toggle-title">
+    <a id="schema.var_source.vault-var-source.type"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.vault-var-source.type">type</a>: <span class="attribute-type"><span class="schema-scalar">vault</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The <code>vault</code> type supports configuring a <a href="https://www.vaultproject.io">Vault</a> server as a <code>((var))</code> source.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.vault-var-source.config" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.vault-var-source.config" class="toggle-title">
+    <a id="schema.var_source.vault-var-source.config"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.vault-var-source.config">config</a>: <span class="attribute-type"><a href="vars.html#schema.vault_config"><strong>vault_config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Configuration for the Vault server has the following schema:</p><div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.vault_config" href="#schema.vault_config"></a><code>vault_config</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.vault_config.url" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.url" class="toggle-title">
+    <a id="schema.vault_config.url"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.url">url</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The URL of the Vault API.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.ca_cert" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.ca_cert" class="toggle-title">
+    <a id="schema.vault_config.ca_cert"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.ca_cert">ca_cert</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The PEM encoded contents of a CA certificate to use when connecting to the API.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.path_prefix" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.path_prefix" class="toggle-title">
+    <a id="schema.vault_config.path_prefix"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.path_prefix">path_prefix</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>/concourse</code>.</em> A prefix under which to look for all credential values.</p><p>See <a href="vault-credential-manager.html#vault-path-prefix">Changing the path prefix</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.lookup_templates" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.lookup_templates" class="toggle-title">
+    <a id="schema.vault_config.lookup_templates"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.lookup_templates">lookup_templates</a>: <span class="attribute-type">[<a href="config-basics.html#schema.string"><strong>string</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>[&#34;/{{.Team}}/{{.Pipeline}}/{{.Secret}}&#34;, &#34;/{{.Team}}/{{.Secret}}&#34;]</code>.</em></p><p>A list of path templates to be expanded in a team and pipeline context subject to the <code>path_prefix</code> and <code>namespace</code>.</p><p>See <a href="vault-credential-manager.html#vault-lookup-templates">Changing the path templates</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.shared_path" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.shared_path" class="toggle-title">
+    <a id="schema.vault_config.shared_path"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.shared_path">shared_path</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>An additional path under which credentials will be looked up.</p><p>See <a href="vault-credential-manager.html#vault-shared-path">Configuring a shared path</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.namespace" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.namespace" class="toggle-title">
+    <a id="schema.vault_config.namespace"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.namespace">namespace</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A <a href="https://www.vaultproject.io/docs/enterprise/namespaces/index.html">Vault namespace</a> to operate under.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.client_cert" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.client_cert" class="toggle-title">
+    <a id="schema.vault_config.client_cert"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.client_cert">client_cert</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A PEM encoded client certificate, for use with TLS based auth.</p><p>See <a href="vault-credential-manager.html#vault-cert-auth">Using the <code>cert</code> auth backend</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.client_key" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.client_key" class="toggle-title">
+    <a id="schema.vault_config.client_key"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.client_key">client_key</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A PEM encoded client key, for use with TLS based auth.</p><p>See <a href="vault-credential-manager.html#vault-cert-auth">Using the <code>cert</code> auth backend</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.server_name" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.server_name" class="toggle-title">
+    <a id="schema.vault_config.server_name"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.server_name">server_name</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The expected name of the server when connecting through TLS.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.insecure_skip_verify" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.insecure_skip_verify" class="toggle-title">
+    <a id="schema.vault_config.insecure_skip_verify"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.insecure_skip_verify">insecure_skip_verify</a>: <span class="attribute-type"><a href="config-basics.html#schema.boolean"><strong>boolean</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Skip TLS validation. Not recommended. Don&#39;t do it. No really, don&#39;t.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.client_token" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.client_token" class="toggle-title">
+    <a id="schema.vault_config.client_token"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.client_token">client_token</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Authenticate via a periodic client token.</p><p>See <a href="vault-credential-manager.html#vault-periodic-token">Using a periodic token</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.auth_backend" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.auth_backend" class="toggle-title">
+    <a id="schema.vault_config.auth_backend"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.auth_backend">auth_backend</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Authenticate using an auth backend, e.g. <code>cert</code> or <code>approle</code>.</p><p>See <a href="vault-credential-manager.html#vault-approle-auth">Using the <code>approle</code> auth backend</a> or <a href="vault-credential-manager.html#vault-cert-auth">Using the <code>cert</code> auth backend</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.auth_params" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.auth_params" class="toggle-title">
+    <a id="schema.vault_config.auth_params"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.auth_params">auth_params</a>: <span class="attribute-type">{<a href="config-basics.html#schema.string"><strong>string</strong></a>: <a href="config-basics.html#schema.string"><strong>string</strong></a>}</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A key-value map of parameters to pass during authentication.</p><p>See <a href="vault-credential-manager.html#vault-approle-auth">Using the <code>approle</code> auth backend</a> for more information.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.auth_max_ttl" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.auth_max_ttl" class="toggle-title">
+    <a id="schema.vault_config.auth_max_ttl"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.auth_max_ttl">auth_max_ttl</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>Maximum duration to elapse before forcing the client to log in again.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.auth_retry_max" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.auth_retry_max" class="toggle-title">
+    <a id="schema.vault_config.auth_retry_max"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.auth_retry_max">auth_retry_max</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>When failing to authenticate, give up after this amount of time.</p>
+  </div>
+</div><div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.vault_config.auth_retry_initial" type="checkbox" class="toggle" />
+  <label for="toggle-schema.vault_config.auth_retry_initial" class="toggle-title">
+    <a id="schema.vault_config.auth_retry_initial"></a>
+
+    <code><a class="attribute-name" href="#schema.vault_config.auth_retry_initial">auth_retry_initial</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>When retrying during authentication, start with this retry interval. The interval will increase exponentially until <code>auth_retry_max</code> is reached.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div>
+</div>
+  </div>
+  
+  <div class="one-of-option">
+    <div class="schema-group">
+  <a id="ssm-var-source"></a>
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.ssm-var-source.type" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.ssm-var-source.type" class="toggle-title">
+    <a id="schema.var_source.ssm-var-source.type"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.ssm-var-source.type">type</a>: <span class="attribute-type"><span class="schema-scalar">ssm</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The <code>SSM</code> type supports configuring an <a href="https://docs.aws.amazon.com/secretsmanager/">AWS Secrets Manager</a> in a single region as a <code>((var))</code> source.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.ssm-var-source.config" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.ssm-var-source.config" class="toggle-title">
+    <a id="schema.var_source.ssm-var-source.config"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.ssm-var-source.config">config</a>: <span class="attribute-type"><a href="vars.html#schema.ssm_config"><strong>ssm_config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.ssm_config" href="#schema.ssm_config"></a><code>ssm_config</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.ssm_config.region" type="checkbox" class="toggle" />
+  <label for="toggle-schema.ssm_config.region" class="toggle-title">
+    <a id="schema.ssm_config.region"></a>
+
+    <code><a class="attribute-name" href="#schema.ssm_config.region">region</a>: <span class="attribute-type"><a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The AWS region to read secrets from.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div>
+</div>
+  </div>
+  
+  <div class="one-of-option">
+    <div class="schema-group">
+  <a id="dummy-var-source"></a>
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.dummy-var-source.type" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.dummy-var-source.type" class="toggle-title">
+    <a id="schema.var_source.dummy-var-source.type"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.dummy-var-source.type">type</a>: <span class="attribute-type"><span class="schema-scalar">dummy</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The <code>dummy</code> type supports configuring a static map of vars to values.</p><p>This is really only useful if you have no better alternative for credential management but still have sensitive values that you would like to <a href="creds-redacting.html">redact</a> them from build output.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.dummy-var-source.config" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.dummy-var-source.config" class="toggle-title">
+    <a id="schema.var_source.dummy-var-source.config"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.dummy-var-source.config">config</a>: <span class="attribute-type"><a href="vars.html#schema.dummy_config"><strong>dummy_config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.dummy_config" href="#schema.dummy_config"></a><code>dummy_config</code> schema</h2>
+
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.dummy_config.vars" type="checkbox" class="toggle" />
+  <label for="toggle-schema.dummy_config.vars" class="toggle-title">
+    <a id="schema.dummy_config.vars"></a>
+
+    <code><a class="attribute-name" href="#schema.dummy_config.vars">vars</a>: <span class="attribute-type"><a href="config-basics.html#schema.vars"><strong>vars</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A mapping of var name to var value.</p>
+  </div>
+</div>
+</div>
+  </div>
+</div>
+</div>
+  </div>
+  
+  <div class="one-of-option">
+    <div class="schema-group">
+  <a id="idtoken-var-source"></a>
+  <div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.idtoken-var-source.type" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.idtoken-var-source.type" class="toggle-title">
+    <a id="schema.var_source.idtoken-var-source.type"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.idtoken-var-source.type">type</a>: <span class="attribute-type"><span class="schema-scalar">idtoken</span></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>The <code>idtoken</code> type issues JWTs which are signed by concourse and contain information about the currently running pipeline/job.</p><p>These JWTs can be used to authenticate with external services.</p>
+  </div>
+</div><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.var_source.idtoken-var-source.config" type="checkbox" class="toggle" />
+  <label for="toggle-schema.var_source.idtoken-var-source.config" class="toggle-title">
+    <a id="schema.var_source.idtoken-var-source.config"></a>
+
+    <code><a class="attribute-name" href="#schema.var_source.idtoken-var-source.config">config</a>: <span class="attribute-type"><a href="vars.html#schema.idtoken_config"><strong>idtoken_config</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <div class="schema">
+  <h2 class="schema-header"><a class="anchor-target" name="schema.idtoken_config" href="#schema.idtoken_config"></a><code>idtoken_config</code> schema</h2>
+
+  <p><div class="toggleable schema-attribute required">
+  <input id="toggle-schema.idtoken_config.audience" type="checkbox" class="toggle" />
+  <label for="toggle-schema.idtoken_config.audience" class="toggle-title">
+    <a id="schema.idtoken_config.audience"></a>
+
+    <code><a class="attribute-name" href="#schema.idtoken_config.audience">audience</a>: <span class="attribute-type">[<a href="config-basics.html#schema.string"><strong>string</strong></a>]</span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>A list of audience-values to place into the token&#39;s aud-claim.</p>
+  </div>
+</div> <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.idtoken_config.subject_scope" type="checkbox" class="toggle" />
+  <label for="toggle-schema.idtoken_config.subject_scope" class="toggle-title">
+    <a id="schema.idtoken_config.subject_scope"></a>
+
+    <code><a class="attribute-name" href="#schema.idtoken_config.subject_scope">subject_scope</a>: <span class="attribute-type"><span class="schema-scalar">team</span> | <span class="schema-scalar">pipeline</span> | <span class="schema-scalar">instance</span> | <span class="schema-scalar">job</span> | <a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>pipeline</code>.</em></p><p>Determines what is put into the token&#39;s sub-claim. See <a href="idtoken-credential-manager.html#idtoken-subject-scope">Subject Scope</a> for a detailed explanation.</p>
+  </div>
+</div> <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.idtoken_config.expires_in" type="checkbox" class="toggle" />
+  <label for="toggle-schema.idtoken_config.expires_in" class="toggle-title">
+    <a id="schema.idtoken_config.expires_in"></a>
+
+    <code><a class="attribute-name" href="#schema.idtoken_config.expires_in">expires_in</a>: <span class="attribute-type"><a href="config-basics.html#schema.duration"><strong>duration</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p>How long the token should be valid.</p><p><em>Default <code>1h</code>.</em> Cannot be longer than <code>24h</code>.</p>
+  </div>
+</div> <div class="toggleable schema-attribute optional">
+  <input id="toggle-schema.idtoken_config.algorithm" type="checkbox" class="toggle" />
+  <label for="toggle-schema.idtoken_config.algorithm" class="toggle-title">
+    <a id="schema.idtoken_config.algorithm"></a>
+
+    <code><a class="attribute-name" href="#schema.idtoken_config.algorithm">algorithm</a>: <span class="attribute-type"><span class="schema-scalar">RS256</span> | <span class="schema-scalar">ES256</span> | <a href="config-basics.html#schema.string"><strong>string</strong></a></span></code>
+  </label>
+
+  <div class="toggle-content attribute-content">
+    <p><em>Default <code>RS256</code>.</em></p><p>The signature algorithm to use for the token.</p>
+  </div>
+</div></p>
+</div>
+  </div>
+</div>
+</div>
+  </div>
+  
+</div>
+</div>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_cluster-wide-credential-manager">
+  
+  <h3 class="section-header"><a class="anchor-target" name="cluster-wide-credential-manager" href="#cluster-wide-credential-manager"></a>The cluster-wide credential manager</h3>
+  
+
+  <p>Concourse can be configured with a single cluster-wide credential manager, which acts as a source for any vars which do not specify a source name.</p><p>See <a href="creds.html">Credential Management</a> for more information.</p><blockquote class="aside"><p>In the future we would like to introduce support for multiple cluster-wide var sources, configured using the <a href="vars.html#schema.var_source"><strong><code>var_source</code></strong> schema</a> schema, and begin deprecating the <a href="vars.html#cluster-wide-credential-manager">cluster-wide credential manager</a>.</p></blockquote>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.6</span>
+              
+
+              <a href="pipelines.html">Pipelines</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.8</span>
+              
+
+              <a href="resources.html">Resources</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside">
+          <div class="page-partial">
+            <div class="content">
+  <h2>Examples</h2>
+
+  <div class="example">
+  <h3>Dummy Vars</h3>
+
+  <p>Here&#39;s a copy-pasteable example using the <a href="vars.html#dummy-var-source"><code>dummy</code> var source</a>, just to demonstrate named <code>((var))</code> syntax:</p><pre><code class="language-yaml">var_sources:
+- name: dumb
+  type: dummy
+  config:
+    vars:
+      simple: hello!
+      user:
+        username: big
+        password: sekrit
+
+jobs:
+- name: print-creds
+  plan:
+  - task: print
+    config:
+      platform: linux
+
+      image_resource:
+        type: registry-image
+        source: {repository: ubuntu}
+
+      run:
+        path: bash
+        args:
+        - -c
+        - |
+          echo simple: ((dumb:simple))
+          echo username: ((dumb:user.username))
+          echo password: ((dumb:user.password))</code></pre><p>The <code>print-creds</code> job above will print the following:</p><pre>simple: hello!
+username: big
+password: sekrit</pre><p>With <a href="creds-redacting.html">credential redaction</a> enabled, the output above will actually print the following:</p><pre>simple: ((redacted))
+username: ((redacted))
+password: ((redacted))</pre><p>The <code>dummy</code> var source type is, well, pretty dumb. It just provides whatever vars you tell it to. It primarily exists for testing purposes, and is useful as a stand-in in place of a real credential manager where you can at least have the credentials redacted from build output.</p><p>In production, you&#39;ll probably want to use something like <a href="vars.html#vault-var-source"><code>vault</code></a> instead.</p>
+</div>
+</div>
+          </div>
+          </div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
diff --git a/vault-credential-manager.html b/vault-credential-manager.html
new file mode 100644
index 00000000..023c135e
--- /dev/null
+++ b/vault-credential-manager.html
@@ -0,0 +1,637 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=775" />
+<title>The Vault credential manager - Concourse CI</title>
+<link rel="stylesheet" type="text/css" href="css/normalize.css" />
+<link rel="stylesheet" type="text/css" href="css/pipeline.css" />
+<link rel="stylesheet" type="text/css" href="css/iosevka.css" />
+<link rel="stylesheet" type="text/css" href="css/booklit.css" />
+<link rel="stylesheet" type="text/css" href="css/prism.css" />
+<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
+<link href="https://fonts.googleapis.com/css?family=Barlow:400,400i,700|Roboto+Slab:300,400,700" rel="stylesheet" />
+<script src="js/search.js"></script>
+<script async type="text/javascript" src="js/prism.js"></script>
+<script data-goatcounter="https://concourse.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+  </head>
+  <body>
+    <div class="top-banner">
+  <p class="banner-text">
+    <a href="https://blog.concourse-ci.org/posts/2025-08-12-new-release-7-14/">🎉 v7.14.0 Released - 🦾 First ARM Build of Concourse</a>
+  </p>
+</div>
+
+<div class="page-top">
+  <nav class="top-nav">
+    <a class="top-link logo-link" href="/"><img src="images/logo-white.svg" />Concourse</a>
+    
+    <a class="top-link active" href="docs.html">Docs</a>
+    
+    <a class="top-link" href="examples.html">Examples</a>
+    
+    <a class="top-link" href="project.html">Project</a>
+    
+    <a class="top-link" href="ecosystem.html">Ecosystem</a>
+    
+    <a class="top-link" href="support.html">Support</a>
+    
+    <a class="top-link" href="https://resource-types.concourse-ci.org">Resource Types</a>
+    <a class="top-link" href="https://blog.concourse-ci.org">blog</a>
+
+    <div id="search"></div>
+
+    <script type="text/javascript">
+      var app = Elm.Main.init({
+        node: document.getElementById('search')
+      });
+
+      app.ports.emitSearchTerm.subscribe(function(term) {
+        goatcounter.count({
+          path: "search:" + term,
+          title: "user searched: " + term,
+          event: true
+        });
+      });
+    </script>
+  </nav>
+</div>
+
+    <div class="page-body">
+      <div class="page-nav">
+        
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1</span><a href="docs.html"  class="active">Docs</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.1</td>
+            <td class="title-cell"><a href="getting-started.html" >Getting Started</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.2</td>
+            <td class="title-cell"><a href="install.html" >Install</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.3</td>
+            <td class="title-cell"><a href="auth.html" >Auth &amp; Teams</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.4</td>
+            <td class="title-cell"><a href="fly.html" >The <code>fly</code> CLI</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.5</td>
+            <td class="title-cell"><a href="config-basics.html" >Config Basics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.6</td>
+            <td class="title-cell"><a href="pipelines.html" >Pipelines</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.7</td>
+            <td class="title-cell"><a href="vars.html" >Vars</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.8</td>
+            <td class="title-cell"><a href="resources.html" >Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.9</td>
+            <td class="title-cell"><a href="resource-types.html" >Resource Types</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.10</td>
+            <td class="title-cell"><a href="jobs.html" >Jobs</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.11</td>
+            <td class="title-cell"><a href="steps.html" >Steps</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.12</td>
+            <td class="title-cell"><a href="tasks.html" >Tasks</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.13</td>
+            <td class="title-cell"><a href="builds.html" >Builds</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.14</td>
+            <td class="title-cell"><a href="how-to-guides.html" >How-To Guides</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15</td>
+            <td class="title-cell"><a href="operation.html"  class="active">Operation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.16</td>
+            <td class="title-cell"><a href="observation.html" >Observation</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.17</td>
+            <td class="title-cell"><a href="internals.html" >Internals</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15</span><a href="operation.html"  class="active">Operation</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.1</td>
+            <td class="title-cell"><a href="metrics.html" >Metrics</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.2</td>
+            <td class="title-cell"><a href="tracing.html" >Tracing</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.3</td>
+            <td class="title-cell"><a href="encryption.html" >Encryption</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4</td>
+            <td class="title-cell"><a href="creds.html"  class="active">Credential Management</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.5</td>
+            <td class="title-cell"><a href="security-hardening.html" >Security Hardening</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.6</td>
+            <td class="title-cell"><a href="container-placement.html" >Container Placement</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.7</td>
+            <td class="title-cell"><a href="opa.html" >Open Policy Agent Integration</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.8</td>
+            <td class="title-cell"><a href="performance-tuning.html" >Performance Tuning</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.9</td>
+            <td class="title-cell"><a href="global-resources.html" >Global Resources</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.10</td>
+            <td class="title-cell"><a href="administration.html" >Administration</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+  <div class="context">
+    <nav>
+      <div class="top">
+        <span class="section-number">1.15.4</span><a href="creds.html"  class="active">Credential Management</a>
+      </div>
+
+      <div class="children">
+        <table>
+        
+          <tr>
+            <td class="number-cell">1.15.4.1</td>
+            <td class="title-cell"><a href="vault-credential-manager.html"  class="self">The Vault credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.2</td>
+            <td class="title-cell"><a href="credhub-credential-manager.html" >The CredHub credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.3</td>
+            <td class="title-cell"><a href="aws-ssm-credential-manager.html" >The AWS SSM credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.4</td>
+            <td class="title-cell"><a href="aws-asm-credential-manager.html" >The AWS Secrets Manager credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.5</td>
+            <td class="title-cell"><a href="kubernetes-credential-manager.html" >Kubernetes Credential Manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.6</td>
+            <td class="title-cell"><a href="conjur-credential-manager.html" >The Conjur credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.7</td>
+            <td class="title-cell"><a href="idtoken-credential-manager.html" >The IDToken credential manager</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.8</td>
+            <td class="title-cell"><a href="creds-caching.html" >Caching credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.9</td>
+            <td class="title-cell"><a href="creds-redacting.html" >Redacting credentials</a></td>
+          </tr>
+        
+          <tr>
+            <td class="number-cell">1.15.4.10</td>
+            <td class="title-cell"><a href="creds-retry-logic.html" >Retrying failed fetches</a></td>
+          </tr>
+        
+        </table>
+      </div>
+    </nav>
+  </div>
+  
+
+  
+
+  
+
+
+
+      </div>
+
+      <div class="body-content">
+        <div class="page-content">
+          <div class="section" id="section_vault-credential-manager">
+  
+  <h1 class="section-header"><a class="anchor-target" name="vault-credential-manager" href="#vault-credential-manager"></a><span class="section-number">1.15.4.1 </span>The Vault credential manager</h1>
+  
+
+  <p>Concourse can be configured to pull credentials from a <a href="https://vaultproject.io">Vault</a> instance.</p><p>To configure this, first configure the URL of your Vault server by setting the following env on the <a href="concourse-web.html"><code>web</code> node</a>:</p><pre><code class="language-bash">CONCOURSE_VAULT_URL=https://vault.example.com:8200</code></pre><p>You may also need to configure the CA cert for Vault:</p><pre><code class="language-bash">CONCOURSE_VAULT_CA_CERT=path/to/ca.crt</code></pre><p>You&#39;ll also need to configure how the <code>web</code> node authenticates with Vault - see <a href="vault-credential-manager.html#authenticating-with-vault">Authenticating with Vault</a> for more details as that step is quite involved.</p>
+
+  
+    
+      <div class="section" id="section_vault-credential-lookup-rules">
+  
+  <h2 class="section-header"><a class="anchor-target" name="vault-credential-lookup-rules" href="#vault-credential-lookup-rules"></a>Credential lookup rules</h2>
+  
+
+  <p>Vault lets you organize secrets into hierarchies, which is useful for when they should be accessible for particular pipelines or teams. When you have a parameter like <code>((foo))</code> in a pipeline definition, Concourse will (by default) look for it in the following paths, in order:</p><ul>
+
+  <li><p><code>/concourse/TEAM_NAME/PIPELINE_NAME/foo</code></p></li>
+
+  <li><p><code>/concourse/TEAM_NAME/foo</code></p></li>
+
+</ul><p>Vault credentials are actually key-value, so for <code>((foo))</code> Concourse will default to the field name <code>value</code>. You can specify the field to grab via <code>.</code> syntax, e.g. <code>((foo.bar))</code>.</p><p>If you have multiple, intermediate levels in your path, you can use the <code>/</code> separator to reach your intended field, e.g. <code>((foo/bar/baz.qux))</code>.</p><p>When executing a one-off task, there is no pipeline: so in this case, only the team path <code>/concourse/TEAM_NAME/foo</code> is searched.</p><p>There are several ways to customize the lookup logic:</p><ol>
+
+  <li><p>Add a &#34;shared path&#34;, for secrets common to all teams.</p></li>
+
+  <li><p>Change the team- and pipeline-dependent path templates.</p></li>
+
+  <li><p>Change the path prefix from <code>/concourse</code> to something else.</p></li>
+
+  <li><p>Set a <a href="https://www.vaultproject.io/docs/enterprise/namespaces/">Vault namespace</a> for isolation within a Vault Enterprise installation.</p></li>
+
+</ol><p>Each of these can be controlled by Concourse command line flags, or environment variables.</p>
+
+  
+    
+      <div class="section" id="section_vault-shared-path">
+  
+  <h3 class="section-header"><a class="anchor-target" name="vault-shared-path" href="#vault-shared-path"></a>Configuring a shared path</h3>
+  
+
+  <p>A &#34;shared path&#34; can also be configured for credentials that you would like to share across all teams and pipelines, foregoing the default team/pipeline namespacing. Use with care!</p><pre><code class="language-bash">CONCOURSE_VAULT_SHARED_PATH=some-shared-path</code></pre><p>This path must exist under the configured path prefix. The above configuration would correspond to <code>/concourse/some-shared-path</code> with the default <code>/concourse</code> prefix.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_vault-lookup-templates">
+  
+  <h3 class="section-header"><a class="anchor-target" name="vault-lookup-templates" href="#vault-lookup-templates"></a>Changing the path templates</h3>
+  
+
+  <p>You can choose your own list of templates, which will expand to team- or pipeline-specific paths. These are subject to the path prefix. By default, the templates used are:</p><pre><code class="language-bash">CONCOURSE_VAULT_LOOKUP_TEMPLATES=/{{.Team}}/{{.Pipeline}}/{{.Secret}},/{{.Team}}/{{.Secret}}</code></pre><p>When secrets are to be looked up, these are evaluated subject to the configured path prefix, where <code>{{.Team}}</code> expands to the current team, <code>{{.Pipeline}}</code> to the current pipeline (if any), and <code>{{.Secret}}</code> to the name of the secret. So if the settings are:</p><pre><code class="language-bash">CONCOURSE_VAULT_PATH_PREFIX=/secrets
+CONCOURSE_VAULT_LOOKUP_TEMPLATES=/{{.Team}}/concourse/{{.Pipeline}}/{{.Secret}},/{{.Team}}/concourse/{{.Secret}},/common/{{.Secret}}</code></pre><p>and <code>((password))</code> is used in team <code>myteam</code> and pipeline <code>mypipeline</code>, Concourse will look for the following, in order:</p><ol>
+
+  <li><p><code>/secrets/myteam/concourse/mypipeline/password</code></p></li>
+
+  <li><p><code>/secrets/myteam/concourse/password</code></p></li>
+
+  <li><p><code>/secrets/common/password</code></p></li>
+
+</ol>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_vault-path-prefix">
+  
+  <h3 class="section-header"><a class="anchor-target" name="vault-path-prefix" href="#vault-path-prefix"></a>Changing the path prefix</h3>
+  
+
+  <p>The leading <code>/concourse</code> can be changed by specifying the following:</p><pre><code class="language-bash">CONCOURSE_VAULT_PATH_PREFIX=/some-other-prefix</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_vault-namespace">
+  
+  <h3 class="section-header"><a class="anchor-target" name="vault-namespace" href="#vault-namespace"></a>Using a Vault namespace</h3>
+  
+
+  <p>If you are using Vault Enterprise, you can make secret lookups and authentication happen under a namespace.</p><pre><code class="language-bash">CONCOURSE_VAULT_NAMESPACE=chosen/namespace/path</code></pre><p>This setting applies to all teams equally.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+      <div class="section" id="section_configuring-the-secrets-engine">
+  
+  <h2 class="section-header"><a class="anchor-target" name="configuring-the-secrets-engine" href="#configuring-the-secrets-engine"></a>Configuring the secrets engine</h2>
+  
+
+  <p>Concourse is currently limited to looking under a single path, meaning enabling only one secrets engine is supported: <code>kv</code>, or <code>kv_v2</code>. This may change in the future - we&#39;re still collecting ideas in <a href="https://github.com/concourse/rfcs/pull/21">RFC #21</a>.</p><p>Using kv version 2 enables versioned secrets and the ability to restore previous versions or deleted secrets. Concourse will read the latest version of a secret at all times and if it is deleted it will appear as if the secret does not exist. More information regarding the Vault KV backend and the differences in versions can be found <a href="https://www.vaultproject.io/docs/secrets/kv">here</a>.</p><p>So, let&#39;s configure the <code>kv</code> secrets engine and mount it at <code>/concourse</code>:</p><pre><code class="language-bash">$ vault secrets enable -version=1 -path=concourse kv</code></pre><p>To enable kv_v2 and versioned secrets: <pre><code class="language-bash">$ vault secrets enable -version=2 -path=concourse kv</code></pre></p><p>Next, you&#39;ll want to create a policy to allow Concourse to read from this path.</p><pre><code class="language-hcl">path &#34;concourse/*&#34; {
+  capabilities = [&#34;read&#34;]
+}</code></pre><p>Save this to <code>concourse-policy.hcl</code>, and then run:</p><pre><code class="language-bash">vault policy write concourse ./concourse-policy.hcl</code></pre><p>This configuration will allow Concourse to read all credentials under <code>/concourse</code>. This should match your configured path prefix.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_authenticating-with-vault">
+  
+  <h2 class="section-header"><a class="anchor-target" name="authenticating-with-vault" href="#authenticating-with-vault"></a>Authenticating with Vault</h2>
+  
+
+  <p>There are many ways to authenticate with a Vault server. The <code>web-node</code> can be configured with either a token or an arbitrary auth backend and arbitrary auth params, so just about all of them should be configurable.</p><p>When the <code>web</code> node acquires a token, either by logging in with an auth backend or by being given one directly, it will continuously renew the token to ensure it doesn&#39;t expire. The renewal interval is half of the token&#39;s lease duration.</p>
+
+  
+    
+      <div class="section" id="section_vault-periodic-token">
+  
+  <h3 class="section-header"><a class="anchor-target" name="vault-periodic-token" href="#vault-periodic-token"></a>Using a periodic token</h3>
+  
+
+  <p>The simplest way to authenticate is by generating a periodic token:</p><pre><code class="language-bash">$ vault token create --policy concourse --period 1h
+Key                Value
+---                -----
+token              s.mSNnbhGAqxK2ZbMasOQ91rIA
+token_accessor     0qsib5YcYvROm86cT08IFxIT
+token_duration     1h
+token_renewable    true
+token_policies     [concourse default]</code></pre><div class="warning">
+  <p>Choose your <code>--period</code> wisely, as the timer starts counting down as soon as the token is created. You should also use a duration long enough to account for any planned <code>web</code> node downtime.</p>
+</div><p>Once you have the token, just set the following env on the <code>web</code> node:</p><pre><code class="language-bash">CONCOURSE_VAULT_CLIENT_TOKEN=s.mSNnbhGAqxK2ZbMasOQ91rIA</code></pre><p>Periodic tokens are the quickest way to get started, but they have one fatal flaw: if the <code>web</code> node is down for longer than the token&#39;s configured period, the token will expire and a new one will have to be created and configured. This can be avoided by using the <a href="vault-credential-manager.html#vault-approle-auth"><code>approle</code> auth backend</a>.</p>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_vault-approle-auth">
+  
+  <h3 class="section-header"><a class="anchor-target" name="vault-approle-auth" href="#vault-approle-auth"></a>Using the <code>approle</code> auth backend</h3>
+  
+
+  <p>The <a href="https://www.vaultproject.io/docs/auth/approle.html"><code>approle</code></a> backend allows for an <em>app</em> (in this case, Concourse) to authenticate with a <em>role</em> pre-configured in Vault.</p><p>With this backend, the <a href="concourse-web.html"><code>web</code> node</a> is configured with a <code>role_id</code> corresponding to a pre-configured role, and a <code>secret_id</code> which is used to authenticate and acquire a token.</p><p>The <code>approle</code> backend must first be configured in Vault. Vault&#39;s <code>approle</code> backend allows for a few parameters which you may want to set to determine the permissions and lifecycle of its issued tokens:</p><dl>
+  
+  <dt><code>policies=names</code></dt>
+    <dd><p>This determines the policies (comma-separated) to set on each token. Be sure to set one that has access to the secrets path - see <a href="vault-credential-manager.html#configuring-the-secrets-engine">Configuring the secrets engine</a> for more information.</p></dd>
+  
+  <dt><code>token_ttl=duration</code></dt>
+    <dd><p>This determines the TTL for each token granted. The token can be continuously renewed, as long as it is renewed before the TTL elapses.</p></dd>
+  
+  <dt><code>token_max_ttl=duration</code></dt>
+    <dd><p>This sets a maximum lifetime for each token, after which the token can no longer be renewed.</p><p>If configured, be sure to set the same value on the <code>web</code> node so that it can re-auth before this duration is reached:</p><pre><code class="language-bash">CONCOURSE_VAULT_AUTH_BACKEND_MAX_TTL=1h</code></pre></dd>
+  
+  <dt><code>period=duration</code></dt>
+    <dd><p>If configured, tokens issued will be <a href="https://www.vaultproject.io/docs/concepts/tokens.html#periodic-tokens"><em>periodic</em></a>. Periodic tokens are not bound by any configured max TTL, and can be renewed continuously. It does not make sense to configure both <code>period</code> and <code>token_max_ttl</code> as the max TTL will be ignored.</p></dd>
+  
+  <dt><code>token_num_uses=count</code></dt>
+    <dd><p>This sets a limit on how often a token can be used. <strong>We do not recommend setting this value</strong>, as it will effectively hamstring Concourse after a few credential acquisitions. The <code>web</code> node does not currently know to re-acquire a token when this limit is reached.</p></dd>
+  
+  <dt><code>secret_id_ttl=duration</code> and <code>secret_id_num_uses=count</code></dt>
+    <dd><p>These two configurations will result in the secret ID expiring after the configured time or configured number of log-ins, respectively.</p><p>You should only set these if you have something periodically re-generating secret IDs and re-configuring your <code>web</code> nodes accordingly.</p></dd>
+  
+</dl><p>Given all that, a typical configuration may look something like this:</p><pre><code class="language-bash">$ vault auth enable approle
+Success! Enabled approle auth method at: approle/
+$ vault write auth/approle/role/concourse policies=concourse period=1h
+Success! Data written to: auth/approle/role/concourse</code></pre><p>Now that the backend is configured, we&#39;ll need to obtain the <code>role_id</code> and generate a <code>secret_id</code>:</p><pre><code class="language-bash">$ vault read auth/approle/role/concourse/role-id
+Key        Value
+---        -----
+role_id    5f3420cd-3c66-2eff-8bcc-0e8e258a7d18
+$ vault write -f auth/approle/role/concourse/secret-id
+Key                   Value
+---                   -----
+secret_id             f7ec2ac8-ad07-026a-3e1c-4c9781423155
+secret_id_accessor    1bd17fc6-dae1-0c82-d325-3b8f9b5654ee</code></pre><p>These should then be set on the <a href="concourse-web.html"><code>web</code> node</a> like so:</p><pre><code class="language-bash">CONCOURSE_VAULT_AUTH_BACKEND=&#34;approle&#34;
+CONCOURSE_VAULT_AUTH_PARAM=&#34;role_id:5f3420cd-3c66-2eff-8bcc-0e8e258a7d18,secret_id:f7ec2ac8-ad07-026a-3e1c-4c9781423155&#34;</code></pre>
+
+  
+    
+  
+</div>
+    
+      <div class="section" id="section_vault-cert-auth">
+  
+  <h3 class="section-header"><a class="anchor-target" name="vault-cert-auth" href="#vault-cert-auth"></a>Using the <code>cert</code> auth backend</h3>
+  
+
+  <p>The <a href="https://www.vaultproject.io/docs/auth/cert.html"><code>cert</code></a> auth method allows authentication using SSL/TLS client certificates.</p><p>With this backend, the <a href="concourse-web.html"><code>web</code> node</a> is configured with a client cert and a client key. Vault must be configured with TLS, which you should be almost certainly be doing anyway.</p><p>The <code>cert</code> backend must first be configured in Vault. The backend is associated to a policy and a CA cert used to verify the client certificate. It may also be given the client certificate itself.</p><p>The <code>cert</code> backend must first be configured in Vault. Vault&#39;s <code>cert</code> backend allows for a few parameters which you may want to set to determine the lifecycle of its issued tokens:</p><dl>
+  
+  <dt><code>policies=names</code></dt>
+    <dd><p>This determines the policies (comma-separated) to set on each token. Be sure to set one that has access to the secrets path - see <a href="vault-credential-manager.html#configuring-the-secrets-engine">Configuring the secrets engine</a> for more information.</p></dd>
+  
+  <dt><code>ttl=duration</code></dt>
+    <dd><p>This determines the TTL for each token granted. The token can be continuously renewed, as long as it is renewed before the TTL elapses.</p></dd>
+  
+  <dt><code>max_ttl=duration</code></dt>
+    <dd><p>This sets a maximum lifetime for each token, after which the token can no longer be renewed.</p><p>If configured, be sure to set the same value on the <code>web</code> node so that it can re-auth before this duration is reached:</p><pre><code class="language-bash">CONCOURSE_VAULT_AUTH_BACKEND_MAX_TTL=1h</code></pre></dd>
+  
+  <dt><code>period=duration</code></dt>
+    <dd><p>If configured, tokens issued will be <a href="https://www.vaultproject.io/docs/concepts/tokens.html#periodic-tokens"><em>periodic</em></a>. Periodic tokens are not bound by any configured max TTL, and can be renewed continuously. It does not make sense to configure both <code>period</code> and <code>max_ttl</code> as the max TTL will be ignored.</p></dd>
+  
+</dl><pre><code class="language-bash">$ vault auth enable cert
+Success! Enabled cert auth method at: cert/
+$ vault write auth/cert/certs/concourse policies=concourse certificate=@out/vault-ca.crt ttl=1h
+Success! Data written to: auth/cert/certs/concourse</code></pre><p>Once that&#39;s all set up, you&#39;ll just need to configure the client cert and key on the <code>web</code> node like so:</p><pre><code class="language-bash">CONCOURSE_VAULT_AUTH_BACKEND=&#34;cert&#34;
+CONCOURSE_VAULT_CLIENT_CERT=vault-certs/concourse.crt
+CONCOURSE_VAULT_CLIENT_KEY=vault-certs/concourse.key</code></pre><p>In this case no additional auth params are necessary, as the Vault&#39;s TLS auth backend will check the certificate against all roles if no name is specified.</p>
+
+  
+    
+  
+</div>
+    
+  
+</div>
+    
+  
+</div>
+
+          <nav class="prev-next">
+          
+            <div class="prev">
+              prev:
+
+              
+              <span class="section-number">1.15.4</span>
+              
+
+              <a href="creds.html">Credential Management</a>
+            </div>
+          
+
+          
+            <div class="next">
+              next:
+
+              
+              <span class="section-number">1.15.4.2</span>
+              
+
+              <a href="credhub-credential-manager.html">The CredHub credential manager</a>
+            </div>
+          
+          </nav>
+        </div>
+
+        <div class="page-aside">
+          <div class="page-partial">
+            <div class="content">
+  <h2>Examples</h2>
+
+  <div class="example">
+  <h3>Docker Compose, Vault, <code>cert</code> auth</h3>
+
+  <p>Configuring Vault with TLS cert-based auth involves a few moving parts. The following example is not really meant for production, but hopefully it makes everything easier to understand by seeing how all the parts fit together.</p><p>First, grab the Docker Compose quick-start:</p><pre><code class="language-bash">$ wget https://concourse-ci.org/docker-compose.yml</code></pre><p>Next, let&#39;s generate all the certificates using <a href="https://github.com/square/certstrap"><code>certstrap</code></a> like so:</p><pre><code class="language-bash">certstrap init --cn vault-ca
+certstrap request-cert --domain vault --ip 127.0.0.1
+certstrap sign vault --CA vault-ca
+certstrap request-cert --cn concourse
+certstrap sign concourse --CA vault-ca
+mv out vault-certs</code></pre><p>Next we&#39;ll configure the Vault server to use the certs we made by creating <code>vault-config/config.hcl</code>:</p><pre><code class="language-hcl">listener &#34;tcp&#34; {
+  address = &#34;0.0.0.0:8200&#34;
+  tls_cert_file = &#34;/vault/certs/vault.crt&#34;
+  tls_key_file = &#34;/vault/certs/vault.key&#34;
+}
+
+storage &#34;file&#34; {
+  path = &#34;/vault/file&#34;
+}</code></pre><p>Next, let&#39;s create a <code>docker-compose.override.yml</code> override that will add Vault and configure cert-based auth:</p><pre><code class="language-yaml">version: &#39;3&#39;
+
+services:
+  concourse:
+    volumes:
+    - ./vault-certs:/vault-certs
+    environment:
+      CONCOURSE_VAULT_URL: https://vault:8200
+      CONCOURSE_VAULT_AUTH_BACKEND: cert
+      CONCOURSE_VAULT_CA_CERT: /vault-certs/vault-ca.crt
+      CONCOURSE_VAULT_CLIENT_CERT: /vault-certs/concourse.crt
+      CONCOURSE_VAULT_CLIENT_KEY: /vault-certs/concourse.key
+
+  vault:
+    image: vault
+    cap_add: [IPC_LOCK]
+    ports: [&#34;8200:8200&#34;]
+    volumes:
+    - ./vault-certs:/vault/certs
+    - ./vault-config:/vault/config
+    command: server</code></pre><p>From here, we just need to spin up the cluster:</p><pre><code class="language-bash">$ docker-compose up</code></pre><p>And...now everything should start blowing up! Vault is still sealed, so <a href="concourse-web.html"><code>web</code> node</a> can&#39;t log in.</p><p>Let&#39;s initialize Vault:</p><pre><code class="language-bash">$ export VAULT_CACERT=$PWD/vault-certs/vault-ca.crt
+$ vault operator init</code></pre><p>Make note of the 5 unseal keys and the root token, then run the following:</p><pre><code class="language-bash">$ vault operator unseal # paste unseal key 1
+$ vault operator unseal # paste unseal key 2
+$ vault operator unseal # paste unseal key 3
+$ vault login           # paste root token</code></pre><p>At this point Vault is unsealed and ready to go, except we haven&#39;t configured the <code>cert</code> backend yet.</p><p>First let&#39;s create a policy for Concourse, <code>concourse-policy.hcl</code>:</p><pre><code class="language-hcl">path &#34;concourse/*&#34; {
+  policy = &#34;read&#34;
+}</code></pre><p>Save this to <code>concourse-policy.hcl</code>, and then run:</p><pre><code class="language-bash">$ vault policy write concourse ./concourse-policy.hcl
+Success! Uploaded policy: concourse
+$ vault auth enable cert
+Success! Enabled cert auth method at: cert/
+$ vault write auth/cert/certs/concourse \
+    policies=concourse \
+    certificate=@vault-certs/vault-ca.crt \
+    ttl=1h</code></pre><p>At this point the <code>web</code> node should be able to log in successfully.</p>
+</div>
+</div>
+          </div>
+          </div>
+      </div>
+    </div>
+
+    <ul class="improve-docs">
+      <li><img src="images/icons/github-box.svg" /> <a href="https://github.com/concourse/docs">help improve this site</a></li>
+      <li><img src="images/booklit.svg" /> powered by <a href="https://vito.github.io/booklit">Booklit</a></li>
+    </ul>
+  </body>
+</html>
\ No newline at end of file
