<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0"><channel><title>Pulumi Blog: Product launches</title><link>https://www.pulumi.com/blog/tag/product-launches/</link><description>Pulumi blog posts: Product launches.</description><language>en-us</language><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><item><title>Sign in to Pulumi Cloud with Passkeys</title><link>https://www.pulumi.com/blog/passkey-support-in-pulumi-cloud/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://www.pulumi.com/blog/passkey-support-in-pulumi-cloud/</guid><description>
&lt;img src="https://www.pulumi.com/blog/passkey-support-in-pulumi-cloud/meta.png" /&gt;
&lt;p&gt;Pulumi Cloud now supports passkeys for users who sign in with email and password. Select a button, approve with Touch ID, Face ID, Windows Hello, or your hardware key, and you&amp;rsquo;re signed in.&lt;/p&gt;
&lt;p&gt;A passkey is a public-key credential stored on your device: your phone, your laptop, a hardware key (YubiKey, Google Titan, etc.), or your password manager can all function as the authenticator. When you sign in, your device authenticates you locally and signs a challenge from Pulumi Cloud with the private key.&lt;/p&gt;
&lt;p&gt;The private key stays on your device — Pulumi Cloud never sees or stores it. Passkeys are built on the &lt;a href="https://www.w3.org/TR/webauthn-3/"&gt;WebAuthn&lt;/a&gt; standard, so they&amp;rsquo;re already supported on every major browser and operating system.&lt;/p&gt;
&lt;h2 id="who-this-is-for"&gt;Who this is for&lt;/h2&gt;
&lt;p&gt;This release applies to users who sign in to Pulumi Cloud with an email address and password. If you sign in through an identity provider (IdP), such as GitHub OAuth, GitLab, Bitbucket, Google, or your organization&amp;rsquo;s SAML SSO, your existing flow is unchanged.&lt;/p&gt;
&lt;h2 id="why-passkeys"&gt;Why passkeys&lt;/h2&gt;
&lt;p&gt;Passwords have always been the weakest link in account security. Since they are shared secrets, they are vulnerable to phishing attacks, and every place you type one is a place that can be impersonated or a data store that can be leaked. Passkeys swap that out for a per-site key pair that lives on your device:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phishing-resistant by design.&lt;/strong&gt; A passkey is bound to the exact origin it was registered for. A look-alike domain can&amp;rsquo;t trigger your authenticator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Synced across your devices.&lt;/strong&gt; Apple iCloud Keychain, Google Password Manager, 1Password, Dashlane, Bitwarden: most credential managers now sync passkeys end-to-end-encrypted to every device you&amp;rsquo;ve signed in on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discoverable.&lt;/strong&gt; Pulumi Cloud doesn&amp;rsquo;t need to know which user you are before you authenticate. Just select &amp;ldquo;Sign in with a passkey&amp;rdquo; and your device offers the right credential.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing to remember.&lt;/strong&gt; A passkey lives on your device. There&amp;rsquo;s no string to memorize, and no sensitive credential stored by us.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setting-up-a-passkey"&gt;Setting up a passkey&lt;/h2&gt;
&lt;p&gt;The next time you sign in with a password, Pulumi Cloud will ask if you&amp;rsquo;d like to configure a passkey. It&amp;rsquo;s a single-step prompt, so you can enroll once and take advantage of passkeys on every subsequent sign-in.&lt;/p&gt;
&lt;p&gt;If you dismiss the prompt and would like to add one later, or want to add multiple passkeys, navigate to &lt;strong&gt;Account Settings → Passkeys&lt;/strong&gt; under your user profile. Select &lt;strong&gt;Register a passkey&lt;/strong&gt;, complete the OS-level prompt (Touch ID, Face ID, Windows Hello, or your hardware key), and you&amp;rsquo;re done. Pulumi Cloud will pick a sensible default name like &lt;code&gt;&amp;quot;iCloud Keychain&amp;quot;&lt;/code&gt; or &lt;code&gt;&amp;quot;Chrome on macOS&amp;quot;&lt;/code&gt; based on the authenticator, but you can rename it inline anytime under &lt;strong&gt;Account Settings → Passkeys&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/passkey-support-in-pulumi-cloud/account-settings-passkeys.png" alt="Pulumi Cloud Account Settings page showing the Passkeys section, with a &amp;ldquo;Register a passkey&amp;rdquo; button and an enrolled passkey named &amp;ldquo;Pulumipus&amp;rsquo;s iPhone&amp;rdquo;."&gt;&lt;/p&gt;
&lt;p&gt;You can register as many passkeys as you want. Typical setups are one per personal device, or one synced credential plus a hardware key as backup. Removing a passkey takes effect immediately; deleted credentials cannot be used to sign in.&lt;/p&gt;
&lt;h2 id="signing-in"&gt;Signing in&lt;/h2&gt;
&lt;p&gt;Depending on how you arrive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explicit sign-in.&lt;/strong&gt; On the sign-in page, select &lt;strong&gt;Sign in with a passkey&lt;/strong&gt;. Your browser opens the passkey picker, and you authenticate from there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autofill.&lt;/strong&gt; If your browser supports &lt;a href="https://web.dev/articles/passkey-form-autofill"&gt;conditional mediation&lt;/a&gt; (Chrome, Safari, Edge, recent Firefox), the email field on the sign-in page proactively offers your registered passkeys as autofill suggestions. Pick one and you&amp;rsquo;re signed in.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-about-my-existing-password-and-mfa"&gt;What about my existing password and MFA?&lt;/h2&gt;
&lt;p&gt;Your existing password still works. Passkeys are an additional sign-in option, not a replacement, and they don&amp;rsquo;t disable password sign-in on your account. If you lose access to every registered passkey, you can still sign in with your email and password as you always have, then register a new passkey from settings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other 2FA still applies.&lt;/strong&gt; If you have TOTP-based MFA enabled on your Pulumi account, a passkey sign-in will still prompt for your second factor. WebAuthn doesn&amp;rsquo;t reliably tell us &lt;em&gt;how&lt;/em&gt; you unlocked the passkey on your device (biometric, PIN, or something weaker), so we can&amp;rsquo;t safely treat the passkey itself as proof of two factors. Your existing MFA configuration remains the boundary it always was.&lt;/p&gt;
&lt;h2 id="try-it-out"&gt;Try it out&lt;/h2&gt;
&lt;p&gt;Passkey support is generally available today for every Pulumi Cloud user who signs in with email and password, at no additional cost and with no configuration. Visit &lt;a href="https://app.pulumi.com/account/profile"&gt;your account settings&lt;/a&gt; to register your first passkey, and let us know what you think on &lt;a href="https://slack.pulumi.com/"&gt;our community Slack&lt;/a&gt; or &lt;a href="https://github.com/pulumi/pulumi/issues"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><author>Devon Grove</author><category>features</category><category>security</category><category>product-launches</category></item><item><title>Introducing pulumi do: Direct Resource Operations for Any Cloud</title><link>https://www.pulumi.com/blog/pulumi-do-direct-resource-operations/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://www.pulumi.com/blog/pulumi-do-direct-resource-operations/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/pulumi-do-direct-resource-operations/index.png" /&gt;
&lt;p&gt;Infrastructure as code is the right model for production systems. State tracking, drift detection, and repeatable deployments all matter when you&amp;rsquo;re managing real workloads.&lt;/p&gt;
&lt;p&gt;But sometimes, you also need a quick, one-off interaction with the cloud: create a bucket or a database, look up a VPC, delete a stray resource.&lt;/p&gt;
&lt;p&gt;Today we&amp;rsquo;re introducing &lt;code&gt;pulumi do&lt;/code&gt;, a new command for direct resource operations. With &lt;code&gt;pulumi do&lt;/code&gt;, you can create, read, update, delete, and query any cloud resource from the terminal with a single command, across thousands of Pulumi-supported providers — no project, code, or state required.&lt;/p&gt;
&lt;h2 id="the-problem-sometimes-iac-is-more-than-you-need"&gt;The problem: Sometimes IaC is more than you need&lt;/h2&gt;
&lt;p&gt;When you&amp;rsquo;re managing production workloads, IaC is the proven solution. Code lets you declare complex systems, state tracking catches drift before it becomes a problem, dependency graphs sequence changes safely, and policy keeps everything in bounds. That full lifecycle, especially with the backing of a platform like Pulumi Cloud, is exactly what you want to build systems that scale.&lt;/p&gt;
&lt;p&gt;But when you (or your coding agent) need an ad-hoc Postgres database, the simplest path with IaC still takes several steps: make a directory, create a project, configure your credentials, write the code, preview, deploy. It works, but it&amp;rsquo;s not always necessary for what should be a simple operation. &lt;code&gt;pulumi do&lt;/code&gt; collapses all of those steps into one, using the same Pulumi providers, resource model, and ecosystem that powers the core Pulumi platform.&lt;/p&gt;
&lt;p&gt;Resource creation is also only part of the problem. As Joe laid out in &lt;a href="https://www.pulumi.com/blog/the-agentic-infrastructure-era/"&gt;The Agentic Infrastructure Era&lt;/a&gt;, the real challenge for AI agents isn&amp;rsquo;t with code or CLI commands, it&amp;rsquo;s with everything else: getting a cloud account, resolving credentials, wiring configuration across multiple services. &lt;a href="https://www.pulumi.com/docs/administration/organizations-teams/agent-accounts/"&gt;Agent accounts&lt;/a&gt;, also &lt;a href="https://www.pulumi.com/releases/agentic-infrastructure-era/"&gt;released this week&lt;/a&gt;, simplify this by letting an agent provision its own ephemeral Pulumi Cloud account, and &lt;a href="https://www.pulumi.com/docs/esc/"&gt;Pulumi ESC&lt;/a&gt; takes care of consolidating credentials across providers. Together, with &lt;code&gt;pulumi do&lt;/code&gt;, agents can now go from zero to deployed infrastructure without requiring a human in the loop — and when that one-off resource needs to grow into a more permanent system, there&amp;rsquo;s a clear graduation path back to full Pulumi IaC.&lt;/p&gt;
&lt;h2 id="what-it-looks-like"&gt;What it looks like&lt;/h2&gt;
&lt;p&gt;As an example, say you wanted to provision an S3 bucket. With the AWS CLI, you&amp;rsquo;d need to assemble an &lt;code&gt;aws s3api create-bucket&lt;/code&gt; invocation with the right set of command-line flags, region constraints, a globally unique name, and so on. With &lt;code&gt;pulumi do&lt;/code&gt;, it&amp;rsquo;s just this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket create
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That might not look all that different on the surface — but because you&amp;rsquo;re using the Pulumi engine and resource model, you can provide a minimal set of input properties, take advantage of provider-defined defaults, and use Pulumi&amp;rsquo;s &lt;a href="https://www.pulumi.com/docs/iac/concepts/resources/names/"&gt;auto-naming&lt;/a&gt; feature to give the bucket a unique name automatically:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket create
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This will create aws:s3/bucket:Bucket with the following inputs:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;bucket&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;bucket-279ea56&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tagsAll&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please confirm that this is what you&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;d like to &lt;span class="k"&gt;do&lt;/span&gt; by typing &lt;span class="sb"&gt;`&lt;/span&gt;yes&lt;span class="sb"&gt;`&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Answer &lt;code&gt;yes&lt;/code&gt; (or just pass &lt;code&gt;--yes&lt;/code&gt;), and you&amp;rsquo;re done. To delete the bucket:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket delete bucket-279ea56 --yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Need to look up an existing resource? Use a &lt;a href="https://www.pulumi.com/docs/iac/concepts/functions/provider-functions/"&gt;provider function&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:ec2:getVpc --default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;arn&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;arn:aws:ec2:us-west-2:663782525873:vpc/vpc-d7b311af&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;cidrBlock&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;172.31.0.0/16&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;enableDnsHostnames&amp;#34;&lt;/span&gt;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;enableDnsSupport&amp;#34;&lt;/span&gt;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;enableNetworkAddressUsageMetrics&amp;#34;&lt;/span&gt;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;vpc-d7b311af&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Same CLI, same output contract, same provider ecosystem.&lt;/p&gt;
&lt;h3 id="the-command-shape"&gt;The command shape&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;do&lt;/code&gt; command accepts a Pulumi resource type, or &lt;a href="https://www.pulumi.com/docs/iac/concepts/resources/names/#types"&gt;&lt;em&gt;type token&lt;/em&gt;&lt;/a&gt;, to determine the action to take. Type tokens have the form &lt;code&gt;&amp;lt;package:module:resource&amp;gt;&lt;/code&gt;. For example, &lt;code&gt;aws:s3:Bucket&lt;/code&gt; refers to the &lt;a href="https://www.pulumi.com/registry/packages/aws/api-docs/s3/bucket/"&gt;Amazon S3 Bucket resource&lt;/a&gt; that belongs to the &lt;code&gt;s3&lt;/code&gt; module of the &lt;code&gt;aws&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;You can also provide a portion of the token to help you find what you&amp;rsquo;re looking for without ever having to leave the terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Functions and resources &lt;span class="k"&gt;for&lt;/span&gt; the s3 module.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Run &lt;span class="s1"&gt;&amp;#39;pulumi do &amp;lt;module/resource/function&amp;gt; --help&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; more details on usage.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Functions:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:getAccessPoint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:getAccountPublicAccessBlock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:getBucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:getBucketObject
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Resources:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:AccessPoint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:AccountPublicAccessBlock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:AnalyticsConfiguration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws:s3:Bucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket &lt;span class="nb"&gt;read&lt;/span&gt; bucket-d20976f
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;arn&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;arn:aws:s3:::bucket-d20976f&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;bucket&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;bucket-d20976f&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;bucketDomainName&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;bucket-d20976f.s3.amazonaws.com&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;bucketNamespace&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;global&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The package, module, and resource/function segments all come directly from the Pulumi provider schema, so &lt;code&gt;--help&lt;/code&gt; works at every level of the tree. Pass a package name, optional module, and optional function or resource type, and &lt;code&gt;do&lt;/code&gt; returns the appropriate level of detail.&lt;/p&gt;
&lt;p&gt;You can also provide the input properties of a resource in a YAML or JSON file with the &lt;code&gt;--input&lt;/code&gt; option. To create a container service in Google Cloud Run for example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# service.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;us-central1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deletionProtection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;us-docker.pkg.dev/cloudrun/container/hello&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; gcp:cloudrunv2:Service create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --input yaml &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --input-file service.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This will create gcp:cloudrunv2/service:Service with the following inputs:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deletionProtection&amp;#34;&lt;/span&gt;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;location&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;us-central1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;service-b8af752&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;template&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;containers&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;us-docker.pkg.dev/cloudrun/container/hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The result:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;createTime&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2026-05-22T23:00:22.415839Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;urls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://service-b8af752-921927215178.us-central1.run.app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://service-b8af752-ctnulmzwoa-uc.a.run.app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="resource-operations"&gt;Resource operations&lt;/h3&gt;
&lt;p&gt;Most resources support the full set of CRUD operations — create, read, update, delete, and list — directly from the CLI. Each operation maps to a provider CRUD method using the same provider logic a full Pulumi program would use, and resources are addressable by their cloud provider IDs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a resource&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket create --yes &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s2"&gt;&amp;#34;.name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bucket-4f5cb22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Fetch it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket &lt;span class="nb"&gt;read&lt;/span&gt; bucket-4f5cb22 &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s2"&gt;&amp;#34;.hostedZoneId&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Z3BJ6K6RIION7M
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Update/patch it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket patch bucket-4f5cb22 --input yaml --input-file tags.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket &lt;span class="nb"&gt;read&lt;/span&gt; bucket-4f5cb22 &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s2"&gt;&amp;#34;.tags&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Delete it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws:s3:Bucket delete bucket-4f5cb22
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="provider-configuration"&gt;Provider configuration&lt;/h3&gt;
&lt;p&gt;Today, &lt;code&gt;pulumi do&lt;/code&gt; resolves provider configuration — for example, applying your AWS credentials — using environment variables or credential files as supported by each individual Pulumi provider. See the &lt;a href="https://www.pulumi.com/registry/"&gt;Pulumi Registry&lt;/a&gt; for provider-specific configuration details.&lt;/p&gt;
&lt;h2 id="designed-for-humans-and-agents"&gt;Designed for humans and agents&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve designed &lt;code&gt;pulumi do&lt;/code&gt; to serve humans and coding agents equally well, guided by three fundamental ideas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consistent command structure across every provider.&lt;/strong&gt; The &lt;code&gt;do &amp;lt;package:module:type&amp;gt; &amp;lt;operation&amp;gt;&lt;/code&gt; pattern is the same for AWS, Azure, Google Cloud, Kubernetes, Cloudflare, Datadog, and every provider, including packages containing higher-level &lt;a href="https://www.pulumi.com/docs/iac/concepts/components/"&gt;component resources&lt;/a&gt;. Once an agent learns that pattern, it applies across the board.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Predictable output contract.&lt;/strong&gt; JSON on stdout, progress on stderr, consistent exit codes. An agent can parse the result programmatically without scraping human-formatted tables.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A single CLI command that works across every cloud.&lt;/strong&gt; Many cloud and SaaS providers don&amp;rsquo;t have a full CLI at all. &lt;code&gt;pulumi do&lt;/code&gt; generates commands from the provider schema, so if a Pulumi provider exists for it, the CLI just works. Neither humans nor agents need to install, learn, or even know about cloud provider-specific tooling.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;Resource operations and provider functions are the foundation. The &lt;code&gt;pulumi do&lt;/code&gt; roadmap extends the same direct-operation model with credential management, state tracking, and a path to full IaC.&lt;/p&gt;
&lt;h3 id="unified-credentials-with-pulumi-esc"&gt;Unified credentials with Pulumi ESC&lt;/h3&gt;
&lt;p&gt;One of the hardest parts of multi-cloud operations is credential management. Every provider has its own authentication scheme, environment variables, and session lifecycle. An agent working across AWS, Cloudflare, and Datadog today manages three separate credential mechanisms.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re building &lt;a href="https://www.pulumi.com/docs/esc/"&gt;Pulumi ESC&lt;/a&gt; integration into &lt;code&gt;pulumi do&lt;/code&gt; so you can manage credentials in one place and resolve them everywhere. ESC handles credential resolution (including OIDC-based dynamic credential generation and short-lived tokens) across all of your providers. Name the credential set, reference it, and ESC does the rest, with rotation, RBAC, and audit built in.&lt;/p&gt;
&lt;h3 id="cross-resource-references"&gt;Cross-resource references&lt;/h3&gt;
&lt;p&gt;Real infrastructure has dependencies — subnets need VPCs, security group rules need their security groups, and so on. When you&amp;rsquo;re building resources one at a time, those references need to flow between commands somehow.&lt;/p&gt;
&lt;p&gt;A future version of &lt;code&gt;pulumi do&lt;/code&gt; will let resource inputs reference outputs from previously created resources, allowing the CLI to resolve them automatically and preserve the dependency graph. Later, when the time comes to graduate to a full IaC program, the generated code contains proper resource references rather than hard-coded strings.&lt;/p&gt;
&lt;h3 id="stateful-mode-and-the-graduation-path"&gt;Stateful mode and the graduation path&lt;/h3&gt;
&lt;p&gt;Today, &lt;code&gt;pulumi do&lt;/code&gt; is stateless. Each command runs independently. A planned stateful mode will persist resource state across operations, enabling drift detection, lifecycle management, and a graduation path to full infrastructure as code.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what we&amp;rsquo;re planning:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zero setup.&lt;/strong&gt; Your first &lt;code&gt;pulumi do&lt;/code&gt; implicitly creates a project and stack. No manual initialization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accumulate resources.&lt;/strong&gt; Each operation stores resource state. After a few commands, you have a lightweight representation of your infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Eject to a full project.&lt;/strong&gt; When the time comes, generate a Pulumi project in your chosen language with all resources imported and dependency graphs intact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect to Pulumi Cloud.&lt;/strong&gt; Layer on governance, compliance, team collaboration, and deployment automation through &lt;a href="https://www.pulumi.com/product/"&gt;Pulumi Cloud&lt;/a&gt;. Resources created via &lt;code&gt;pulumi do&lt;/code&gt; can be governed by &lt;a href="https://www.pulumi.com/product/insights-governance/"&gt;Pulumi Insights&lt;/a&gt; from day one, even before you opt into full IaC.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This path works because &lt;code&gt;pulumi do&lt;/code&gt; uses the same providers, resource types, and property schemas as every other &lt;code&gt;pulumi&lt;/code&gt; operation. Provisioned cloud resources stay where they are as management capabilities are added as needed.&lt;/p&gt;
&lt;h2 id="get-started"&gt;Get started&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pulumi do&lt;/code&gt; ships as a research preview in &lt;a href="https://github.com/pulumi/pulumi/releases/tag/v3.242.0"&gt;Pulumi CLI v3.242.0&lt;/a&gt; and later. Install or update the CLI, install a provider plugin, and start running commands. The &lt;a href="https://www.pulumi.com/docs/iac/cli/direct-resource-operations/"&gt;documentation&lt;/a&gt; has the full reference.&lt;/p&gt;
&lt;p&gt;We can&amp;rsquo;t wait to hear your feedback. &lt;a href="https://www.pulumi.com/docs/install/"&gt;Give it a try today&lt;/a&gt;, tell us what works (and what doesn&amp;rsquo;t), and help shape the CLI that agents and humans both reach for first.&lt;/p&gt;</description><author>Fraser Waters</author><author>Pat Gavlin</author><author>Arun Loganathan</author><author>Christian Nunciato</author><category>features</category><category>pulumi-cli</category><category>ai-agents</category><category>product-launches</category></item><item><title>Better CLI Interactions for Agents and Humans</title><link>https://www.pulumi.com/blog/better-cli-interactions-for-agents-and-humans/</link><pubDate>Tue, 19 May 2026 04:00:00 -0700</pubDate><guid>https://www.pulumi.com/blog/better-cli-interactions-for-agents-and-humans/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/better-cli-interactions-for-agents-and-humans/index.png" /&gt;
&lt;p&gt;AI agents do a lot of their work through CLIs. They&amp;rsquo;re easier to call than HTTP APIs and they produce predictable output. Over the last few months our own CLI traffic has shifted from mostly people typing commands to people and agents running commands together, often in the same session.&lt;/p&gt;
&lt;p&gt;Today we&amp;rsquo;re shipping a release built for both. The &lt;a href="https://www.pulumi.com/docs/iac/cli/"&gt;Pulumi CLI&lt;/a&gt; is reorganized around three ideas: the right command should be the one you can guess, anything you can do in &lt;a href="https://www.pulumi.com/product/pulumi-cloud/"&gt;Pulumi Cloud&lt;/a&gt; should also be doable from the terminal, and what comes back should be just as readable to an agent as it is to a person.&lt;/p&gt;
&lt;h2 id="designing-for-guessability"&gt;Designing for guessability&lt;/h2&gt;
&lt;p&gt;The bar we set was that both developers and coding agents should be able to guess at the right command for a particular task: &lt;code&gt;pulumi env edit&lt;/code&gt; to modify an environment, &lt;code&gt;pulumi stack get&lt;/code&gt; to see what&amp;rsquo;s going on with a stack, &lt;code&gt;pulumi org member list&lt;/code&gt; to see who&amp;rsquo;s on the team. If we had to explain which command did what, the usability bar hadn&amp;rsquo;t been met.&lt;/p&gt;
&lt;p&gt;Branches in the tree are now singular nouns like &lt;code&gt;stack&lt;/code&gt;, &lt;code&gt;env&lt;/code&gt;, &lt;code&gt;org&lt;/code&gt;, and &lt;code&gt;deployment&lt;/code&gt;. Leaves are now verbs from a canonical vocabulary — &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;set&lt;/code&gt;, &lt;code&gt;new&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt; — and they mean the same thing wherever they&amp;rsquo;re used. &lt;code&gt;edit&lt;/code&gt; always means &lt;em&gt;modify an existing thing&lt;/em&gt;. Wherever the old vocabulary differed, though, the old name still works: &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, and &lt;code&gt;open&lt;/code&gt; are all aliased to preserve backward compatibility.&lt;/p&gt;
&lt;p&gt;For the most part, product names have also been replaced with familiar nouns. Users (human or otherwise) don&amp;rsquo;t think in product names; they think in terms of resources, stacks, environments. For example, take &lt;a href="https://www.pulumi.com/esc/"&gt;Pulumi ESC&lt;/a&gt;: the product may be named ESC (and for a while the command was too), but nobody thinks &lt;em&gt;I need to initialize a new ESC&lt;/em&gt; — they think &lt;em&gt;I need to create a new environment&lt;/em&gt;. The command is therefore &lt;code&gt;pulumi env new&lt;/code&gt;, with &lt;code&gt;esc init&lt;/code&gt; preserved as an alias to avoid disrupting anyone&amp;rsquo;s existing workflows.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi env new my-project my-env
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment created.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="all-of-pulumi-cloud-in-the-terminal"&gt;All of Pulumi Cloud in the terminal&lt;/h2&gt;
&lt;p&gt;Up to now, most of what you could do with Pulumi Cloud had to be done either in the browser or through direct API calls. Things like reviewing deployments, setting up webhooks, finding non-compliant resources, or managing deployment settings all required you to break out &lt;code&gt;curl&lt;/code&gt; and hit the API docs or open a browser and navigate the Pulumi Cloud console.&lt;/p&gt;
&lt;p&gt;That changes today. Pulumi Cloud is now fully accessible from the command line through the &lt;code&gt;pulumi&lt;/code&gt; CLI, with consistently named nouns and verbs aligned to what you&amp;rsquo;d expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;pulumi stack get&lt;/code&gt; returns a complete stack overview, metadata, resource list, and more:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi stack get &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --stack cnunciato/chris.nunciato.org/production &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output json &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s2"&gt;&amp;#34;.resources[].type&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;aws:s3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws:s3:BucketEventSubscription
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws:s3/bucket:Bucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws:s3/bucket:Bucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws:s3/bucketPublicAccessBlock:BucketPublicAccessBlock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws:s3/bucketWebsiteConfiguration:BucketWebsiteConfiguration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws:s3/bucketOwnershipControls:BucketOwnershipControls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws:s3/bucketNotification:BucketNotification
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; with other stack-related commands like &lt;code&gt;pulumi stack history get events&lt;/code&gt;, &lt;code&gt;pulumi stack drift list&lt;/code&gt;, &lt;code&gt;pulumi stack schedule new&lt;/code&gt;, and &lt;code&gt;pulumi stack webhook new&lt;/code&gt; alongside it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Organizational commands like &lt;code&gt;pulumi org member list&lt;/code&gt;, &lt;code&gt;pulumi org role list&lt;/code&gt;, &lt;code&gt;pulumi org usage get&lt;/code&gt;, and &lt;code&gt;pulumi org audit-log export&lt;/code&gt; can help you dig into the details when you need to as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deployment-related commands like &lt;code&gt;pulumi deployment list&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;log&lt;/code&gt;, and &lt;code&gt;cancel&lt;/code&gt; let you see what&amp;rsquo;s running, dive into what happened, and take action without having to leave the terminal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi deployment list &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --stack cnunciato/chris.nunciato.org/production &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────────────────────────────┬───────────┬─────────┬───────────┬──────────────┬─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ID │ OPERATION │ VERSION │ STATUS │ INITIATED BY │ MODIFIED │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├──────────────────────────────────────┼───────────┼─────────┼───────────┼──────────────┼─────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 83e44b8c-643c-4e9f-9f36-0c6a81d9db2e │ update │ &lt;span class="m"&gt;140&lt;/span&gt; │ running │ cnunciato │ 2026-05-17 21:26:37.340 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 52a37cbe-b7fd-4027-8e0f-7b4785ab12e8 │ update │ &lt;span class="m"&gt;139&lt;/span&gt; │ succeeded │ cnunciato │ 2026-05-16 23:36:07.999 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 94e04525-b3a4-42b5-9987-e344018a3324 │ preview │ &lt;span class="m"&gt;138&lt;/span&gt; │ succeeded │ cnunciato │ 2026-05-16 23:29:19.709 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────────────────────────────────────┴───────────┴─────────┴───────────┴──────────────┴─────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And when you need to query across managed (and even unmanaged) resources, &lt;code&gt;pulumi insights resource search&lt;/code&gt; and &lt;code&gt;get&lt;/code&gt; can help you find what you&amp;rsquo;re looking for quickly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi insights resource search &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --query &lt;span class="s1"&gt;&amp;#39;type:aws:s3/bucket:Bucket org:cnunciato project:photomap stack:dev&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────────────────────────────────────────────────────────────────┬──────────────────────┬───────┬──────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ URN │ TYPE │ STACK │ MODIFIED │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├──────────────────────────────────────────────────────────────────────────┼──────────────────────┼───────┼──────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ urn:pulumi:dev::photomap::aws:apigateway:x:API&lt;span class="nv"&gt;$aws&lt;/span&gt;:s3/bucket:Bucket::api │ aws:s3/bucket:Bucket │ dev │ 2020-10-31T00:39:47.926Z │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ urn:pulumi:dev::photomap::aws:s3/bucket:Bucket::images │ aws:s3/bucket:Bucket │ dev │ 2020-10-31T00:39:47.926Z │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────────────────────────────────────────────────────────────────────────┴──────────────────────┴───────┴──────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Showing &lt;span class="m"&gt;2&lt;/span&gt; of &lt;span class="m"&gt;2&lt;/span&gt; resources.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flags and output formats are consistent across commands (&lt;code&gt;--output table&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;), as are the shapes of cross-cutting features like webhooks. If you&amp;rsquo;ve used &lt;code&gt;pulumi stack webhook&lt;/code&gt;, for example, you already know how to use &lt;code&gt;pulumi env webhook&lt;/code&gt; and &lt;code&gt;pulumi org webhook&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;h2 id="direct-access-to-the-pulumi-cloud-api"&gt;Direct access to the Pulumi Cloud API&lt;/h2&gt;
&lt;p&gt;For any features of Pulumi Cloud that don&amp;rsquo;t yet have their own commands, you&amp;rsquo;ve also got &lt;a href="https://www.pulumi.com/docs/iac/cli/api/"&gt;&lt;code&gt;pulumi api&lt;/code&gt;&lt;/a&gt;. It&amp;rsquo;s a &lt;code&gt;gh api&lt;/code&gt;-inspired command designed to give you direct access to the full REST API, without having to manage separate access tokens, auth settings, or request/response payloads. Everything is handled for you through your authenticated &lt;code&gt;pulumi&lt;/code&gt; CLI.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s even &lt;code&gt;pulumi api list&lt;/code&gt;, which enumerates every single endpoint that&amp;rsquo;s exposed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi api list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌───────────────┬────────┬───────────────────────────────────────┬──────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ TAG │ METHOD │ PATH │ SUMMARY │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├───────────────┼────────┼───────────────────────────────────────┼──────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AccessTokens │ GET │ /api/orgs/&lt;span class="o"&gt;{&lt;/span&gt;orgName&lt;span class="o"&gt;}&lt;/span&gt;/tokens │ ListOrgTokens │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AccessTokens │ POST │ /api/orgs/&lt;span class="o"&gt;{&lt;/span&gt;orgName&lt;span class="o"&gt;}&lt;/span&gt;/tokens │ CreateOrgToken │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AccessTokens │ DELETE │ /api/orgs/&lt;span class="o"&gt;{&lt;/span&gt;orgName&lt;span class="o"&gt;}&lt;/span&gt;/tokens/&lt;span class="o"&gt;{&lt;/span&gt;tokenId&lt;span class="o"&gt;}&lt;/span&gt; │ DeleteOrgToken │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AccessTokens │ GET │ /api/user/tokens │ ListPersonalTokens │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AccessTokens │ POST │ /api/user/tokens │ CreatePersonalToken │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AccessTokens │ DELETE │ /api/user/tokens/&lt;span class="o"&gt;{&lt;/span&gt;tokenId&lt;span class="o"&gt;}&lt;/span&gt; │ DeletePersonalToken │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;537&lt;/span&gt; operations. Pass --output&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="k"&gt;for&lt;/span&gt; a stable, scriptable contract.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To get the details about a particular API, use &lt;code&gt;pulumi api describe&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi api describe &lt;span class="s1"&gt;&amp;#39;DELETE /api/user/tokens/{tokenId}&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# or DeletePersonalToken&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DELETE /api/user/tokens/&lt;span class="o"&gt;{&lt;/span&gt;tokenId&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tag: AccessTokens
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Operation: DeletePersonalToken
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DeletePersonalToken
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Permanently deletes a personal access token by its identifier. The token is immediately
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;invalidated and can no longer be used &lt;span class="k"&gt;for&lt;/span&gt; authentication. Returns &lt;span class="m"&gt;204&lt;/span&gt; on success or &lt;span class="m"&gt;404&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; the token does not exist.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Parameters:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;path&lt;span class="o"&gt;]&lt;/span&gt; tokenId* &lt;span class="o"&gt;(&lt;/span&gt;string&lt;span class="o"&gt;)&lt;/span&gt; — The access token identifier
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All requests are made through your authenticated &lt;code&gt;pulumi&lt;/code&gt; CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Logged in to pulumi.com as cnunciato.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi whoami
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cnunciato
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi api /api/user/tokens/2cf15c7d-afad-458f-ace0-fc7ff0512b10 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --method DELETE &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Token deleted.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Token deleted.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Newly published endpoints are available through &lt;code&gt;pulumi api&lt;/code&gt; immediately, so you don&amp;rsquo;t have to wait for a new CLI release before you can start using them. See the &lt;a href="https://www.pulumi.com/docs/reference/cloud-rest-api/"&gt;Pulumi Cloud REST API documentation&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;h2 id="finding-templates-in-the-pulumi-cloud-registry"&gt;Finding templates in the Pulumi Cloud Registry&lt;/h2&gt;
&lt;p&gt;Finding out which templates are available to you through your Pulumi organization used to mean having to navigate to the &lt;a href="https://www.pulumi.com/registry/"&gt;Pulumi Cloud Registry&lt;/a&gt; and start searching. The new &lt;code&gt;pulumi template&lt;/code&gt; commands make this easier by letting you ask for what&amp;rsquo;s available right from the shell, either by fetching the full list or filtering with the &lt;code&gt;--name&lt;/code&gt; or &lt;code&gt;--search&lt;/code&gt; params:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi template list --search &lt;span class="s2"&gt;&amp;#34;container typescript&amp;#34;&lt;/span&gt; --org cnunciato
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────────────┬────────┬────────────┬────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Name │ Source │ Language │ Visibility │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────┼────────┼────────────┼────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ pulumi/templates/container-aws-typescript │ github │ typescript │ public │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ pulumi/templates/container-azure-typescript │ github │ typescript │ public │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ pulumi/templates/container-gcp-typescript │ github │ typescript │ public │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────────────┴────────┴────────────┴────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is especially useful when you&amp;rsquo;re working with an agent because it helps the agent discover your org&amp;rsquo;s approved templates without having to name them. Start with a prompt that tells the agent what you want to build, and let the agent find the right template for you.&lt;/p&gt;
&lt;h2 id="agent-friendly-markdown-docs-for-providers-and-components"&gt;Agent-friendly Markdown docs for providers and components&lt;/h2&gt;
&lt;p&gt;Both humans and agents need to be able to understand what&amp;rsquo;s inside a Pulumi package before they can use it. And while the &lt;a href="https://www.pulumi.com/registry/"&gt;Registry&lt;/a&gt; is an excellent resource for that, it was mainly designed to deliver HTML — a human-friendly format that agents can certainly use, but that&amp;rsquo;s much more verbose than they actually need.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;pulumi api&lt;/code&gt;, agents can fetch the details about a package from the Registry directly and get back those details either in &lt;code&gt;markdown&lt;/code&gt; or &lt;code&gt;json&lt;/code&gt;, whichever works best, filtering on properties like language where applicable:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi api &lt;span class="s2"&gt;&amp;#34;/api/registry/packages/pulumi/pulumi/random/versions/4.19.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;random&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;publisher&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;pulumi&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;publisherDisplayName&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Pulumi&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;pulumi&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;4.19.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;A Pulumi package to safely use randomness in Pulumi programs.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;repoUrl&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;https://github.com/pulumi/pulumi-random&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi api &lt;span class="s2"&gt;&amp;#34;/api/registry/packages/pulumi/pulumi/random/versions/4.19.1/docs/random%3Aindex%2FrandomPassword%3ARandomPassword&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output markdown
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RandomPassword&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource &lt;span class="sb"&gt;`&lt;/span&gt;random:index/randomPassword:RandomPassword&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Example Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;package main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Resources are individually addressable using their URL-encoded Pulumi type tokens — e.g., &lt;code&gt;random:index/randomPassword:RandomPassword&lt;/code&gt; — and API endpoints are configured to deliver Markdown when agents ask for it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl &lt;span class="s2"&gt;&amp;#34;https://api.pulumi.com/api/registry/packages/pulumi/pulumi/random/versions/latest/readme?lang=python&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Accept: text/markdown&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The Random provider is available as a package in all Pulumi languages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even compared to JSON (which is itself a significant improvement over HTML), Markdown is a much more token-efficient format for agents to work with:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;JSON&lt;/th&gt;
&lt;th&gt;Markdown&lt;/th&gt;
&lt;th&gt;Tokens saved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;random&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/readme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10.68 KB&lt;/td&gt;
&lt;td&gt;6.04 KB&lt;/td&gt;
&lt;td&gt;43%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aws&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/readme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4.22 KB&lt;/td&gt;
&lt;td&gt;2.54 KB&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aws&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/nav?depth=full&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;204 KB&lt;/td&gt;
&lt;td&gt;170 KB&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aws&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/docs/{resource type token}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15.24 KB&lt;/td&gt;
&lt;td&gt;11.28 KB&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;azure-native&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/docs/{resource type token}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;48.13 KB&lt;/td&gt;
&lt;td&gt;30.37 KB&lt;/td&gt;
&lt;td&gt;37%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aws&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/docs/{function type token}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.40 KB&lt;/td&gt;
&lt;td&gt;1.46 KB&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Learn more about our Registry endpoints in the &lt;a href="https://www.pulumi.com/docs/reference/cloud-rest-api/registry-preview/"&gt;REST API docs&lt;/a&gt;. (Or just ask your agent!)&lt;/p&gt;
&lt;h2 id="new-to-the-cli-pulumi-neo"&gt;New to the CLI: Pulumi Neo&lt;/h2&gt;
&lt;p&gt;When we launched &lt;a href="https://www.pulumi.com/neo/"&gt;Pulumi Neo&lt;/a&gt; last year, the only way to use it was in the Pulumi Cloud Console. But while there&amp;rsquo;s a ton you can do with Neo in the browser, if you&amp;rsquo;re an engineer already living in the terminal, chances are that eventually you&amp;rsquo;re going to wish you had Neo right in the CLI along with you.&lt;/p&gt;
&lt;p&gt;Now you do. Running &lt;code&gt;pulumi neo&lt;/code&gt; with or without a prompt launches a Pulumi Cloud-connected session that gives Neo access to your local environment just like any other coding agent. Use it on its own to scaffold a new project, understand an existing codebase, or debug a failing deployment — or pull it into an active session with the coding agent you&amp;rsquo;re already using. Either way, it stays in the shell you&amp;rsquo;re already working in.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll cover Neo in the CLI in more detail &lt;a href="https://www.pulumi.com/blog/pulumi-neo-cli/"&gt;later this week&lt;/a&gt;. In the meantime, here&amp;rsquo;s a peek:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pulumi.com/blog/better-cli-interactions-for-agents-and-humans/neo-cli.png" alt="Running Neo in the Pulumi CLI"&gt;&lt;/p&gt;
&lt;h2 id="smaller-changes-that-add-up"&gt;Smaller changes that add up&lt;/h2&gt;
&lt;p&gt;A long list of smaller changes also runs through this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The core loop now speaks JSON end to end, with &lt;code&gt;pulumi up&lt;/code&gt;, &lt;code&gt;pulumi destroy&lt;/code&gt;, and &lt;code&gt;pulumi import&lt;/code&gt; all emitting structured JSON output when called with &lt;code&gt;--output json&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Streams now behave the way scripts expect them to, with data on stdout, progress and diagnostics on stderr.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exit codes are more consistent across the board. Every failure mode — auth, resource, policy, missing stack, cancellation, timeout, and others — has its own exit code, so agents can branch on the actual cause instead of having to interpret output. The &lt;a href="https://www.pulumi.com/docs/iac/cli/exit-codes/"&gt;full table&lt;/a&gt; is in the docs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help text explains &lt;em&gt;why&lt;/em&gt; a command exists, not just what it does, and includes at least one concrete example. Examples in &lt;code&gt;--help&lt;/code&gt; are one of the most effective ways to improve LLM accuracy on first-try invocations — and it turns out they&amp;rsquo;re pretty handy for humans, too.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="a-sneak-peek-at-a-new-command"&gt;A sneak peek at a new command&lt;/h2&gt;
&lt;p&gt;Later this week, you&amp;rsquo;ll get a closer look at &lt;code&gt;pulumi do&lt;/code&gt;, a new top-level command that enables direct resource operations like create, read, update, delete, and list across every Pulumi-supported cloud provider and resource, all in one command. A simple example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pulumi &lt;span class="k"&gt;do&lt;/span&gt; aws getAvailabilityZones
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;groupNames&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;us-west-2-zg-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;us-west-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;names&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;us-west-2a&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;us-west-2b&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;us-west-2c&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;us-west-2d&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;region&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;us-west-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;zoneIds&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;usw2-az2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;usw2-az1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;usw2-az3&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;usw2-az4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It might look like that&amp;rsquo;s calling the AWS CLI, but it&amp;rsquo;s not — it&amp;rsquo;s using &lt;a href="https://www.pulumi.com/registry/packages/aws/api-docs/getavailabilityzones/"&gt;the same AWS provider function&lt;/a&gt; a full Pulumi program would use, only without the program, and invoked directly from the CLI.&lt;/p&gt;
&lt;p&gt;More on how it works, and what you can do with it, in the days ahead.&lt;/p&gt;
&lt;h2 id="try-it-yourself"&gt;Try it yourself&lt;/h2&gt;
&lt;p&gt;A lot of what makes a developer tool worth using is in the details, and most of what&amp;rsquo;s in &lt;a href="https://www.pulumi.com/releases/agentic-infrastructure-era/"&gt;this release&lt;/a&gt; is exactly that, across the whole CLI, with humans and agents in mind.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;d love for you to &lt;a href="https://www.pulumi.com/docs/get-started/download-install/"&gt;grab the latest release&lt;/a&gt; and give it a try. Tell us what&amp;rsquo;s now easy, what&amp;rsquo;s still hard, and what to fix next on &lt;a href="https://github.com/pulumi/pulumi/issues"&gt;GitHub&lt;/a&gt; or in the &lt;a href="https://slack.pulumi.com/"&gt;community Slack&lt;/a&gt;. The fastest way the CLI gets better is feedback from the humans and agents who live in it.&lt;/p&gt;</description><author>Michael Fallihee</author><author>Christian Nunciato</author><category>features</category><category>pulumi-cli</category><category>ai-agents</category><category>product-launches</category></item><item><title>Pulumi 2025: Neo, Next-Gen Policies, and Platform Engineering at Scale</title><link>https://www.pulumi.com/blog/2025-product-launches/</link><pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.pulumi.com/blog/2025-product-launches/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/2025-product-launches/index.png" /&gt;
&lt;p&gt;The era of AI-accelerated development has arrived, creating both unprecedented opportunity and unprecedented challenge. Developers ship code faster than ever, but platform teams struggle to keep pace. The velocity gap threatens to become a bottleneck.&lt;/p&gt;
&lt;p&gt;As 2025 comes to a close, let&amp;rsquo;s look back at how we addressed this challenge.&lt;/p&gt;
&lt;p&gt;This year, we took a giant leap forward to close that gap with several major innovations, including purpose-built AI for platform engineers, next-generation policy management that transforms governance into an accelerator, and the foundation for building Internal Developer Platforms that enable self-service without sacrificing control.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#pulumi-neo-your-newest-platform-engineer"&gt;Pulumi Neo: Your Newest Platform Engineer&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#ai-assisted-development-everywhere"&gt;AI-Assisted Development Everywhere&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#next-generation-policy-management-ai-powered-governance-at-scale"&gt;Next-Generation Policy Management: AI-Powered Governance at Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#internal-developer-platform-self-service-infrastructure-at-scale"&gt;Internal Developer Platform: Self-Service Infrastructure at Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#secrets-management-taming-sprawl-at-scale"&gt;Secrets Management: Taming Sprawl at Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#identity-and-access-management"&gt;Identity and Access Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pulumi-iac"&gt;Pulumi IaC&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#cloud-provider-support"&gt;Cloud Provider Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#language-support"&gt;Language Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#infrastructure-operations"&gt;Infrastructure Operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#kubernetes-operator"&gt;Kubernetes Operator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-year-ahead"&gt;The Year Ahead&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pulumi-neo-your-newest-platform-engineer"&gt;Pulumi Neo: Your Newest Platform Engineer&lt;/h2&gt;
&lt;p&gt;We launched &lt;a href="https://www.pulumi.com/blog/pulumi-neo/"&gt;Pulumi Neo&lt;/a&gt;, purpose-built AI specifically designed for platform engineering challenges. Neo fundamentally changed how platform engineers work.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/9GB9M2l1OgY?rel=0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;The problem Neo solves is critical: while AI coding assistants have accelerated developers substantially, platform teams have struggled to keep pace. Every line of code that ships faster creates new platform needs - monitoring, secrets, pipelines, compliance checks. The velocity gap between development and platform teams was widening, threatening to become a bottleneck that would slow down entire organizations.&lt;/p&gt;
&lt;p&gt;Neo levels the playing field by giving platform engineers their own dedicated AI tool. Unlike generic AI coding assistants that lack infrastructure context, Neo deeply understands cloud environments, infrastructure as code, secrets management, and the unique challenges platform teams face. It speaks their language and works within their constraints.&lt;/p&gt;
&lt;p&gt;What makes Neo different is how it&amp;rsquo;s built. Neo operates on top of Pulumi&amp;rsquo;s existing platform capabilities - the same IaC, ESC, and policy features you already use for governance become Neo&amp;rsquo;s operational guardrails. It automatically respects your security and policy rules, works within your governance frameworks, and maintains the audit trails and compliance controls your organization requires. This isn&amp;rsquo;t experimental AI retrofitted with infrastructure plugins - it&amp;rsquo;s enterprise-ready intelligence built from the ground up on proven foundations.&lt;/p&gt;
&lt;p&gt;Throughout the year, we enhanced Neo with capabilities that scale your team&amp;rsquo;s expertise. &lt;a href="https://www.pulumi.com/blog/slash-commands-custom-instructions/"&gt;Custom Instructions and Slash Commands&lt;/a&gt; let you encode organizational standards once and Neo applies them automatically, while turning proven prompts into reusable shortcuts anyone can use. &lt;a href="https://www.pulumi.com/blog/neo-levels-up/"&gt;Operating Modes&lt;/a&gt; give you flexible control - from full review to autonomous execution. And &lt;a href="https://www.pulumi.com/blog/neo-levels-up/"&gt;full Pulumi CLI integration&lt;/a&gt; means Neo can handle complete infrastructure workflows, from stack operations to cloud CLI commands.&lt;/p&gt;
&lt;h3 id="ai-assisted-development-everywhere"&gt;AI-Assisted Development Everywhere&lt;/h3&gt;
&lt;p&gt;Beyond Neo, we brought AI assistance directly into development workflows throughout the year. The &lt;a href="https://www.pulumi.com/blog/mcp-server-ai-assistants/"&gt;Pulumi Model Context Protocol (MCP) Server&lt;/a&gt; connects AI-powered code assistants with Pulumi&amp;rsquo;s CLI and registry, enabling real-time resource information without leaving your editor. Use it with GitHub Copilot, Anthropic&amp;rsquo;s Claude Code, and Cursor to accelerate resource discovery and write infrastructure code faster. We enhanced this with &lt;a href="https://www.pulumi.com/blog/remote-mcp-server/"&gt;remote MCP server&lt;/a&gt; support for centralized management and &lt;a href="https://www.pulumi.com/blog/cli-ai-extensions/"&gt;CLI AI extensions&lt;/a&gt; for intelligent command-line assistance.&lt;/p&gt;
&lt;h2 id="next-generation-policy-management-ai-powered-governance-at-scale"&gt;Next-Generation Policy Management: AI-Powered Governance at Scale&lt;/h2&gt;
&lt;p&gt;With Neo giving platform teams AI superpowers, we needed to ensure AI-accelerated development remained safe and compliant. The challenge isn&amp;rsquo;t detecting security issues - it&amp;rsquo;s fixing them at scale. Most policy tools stop at detection, leaving teams with overwhelming backlogs and no scalable way to remediate violations.&lt;/p&gt;
&lt;p&gt;We ended that compromise with the &lt;a href="https://www.pulumi.com/blog/policy-next-gen/"&gt;next generation of Pulumi Policies&lt;/a&gt;. This comprehensive governance solution moves beyond detection to deliver AI-powered remediation through a two-step lifecycle:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mwcrOTEf1EQ?rel=0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Get Clean:&lt;/strong&gt; We introduced the &lt;a href="https://www.pulumi.com/blog/policy-issue-management/"&gt;Policy Findings Hub&lt;/a&gt; that gives every stakeholder their needed view - leadership sees compliance scores, auditors get control-centric compliance views, and platform teams get a collaborative workspace to triage and track remediation. Combined with &lt;a href="https://www.pulumi.com/blog/policy-audit-scans-for-stacks/"&gt;audit scans&lt;/a&gt;, you get instant compliance baselines without blocking developers. Neo integrates directly into the Policy Findings hub to automate the fix itself, generating pull requests with exact code changes needed. For unmanaged resources, Neo even generates code to import the resource into a Pulumi stack and apply the fix.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stay Clean:&lt;/strong&gt; We launched &lt;a href="https://www.pulumi.com/blog/policy-packs-cis-nist-pci/"&gt;pre-built compliance packs&lt;/a&gt; for &lt;strong&gt;CIS, NIST, PCI, and HITRUST&lt;/strong&gt; across AWS, Azure, and Google Cloud. These out-of-the-box policy packs let you enforce industry-standard compliance frameworks immediately without writing custom policies. They act as universal guardrails by blocking non-compliant changes during deployment. Neo can even author new custom policies - ask Neo to &amp;ldquo;create a policy that prevents overly permissive IAM roles,&amp;rdquo; and it generates the code. This is how we make AI safe to go fast.&lt;/p&gt;
&lt;h2 id="internal-developer-platform-self-service-infrastructure-at-scale"&gt;Internal Developer Platform: Self-Service Infrastructure at Scale&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3gZmKaAeppc?rel=0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Platform engineering teams face a persistent challenge: they&amp;rsquo;re constantly responding to infrastructure requests instead of building the systems that enable self-service at scale. This reactive cycle prevents platform teams from doing their most valuable work - establishing patterns, codifying standards, and creating golden paths that empower developers without sacrificing control.&lt;/p&gt;
&lt;p&gt;We delivered the foundation to break this cycle with &lt;a href="https://www.pulumi.com/blog/announcing-pulumi-idp/"&gt;Pulumi IDP&lt;/a&gt;. Pulumi IDP provides everything platform teams need to build world-class internal developer platforms. Codify organizational standards into reusable building blocks. Give developers simple, approachable interfaces that enforce best practices automatically. Transform platform engineering from reactive ticket-taking to strategic enablement.&lt;/p&gt;
&lt;p&gt;The key is &lt;a href="https://www.pulumi.com/blog/announcing-pulumi-private-registry/"&gt;Pulumi Private Registry&lt;/a&gt;, your organization&amp;rsquo;s source of truth for golden paths and platform building blocks. Private Registry provides streamlined publishing workflows and simplified discovery, making it easy to share infrastructure abstractions across your organization. Combined with our expanded &lt;a href="https://www.pulumi.com/blog/registry-wave-2/"&gt;public registry&lt;/a&gt; (now over 150 providers and 7,500 resource types), you have comprehensive options for managing infrastructure across your entire cloud estate.&lt;/p&gt;
&lt;p&gt;What makes this powerful is &lt;a href="https://www.pulumi.com/blog/pulumi-components/"&gt;next-generation Pulumi Components&lt;/a&gt; with true cross-language support. Author infrastructure abstractions once in your preferred language, then consume them in any supported Pulumi language - including YAML for non-programmers, and soon, &lt;a href="https://www.pulumi.com/blog/all-iac-including-terraform-and-hcl/"&gt;HCL&lt;/a&gt;. Components include built-in input validation, detailed documentation, and improved error messages. This means platform teams can reach every developer in their organization regardless of language preference, scaling their expertise without scaling their team.&lt;/p&gt;
&lt;h2 id="secrets-management-taming-sprawl-at-scale"&gt;Secrets Management: Taming Sprawl at Scale&lt;/h2&gt;
&lt;p&gt;The proliferation of secrets across modern cloud environments creates massive security risks. Long-lived credentials pose significant vulnerabilities. Secrets scattered across systems make it nearly impossible to track usage or enforce consistent policies. And manual rotation processes are error-prone and rarely done.&lt;/p&gt;
&lt;p&gt;2025 saw significant expansion of Pulumi ESC to address these challenges across your entire secrets ecosystem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automated Rotation:&lt;/strong&gt; We launched &lt;a href="https://www.pulumi.com/blog/esc-rotated-secrets-launch/"&gt;ESC Rotated Secrets&lt;/a&gt;, automatically rotating credentials like AWS IAM access keys on flexible schedules. This eliminates manual rotation effort and significantly reduces vulnerability windows. We expanded this with &lt;a href="https://www.pulumi.com/blog/esc-db-secrets-rotation-launch/"&gt;database credential rotation&lt;/a&gt; for PostgreSQL and MySQL, including support for databases in private VPCs via AWS VPC Lambda connectors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Universal Integration:&lt;/strong&gt; We integrated ESC with the secrets management platforms you&amp;rsquo;re already using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pulumi.com/blog/esc-snowflake-providers-launch/"&gt;Snowflake&lt;/a&gt; - Dynamic OIDC tokens for temporary authentication plus automated RSA keypair rotation&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pulumi.com/blog/esc-infisical-providers-launch/"&gt;Infisical&lt;/a&gt; - Dynamic OIDC login and secret fetching from the open-source secrets platform&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pulumi.com/blog/esc-doppler-providers-launch/"&gt;Doppler&lt;/a&gt; - OIDC access tokens and centralized secret fetching&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For systems without native support, we launched &lt;a href="https://www.pulumi.com/blog/esc-connect/"&gt;ESC Connect&lt;/a&gt;, enabling you to build simple HTTPS adapters that integrate any custom or proprietary secret source with ESC.&lt;/p&gt;
&lt;p&gt;These integrations let you maintain existing secrets infrastructure while gaining ESC&amp;rsquo;s centralized management, audit capabilities, and governance controls. You don&amp;rsquo;t have to rip and replace - ESC works with what you have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Better Experience:&lt;/strong&gt; We improved ESC usability throughout the year with &lt;a href="https://www.pulumi.com/blog/esc-new-onboarding/"&gt;streamlined onboarding&lt;/a&gt;, &lt;a href="https://www.pulumi.com/blog/esc-open-approvals/"&gt;approval workflows&lt;/a&gt; for sensitive environments, and &lt;a href="https://www.pulumi.com/blog/esc-deletion-protection/"&gt;deletion protection&lt;/a&gt; to prevent accidents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security &amp;amp; Trust:&lt;/strong&gt; For organizations with strict compliance needs like HIPAA or GDPR, we launched &lt;a href="https://www.pulumi.com/blog/bring-your-own-keys-with-pulumi-esc/"&gt;Customer-Managed Keys (BYOK)&lt;/a&gt;. This allows you to bring your own encryption keys (via AWS KMS) to encrypt secrets stored in ESC, giving you full control over key lifecycles and revocation.&lt;/p&gt;
&lt;h2 id="identity-and-access-management"&gt;Identity and Access Management&lt;/h2&gt;
&lt;p&gt;Modern security demands unwavering trust in your security posture. How do you empower teams to deploy rapidly without opening doors to risk or violating compliance mandates?&lt;/p&gt;
&lt;p&gt;We launched &lt;a href="https://www.pulumi.com/blog/pulumi-cloud-iam-launch/"&gt;Pulumi IAM&lt;/a&gt;, embedding robust, granular security directly into your cloud development lifecycle. Pulumi IAM provides the unified framework for fine-grained authorization needed to confidently manage modern cloud infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom Roles&lt;/strong&gt;: Define reusable permissions with fine-grained scopes tailored to your organization&amp;rsquo;s specific needs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Least Privilege Enforcement&lt;/strong&gt;: Control precisely who can do what on which specific resources, minimizing the impact if credentials are compromised&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure Automation&lt;/strong&gt;: Generate scoped access tokens for CI/CD pipelines with only the necessary permissions, eliminating over-privileged service accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero Trust Foundation&lt;/strong&gt;: Verify every access request and grant minimum necessary access, implementing true Zero Trust principles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This foundational capability enables true least-privilege for CI/CD pipelines, reduces blast radius if tokens are compromised, and provides the compliance evidence auditors require. Platform and security teams finally have the fine-grained control needed to scale Pulumi usage securely across enterprise organizations without sacrificing velocity.&lt;/p&gt;
&lt;h2 id="pulumi-iac"&gt;Pulumi IaC&lt;/h2&gt;
&lt;p&gt;Platform teams need IaC tools that keep pace with rapidly evolving cloud platforms while providing operational flexibility and reliability. This year we shipped hundreds of enhancements to Pulumi&amp;rsquo;s core IaC capabilities, from major cloud provider updates to new operational primitives that give teams more control over infrastructure lifecycles.&lt;/p&gt;
&lt;h3 id="cloud-provider-support"&gt;Cloud Provider Support&lt;/h3&gt;
&lt;p&gt;Managing multi-cloud infrastructure requires comprehensive provider support that keeps pace with rapidly evolving cloud platforms. This year we shipped major provider updates:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.pulumi.com/blog/announcing-7-0-of-the-pulumi-aws-provider/"&gt;AWS Provider 7.0&lt;/a&gt;&lt;/strong&gt; brought game-changing improvements: manage resources across multiple AWS regions with a single provider instance, enhanced IAM role chaining with better error handling, and simplified S3 resource management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.pulumi.com/blog/azure-native-v3/"&gt;Azure Native V3&lt;/a&gt;&lt;/strong&gt; delivered a 75% reduction in SDK size while maintaining 100% Azure ARM API coverage. Faster downloads, more manageable package sizes, and improved reliability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.pulumi.com/blog/gcp-v9-release/"&gt;Google Cloud Provider 9.0&lt;/a&gt;&lt;/strong&gt; brought updated API versions, new modules for AI and Google Gemini, and expanded resource support for the latest GCP services.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.pulumi.com/blog/announcing-direct-tf-modules/"&gt;Direct Terraform Module Support&lt;/a&gt;&lt;/strong&gt; was one of our most requested features. Execute Terraform modules directly in Pulumi without conversion, providing a seamless migration path for module-heavy projects.&lt;/p&gt;
&lt;h3 id="language-support"&gt;Language Support&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.pulumi.com/blog/java-1-0/"&gt;Java SDK 1.0 GA&lt;/a&gt;&lt;/strong&gt; provides first-class Java support with feature parity to other Pulumi languages, support for all current LTS Java versions, and complete Automation API support.&lt;/p&gt;
&lt;h3 id="infrastructure-operations"&gt;Infrastructure Operations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.pulumi.com/blog/resource-hooks/"&gt;Resource Hooks&lt;/a&gt;&lt;/strong&gt; was one of our most requested features. Run custom code at any point in a resource&amp;rsquo;s lifecycle - before creation, after updates, before deletion. This unlocks scenarios like validation checks before deployment, triggering external systems when infrastructure changes, and custom logging and auditing.&lt;/p&gt;
&lt;p&gt;We also shipped &lt;a href="https://www.pulumi.com/blog/dependent-resource-replacements/"&gt;dependent resource replacements&lt;/a&gt;, &lt;a href="https://www.pulumi.com/blog/excluding-targets-from-stack-operations/"&gt;excluding specific targets from stack operations&lt;/a&gt;, &lt;a href="https://www.pulumi.com/blog/pulumi-state-taint/"&gt;state taint capabilities&lt;/a&gt;, &lt;a href="https://www.pulumi.com/blog/improved-refresh-destroy-experience/"&gt;improved refresh and destroy experience&lt;/a&gt; for short-lived credentials, and &lt;a href="https://www.pulumi.com/blog/controlling-the-cli-through-environment-variables/"&gt;CLI control through environment variables&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="kubernetes-operator"&gt;Kubernetes Operator&lt;/h3&gt;
&lt;p&gt;The &lt;a href="https://www.pulumi.com/blog/pko-2-0-ga/"&gt;Pulumi Kubernetes Operator 2.0 reached GA&lt;/a&gt; with a completely rewritten, faster codebase featuring enhanced reconciliation logic, better error handling, and automatic retry for temporary failures. We continued enhancing it with &lt;a href="https://www.pulumi.com/blog/pulumi-kubernetes-operator-2-3/"&gt;version 2.3.0&lt;/a&gt; adding preview mode for validating infrastructure changes and structured configuration support for GitOps workflows.&lt;/p&gt;
&lt;h2 id="the-year-ahead"&gt;The Year Ahead&lt;/h2&gt;
&lt;p&gt;2025 was the year we gave platform engineers the tools to thrive in the age of AI-accelerated development. We ended the impossible choice between velocity and control. We transformed governance from a blocker into an accelerator. We enabled self-service without sacrificing governance.&lt;/p&gt;
&lt;p&gt;But this is just the beginning. The foundation we built this year sets the stage for even bigger innovations ahead. Neo will get smarter as it learns from infrastructure patterns across the community. Policy management will expand to more compliance frameworks. IDP will enable more sophisticated self-service workflows. ESC will integrate with more platforms.&lt;/p&gt;
&lt;p&gt;The future of platform engineering is strategic, proactive, and AI-enabled. Platform teams won&amp;rsquo;t be bottlenecks - they&amp;rsquo;ll be the strategic enablers who make sustainable velocity possible.&lt;/p&gt;
&lt;p&gt;Thank you for being part of the Pulumi community. Your feedback drives everything we build. We can&amp;rsquo;t wait to show you what comes next.&lt;/p&gt;
&lt;p&gt;Want to try these features? Check out our &lt;a href="https://www.pulumi.com/docs/"&gt;documentation&lt;/a&gt;, join our &lt;a href="https://slack.pulumi.com/"&gt;community Slack&lt;/a&gt;, or &lt;a href="https://www.pulumi.com/contact/"&gt;contact us&lt;/a&gt; to discuss how Pulumi can transform your platform engineering practice.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s to an incredible 2025, and an even better 2026!&lt;/p&gt;</description><author>Arun Loganathan</author><category>features</category><category>product-launches</category><category>pulumi-cloud</category></item></channel></rss>