<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>atmos Blog</title>
        <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog</link>
        <description>atmos Blog</description>
        <lastBuildDate>Thu, 09 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[See what changed before you update a vendored component]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-diff-and-update</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-diff-and-update</guid>
            <pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Bumping a vendored component to a newer version has always meant guessing. atmos vendor pull]]></description>
            <content:encoded><![CDATA[<p>Bumping a vendored component to a newer version has always meant guessing. <code>atmos vendor pull</code>
fetches whatever version is pinned — it doesn't tell you a newer one exists, and it definitely
doesn't show you what changed. Finding out meant a manual <code>git clone</code>, a <code>git diff</code> between two
tags, and then hand-editing the <code>version</code> field in <code>vendor.yaml</code> without breaking a comment or a
YAML anchor.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-diff-and-update#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Every vendored component in <code>vendor.yaml</code> pins a version, but nothing checked whether a newer one
was available or what it would change. Bumping a version meant three separate manual steps: check
upstream tags yourself, clone the repo somewhere to diff two versions, then edit the <code>version</code>
field by hand — risking a stripped comment or a mangled anchor, since most YAML tools rewrite the
whole file to make one change.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-fix">The Fix<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-diff-and-update#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>Two new commands close that loop, both built on Atmos's format-preserving <code>pkg/yaml</code> engine (the
same one behind <code>atmos config|stack|vendor get|set|delete</code>):</p>
<ul>
<li class=""><strong><code>atmos vendor update</code></strong> checks every Git-backed source in <code>vendor.yaml</code> for a newer version —
honoring each source's <code>constraints</code> (semver range, excluded versions, <code>no_prereleases</code>) — and
writes the new <code>version</code> in place, preserving comments, anchors, and <code>{{.Version}}</code> templates.
<code>--check</code> previews updates without writing anything; <code>--pull</code> runs <code>atmos vendor pull</code>
immediately after.</li>
<li class=""><strong><code>atmos vendor diff</code></strong> shows the Git diff between two versions (tags, branches, or commits) of a
component, with no local checkout — it clones to a temp directory and cleans up after itself.</li>
</ul>
<p>Both commands also work for components vendored purely through a per-component <code>component.yaml</code>
instead of a repo-level <code>vendor.yaml</code>, falling back to it the same way <code>atmos vendor pull</code> already
does (<code>vendor.yaml</code> wins if it declares the component). A repo with no <code>vendor.yaml</code> at all gets
this for free; <code>--component-manifests</code> runs the same sweep alongside an existing <code>vendor.yaml</code> for
repos that mix both styles, and <code>component.yaml</code> sources can declare their own <code>constraints</code>,
matching <code>vendor.yaml</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="how-to-use-it">How to Use It<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-diff-and-update#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Dry run: show what would update, without touching any files.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor update </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--check</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Update one component, or everything tagged 'networking'.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor update </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--component</span><span class="token plain"> vpc</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor update </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--tags</span><span class="token plain"> networking</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Update and immediately pull the new versions.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor update </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--pull</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Diff the current pinned version against the latest tag.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor </span><span class="token function" style="color:rgb(130, 170, 255)">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--component</span><span class="token plain"> vpc</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Diff two specific versions, restricted to one file.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor </span><span class="token function" style="color:rgb(130, 170, 255)">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-c</span><span class="token plain"> vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--from</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1.0</span><span class="token plain">.0 </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--to</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2.0</span><span class="token plain">.0 --diff-file variables.tf</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Works with component.yaml-only vendoring too — no vendor.yaml required.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor update </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--component</span><span class="token plain"> vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--check</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor </span><span class="token function" style="color:rgb(130, 170, 255)">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--component</span><span class="token plain"> vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--type</span><span class="token plain"> helmfile</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="also-fixed-vendorbase_path-and---chdir">Also Fixed: <code>vendor.base_path</code> and <code>--chdir</code><a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-diff-and-update#also-fixed-vendorbase_path-and---chdir" class="hash-link" aria-label="Direct link to also-fixed-vendorbase_path-and---chdir" title="Direct link to also-fixed-vendorbase_path-and---chdir" translate="no">​</a></h2>
<p><code>atmos --chdir=&lt;dir&gt; vendor update --check</code> (and <code>diff</code>/<code>get</code>/<code>set</code>) failed with "No vendor.yaml
found in the current directory" whenever <code>&lt;dir&gt;</code>'s <code>atmos.yaml</code> configured <code>vendor.base_path</code> to
anything other than a literal <code>./vendor.yaml</code> — common in <code>infra-live</code>-style repos. Vendor-wide
discovery only checked the process's working directory and ignored <code>atmos.yaml</code> entirely. All four
commands now resolve <code>vendor.base_path</code> (and <code>ATMOS_VENDOR_BASE_PATH</code>) the same way <code>atmos vendor pull</code> already does.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-diff-and-update#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/vendor/vendor-diff"><code>vendor diff</code></a> and
<a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/vendor/vendor-update"><code>vendor update</code></a> docs for the full flag reference, or open an
issue if you hit a vendoring setup this doesn't cover yet.</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Interactive Workflow & Command Steps Now Run in CI]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/interactive-steps-ci-defaults</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/interactive-steps-ci-defaults</guid>
            <pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[You built a slick interactive workflow — choose an account, input a release tag, then deploy. It is perfect on your laptop. Then CI runs it and everything stops with interactive terminal required for step. The prompts that make the workflow friendly locally are exactly what make it unrunnable in a pipeline, so you end up maintaining a second, prompt-free copy just for CI.]]></description>
            <content:encoded><![CDATA[<p>You built a slick interactive workflow — <code>choose</code> an account, <code>input</code> a release tag, then deploy. It is perfect on your laptop. Then CI runs it and everything stops with <code>interactive terminal required for step</code>. The prompts that make the workflow friendly locally are exactly what make it unrunnable in a pipeline, so you end up maintaining a second, prompt-free copy just for CI.</p>
<p>Interactive steps now fall back to their <code>default</code> value when there is no TTY, so the <em>same</em> workflow runs unattended in CI — no duplicate variant required.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/interactive-steps-ci-defaults#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Interactive step types (<code>choose</code>, <code>input</code>, <code>confirm</code>, <code>filter</code>, <code>file</code>, <code>write</code>) need a terminal to prompt you. In CI there is no TTY, so every one of them failed hard with <code>interactive terminal required for step</code>. The usual workaround was to fork your automation: an interactive version for humans and a flag-driven version for pipelines.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-fix">The Fix<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/interactive-steps-ci-defaults#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>When an interactive step has a <code>default</code> and there is no TTY, Atmos now uses that default instead of erroring. With a TTY it still prompts (using the default as the pre-selected value). Without a default, the existing error stands — so you never silently deploy an unintended value.</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">workflows</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">build-manifests</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> account</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> choose</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">prompt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"Account"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">dev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> prod</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!env</span><span class="token plain"> STACK_ACCOUNT dev</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> tag</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> input</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">prompt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"Release tag"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!env</span><span class="token plain"> RELEASE_TAG latest</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> shell</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos kube build "</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> .steps.account.value </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain">/tao" </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">tag "</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> .steps.tag.value </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain">"</span></span><br></div></code></pre></div></div>
<p>Locally, this prompts. In CI, it reads <code>STACK_ACCOUNT</code> / <code>RELEASE_TAG</code> (falling back to <code>dev</code> / <code>latest</code>), then runs the shell step with the captured values.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="dynamic-defaults-from-the-environment">Dynamic Defaults from the Environment<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/interactive-steps-ci-defaults#dynamic-defaults-from-the-environment" class="hash-link" aria-label="Direct link to Dynamic Defaults from the Environment" title="Direct link to Dynamic Defaults from the Environment" translate="no">​</a></h2>
<p>Defaults can come from the environment with the <code>!env</code> function (<code>!env VAR fallback</code>) in a workflow step's <code>default</code>, <code>prompt</code>, <code>options</code>, and <code>placeholder</code>. <code>!exec</code> is supported too. Custom commands defined in <code>atmos.yaml</code> already resolved <code>!env</code>; workflows now do as well.</p>
<p>Consuming those captured values in later <code>shell</code>/<code>atmos</code> steps (<code>{{ .steps.&lt;name&gt;.value }}</code>) works thanks to a companion fix that brought workflow command templating to parity with custom command steps.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="how-to-use-it">How to Use It<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/interactive-steps-ci-defaults#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<ul>
<li class="">Give each interactive step a <code>default</code> so it can run unattended.</li>
<li class="">Use <code>!env VAR fallback</code> to pull that default from the environment in CI.</li>
<li class="">Leave <code>default</code> off when a human must choose — the step still errors in CI, by design.</li>
</ul>
<p>The behavior is automatic based on TTY detection; there is no new flag to set. It applies to both workflows and custom commands, which share the same step engine.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/interactive-steps-ci-defaults#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Try converting one of your prompt-driven workflows to run in CI by adding <code>default</code> values, and let us know how it goes in <a href="https://github.com/cloudposse/atmos/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Record and Render Terminal Sessions with Atmos Cast]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/cast-record-render</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/cast-record-render</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos can now record terminal sessions as asciicast files and render them into]]></description>
            <content:encoded><![CDATA[<p>Atmos can now record terminal sessions as asciicast files and render them into
shareable formats for documentation, demos, and CI artifacts.</p>
<div class="language-bash codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-bash codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos cast render demo.cast </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--output</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">demo.gif</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos cast render demo.cast </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--output</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">demo.html</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos cast render demo.cast </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--output</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">demo.out </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">html</span><br></div></code></pre></div></div>
<p>The <code>render</code> command turns a recording into a rendered artifact — here it's converted straight to a GIF:</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos cast render</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p>Replaying a recording in the terminal with <code>play</code> reproduces it exactly as it was captured:</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos cast play</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p>And any command can capture its own session as it runs with <code>--cast</code>, no separate recording step required:</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">record a cast with --cast</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/cast-record-render#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The <code>atmos cast</code> command now has a render interface built around <code>--output</code> and
<code>--format</code>. Atmos infers the format from common output extensions such as
<code>.gif</code>, <code>.mp4</code>, <code>.html</code>, <code>.ascii</code>, <code>.png</code>, <code>.jpg</code>, and <code>.jpeg</code>, while
<code>--format</code> handles custom output filenames.</p>
<p>The same recording and rendering engine is also available to workflow and custom
command steps. That means a runbook can capture the exact terminal session it
executes, then turn the recording into an artifact without a separate wrapper
script.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="workflow-friendly-captures">Workflow-Friendly Captures<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/cast-record-render#workflow-friendly-captures" class="hash-link" aria-label="Direct link to Workflow-Friendly Captures" title="Direct link to Workflow-Friendly Captures" translate="no">​</a></h2>
<p>Cast support is designed for repeatable automation:</p>
<ul>
<li class="">Terminal output is recorded through the shared Atmos execution paths.</li>
<li class="">Final terminal state can be rendered as static text, HTML, or images.</li>
<li class="">Animated outputs are available for demos and walkthroughs.</li>
<li class="">Render options are explicit, so CI and local commands use the same interface.</li>
</ul>
<p>This is useful when a workflow needs to publish a proof-of-run artifact, attach a
terminal demo to documentation, or keep a reproducible recording of an
interactive command.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/cast-record-render#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<p>Teams often rely on external tools and custom shell scripts to capture terminal
demos. Bringing cast recording and rendering into Atmos makes those captures part
of the same command and workflow system that runs the work.</p>
<p>The result is easier to automate, easier to review, and easier to reproduce.</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Topic-Specific CLI Help]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/topic-specific-cli-help</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/topic-specific-cli-help</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos help showed too much at once. A simple command like atmos terraform plan --help explained the command, its examples, its own flags, compatibility flags, and every inherited global flag, which made the options you actually needed harder to find.]]></description>
            <content:encoded><![CDATA[<p>Atmos help showed too much at once. A simple command like <code>atmos terraform plan --help</code> explained the command, its examples, its own flags, compatibility flags, and every inherited global flag, which made the options you actually needed harder to find.</p>
<p>Topic-specific help fixes that by making default help focused, while keeping usage examples, command flags, and the full reference one flag away.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/topic-specific-cli-help#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Default <code>--help</code> now shows the command description, usage, examples, subcommands, and flags for that command. Atmos no longer dumps every inherited global flag by default, so command-specific options stay visible.</p>
<p>When you need a narrower or broader view, use a help topic:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--help</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">usage</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--help</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">flags</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--help</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">all</span><br></div></code></pre></div></div>
<p><code>--help=usage</code> shows just usage and examples. <code>--help=flags</code> shows command-specific flags, plus compatibility flags when Atmos forwards options to a native tool. <code>--help=all</code> restores the full reference view, including global flags.</p>
<p>Every default help page includes a short reminder:</p>
<div class="language-text codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-text codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">Use --help=usage for examples or --help=all for all flags and full help.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/topic-specific-cli-help#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>Less noise by default.</strong> Atmos still exposes global flags, but they no longer bury the flags that actually change the command you are reading about.</li>
<li class=""><strong>Examples are one command away.</strong> Atmos already maintains usage snippets in markdown help files, and those snippets now have their own focused view.</li>
<li class=""><strong>Full reference stays available.</strong> <code>--help=all</code> keeps the exhaustive output available for scripting, documentation, and deep inspection.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="try-it">Try It<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/topic-specific-cli-help#try-it" class="hash-link" aria-label="Direct link to Try It" title="Direct link to Try It" translate="no">​</a></h2>
<p>Compare the focused and full views:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--help</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--help</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">all</span><br></div></code></pre></div></div>
<p>Use <code>--help=usage</code> when you only need examples, and <code>--help=flags</code> when you are checking command-specific options.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[One Catalog for Every Version Pin: the Atmos Version Tracker]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-version-tracker</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-version-tracker</guid>
            <pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Your infrastructure's versions live everywhere except one place. actions/checkout@v4 in a dozen workflow files, TOFU_VERSION=1.9.0 in a Dockerfile, nginx a catalog in atmos.yaml, a deterministic lock file, policy-driven updates, and file managers that rewrite your workflows, Dockerfiles, and rendered files from the lock.]]></description>
            <content:encoded><![CDATA[<p>Your infrastructure's versions live everywhere except one place. <code>actions/checkout@v4</code> in a dozen workflow files, <code>TOFU_VERSION=1.9.0</code> in a Dockerfile, <code>nginx:1.27</code> in a stack, <code>kubectl</code> wherever your bootstrap script says. When a version needs to move, you grep and hope. When it shouldn't move, nothing enforces that either — and every unpinned mutable tag is a supply-chain incident waiting for its moment. The Atmos Version Tracker gives all of those versions a single source of truth: a catalog in <code>atmos.yaml</code>, a deterministic lock file, policy-driven updates, and file managers that rewrite your workflows, Dockerfiles, and rendered files from the lock.</p>
<p>Here's the same idea applied to vendored component versions:</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos component version vendoring</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p><a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/examples/demo-component-versions">View the full example</a></p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-version-tracker#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Version pins are configuration, but nobody manages them like configuration:</p>
<ul>
<li class=""><strong>No source of truth.</strong> The same tool version is repeated across workflow YAML, Dockerfiles, stack manifests, and CI scripts. Environments drift silently because there is nothing to drift <em>from</em>.</li>
<li class=""><strong>Bolt-on updaters don't understand your stacks.</strong> Renovate and Dependabot see files, not Atmos configuration. They can't resolve a version into a stack, don't know your tracks or environments, and produce PR noise you tune with regex managers instead of policy.</li>
<li class=""><strong>Mutable tags are a supply-chain risk.</strong> <code>actions/checkout@v4</code> and <code>nginx:latest</code> can change underneath you. Pinning to SHAs by hand is the fix everyone agrees on and nobody keeps up with.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-fix">The Fix<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-version-tracker#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>The Atmos Version Tracker makes external versions first-class Atmos configuration. You declare a catalog under <code>version:</code> in <code>atmos.yaml</code>; Atmos owns resolution, locking, policy, and file rewriting:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_JJ7b">atmos.yaml</div><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">track</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> prod</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">checkout</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">ecosystem</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">actions</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">package</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">desired</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v6</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">update</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">pin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> sha        </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># lock and render the immutable commit SHA</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">opentofu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">ecosystem</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> toolchain</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">package</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> opentofu</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">desired</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"~1.10"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">nginx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">ecosystem</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> oci</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">package</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> library/nginx</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">desired</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1.29.0"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">tracks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">prod</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">nginx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">          </span><span class="token key atrule">desired</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1.29.1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">files</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">actions</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">.github/workflows/</span><span class="token important">*.yaml</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> marker</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Dockerfile</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">manager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> template</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"**/*.tmpl"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span></span><br></div></code></pre></div></div>
<p>Resolved versions land in a committed <code>versions.lock.yaml</code>, so local runs and CI are deterministic. Updates are policy-driven — strategy caps (<code>major</code>/<code>minor</code>/<code>patch</code>), cooldown windows (<code>14d</code>, <code>2w</code>), include/exclude rules, and prerelease policy — and every version held back by policy is reported with the reason instead of silently skipped:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos version track update</span><br></div></code></pre></div></div>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">track</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> prod</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain"></span><span class="token key atrule">results</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> checkout</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v6.1.0</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v6.2.0</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">updated</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> nginx</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 1.29.0</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">updated</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">reason</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1.30.0 released 3d ago; cooldown 14d has not elapsed"</span></span><br></div></code></pre></div></div>
<p>File managers then rewrite your actual project files from the lock. Pinned entries get the immutable SHA with the human-readable version as a trailing comment — the same round-trip convention Renovate and Dependabot use:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_JJ7b">.github/workflows/ci.yaml</div><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@8edcb1bdb4e267140fa742c62e395cd74f332709 </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># v6.1.0</span><br></div></code></pre></div></div>
<p>Any text file with comments can carry a managed version via a marker annotation:</p>
<div class="language-dockerfile codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_JJ7b">Dockerfile</div><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># atmos:version opentofu</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(127, 219, 202)">ENV</span><span class="token instruction"> TOFU_VERSION=1.10.6</span></span><br></div></code></pre></div></div>
<p>And comment-hostile formats (like JSON) render from <code>*.tmpl</code> templates with the <code>.version</code> context. In stacks, <code>!version name</code> and <code>{{ .version.name }}</code> resolve from the lock, so versions stop being copy-pasted into stack manifests at all.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="how-to-use-it">How to Use It<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-version-tracker#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>Add an entry (the ecosystem is inferred from the package), lock, and apply:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos version track </span><span class="token function" style="color:rgb(130, 170, 255)">add</span><span class="token plain"> checkout </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--package</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">actions/checkout </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--pin</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">sha</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos version track lock      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># resolve desired versions into versions.lock.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos version track apply     </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># rewrite managed files from the lock</span><br></div></code></pre></div></div>
<p>Then gate CI on the whole thing staying honest:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_JJ7b">.github/workflows/version-check.yaml</div><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@v6</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos version track apply </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">check   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># fail if any managed file is stale</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos version track verify          </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># lock fresh AND files current</span></span><br></div></code></pre></div></div>
<p><code>atmos version track status</code> shows where you stand at any time — including <code>newer-available (blocked)</code> when a newer version exists upstream but your cooldown or strategy is deliberately holding it back. That's a passing state, not a failure: the locked version is exactly what your policy wants deployed.</p>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/version/track"><code>atmos version track</code> command reference</a> and <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/version/managed-versions">Managed Versions configuration</a> for the full surface, or try the runnable <a href="https://github.com/cloudposse/atmos/tree/main/examples/version-tracker" target="_blank" rel="noopener noreferrer" class=""><code>examples/version-tracker</code></a> example.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-version-tracker#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>If you've been stitching together Renovate configs to approximate this, we'd love to hear which datasources and ecosystems you need next. Open a discussion or issue in the <a href="https://github.com/cloudposse/atmos" target="_blank" rel="noopener noreferrer" class="">Atmos repo</a>, or join us in the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">Cloud Posse Slack</a>.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Command Aliases Can Now Set Your Defaults]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/command-path-aliases</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/command-path-aliases</guid>
            <pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sometimes the built-in command defaults do not match how your team actually works. When that happens, every run starts to collect the same extra flags: disable identity for a specific workflow, auto-approve a safe apply path, or skip function processing for a common describe command.]]></description>
            <content:encoded><![CDATA[<p>Sometimes the built-in command defaults do not match how your team actually works. When that happens, every run starts to collect the same extra flags: disable identity for a specific workflow, auto-approve a safe apply path, or skip function processing for a common describe command.</p>
<p>Atmos aliases can now encode those defaults directly. They behave more like shell aliases: rewrite argv prefixes before command parsing, and match full command paths, including subcommands.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/command-path-aliases#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The <code>aliases</code> section is now the single interface for shortcuts and command defaults. Alias keys and values are parsed like shell fields, the longest matching command path wins, and expansion happens before flag normalization.</p>
<p>That means a short alias can still point at a command:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">aliases</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">tp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> terraform plan</span></span><br></div></code></pre></div></div>
<p>And when a default flag belongs to a command or subcommand, the alias can define that too:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">aliases</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> terraform </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">identity=false</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">"terraform apply"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> terraform apply </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">approve</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">"describe component"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> describe component </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">process</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">functions=false</span></span><br></div></code></pre></div></div>
<p>Running <code>atmos terraform apply app -s dev</code> expands the command path first, then passes the remaining arguments through normal command and flag handling.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/command-path-aliases#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>One configuration surface.</strong> Aliases now cover both shortcuts and command defaults without a separate <code>args</code> section.</li>
<li class=""><strong>Subcommands work naturally.</strong> Multi-word aliases such as <code>"terraform apply"</code> can add behavior to one command path without affecting siblings like <code>terraform plan</code>.</li>
<li class=""><strong>User flags still win.</strong> Defaults injected by an alias appear earlier in argv, so explicit flags typed by the user later on the command line can override them.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/command-path-aliases#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/aliases">aliases configuration reference</a> for examples of shortcuts, same-name aliases, command-path aliases, and quoting rules.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Unsupported YAML Function Validation]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/unsupported-yaml-function-validation</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/unsupported-yaml-function-validation</guid>
            <pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now detects unsupported and misspelled YAML function tags before configuration]]></description>
            <content:encoded><![CDATA[<p>Atmos now detects unsupported and misspelled YAML function tags before configuration
processing continues. Invalid tags return a clear error with the supported Atmos YAML
functions, so typos fail fast instead of being silently treated as ordinary YAML.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/unsupported-yaml-function-validation#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Atmos validates explicit custom YAML tags during <code>atmos.yaml</code> and stack manifest
processing. If a tag is not one of the supported Atmos YAML functions, Atmos returns an
unsupported tag error that includes the valid options.</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">home</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!envv</span><span class="token plain"> HOME</span></span><br></div></code></pre></div></div>
<p>Instead of quietly accepting the misspelled <code>!envv</code> tag, Atmos reports that the tag is
unsupported and points users toward valid functions like <code>!env</code>, <code>!exec</code>, <code>!include</code>, and
the other supported YAML tags.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="exact-matching">Exact Matching<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/unsupported-yaml-function-validation#exact-matching" class="hash-link" aria-label="Direct link to Exact Matching" title="Direct link to Exact Matching" translate="no">​</a></h2>
<p>Validation uses exact tag matching. A misspelled function such as <code>!envv</code> no longer
matches the supported <code>!env</code> prefix, which prevents typos from slipping through parser
or resolver paths that previously checked only the beginning of a tag.</p>
<p>Standard YAML tags such as <code>!!str</code> continue to work normally.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/unsupported-yaml-function-validation#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<p>YAML functions are often used for dynamic values: environment variables, Terraform
outputs, secrets, Git metadata, and included files. A misspelled tag can otherwise hide
until much later in a deployment workflow, where the failure is harder to connect to the
original configuration.</p>
<p>Failing at parse or processing time makes the error immediate and actionable.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-started">Get Started<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/unsupported-yaml-function-validation#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>No configuration is required. Use the documented <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/functions/yaml">Atmos YAML functions</a>
as usual, and Atmos will report unsupported tags when it finds them.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Atmos Now Builds Atmos]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-builds-atmos</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-builds-atmos</guid>
            <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now builds itself through a first-class Atmos command:]]></description>
            <content:encoded><![CDATA[<p>Atmos now builds itself through a first-class Atmos command:</p>
<div class="language-bash codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-bash codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos build </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--target</span><span class="token plain"> linux</span><br></div></code></pre></div></div>
<p>We replaced the old Make-based build and CI entrypoints with Atmos custom commands to improve the developer experience and dogfood our own workflow engine. Build and test workflows now expose the flags developers actually care about, such as the target platform, while Atmos owns the shell details, cross-compilation wiring, output paths, and CI glue behind the command.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-builds-atmos#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The repository's development commands now live in <code>.atmos.d/</code> command groups instead of Make targets. The root <code>atmos.yaml</code> stays focused on project configuration, while the command surface is split by concern:</p>
<ul>
<li class=""><code>atmos build ...</code> for dependencies, binaries, versions, and docs generation.</li>
<li class=""><code>atmos test</code> plus mode flags for short, acceptance, coverage, and race-test workflows.</li>
<li class=""><code>atmos lint ...</code> for changed-file linting, custom lintroller rules, go.mod checks, and link checks.</li>
<li class=""><code>atmos check ...</code>, <code>atmos format ...</code>, and <code>atmos cache ...</code> for repository maintenance workflows.</li>
<li class=""><code>atmos screengrabs ...</code> for website screengrab generation.</li>
</ul>
<p>Makefiles remain only as migration guards. If someone runs an old target, the Makefile exits and points them to the Atmos command that replaced it.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="a-cleaner-command-surface">A Cleaner Command Surface<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-builds-atmos#a-cleaner-command-surface" class="hash-link" aria-label="Direct link to A Cleaner Command Surface" title="Direct link to A Cleaner Command Surface" translate="no">​</a></h2>
<p>The result is intentionally plain. The repository now has command groups that read like the workflows contributors actually run:</p>
<div class="language-bash codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-bash codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos build deps</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos build </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--target</span><span class="token plain"> linux</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">test</span><span class="token plain"> acceptance </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--cover</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos lint </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--changed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos screengrabs all</span><br></div></code></pre></div></div>
<p>This keeps the developer contract narrow. The command can grow flags like <code>--target</code> without forcing every contributor or CI job to understand the lower-level build minutia. Atmos handles the parsing, defaults, and orchestration once, and every caller gets the same behavior.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-builds-atmos#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<p>This is dogfooding in the useful sense: Atmos exercises its own custom command engine for the daily loops that maintain Atmos. That gives contributors one command vocabulary locally and in CI, and it gives us immediate feedback when custom commands need to become better.</p>
<p>It also removes a layer. CI now calls grouped Atmos commands such as <code>atmos build deps</code>, <code>atmos build --target linux</code>, and <code>atmos test acceptance --cover</code>. The screengrab workflow calls <code>atmos screengrabs all</code>. The install script has its own Linux, macOS, and Windows smoke test, so the installer path gets exercised directly too.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="try-the-pattern">Try the Pattern<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-builds-atmos#try-the-pattern" class="hash-link" aria-label="Direct link to Try the Pattern" title="Direct link to Try the Pattern" translate="no">​</a></h2>
<p>If you are maintaining a repo with an aging Makefile, <code>.atmos.d/</code> is a good place to split the command surface by concern. Keep project configuration in <code>atmos.yaml</code>; keep operational commands in grouped files such as <code>.atmos.d/build.yaml</code>, <code>.atmos.d/test.yaml</code>, and <code>.atmos.d/lint.yaml</code>.</p>
<p>For the general command schema, see the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/commands">custom commands documentation</a>. For a smaller standalone example, browse the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/examples/custom-commands">custom commands example</a>.</p>]]></content:encoded>
            <category>DX</category>
            <category>Core</category>
        </item>
        <item>
            <title><![CDATA[Clearer Help Sections and Error Explanations]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/help-command-groups-error-formatting</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/help-command-groups-error-formatting</guid>
            <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos help output now separates built-in commands from custom commands, and error output now makes explanations easier to scan without adding extra headings.]]></description>
            <content:encoded><![CDATA[<p>Atmos help output now separates built-in commands from custom commands, and error output now makes explanations easier to scan without adding extra headings.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/help-command-groups-error-formatting#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Command help now groups native Atmos commands under <strong>BUILT-IN COMMANDS</strong> and commands defined in <code>atmos.yaml</code> under <strong>CUSTOM COMMANDS</strong>. Teams with project-specific runbooks can now see what Atmos provides out of the box and what their repository adds locally.</p>
<p>Error formatting also got cleaner. Explanations render as a styled callout when color is enabled, while hints stay as direct, actionable lines. The formatter reserves room for callout padding before wrapping text, so long explanations stay aligned instead of reflowing inside the box.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/help-command-groups-error-formatting#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>Faster command discovery.</strong> Built-in commands and custom shortcuts no longer compete in one flat list.</li>
<li class=""><strong>Cleaner troubleshooting.</strong> Error explanations are visually distinct from hints without adding extra section headers.</li>
<li class=""><strong>More consistent output.</strong> Snapshot comparisons and stderr formatting now preserve intentional whitespace unless a test opts into trailing-whitespace tolerance.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/help-command-groups-error-formatting#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Run <code>atmos --help</code> or any command-specific <code>--help</code> page in a repository with custom commands to see the new grouping.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Native Container Image Summaries in CI]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-container-image-ci-summaries</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-container-image-ci-summaries</guid>
            <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos container builds and pushes now write rich image summaries directly to the CI job summary when]]></description>
            <content:encoded><![CDATA[<p>Atmos container builds and pushes now write rich image summaries directly to the CI job summary when
native CI is enabled. Use <code>type: container</code> workflow steps or <code>atmos container build/push</code> component
commands and GitHub Actions gets a readable image report without adding a separate Docker summary
action.</p>
<p>The summary includes the image reference, digest, image ID, OCI metadata, runtime configuration,
environment variables, labels, layer digests, and the formatted raw inspect JSON. Push summaries use
the pushed digest when the registry returns one, so reviewers can see the canonical artifact that was
published.</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">ci</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">summary</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span></span><br></div></code></pre></div></div>
<p>Summaries are best-effort. A successful build or push is not failed just because image inspection or
job-summary writing is unavailable. When <code>ci.summary.enabled: false</code> is set, Atmos skips the image
summary entirely.</p>
<p>This keeps native Atmos container pipelines self-contained: build, push, and review the image metadata
from the same workflow or component command you already run locally.</p>]]></content:encoded>
            <category>Feature</category>
            <category>ci</category>
        </item>
        <item>
            <title><![CDATA[Path-Based Custom Commands]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/path-based-custom-commands</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/path-based-custom-commands</guid>
            <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos custom commands now support path-based names. Instead of writing a deeply nested command tree just to describe a command path, you can put the full command path in name.]]></description>
            <content:encoded><![CDATA[<p>Atmos custom commands now support path-based names. Instead of writing a deeply nested command tree just to describe a command path, you can put the full command path in <code>name</code>.</p>
<p>The result is easier to read, easier to review, and keeps the same recursive merge behavior that existing custom commands rely on.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/path-based-custom-commands#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Before, command hierarchies had to be expressed as nested <code>commands</code> arrays:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> casts</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> generate</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> examples</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> custom</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">commands</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                </span><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> hello</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">greet</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Regenerate the Custom Commands example cast</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> shell</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos casts setup</span></span><br></div></code></pre></div></div>
<p>That shape is programmatically consistent, but it is not very friendly when the nesting only exists to spell out the command path.</p>
<p>Now you can write the same command as:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> casts generate examples custom</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">commands hello</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">greet</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Regenerate the Custom Commands example cast</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> shell</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos casts setup</span></span><br></div></code></pre></div></div>
<p>Atmos expands the path-based name into the normal recursive command tree before merging configuration.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="merge-behavior-is-preserved">Merge Behavior Is Preserved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/path-based-custom-commands#merge-behavior-is-preserved" class="hash-link" aria-label="Direct link to Merge Behavior Is Preserved" title="Direct link to Merge Behavior Is Preserved" translate="no">​</a></h2>
<p>This is syntax sugar, not a new command model. A command named <code>casts generate demo</code> is normalized to the same internal structure as:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> casts</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> generate</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> demo</span></span><br></div></code></pre></div></div>
<p>Because normalization happens before config merge and unmarshal, later configs and imports still override matching command fields by segment name. Nested <code>commands</code> arrays still merge recursively, and sibling commands that share a prefix still collapse into one command tree.</p>
<p>That means you can define a shared branch in one config:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> casts generate</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Generate casts</span></span><br></div></code></pre></div></div>
<p>And add leaves elsewhere:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> casts generate examples sops</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">secrets secret</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">lifecycle</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Regenerate the SOPS secrets example cast</span></span><br></div></code></pre></div></div>
<p>Atmos treats both definitions as part of the same <code>casts -&gt; generate</code> command branch.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="when-to-use-it">When to Use It<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/path-based-custom-commands#when-to-use-it" class="hash-link" aria-label="Direct link to When to Use It" title="Direct link to When to Use It" translate="no">​</a></h2>
<p>Use path-based names when the intermediate command levels do not carry their own behavior. This is ideal for demo generation, validation commands, and operational command groups where the path is the structure.</p>
<p>Keep the nested form when an intermediate command needs its own description, flags, environment, steps, or child-specific organization that is clearer when written explicitly.</p>
<p>Both forms can coexist. The important rule is simple: spaces in <code>commands[].name</code> are treated as command path separators, so literal spaces inside one command segment are not supported.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[See Atmos in Action]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Start with the recording.]]></description>
            <content:encoded><![CDATA[<p>Start with the recording.</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos terraform plan</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p>That is the point of this update: the docs now have short terminal casts for the parts of Atmos that are easier to understand by watching them run.</p>
<p>No big setup. No long pitch before the useful part. Open a page, press play, and see what happens.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="new-recordings">New Recordings<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows#new-recordings" class="hash-link" aria-label="Direct link to New Recordings" title="Direct link to New Recordings" translate="no">​</a></h2>
<p>The first set covers the runs people usually want to inspect first:</p>
<ul>
<li class="">plan</li>
<li class="">deploy</li>
<li class="">output</li>
<li class="">source pull</li>
<li class="">stack list</li>
<li class="">component details</li>
<li class="">stack details</li>
<li class="">local AWS demo</li>
</ul>
<p>Each cast is meant to answer the same question: what will I see when I run this?</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="plan-deploy-output">Plan, Deploy, Output<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows#plan-deploy-output" class="hash-link" aria-label="Direct link to Plan, Deploy, Output" title="Direct link to Plan, Deploy, Output" translate="no">​</a></h2>
<p>The plan cast starts the set. The next two show the follow-up runs:</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos terraform deploy</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos terraform output</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p>Together, they show the basic path from preview to apply to result.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="source-pull">Source Pull<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows#source-pull" class="hash-link" aria-label="Direct link to Source Pull" title="Direct link to Source Pull" translate="no">​</a></h2>
<p>This cast shows the source pull by itself:</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos vendor pull</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p>It is intentionally plain. You can see what is fetched and what the terminal prints when it finishes.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="look-around-first">Look Around First<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows#look-around-first" class="hash-link" aria-label="Direct link to Look Around First" title="Direct link to Look Around First" translate="no">​</a></h2>
<p>Sometimes the next step is to inspect the project before changing anything.</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos list stacks</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos describe component</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos describe stacks</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p>These casts show what Atmos sees before you ask it to do anything else.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="local-aws-demo">Local AWS Demo<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows#local-aws-demo" class="hash-link" aria-label="Direct link to Local AWS Demo" title="Direct link to Local AWS Demo" translate="no">​</a></h2>
<p>The longest cast shows a full local AWS run:</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos emulator aws lifecycle</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p>It brings the local service up, waits for it, runs against it, prints the result, and shuts it down.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="kept-current">Kept Current<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/atmos-demo-workflows#kept-current" class="hash-link" aria-label="Direct link to Kept Current" title="Direct link to Kept Current" translate="no">​</a></h2>
<p>The recordings are made by Atmos:</p>
<p><a href="https://github.com/cloudposse/atmos/blob/main/demo/casts/atmos.yaml" target="_blank" rel="noopener noreferrer" class="">github.com/cloudposse/atmos/blob/main/demo/casts/atmos.yaml</a></p>
<p>That file builds the binary, prepares the demo files, records the casts, copies them into the website, and checks the result.</p>
<p>The docs get a visible example. The repo gets a repeatable way to refresh it.</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Structured Diagnostics for Agentic Troubleshooting]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/diagnostics-jsonl</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/diagnostics-jsonl</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Human logs are useful while you are watching a command run, but they are not enough when you need to diagnose subprocess execution, CI failures, or agent runs after the fact.]]></description>
            <content:encoded><![CDATA[<p>Human logs are useful while you are watching a command run, but they are not enough when you need to diagnose subprocess execution, CI failures, or agent runs after the fact.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/diagnostics-jsonl#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>When a run fails, the important question is usually not "what did the terminal print?" It is "what command ran, with which arguments, from which directory, for how long, and how did it exit?"</p>
<p>Humans can sometimes reconstruct that from logs. Agents and support tooling should not have to scrape terminal prose to find the root cause.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-change">The Change<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/diagnostics-jsonl#the-change" class="hash-link" aria-label="Direct link to The Change" title="Direct link to The Change" translate="no">​</a></h2>
<p>Atmos now supports an opt-in diagnostics stream: machine-readable JSONL events written to a file.</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">diagnostics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">file</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> .atmos/diagnostics.jsonl</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">include_output</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span></span><br></div></code></pre></div></div>
<p>The same settings can be controlled with environment variables:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_DIAGNOSTICS_ENABLED</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">true </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_DIAGNOSTICS_FILE</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">.atmos/diagnostics.jsonl </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> plat-ue2-dev</span><br></div></code></pre></div></div>
<p>Because the output is JSONL, it is easy to inspect with tools like <code>jq</code>:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">jq </span><span class="token string" style="color:rgb(173, 219, 103)">'select(.type == "process.exit")'</span><span class="token plain"> .atmos/diagnostics.jsonl</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="diagnostics-vs-logging">Diagnostics vs. Logging<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/diagnostics-jsonl#diagnostics-vs-logging" class="hash-link" aria-label="Direct link to Diagnostics vs. Logging" title="Direct link to Diagnostics vs. Logging" translate="no">​</a></h2>
<p>Logs are human-readable status and narrative output. They explain what Atmos is doing for someone watching the run.</p>
<p>Diagnostics are machine-readable event records for tooling, agents, and post-run inspection. They are designed to accelerate root-cause analysis by giving agents structured facts about subprocesses, exits, durations, cancellation, and failures without requiring them to parse terminal output.</p>
<p><code>diagnostics.include_output</code> can include masked subprocess stdout and stderr chunks, but it is disabled by default. Diagnostic output is masked before it is written.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/diagnostics-jsonl#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>Agentic troubleshooting gets faster.</strong> Agents can reason from structured events, identify the failing step, and move from diagnosis to remediation.</li>
<li class=""><strong>CI artifacts become more useful.</strong> Save the JSONL file with a failed job and inspect it after the terminal session is gone.</li>
<li class=""><strong>Logs stay for people.</strong> Diagnostics add a tooling-oriented layer without replacing human-readable logs.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/diagnostics-jsonl#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Enable diagnostics when you need a structured troubleshooting artifact, especially for CI and agent-driven workflows.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Profiles Can Now Import Shared Configuration]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/profile-imports</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/profile-imports</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Auth profiles and team defaults are often managed centrally, but workload or app repositories still need to use them. Until now, that usually meant copying profile YAML into each repository and keeping those copies in sync by hand.]]></description>
            <content:encoded><![CDATA[<p>Auth profiles and team defaults are often managed centrally, but workload or app repositories still need to use them. Until now, that usually meant copying profile YAML into each repository and keeping those copies in sync by hand.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/profile-imports#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Many teams keep authentication, identity, terminal, and CI defaults in a central infrastructure repository. That works well for governance, but it creates friction for workload or app repositories: every repo needs the same profile definitions, and every update has to be copied everywhere.</p>
<p>That duplication is especially painful for auth profiles. The central platform team owns the provider and identity shape, while each app repository only wants to consume the right profile and add a small local override.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-change">The Change<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/profile-imports#the-change" class="hash-link" aria-label="Direct link to The Change" title="Direct link to The Change" translate="no">​</a></h2>
<p>Profile config files can now use <code>import:</code>, including remote imports. That means a profile in a workload or app repository can pull shared configuration from a central repository and then override only the local pieces it owns.</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_JJ7b">profiles/developer/atmos.yaml</div><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">import</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github.com/my-org/platform-atmos//profiles/shared-auth.yaml?ref=v1.4.0"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain"></span><span class="token key atrule">logs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">level</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Debug</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain"></span><span class="token key atrule">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">terminal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">max_width</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">140</span></span><br></div></code></pre></div></div>
<p>The imported file provides the baseline. Values in the local profile are merged over it, so the workload repository can keep its local preferences without forking the shared auth profile.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/profile-imports#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>Centralize auth profiles.</strong> Platform teams can publish shared provider and identity configuration once.</li>
<li class=""><strong>Keep app repos small.</strong> Workload or app repositories can consume the shared profile instead of duplicating it.</li>
<li class=""><strong>Override locally when needed.</strong> Imported profile configuration is still just layered Atmos configuration, so local profile values win.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/profile-imports#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/profiles">profiles documentation</a> for profile discovery, activation, and merge behavior.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Check Workflow Prerequisites with require and assert]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/require-assert-step</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/require-assert-step</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Workflows often depend on tools, files, and directories being present before they run. Without a first-class check, those prerequisites tend to hide inside brittle shell snippets and ad hoc command checks.]]></description>
            <content:encoded><![CDATA[<p>Workflows often depend on tools, files, and directories being present before they run. Without a first-class check, those prerequisites tend to hide inside brittle shell snippets and ad hoc command checks.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/require-assert-step#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Shell checks work until they have to be portable, readable, and friendly. A workflow might need <code>vhs</code>, <code>ffmpeg</code>, a generated config file, and a local output directory before the real work starts. Encoding that as inline shell makes the workflow harder to scan and usually produces a poor error when something is missing.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-change">The Change<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/require-assert-step#the-change" class="hash-link" aria-label="Direct link to The Change" title="Direct link to The Change" translate="no">​</a></h2>
<p>Atmos now has a declarative <code>require</code> step type for workflow and custom command prerequisites. The <code>assert</code> step type is an alias for the same behavior.</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> require recording tools</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> require</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">tools</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> vhs</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> ffmpeg</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">files</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> ./Taskfile.yml</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">dirs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> ./demo</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">hint</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"on macOS run: brew install vhs ffmpeg"</span></span><br></div></code></pre></div></div>
<p>The step checks that tools are executable on <code>PATH</code>, files exist, and directories exist. If anything is missing, Atmos fails fast with one aggregated error and the remediation hint.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/require-assert-step#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>Prerequisites are visible.</strong> The workflow declares what it needs before the work starts.</li>
<li class=""><strong>Errors are actionable.</strong> Missing tools and paths are reported together with a hint.</li>
<li class=""><strong>It is read-only.</strong> <code>require</code> never installs tools and never mutates <code>PATH</code>; use <code>dependencies.tools</code> when you want Atmos to manage tool installation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/require-assert-step#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/workflows/steps/type/require"><code>require</code> step reference</a> for all supported fields and examples.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Pace Terminal Output for Demos and Recordings]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terminal-speed</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terminal-speed</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Terminal demos and recordings are hard to follow when a command dumps hundreds of lines instantly. The output may be correct, but viewers cannot read it and recording tools capture a wall of text instead of a sequence.]]></description>
            <content:encoded><![CDATA[<p>Terminal demos and recordings are hard to follow when a command dumps hundreds of lines instantly. The output may be correct, but viewers cannot read it and recording tools capture a wall of text instead of a sequence.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terminal-speed#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Some Atmos commands produce rich, multi-line output that is useful in a real terminal but awkward in demos, docs, and recorded walkthroughs. When everything appears at once, important transitions are easy to miss.</p>
<p>That is especially noticeable with VHS recordings and scripted demos, where readable pacing matters as much as the final output.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-change">The Change<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terminal-speed#the-change" class="hash-link" aria-label="Direct link to The Change" title="Direct link to The Change" translate="no">​</a></h2>
<p>Atmos now supports <code>settings.terminal.speed</code>, also available as <code>ATMOS_TERMINAL_SPEED</code>, to pace terminal output by lines per second.</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">terminal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">speed</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">18</span></span><br></div></code></pre></div></div>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_TERMINAL_SPEED</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token number" style="color:rgb(247, 140, 108)">18</span><span class="token plain"> atmos describe stacks</span><br></div></code></pre></div></div>
<p>A value of <code>0</code> keeps the existing unlimited output behavior. That is the default, so normal interactive and CI usage does not change unless you opt in.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terminal-speed#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>Better recordings.</strong> Output appears at a readable pace for demos, tutorials, and screengrabs.</li>
<li class=""><strong>No command rewrites.</strong> Keep the same Atmos command and control pacing through config or an environment variable.</li>
<li class=""><strong>Default behavior is unchanged.</strong> Unlimited output remains the default.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terminal-speed#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/settings/terminal">terminal settings documentation</a> for the full terminal configuration reference.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Collapsible CI Log Groups for Workflows and Custom Commands]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ci-log-groups</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ci-log-groups</guid>
            <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A workflow fails in CI. You open the run and you're staring at two thousand lines of]]></description>
            <content:encoded><![CDATA[<p>A workflow fails in CI. You open the run and you're staring at two thousand lines of
undifferentiated output — <code>terraform init</code>, <code>plan</code>, and <code>apply</code> from every step mashed into one
endless scroll, with no marker for where one step ends and the next begins. Finding the step
that actually broke means scrolling and squinting.</p>
<p>Atmos now folds each workflow and custom-command step into its own collapsible, named log
group. You see the list of steps up front and expand only the one you care about.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ci-log-groups#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Workflows and custom commands run a sequence of steps, and in CI all of that output landed in
one flat log. The CI provider had no idea where one step stopped and the next started, so it
couldn't help you navigate. The usual fix is to hand-write <code>echo "::group::..."</code> around each
<code>run:</code> step — but Atmos steps aren't <code>run:</code> steps you control line by line, so there was no
clean place to put those markers. You scrolled.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-fix">The Fix<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ci-log-groups#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>Atmos now folds its output into the active CI provider's log groups. On GitHub Actions that's the
<code>::group::</code> / <code>::endgroup::</code> workflow commands, so the run log renders as a list of expandable
sections instead of a wall of text. A single <code>ci.groups.mode</code> picks the granularity — and because
CI providers can't nest groups, the mode is the one knob you need:</p>
<ul>
<li class="">
<p><strong><code>auto</code></strong> (default) — the finest grouping per command. A <strong>workflow</strong> renders one group per
step; a direct <strong><code>atmos terraform plan</code></strong> renders one group per phase (<code>init</code>, then <code>plan</code>):</p>
<div class="language-text codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-text codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">▸ deploy network          ▸ terraform init</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">▾ deploy cluster          ▾ terraform plan</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">  atmos terraform apply…    ... the plan you actually want ...</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">▸ smoke test</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong><code>invocation</code></strong> — one group around each whole <code>atmos &lt;command&gt;</code> run, including bare commands you
invoke directly from CI YAML.</p>
</li>
<li class="">
<p><strong><code>off</code></strong> — no grouping.</p>
</li>
</ul>
<p>A step that runs <code>atmos terraform apply</code> is one group, not three — the outermost group always wins.
You write nothing extra: no markers in your workflows, custom commands, or CI YAML.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="how-to-use-it">How to Use It<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ci-log-groups#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>It rides on the existing <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ci"><code>ci</code></a> configuration. Turn on CI integration and
grouping defaults to <code>auto</code>:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">ci</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># master switch</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">groups</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">mode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> auto    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># auto | invocation | off  (default: auto)</span></span><br></div></code></pre></div></div>
<p>Grouping is emitted only when <strong>both</strong> <code>ci.enabled</code> is <code>true</code> <strong>and</strong> a grouping-capable CI
provider is detected (GitHub Actions). Outside CI it's a complete no-op, so local runs look
exactly as before. You can also set it per-run with <code>ATMOS_CI_GROUPS_MODE</code>.</p>
<p>A couple of details keep it unobtrusive:</p>
<ul>
<li class=""><strong>No nested groups.</strong> When a command invokes <code>atmos</code> again (a custom command calling another, a
nested workflow, or a workflow step running <code>atmos terraform apply</code>), the child detects the open
group and stays flat — you always get one level of grouping.</li>
<li class=""><strong>Secret-safe labels.</strong> Group labels go through the same masking layer as the rest of Atmos
output, so a secret resolved into a step command or flag can't leak into the label.</li>
</ul>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ci/groups"><code>ci.groups</code></a> reference for the full configuration.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ci-log-groups#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Atmos is open source and we'd love your feedback. Join the conversation in the
<a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">Cloud Posse community</a> or open an issue on
<a href="https://github.com/cloudposse/atmos" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content:encoded>
            <category>Enhancement</category>
        </item>
        <item>
            <title><![CDATA[Run Ordered Steps in Lifecycle Hooks]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ordered-steps-hooks</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ordered-steps-hooks</guid>
            <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos lifecycle hooks can now run an ordered list of steps with kind: steps.]]></description>
            <content:encoded><![CDATA[<p>Atmos lifecycle hooks can now run an ordered list of steps with <code>kind: steps</code>.
Use it when one lifecycle event needs sequencing but the orchestration should
stay local to the component being operated on.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ordered-steps-hooks#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p><code>kind: step</code> runs one registered step type as a lifecycle hook. <code>kind: steps</code>
runs several registered step types in order:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">hooks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">test-fixtures-up</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">events</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">before.terraform.test</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> steps</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">on_failure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> fail</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> emulator</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">stack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> fixtures</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> up</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> terraform apply vpc </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s fixtures </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">approve</span></span><br></div></code></pre></div></div>
<p>The hook envelope stays the same: <code>events</code>, <code>when</code>, <code>on_failure</code>, <code>retry</code>, and
<code>env</code> are still hook-level controls. The ordered payload lives under <code>with:</code>,
the same conventional payload key used by <code>kind: step</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-this-matters">Why This Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ordered-steps-hooks#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Some test fixtures need real lifecycle ordering. For example, a component test
may need a local AWS emulator before it can provision a VPC fixture, and the
fixture must be destroyed after the test even if the test fails.</p>
<p>Before <code>kind: steps</code>, the choices were awkward:</p>
<ul>
<li class="">split the lifecycle across multiple hooks and rely on unordered map iteration,</li>
<li class="">move component-specific fixture setup into a custom command or workflow, or</li>
<li class="">fall back to a helper script.</li>
</ul>
<p><code>kind: steps</code> keeps the fixture lifecycle declarative and component-local:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">hooks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">test-fixtures-up</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">events</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">before.terraform.test</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> steps</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">on_failure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> fail</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> emulator</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">stack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> fixtures</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> up</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> terraform apply vpc </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s fixtures </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">approve</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token key atrule">test-fixtures-down</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">events</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">after.terraform.test</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">when</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> always</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> steps</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> terraform destroy vpc </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s fixtures </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">approve</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> emulator</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">stack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> fixtures</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> down</span></span><br></div></code></pre></div></div>
<p>Steps run in list order. If a step fails, Atmos stops the list and applies the
hook's <code>on_failure</code> policy. A hook-level <code>retry</code> retries the whole ordered list.</p>
<p>For Terraform tests, Atmos still owns the normal component preparation. It
generates the tested component varfile from the selected stack and can pass a
second generated test varfile from <code>test.vars</code>. Because <code>test.vars</code> resolves
after <code>before.terraform.test</code> hooks run, it can use <code>!terraform.state</code> to pass
fixture outputs into Terraform test without scripts.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="learn-more">Learn More<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ordered-steps-hooks#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/hooks#kind-steps-run-ordered-steps">Hooks reference</a> for the
full <code>kind: steps</code> syntax.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Flag-Aware Custom Commands and Dynamic Tables]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/flag-aware-custom-commands</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/flag-aware-custom-commands</guid>
            <pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Custom command steps can now read their own command-line flags through {{ .Flags. }}, and the table step templates its data, columns, and title per-step. Together they let you build flag-driven runbooks — rich, dynamic output assembled declaratively in atmos.yaml, no shell scripting required.]]></description>
            <content:encoded><![CDATA[<p>Custom command steps can now read their own command-line flags through <code>{{ .Flags.&lt;name&gt; }}</code>, and the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/workflows/steps/type/table"><code>table</code></a> step templates its <code>data</code>, <code>columns</code>, and <code>title</code> per-step. Together they let you build flag-driven runbooks — rich, dynamic output assembled declaratively in <code>atmos.yaml</code>, no shell scripting required.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="what-changed">What Changed<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/flag-aware-custom-commands#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Two things came together:</p>
<ol>
<li class=""><strong>Flags are now template variables.</strong> When a custom command declares flags, each one is exposed to its steps as <code>{{ .Flags.&lt;name&gt; }}</code>. Step titles, shell commands, working directories, and <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/workflows/steps/type/table"><code>table</code></a> data all resolve those values.</li>
<li class=""><strong><code>table</code> steps are fully templated.</strong> A <code>table</code> step's <code>title</code>, <code>columns</code>, and every cell in <code>data</code> are rendered as Go templates, so the table content can depend on flags and other <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/workflows/steps/type">step variables</a>.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="how-to-use-it">How to Use It<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/flag-aware-custom-commands#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>Here's a real example now shipping in <code>examples/demo-stacks</code> — a <code>platform</code> command group whose subcommands take a <code>--stack</code> flag and build their output from it:</p>
<div class="language-yaml codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-yaml codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A codeBlockLinesWithNumbering_UQ30" style="counter-reset:line-count 0"><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> platform</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Platform team shortcuts for stack discovery and day</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">two commands.</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">    </span><span class="token key atrule">commands</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> status</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Show stacks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> and common next actions for one stack.</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">flags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> stack</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">shorthand</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> s</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Target stack.</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">        </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> stage</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">title</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Components in </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> .Flags.stack </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> shell</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos list components </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> .Flags.stack </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> table</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">title</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Platform commands</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">columns</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> task</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> command</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">            </span><span class="token key atrule">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">task</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Show variables</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos list vars myapp </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> .Flags.stack </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">task</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Plan affected</span></span><br></div><div class="token-line codeLine_MYOh" style="color:#d6deeb"><span class="codeLineNumber_C7H_"></span><span class="codeLineContent_hnsy"><span class="token plain">                </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos terraform plan </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">affected</span></span><br></div></code></pre></div></div>
<p>Run it like any other command:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos platform status </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> plat-ue2-dev</span><br></div></code></pre></div></div>
<p>Every <code>{{ .Flags.stack }}</code> resolves to <code>plat-ue2-dev</code>, the stage titles and table rows fill in, and the shell steps run against the right stack.</p>
<div class="window_X9dN"><div class="titlebar_DN7h"><span class="dots_R2sg" aria-hidden="true"><i></i><i></i><i></i></span><span class="title_Dael">atmos interactive workflow steps</span></div><pre class="screen__b5c noPreWrap_ImkX screenLoading_abuO"><span> </span></pre><div class="controls_eyLV"><button type="button" class="playButton_kD9r" aria-label="Pause cast"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M6 5H8V19H6V5ZM16 5H18V19H16V5Z"></path></svg></button><input aria-label="Cast position" type="range" min="0" max="0" step="0.01" value="0"><span>00:00.0<!-- --> / <!-- -->00:00.0</span></div></div>
<p><a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/examples/interactive-workflows">View the full example</a></p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/flag-aware-custom-commands#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>Build your own shortcuts.</strong> Wrap your team's day-two operations — discovery, planning, secret access — into named commands that adapt to their flags.</li>
<li class=""><strong>Rich output without scripts.</strong> Tables, staged sections, and dynamic titles are declared in YAML, not hand-rolled in bash with <code>printf</code> and <code>column</code>.</li>
<li class=""><strong>Consistent across workflows and custom commands.</strong> The same step library powers both, so what you learn in one applies to the other.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/flag-aware-custom-commands#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/workflows/steps/type">workflow step types</a> and the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/workflows/steps/type/table"><code>table</code> step</a> reference to start building. Share what you create with the <a href="https://github.com/cloudposse/atmos" target="_blank" rel="noopener noreferrer" class="">Atmos community</a>.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Visualize Component Dependencies as a Tree]]></title>
            <link>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/list-dependencies</link>
            <guid>https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/list-dependencies</guid>
            <pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The new atmos list dependencies command renders the dependency relationships between your components as a tree — showing, for every component, both what it depends on and what depends on it. It reads dependencies.components (preferred) and the legacy settings.depends_on, so the output stays consistent with atmos describe dependents.]]></description>
            <content:encoded><![CDATA[<p>The new <code>atmos list dependencies</code> command renders the dependency relationships between your components as a tree — showing, for every component, both what it <strong>depends on</strong> and what <strong>depends on it</strong>. It reads <code>dependencies.components</code> (preferred) and the legacy <code>settings.depends_on</code>, so the output stays consistent with <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/describe/dependents"><code>atmos describe dependents</code></a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-problem">The Problem<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/list-dependencies#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>As infrastructure grows, the relationships between components matter as much as the components themselves. A <code>vpc</code> is a prerequisite for the <code>eks</code> cluster, which is a prerequisite for the <code>alb-controller</code>, and so on. Until now, answering "what would break if I change this?" or "what has to exist before I deploy that?" meant reading <code>atmos describe dependents</code> for one component at a time and stitching the picture together in your head.</p>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="the-solution">The Solution<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/list-dependencies#the-solution" class="hash-link" aria-label="Direct link to The Solution" title="Direct link to The Solution" translate="no">​</a></h2>
<p><code>atmos list dependencies</code> gives you the whole graph at a glance, as a tree:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos list dependencies</span><br></div></code></pre></div></div>
<p>Tree output keeps stack context next to the component hierarchy, with component
type as secondary metadata on the right:</p>
<div class="language-text codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-text codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token plain">Dependencies</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">Stack         Component                 Type</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">plat-ue2-dev  app-config                terraform</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">              ├──depends on ↓</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">              │  ├──▶ dynamodb-table</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">              │  └──▶ kms-key</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">              └──required by ↑</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">                 └──(none)</span><br></div></code></pre></div></div>
<p>Triangle markers show edge direction: <code>▶</code> means the component depends on that
child, and <code>◀</code> means that child depends on the selected component.</p>
<p>By default it walks every component and renders <strong>both directions</strong> — prerequisites and dependents. Scope it to a stack, focus on a single component, pick a direction, or emit structured data instead:</p>
<div class="language-shell codeBlockContainer_W6UR theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_gU9i"><pre tabindex="0" class="prism-code language-shell codeBlock_dlrW thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_YA7A"><div class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Limit to one stack</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos list dependencies </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> plat-ue2-dev</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Focus on a single component in a stack</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos list dependencies vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> plat-ue2-dev</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Only what the component depends on (its prerequisites)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos list dependencies vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> plat-ue2-dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--direction</span><span class="token plain"> forward</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Only what depends on the component (its dependents)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos list dependencies vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> plat-ue2-dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--direction</span><span class="token plain"> reverse</span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Machine-readable output for scripts and CI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#d6deeb"><span class="token plain">atmos list dependencies </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> json</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="why-it-matters">Why It Matters<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/list-dependencies#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h2>
<ul>
<li class=""><strong>See blast radius before you change anything.</strong> <code>--direction reverse</code> answers "what depends on this?" so you know what a change could affect.</li>
<li class=""><strong>Understand deployment order.</strong> <code>--direction forward</code> shows prerequisites, so you know what must exist first.</li>
<li class=""><strong>Consistent with the rest of Atmos.</strong> Dependencies come from the same <code>dependencies.components</code> / <code>settings.depends_on</code> sources used by <code>atmos describe dependents</code>, so the tree never contradicts your CI change-detection.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_K69Q" id="get-involved">Get Involved<a href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/list-dependencies#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2572.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/list/dependencies"><code>atmos list dependencies</code></a> reference for all flags and output formats. As always, feedback and ideas are welcome in the <a href="https://github.com/cloudposse/atmos" target="_blank" rel="noopener noreferrer" class="">Atmos community</a>.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
    </channel>
</rss>