<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Aspire | The .NET Blog</title><link>https://thedotnetblog.com/tags/aspire/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>en</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 19 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/tags/aspire/index.xml" rel="self" type="application/rss+xml"/><item><title>Private Endpoints, VNets, NSGs — Aspire Handles the Networking Now</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-azure-enterprise-networking-private-endpoints/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-azure-enterprise-networking-private-endpoints/</guid><description>Aspire's new Azure enterprise networking support lets you model VNets, private endpoints, NAT gateways, NSGs, and Network Security Perimeters directly in your AppHost — no infrastructure drift required.</description><content:encoded>&lt;p&gt;Here&amp;rsquo;s a scenario I&amp;rsquo;ve seen too many times. The app is done. The demo is great. Then the security checklist shows up: take storage off the public internet, run inside a VNet, provide outbound IPs for the partner allowlist, prove that only the right subnets talk to the right services.&lt;/p&gt;
&lt;p&gt;At that point the application model and the infrastructure model start drifting apart in ways that are painful to maintain.&lt;/p&gt;
&lt;p&gt;Aspire&amp;rsquo;s new Azure enterprise networking support addresses this directly. You describe the network shape next to the resources that use it, in your AppHost.&lt;/p&gt;
&lt;h2 id="the-building-blocks"&gt;The Building Blocks&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what each Azure networking concept is for, distilled:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Use it when&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;td&gt;You need a private address space&lt;/td&gt;
&lt;td&gt;The network boundary for subnets, private endpoints, and routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet&lt;/td&gt;
&lt;td&gt;You need to separate workloads inside the VNet&lt;/td&gt;
&lt;td&gt;Each part of the system gets its own address range and policy surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delegated subnet&lt;/td&gt;
&lt;td&gt;A platform service (like ACA) needs to manage a subnet&lt;/td&gt;
&lt;td&gt;Lets the service place managed infrastructure in your VNet safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT gateway&lt;/td&gt;
&lt;td&gt;You need predictable outbound public IPs&lt;/td&gt;
&lt;td&gt;Stable address for allowlists and auditing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private endpoint&lt;/td&gt;
&lt;td&gt;You want a PaaS resource reachable privately&lt;/td&gt;
&lt;td&gt;Puts a private IP for that service inside your VNet, removes public exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NSG&lt;/td&gt;
&lt;td&gt;You need subnet-level traffic rules&lt;/td&gt;
&lt;td&gt;Explicit allow/deny for inbound and outbound traffic per subnet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="describing-it-in-your-apphost"&gt;Describing It in Your AppHost&lt;/h2&gt;
&lt;p&gt;The key shift here is that you&amp;rsquo;re modeling the network &lt;em&gt;alongside&lt;/em&gt; the resources that use it, not in a separate Bicep file that drifts away from the app model over time.&lt;/p&gt;
&lt;p&gt;From the AppHost, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create VNets and subnets with &lt;code&gt;AddVirtualNetwork()&lt;/code&gt; and &lt;code&gt;AddSubnet()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Attach a NAT gateway to subnets for stable outbound IPs&lt;/li&gt;
&lt;li&gt;Create private endpoints for storage, Key Vault, SQL, and other PaaS services&lt;/li&gt;
&lt;li&gt;Define NSGs with inbound and outbound security rules&lt;/li&gt;
&lt;li&gt;Configure Network Security Perimeters for cross-resource policies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result is that when you run &lt;code&gt;azd up&lt;/code&gt;, the infrastructure matches what the app model says it needs. Not what a manually maintained template says.&lt;/p&gt;
&lt;h2 id="why-this-matters-for-real-applications"&gt;Why This Matters for Real Applications&lt;/h2&gt;
&lt;p&gt;A few things that become significantly easier once the network is modeled in Aspire:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Private endpoints for Key Vault and storage&lt;/strong&gt; — you describe &lt;code&gt;WithPrivateEndpoint()&lt;/code&gt; on those resources, and Aspire handles the DNS zone configuration and endpoint attachment. The app never changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consistent outbound IPs&lt;/strong&gt; — add a NAT gateway to the relevant subnet and every outbound request from your app goes through a known, stable IP. Partners can allowlist it. Auditors can trace it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NSG rules from code&lt;/strong&gt; — instead of clicking through the portal or maintaining a Bicep snippet, your security rules live in the AppHost alongside the resources they protect.&lt;/p&gt;
&lt;p&gt;This is the kind of integration that doesn&amp;rsquo;t make demos exciting but makes production systems maintainable.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;Network security showing up late in the project lifecycle is a solved problem if you model it alongside the app from the start. Aspire&amp;rsquo;s enterprise networking support makes that possible without requiring a separate infrastructure track.&lt;/p&gt;
&lt;p&gt;Full details in the original post: &lt;a href="https://devblogs.microsoft.com/aspire/aspire-azure-enterprise-networking/"&gt;Securing Azure apps with Aspire enterprise networking&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.3: Kubernetes Support, Browser Logs, and the Aspireify Skill</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</guid><description>Five weeks after 13.2, Aspire 13.3 lands with 45 new features including first-class AKS deployment, an AI-assisted onboarding skill, browser log capture, and structured command results.</description><content:encoded>&lt;p&gt;Five weeks is not a long time for a release, but Aspire 13.3 doesn&amp;rsquo;t feel like it. The headline items are meaningful: first-class Kubernetes and AKS deployment with Helm, an agent-assisted onboarding skill called Aspireify, browser log capture directly in the dashboard, and structured command results. Plus 45 new features, 134 improvements, and 93 bug fixes.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s hit the highlights.&lt;/p&gt;
&lt;h2 id="aspireify-agent-assisted-onboarding"&gt;Aspireify: Agent-Assisted Onboarding&lt;/h2&gt;
&lt;p&gt;Adding Aspire to an existing project sounds simple — drop an AppHost in, done. In practice it involves a lot of archaeology: which ports matter, which environment variables are real dependencies, which Docker Compose services should map to Aspire integrations.&lt;/p&gt;
&lt;p&gt;The new &lt;strong&gt;Aspireify skill&lt;/strong&gt; gives your coding agent a guided workflow for exactly this. When &lt;code&gt;aspire init&lt;/code&gt; drops a skeleton AppHost, the Aspireify skill helps the agent inspect the repo, understand how it already runs, and wire the AppHost to fit the app — not the other way around.&lt;/p&gt;
&lt;p&gt;The default stance is &amp;ldquo;minimize changes to your code.&amp;rdquo; If your app already reads &lt;code&gt;DATABASE_URL&lt;/code&gt;, the agent maps that with &lt;code&gt;WithEnvironment()&lt;/code&gt; instead of asking you to rewrite your configuration. If a port is hardcoded, the skill tells the agent when to preserve it.&lt;/p&gt;
&lt;p&gt;This is the kind of AI tooling that actually saves time rather than generating more work to review.&lt;/p&gt;
&lt;h2 id="first-class-kubernetes-and-aks-deployment"&gt;First-Class Kubernetes and AKS Deployment&lt;/h2&gt;
&lt;p&gt;This one has been on the wishlist for a while. Aspire 13.3 ships &lt;strong&gt;first-class Kubernetes and AKS deployment support with Helm&lt;/strong&gt;. You can now target AKS as a deployment target directly from the Aspire tooling.&lt;/p&gt;
&lt;p&gt;For teams already running production workloads on AKS, this closes a significant gap. Your Aspire app model now has a clean path from local dev to Kubernetes without manual Helm chart authoring.&lt;/p&gt;
&lt;h2 id="browser-logs-in-the-dashboard"&gt;Browser Logs in the Dashboard&lt;/h2&gt;
&lt;p&gt;This is one of those features that sounds small until you&amp;rsquo;re debugging a frontend issue.&lt;/p&gt;
&lt;p&gt;The new &lt;code&gt;WithBrowserLogs()&lt;/code&gt; API attaches a tracked browser resource to any endpoint-capable resource. Aspire launches Chromium using a private CDP pipe and streams console logs, network requests, and errors directly into the resource log stream:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;frontend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;../frontend&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithBrowserLogs&lt;/span&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;p&gt;TypeScript AppHost supports the same:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;frontend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../frontend&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;: &lt;span class="kt"&gt;3000&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withBrowserLogs&lt;/span&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;p&gt;Console errors, failed network requests, client-side exceptions — all visible in the same dashboard where you&amp;rsquo;re already watching traces and metrics. No more tab-switching to browser DevTools for the basic stuff.&lt;/p&gt;
&lt;h2 id="structured-command-results"&gt;Structured Command Results&lt;/h2&gt;
&lt;p&gt;Resource commands got a meaningful upgrade. Until now, commands returned success/failure. Now they return structured results: text, JSON, or markdown that flows through the model, dashboard UI, CLI, and MCP tools.&lt;/p&gt;
&lt;p&gt;The dashboard ties this together with a new notification center in the header. Command results show up as timestamped notifications with markdown rendering and a &amp;ldquo;View response&amp;rdquo; action.&lt;/p&gt;
&lt;p&gt;This makes resource commands genuinely composable. An integration can now expose a command that returns meaningful output — like a tunnel URL — rather than just changing state somewhere.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;Aspire 13.3 is worth the upgrade even just for the Kubernetes support. The browser logs and structured command results feel like the kind of quality-of-life improvements that accumulate quickly in a day-to-day development workflow.&lt;/p&gt;
&lt;p&gt;Full release notes: &lt;a href="https://devblogs.microsoft.com/aspire/whats-new-aspire-13-3/"&gt;What&amp;rsquo;s New in Aspire 13.3&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 Gets Bun, Better Containers, and Less Debugging Friction</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</guid><description>Aspire 13.2 adds first-class Bun support for Vite apps, fixes Yarn reliability, and ships container improvements that make local dev behavior honest. Here's what actually changed and why it matters.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve been building .NET backends with JavaScript frontends in Aspire, 13.2 is the kind of update that quietly makes your day better. No splashy new paradigms. Just solid improvements to things that were mildly annoying.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s walk through what actually landed.&lt;/p&gt;
&lt;h2 id="bun-is-now-a-first-class-citizen"&gt;Bun is Now a First-Class Citizen&lt;/h2&gt;
&lt;p&gt;The headline feature: Bun support for Vite apps in Aspire. One fluent call, done.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// TypeScript AppHost
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&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 class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withBun&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&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;p&gt;If your team already uses Bun — which you might, given its dramatically faster install times and startup — Aspire no longer makes you fight against the grain. Previously, Aspire assumed npm and you had to work around it. Now &lt;code&gt;.withBun()&lt;/code&gt; is a first-class option alongside &lt;code&gt;.withYarn()&lt;/code&gt; and the default npm behavior.&lt;/p&gt;
&lt;p&gt;Why does this matter? Because JavaScript tooling speed directly affects your inner dev loop. If your frontend takes 30 seconds to install dependencies every time you spin up a fresh environment, that adds up. Bun cuts that dramatically.&lt;/p&gt;
&lt;p&gt;The C# AppHost equivalents are documented at &lt;a href="https://aspire.dev/integrations/frameworks/javascript/#use-bun"&gt;aspire.dev&lt;/a&gt; if you prefer authoring in C# — all the same patterns apply.&lt;/p&gt;
&lt;h2 id="yarn-got-more-reliable"&gt;Yarn Got More Reliable&lt;/h2&gt;
&lt;p&gt;Bun gets the spotlight, but Yarn users get something arguably more impactful: fewer mysterious failures. Aspire 13.2 improves reliability for &lt;code&gt;withYarn()&lt;/code&gt; with &lt;code&gt;addViteApp()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These kinds of fixes don&amp;rsquo;t sound exciting until you&amp;rsquo;ve spent 20 minutes debugging why your Yarn-backed frontend resource wouldn&amp;rsquo;t start. Consider it fixed.&lt;/p&gt;
&lt;h2 id="container-publishing-you-can-actually-reason-about"&gt;Container Publishing You Can Actually Reason About&lt;/h2&gt;
&lt;p&gt;Two container improvements worth knowing:&lt;/p&gt;
&lt;h3 id="explicit-pull-policy"&gt;Explicit Pull Policy&lt;/h3&gt;
&lt;p&gt;Docker Compose publishing now supports &lt;code&gt;PullPolicy&lt;/code&gt;, including a &lt;code&gt;Never&lt;/code&gt; option:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ImagePullPolicy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addDockerComposeEnvironment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;compose&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;worker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myorg/worker:latest&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withImagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ImagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Never&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&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;p&gt;This is the &amp;ldquo;please use the image I already built and leave the registry out of it&amp;rdquo; workflow. Super useful when iterating locally on images you&amp;rsquo;re building and publishing manually, or when your CI produces an image and you want Compose to use exactly that one without sneaking in a remote pull.&lt;/p&gt;
&lt;h3 id="postgresql-18-volumes-work-again"&gt;PostgreSQL 18+ Volumes Work Again&lt;/h3&gt;
&lt;p&gt;PostgreSQL 18 changed its internal data directory layout. This broke volume mapping in Aspire silently — your data volume would be set up but persistence wouldn&amp;rsquo;t actually work correctly. 13.2 fixes this.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;postgres&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withDataVolume&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;isReadOnly&lt;/span&gt;: &lt;span class="kt"&gt;false&lt;/span&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;p&gt;If you&amp;rsquo;re running PostgreSQL 18 or later with a data volume, upgrade to Aspire 13.2 and don&amp;rsquo;t think about it again.&lt;/p&gt;
&lt;h2 id="debugging-quality-of-life-improvements"&gt;Debugging Quality-of-Life Improvements&lt;/h2&gt;
&lt;p&gt;A few things that make stepping through an AppHost session less frustrating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DebuggerDisplayAttribute on core types&lt;/strong&gt; — &lt;code&gt;DistributedApplication&lt;/code&gt;, resources, endpoint expressions now show useful values in the debugger instead of requiring you to drill into object trees&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better WaitFor failure messages&lt;/strong&gt; — when resources fail to start, the error context is actually helpful now&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;BeforeResourceStartedEvent&lt;/code&gt; fires at the right time&lt;/strong&gt; — only when a resource is actually starting, not on unrelated state transitions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;launchSettings.json&lt;/code&gt; is more resilient&lt;/strong&gt; — less chance of a malformed setting corrupting your dev startup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these are individually earth-shattering, but collectively they remove friction from the debugging experience. If you&amp;rsquo;ve ever had to drill three levels deep into an Aspire resource object to figure out what endpoint it was using, the debugger display improvement alone is worth the update.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 is a focused quality release. Bun support is the headline, but the container and debugging improvements are what will make your day-to-day work smoother. Worth updating — especially if you&amp;rsquo;re on PostgreSQL 18 with data volumes.&lt;/p&gt;
&lt;p&gt;Full details in the &lt;a href="https://devblogs.microsoft.com/aspire/aspire-bun-support-and-container-enhancements/"&gt;original post by David Pine&lt;/a&gt; and the &lt;a href="https://aspire.dev/whats-new/aspire-13-2/"&gt;Aspire 13.2 what&amp;rsquo;s new docs&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Global Azure Spain 2026</title><link>https://thedotnetblog.com/events/global-azure-spain-2026/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/events/global-azure-spain-2026/</guid><description>The biggest Azure community event in Spain — a full day of sessions on Azure, AI, data, security, and cloud-native development with 38 speakers across 3 tracks.</description><content:encoded>&lt;p&gt;Global Azure Spain 2026 takes place on &lt;strong&gt;April 18, 2026&lt;/strong&gt; at &lt;strong&gt;Kinépolis Diversia&lt;/strong&gt; in Alcobendas, Madrid. It&amp;rsquo;s the largest community-driven Azure event in Spain, bringing together 38 speakers across 3 parallel tracks covering AI agents, Azure networking, Cosmos DB, Fabric, IoT, security, and much more.&lt;/p&gt;
&lt;p&gt;The event runs from &lt;strong&gt;08:30 to 18:30&lt;/strong&gt; and includes keynote, coffee breaks, lunch, and a closing Q&amp;amp;A session.&lt;/p&gt;
&lt;h2 id="highlights-from-the-agenda"&gt;Highlights from the agenda&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domando Agentes de IA&lt;/strong&gt;: governance, tools, and APIs with Azure AI Foundry and Azure API Management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Construyendo agentes con LibreChat en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How Can I Steal Your Data with Azure Private Endpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop Building APIs. Forge Agents with Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic DevOps Meets IoT: Real-Time Systems with Fabric and GitHub Copilot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El regreso de los tamagotchis!&lt;/strong&gt;: multi-agent systems in action&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundry Control Plane como plataforma de Agentes global&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rompiendo el perímetro: Zero Trust aplicado en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tickets"&gt;Tickets&lt;/h2&gt;
&lt;p&gt;Registration is a symbolic donation — the full ticket price goes directly to &lt;strong&gt;Plan International&lt;/strong&gt;, supporting children&amp;rsquo;s rights and equality worldwide. Limited capacity, so grab your spot early.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eventbrite.es/e/entradas-global-azure-spain-2026-en-madrid-1981594189564"&gt;Get tickets on Eventbrite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://globalazure.es/"&gt;Event website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="azure-tour-2026"&gt;Azure Tour 2026&lt;/h2&gt;
&lt;p&gt;Beyond Madrid, the Global Azure Tour 2026 also includes stops in &lt;strong&gt;Zaragoza&lt;/strong&gt;, &lt;strong&gt;Tenerife&lt;/strong&gt;, and &lt;strong&gt;Sevilla&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>Stop Babysitting Your Terminal: Aspire's Detached Mode Changes the Workflow</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 lets you run your AppHost in the background and take your terminal back. Combined with new CLI commands and agent support, this is a bigger deal than it sounds.</description><content:encoded>&lt;p&gt;Every time you run an Aspire AppHost, your terminal is gone. Locked. Occupied until you Ctrl+C out of it. Need to run a quick command? Open another tab. Want to check logs? Another tab. It&amp;rsquo;s a small friction that adds up fast.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 fixes this. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;wrote up the full details&lt;/a&gt;, and honestly, this is one of those features that immediately changes how you work.&lt;/p&gt;
&lt;h2 id="detached-mode-one-command-terminal-back"&gt;Detached mode: one command, terminal back&lt;/h2&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;aspire start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s the shorthand for &lt;code&gt;aspire run --detach&lt;/code&gt;. Your AppHost boots up in the background and you get your terminal back immediately. No extra tabs. No terminal multiplexer. Just your prompt, ready to go.&lt;/p&gt;
&lt;h2 id="managing-whats-running"&gt;Managing what&amp;rsquo;s running&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the thing — running in the background is only useful if you can actually manage what&amp;rsquo;s out there. Aspire 13.2 ships a full set of CLI commands for exactly that:&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;# List all running AppHosts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire ps
&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;# Inspect the state of a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire describe
&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;# Stream logs from a running AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire logs
&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;# Stop a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This turns the Aspire CLI into a proper process manager. You can start multiple AppHosts, check their status, tail their logs, and shut them down — all from a single terminal session.&lt;/p&gt;
&lt;h2 id="combine-it-with-isolated-mode"&gt;Combine it with isolated mode&lt;/h2&gt;
&lt;p&gt;Detached mode pairs naturally with isolated mode. Want to run two instances of the same project in the background without port conflicts?&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;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each gets random ports, separate secrets, and its own lifecycle. Use &lt;code&gt;aspire ps&lt;/code&gt; to see both, &lt;code&gt;aspire stop&lt;/code&gt; to kill whichever you&amp;rsquo;re done with.&lt;/p&gt;
&lt;h2 id="why-this-is-huge-for-coding-agents"&gt;Why this is huge for coding agents&lt;/h2&gt;
&lt;p&gt;This is where it gets really interesting. A coding agent working in your terminal can now:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start the app with &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Query its state with &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check logs with &lt;code&gt;aspire logs&lt;/code&gt; to diagnose issues&lt;/li&gt;
&lt;li&gt;Stop it with &lt;code&gt;aspire stop&lt;/code&gt; when done&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All without losing the terminal session. Before detached mode, an agent that ran your AppHost would lock itself out of its own terminal. Now it can start, observe, iterate, and clean up — exactly how you&amp;rsquo;d want an autonomous agent to work.&lt;/p&gt;
&lt;p&gt;The Aspire team leaned into this. Running &lt;code&gt;aspire agent init&lt;/code&gt; sets up an Aspire skill file that teaches agents these commands. So tools like Copilot&amp;rsquo;s coding agent can manage your Aspire workloads out of the box.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Detached mode is a workflow upgrade disguised as a simple flag. You stop context-switching between terminals, agents stop blocking themselves, and the new CLI commands give you real visibility into what&amp;rsquo;s running. It&amp;rsquo;s practical, it&amp;rsquo;s clean, and it makes the daily development loop noticeably smoother.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;full post&lt;/a&gt; for all the details and grab Aspire 13.2 with &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Wants to Be Your AI Agent's Best Friend</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 goes all-in on agentic development — structured CLI output, isolated runs, auto-healing environments, and full OpenTelemetry data so your AI agents can actually build, run, and observe your apps.</description><content:encoded>&lt;p&gt;You know that moment when your AI coding agent writes some solid code, you get excited, and then it completely falls apart trying to actually &lt;em&gt;run&lt;/em&gt; the thing? Port conflicts, phantom processes, wrong environment variables — suddenly your agent is burning tokens troubleshooting startup issues instead of building features.&lt;/p&gt;
&lt;p&gt;The Aspire team just dropped a &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;really thoughtful post&lt;/a&gt; about exactly this problem, and their answer is compelling: Aspire 13.2 is designed not just for humans, but for AI agents.&lt;/p&gt;
&lt;h2 id="the-problem-is-real"&gt;The problem is real&lt;/h2&gt;
&lt;p&gt;AI agents are incredible at writing code. But shipping a working full-stack app involves way more than generating files. You need to start services in the right order, manage ports, set environment variables, connect databases, and get feedback when things break. Right now, most agents handle all of this through trial-and-error — running commands, reading error output, trying again.&lt;/p&gt;
&lt;p&gt;We layer on Markdown instructions, custom skills, and prompts to try to guide them, but those are unpredictable, can&amp;rsquo;t be compiled, and cost tokens just to parse. The Aspire team nailed the core insight: agents need &lt;strong&gt;compilers and structured APIs&lt;/strong&gt;, not more Markdown.&lt;/p&gt;
&lt;h2 id="aspire-as-agent-infrastructure"&gt;Aspire as agent infrastructure&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what Aspire 13.2 brings to the agentic development table:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your entire stack in typed code.&lt;/strong&gt; The AppHost defines your full topology — API, frontend, database, cache — in compilable TypeScript or C#:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&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 class="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&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 class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&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;p&gt;An agent can read this to understand app topology, add resources, wire up connections, and &lt;em&gt;build to verify&lt;/em&gt;. The compiler tells it immediately if something is wrong. No guessing, no trial-and-error with config files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One command to rule them all.&lt;/strong&gt; Instead of agents juggling &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt;, and database startup scripts, everything is just &lt;code&gt;aspire start&lt;/code&gt;. All resources launch in the right order, on the right ports, with the right configuration. Long-running processes don&amp;rsquo;t hang the agent either — Aspire manages them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isolated mode for parallel agents.&lt;/strong&gt; With &lt;code&gt;--isolated&lt;/code&gt;, each Aspire run gets its own random ports and separate user secrets. Got multiple agents working across git worktrees? They won&amp;rsquo;t collide. This is huge for tools like VS Code&amp;rsquo;s background agents that spin up parallel environments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent eyes through telemetry.&lt;/strong&gt; Here&amp;rsquo;s where it gets really powerful. The Aspire CLI exposes full OpenTelemetry data during development — traces, metrics, structured logs. Your agent isn&amp;rsquo;t just reading console output and hoping for the best. It can trace a failing request across services, profile slow endpoints, and pinpoint exactly where things break. That&amp;rsquo;s production-grade observability in the development loop.&lt;/p&gt;
&lt;h2 id="the-bowling-bumper-analogy"&gt;The bowling bumper analogy&lt;/h2&gt;
&lt;p&gt;The Aspire team uses a great analogy: think of Aspire as bowling lane bumpers for AI agents. If the agent isn&amp;rsquo;t perfect (and it won&amp;rsquo;t be), the bumpers keep it from throwing gutter balls. The stack definition prevents misconfiguration, the compiler catches errors, the CLI handles process management, and the telemetry provides the feedback loop.&lt;/p&gt;
&lt;p&gt;Pair this with something like Playwright CLI, and your agent can actually &lt;em&gt;use&lt;/em&gt; your app — clicking through flows, checking the DOM, seeing broken things in telemetry, fixing the code, restarting, and testing again. Build, run, observe, fix. That&amp;rsquo;s the autonomous development loop we&amp;rsquo;ve been chasing.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;New to Aspire? Install the CLI from &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; and follow the &lt;a href="https://aspire.dev/get-started/first-app"&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Already using Aspire? Run &lt;code&gt;aspire update --self&lt;/code&gt; to get 13.2, then point your favorite coding agent at your repo. You might be surprised how much further it gets with Aspire&amp;rsquo;s guardrails in place.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 isn&amp;rsquo;t just a distributed app framework anymore — it&amp;rsquo;s becoming essential agent infrastructure. Structured stack definitions, one-command startup, isolated parallel runs, and real-time telemetry give AI agents exactly what they need to go from writing code to shipping apps.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;full post&lt;/a&gt; from the Aspire team for all the details and demo videos.&lt;/p&gt;</content:encoded></item><item><title>Aspire's Isolated Mode Fixes the Port Conflict Nightmare for Parallel Development</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 introduces --isolated mode: random ports, separate secrets, and zero collisions when running multiple instances of the same AppHost. Perfect for AI agents, worktrees, and parallel workflows.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve ever tried running two instances of the same project at the same time, you know the pain. Port 8080 is already in use. Port 17370 is taken. Kill something, restart, juggle environment variables — it&amp;rsquo;s a productivity killer.&lt;/p&gt;
&lt;p&gt;This problem is getting worse, not better. AI agents create git worktrees to work independently. Background agents spin up separate environments. Developers checkout the same repo twice for feature branches. Every one of these scenarios hits the same wall: two instances of the same app fighting over the same ports.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 fixes this with a single flag. James Newton-King from the Aspire team &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;wrote up the full details&lt;/a&gt;, and it&amp;rsquo;s one of those &amp;ldquo;why didn&amp;rsquo;t we have this sooner&amp;rdquo; features.&lt;/p&gt;
&lt;h2 id="the-fix---isolated"&gt;The fix: &lt;code&gt;--isolated&lt;/code&gt;&lt;/h2&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;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Each run gets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Random ports&lt;/strong&gt; — no more collisions between instances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolated user secrets&lt;/strong&gt; — connection strings and API keys stay separate per instance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No manual port reassignment. No environment variable juggling. Each run gets a fresh, collision-free environment automatically.&lt;/p&gt;
&lt;h2 id="real-scenarios-where-this-shines"&gt;Real scenarios where this shines&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Multiple checkouts.&lt;/strong&gt; You&amp;rsquo;ve got a feature branch in one directory and a bugfix in another:&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;# Terminal 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&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;# Terminal 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-bugfix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both run without conflicts. The dashboard shows what&amp;rsquo;s running and where.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Background agents in VS Code.&lt;/strong&gt; When Copilot Chat&amp;rsquo;s background agent creates a git worktree to work on your code independently, it may need to run your Aspire AppHost. Without &lt;code&gt;--isolated&lt;/code&gt;, that&amp;rsquo;s a port collision with your primary worktree. With it, both instances just work.&lt;/p&gt;
&lt;p&gt;The Aspire skill that ships with &lt;code&gt;aspire agent init&lt;/code&gt; automatically instructs agents to use &lt;code&gt;--isolated&lt;/code&gt; when working in worktrees. So Copilot&amp;rsquo;s background agent should handle this out of the box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integration tests alongside development.&lt;/strong&gt; Need to run tests against a live AppHost while continuing to build features? Isolated mode gives each context its own ports and config.&lt;/p&gt;
&lt;h2 id="how-it-works-under-the-hood"&gt;How it works under the hood&lt;/h2&gt;
&lt;p&gt;When you pass &lt;code&gt;--isolated&lt;/code&gt;, the CLI generates a unique instance ID for the run. This drives two behaviors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Port randomization&lt;/strong&gt; — instead of binding to predictable ports defined in your AppHost config, isolated mode picks random available ports for everything — the dashboard, service endpoints, all of it. Service discovery adjusts automatically, so services find each other regardless of which ports they land on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secret isolation&lt;/strong&gt; — each isolated run gets its own user secrets store, keyed by the instance ID. Connection strings and API keys from one run don&amp;rsquo;t leak into another.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your code doesn&amp;rsquo;t need any changes. Aspire&amp;rsquo;s service discovery resolves endpoints at runtime, so everything connects correctly regardless of port assignment.&lt;/p&gt;
&lt;h2 id="when-to-use-it"&gt;When to use it&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;--isolated&lt;/code&gt; when running multiple instances of the same AppHost simultaneously — whether that&amp;rsquo;s parallel development, automated tests, AI agents, or git worktrees. For single-instance development where you prefer predictable ports, regular &lt;code&gt;aspire run&lt;/code&gt; still works fine.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Isolated mode is a small feature that solves a real, increasingly common problem. As AI-assisted development pushes us toward more parallel workflows — multiple agents, multiple worktrees, multiple contexts — the ability to just spin up another instance without fighting over ports is essential.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;full post&lt;/a&gt; for all the technical details and try it out with &lt;code&gt;aspire update --self&lt;/code&gt; to get 13.2.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 Ships a Docs CLI — and Your AI Agent Can Use It Too</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 adds aspire docs — a CLI for searching, browsing, and reading official documentation without leaving your terminal. It also works as a tool for AI agents. Here's why this matters.</description><content:encoded>&lt;p&gt;You know that moment when you&amp;rsquo;re deep in an Aspire AppHost, wiring up integrations, and you need to check exactly which parameters the Redis integration expects? You alt-tab to your browser, hunt through aspire.dev, squint at the API docs, then come back to your editor. Context lost. Flow broken.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 just &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;shipped a fix for that&lt;/a&gt;. The &lt;code&gt;aspire docs&lt;/code&gt; CLI lets you search, browse, and read official Aspire documentation directly from your terminal. And because it&amp;rsquo;s backed by reusable services, AI agents and skills can use the same commands to look up docs instead of hallucinating APIs that don&amp;rsquo;t exist.&lt;/p&gt;
&lt;h2 id="the-problem-this-actually-solves"&gt;The problem this actually solves&lt;/h2&gt;
&lt;p&gt;David Pine nails it in the original post: AI agents were &lt;em&gt;terrible&lt;/em&gt; at helping developers build Aspire apps. They&amp;rsquo;d recommend &lt;code&gt;dotnet run&lt;/code&gt; instead of &lt;code&gt;aspire run&lt;/code&gt;, reference learn.microsoft.com for docs that live on aspire.dev, suggest outdated NuGet packages, and — my personal favorite — hallucinate APIs that don&amp;rsquo;t exist.&lt;/p&gt;
&lt;p&gt;Why? Because Aspire was .NET-specific far longer than it&amp;rsquo;s been polyglot, and LLMs are working off training data that predates the latest features. When you give an AI agent the ability to actually look up the current docs, it stops guessing and starts being useful.&lt;/p&gt;
&lt;h2 id="three-commands-zero-browser-tabs"&gt;Three commands, zero browser tabs&lt;/h2&gt;
&lt;p&gt;The CLI is refreshingly simple:&lt;/p&gt;
&lt;h3 id="list-all-docs"&gt;List all docs&lt;/h3&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;aspire docs list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Returns every documentation page available on aspire.dev. Need machine-readable output? Add &lt;code&gt;--format Json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="search-for-a-topic"&gt;Search for a topic&lt;/h3&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;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Searches both titles and content with weighted relevance scoring. Same search engine that powers the documentation tooling internally. You get ranked results with titles, slugs, and relevance scores.&lt;/p&gt;
&lt;h3 id="read-a-full-page-or-just-one-section"&gt;Read a full page (or just one section)&lt;/h3&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;aspire docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Streams the full page as markdown to your terminal. Need just one section?&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;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Surgical precision. No scrolling through 500 lines. Just the part you need.&lt;/p&gt;
&lt;h2 id="the-ai-agent-angle"&gt;The AI agent angle&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s where it gets interesting for us developers building with AI tooling. The same &lt;code&gt;aspire docs&lt;/code&gt; commands work as tools for AI agents — through skills, MCP servers, or simple CLI wrappers.&lt;/p&gt;
&lt;p&gt;Instead of your AI assistant making up Aspire APIs based on stale training data, it can call &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, find the official integration docs, read the right page, and give you the documented approach. Real-time, current documentation — not what the model memorized six months ago.&lt;/p&gt;
&lt;p&gt;The architecture behind this is intentional. The Aspire team built reusable services (&lt;code&gt;IDocsIndexService&lt;/code&gt;, &lt;code&gt;IDocsSearchService&lt;/code&gt;, &lt;code&gt;IDocsFetcher&lt;/code&gt;, &lt;code&gt;IDocsCache&lt;/code&gt;) rather than a one-off integration. That means the same search engine works for humans in the terminal, AI agents in your editor, and automation in your CI pipeline.&lt;/p&gt;
&lt;h2 id="real-world-scenarios"&gt;Real-world scenarios&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quick terminal lookups:&lt;/strong&gt; You&amp;rsquo;re three files deep and need Redis config parameters. Two commands, ninety seconds, back to work:&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;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;AI-assisted development:&lt;/strong&gt; Your VS Code skill wraps the CLI commands. You ask &amp;ldquo;Add a PostgreSQL database to my AppHost&amp;rdquo; and the agent looks up the real docs before answering. No hallucinations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD validation:&lt;/strong&gt; Your pipeline validates AppHost configurations against official documentation programmatically. &lt;code&gt;--format Json&lt;/code&gt; output pipes cleanly to &lt;code&gt;jq&lt;/code&gt; and other tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom knowledge bases:&lt;/strong&gt; Building your own AI tooling? Pipe structured JSON output directly into your knowledge base:&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;aspire docs search &lt;span class="s2"&gt;&amp;#34;monitoring&amp;#34;&lt;/span&gt; --format Json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;[.[] | {slug, title, summary}]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No web scraping. No API keys. Same structured data the docs tooling uses internally.&lt;/p&gt;
&lt;h2 id="the-documentation-is-always-live"&gt;The documentation is always live&lt;/h2&gt;
&lt;p&gt;This is the part I appreciate most. The CLI doesn&amp;rsquo;t download a snapshot — it queries aspire.dev with ETag-based caching. The moment the docs update, your CLI and any skill built on top of it reflects that. No stale copies, no &amp;ldquo;but the wiki said&amp;hellip;&amp;rdquo; moments.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; is one of those small features that solves a real problem cleanly. Humans get terminal-native documentation access. AI agents get a way to stop guessing and start referencing actual docs. And it&amp;rsquo;s all backed by the same source of truth.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re building with .NET Aspire and haven&amp;rsquo;t tried the CLI yet, run &lt;code&gt;aspire docs search &amp;quot;your-topic-here&amp;quot;&lt;/code&gt; and see how it feels. Then consider wrapping those commands into whatever AI skill or automation setup you&amp;rsquo;re using — your agents will thank you.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;David Pine&amp;rsquo;s deep dive&lt;/a&gt; on how the docs tooling came together, and the &lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;official CLI reference&lt;/a&gt; for all the details.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2's Dashboard Just Got a Telemetry API — and It Changes Everything</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 ships smarter telemetry export, a programmable API for traces and logs, and GenAI visualization improvements. Here's why this matters for your debugging workflow.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve been building distributed apps with .NET Aspire, you already know the dashboard is the single best thing about the whole experience. All your traces, logs, and metrics in one place — no external Jaeger, no Seq setup, no &amp;ldquo;let me check the other terminal&amp;rdquo; moments.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 just made it significantly better. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;announced the update&lt;/a&gt;, and honestly? The telemetry export and API features alone are worth the upgrade.&lt;/p&gt;
&lt;h2 id="export-telemetry-like-a-sane-person"&gt;Export telemetry like a sane person&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the scenario we&amp;rsquo;ve all lived through: you&amp;rsquo;re debugging a distributed issue, you finally reproduce it after twenty minutes of setup, and now you need to share what happened with your team. Before? Screenshots. Copy-pasting trace IDs. The usual mess.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 adds a proper &lt;strong&gt;Manage logs and telemetry&lt;/strong&gt; dialog where you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear all telemetry (useful before a repro attempt)&lt;/li&gt;
&lt;li&gt;Export selected telemetry to a ZIP file in standard OTLP/JSON format&lt;/li&gt;
&lt;li&gt;Re-import that ZIP into any Aspire dashboard later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last part is the killer feature. You reproduce a bug, export the telemetry, attach it to your work item, and your teammate can import it into their own dashboard to see exactly what you saw. No more &amp;ldquo;can you reproduce it on your machine?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Individual traces, spans, and logs also get an &amp;ldquo;Export JSON&amp;rdquo; option in their context menus. Need to share one specific trace? Right-click, copy JSON, paste into your PR description. Done.&lt;/p&gt;
&lt;h2 id="the-telemetry-api-is-the-real-game-changer"&gt;The telemetry API is the real game changer&lt;/h2&gt;
&lt;p&gt;This is what I&amp;rsquo;m most excited about. The dashboard now exposes an HTTP API under &lt;code&gt;/api/telemetry&lt;/code&gt; for querying telemetry data programmatically. Available endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — list resources with telemetry&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — query spans with filters&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — query logs with filters&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — list traces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt; — get all spans for a specific trace&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything comes back in OTLP JSON format. This powers the new &lt;code&gt;aspire agent mcp&lt;/code&gt; and &lt;code&gt;aspire otel&lt;/code&gt; CLI commands, but the real implication is bigger: you can now build tooling, scripts, and AI agent integrations that query your app&amp;rsquo;s telemetry directly.&lt;/p&gt;
&lt;p&gt;Imagine an AI coding agent that can look at your actual distributed traces while debugging. That&amp;rsquo;s not hypothetical anymore — that&amp;rsquo;s what this API enables.&lt;/p&gt;
&lt;h2 id="genai-telemetry-gets-practical"&gt;GenAI telemetry gets practical&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re building AI-powered apps with Semantic Kernel or Microsoft.Extensions.AI, you&amp;rsquo;ll appreciate the improved GenAI telemetry visualizer. Aspire 13.2 adds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI tool descriptions rendered as Markdown&lt;/li&gt;
&lt;li&gt;A dedicated GenAI button on the traces page for quick AI trace access&lt;/li&gt;
&lt;li&gt;Better error handling for truncated or non-standard GenAI JSON&lt;/li&gt;
&lt;li&gt;Click-to-highlight navigation between tool definitions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The blog post mentions that VS Code Copilot chat, Copilot CLI, and OpenCode all support configuring an &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;. Point them at the Aspire dashboard and you can literally watch your AI agents think in real time through telemetry. That&amp;rsquo;s a debugging experience you won&amp;rsquo;t find anywhere else.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 takes the dashboard from &amp;ldquo;nice debugging UI&amp;rdquo; to &amp;ldquo;programmable observability platform.&amp;rdquo; The export/import workflow alone saves real time on distributed debugging, and the telemetry API opens the door to AI-assisted diagnostics.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re already on Aspire, upgrade. If you&amp;rsquo;re not — this is a good reason to check out &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt; and see what the fuss is about.&lt;/p&gt;</content:encoded></item></channel></rss>