{"id":349,"date":"2026-04-07T10:00:00","date_gmt":"2026-04-07T17:00:00","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/aspire\/?p=349"},"modified":"2026-04-07T10:36:17","modified_gmt":"2026-04-07T17:36:17","slug":"agentic-dev-aspirations","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/aspire\/agentic-dev-aspirations\/","title":{"rendered":"Agentic development aspirations: build, run, observe \u2014 without more Markdown"},"content":{"rendered":"<p>AI agents are <em>really<\/em> good at writing code. Embarrassingly, scarily, and increasingly good. But generating code and shipping working full-stack apps are very different things. Right now, most agents are fantastic at the first part and terrible at everything after it. To try and keep agents on track, we layer on Markdown \u2014 skills, prompts, custom instructions &#8211; but those are unpredictable, require constant maintenance, can&#8217;t be compiled or tested, and cost tokens just to parse.<\/p>\n<p>When it comes to actually <em>running<\/em> the app, things get worse. Long-running CLI processes (like a Vite dev server) can hang agents entirely. Port conflicts, phantom processes, unset environment variables \u2014 all of it burns tokens while the agent spins its wheels troubleshooting by trial-and-error.<\/p>\n<p>Even when everything does run, the feedback loop is broken. The agent can\u2019t see what\u2019s happening! It relies on you to copy-paste logs, errors, and screenshots back into the chat. That makes the agent loop annoyingly manual, dependent on your constant attention and feedback. As agentic tools move toward things like autopilot, YOLO mode, and delegated sessions, we want agents to run as long as possible without intervention \u2014 but also without breaking things.<\/p>\n<p>Burke Holland, VS Code #influencer and generally smart guy, nailed one of my biggest concerns in a recent post:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/aspire\/wp-content\/uploads\/sites\/90\/2026\/04\/burketweet.webp\" alt=\"An x post by @burkeholland saying &quot;Markdown is not the answer to your AI problems. It just can't be. We need to force AI through deterministic gates.&quot;\" \/> <a href=\"https:\/\/x.com\/burkeholland\/status\/2040131862501200271\">Original post<\/a><\/p>\n<h2>Aspire can help<\/h2>\n<p>Aspire&#8217;s main goal is giving structure to distributed apps \u2014 defining your stack in code, running everything with one command, and surfacing telemetry so you can actually see what&#8217;s happening. It turns out those same things are exactly what AI agents need to be effective. Think of it like bowling \u2014 if you aren&#8217;t great, you probably throw the ball in the gutter a lot. But put up lane bumpers, and a <a href=\"https:\/\/www.youtube.com\/watch?v=gI5kICE1wto\">gutter ball can turn into a strike<\/a>!<\/p>\n<p>With Aspire 13.2, we went all-in on agent-friendly features (along with our usual heap of human-friendly improvements \u263a\ufe0f). The CLI now outputs structured, minimal-token responses built for agent consumption. Detached and isolated run modes let agents run and parallelize without conflicts. <code>aspire doctor<\/code> validates the environment before work starts. And <code>aspire init<\/code> ships agent skills and an MCP out of the box.<\/p>\n<h2>\ud83d\udd28 Agents love compilers, and agents loooooove reading source code<\/h2>\n<p>Agents are at their best when they have two things: source code to read and a compiler to check their work (usually via the command line). They have that already with your app, but lose that with YAML or JSON based launch configs. The Aspire apphost gives you the same functionality as a <code>compose.yml<\/code> or <code>launch.json<\/code> but in typesafe, compilable, TypeScript or C# code.<\/p>\n<p>When your stack is defined in code \u2014 your API, your frontend, your database, your cache \u2014 the agent doesn&#8217;t have to guess how things connect. It can traverse the apphost, discover available integrations, read the APIs, wire up new resources, and build the project to see if everything relates correctly. No trial and error with CLI flags, and no guessing at configuration formats!<\/p>\n<p>Here&#8217;s what a typical apphost looks like \u2014 your entire stack, defined in a few lines of code:<\/p>\n<pre><code class=\"language-ts\">import { createBuilder } from '.\/.modules\/aspire.js';\n\nconst builder = await createBuilder();\n\nconst postgres = await builder.addPostgres(\"pg\").addDatabase(\"catalog\");\nconst cache = await builder.addRedis(\"cache\");\n\nconst api = await builder\n    .addNodeApp(\"api\", \".\/api\", \"src\/index.ts\")\n    .withHttpEndpoint({ env: \"PORT\" })\n    .withReference(postgres)\n    .withReference(cache);\n\nawait builder\n    .addViteApp(\"frontend\", \".\/frontend\")\n    .withReference(api)\n    .waitFor(api);\n\nawait builder.build().run();<\/code><\/pre>\n<p>An agent can easily read this to understand the full topology of your app. This also means the agent can <em>modify<\/em> your stack with confidence. Need to add Redis? The agent can add the integration, reference it from the right project, and build to verify, all without you telling it what to do. The compiler tells it immediately whether the change is valid. Instead of scattering secrets across <code>.env<\/code> files that are easy to accidentally commit, you define parameters in the apphost. Resources can declare which parameters they need to start, you or the agent can fill them in interactively, and the values get stored in your user profile \u2014 outside the source tree and out of version control.<\/p>\n<h2>\u23ef\ufe0f Stop making your agent a process manager<\/h2>\n<p>Right now, when an agent needs to run your app, it fires off a ton of commands like <code>docker compose up<\/code>, <code>npm run dev<\/code>, <code>python manage.py runserver<\/code>, <code>.\/random-build-script.sh<\/code> and whatever else your stack requires. Long-running processes are especially painful \u2014 a Vite dev server or a database container doesn&#8217;t exit, so the agent either hangs waiting for it or tries to background it and loses track. It also usually spends some time trial-and-erroring the startup order. Even if someone on your team built out <code>instructions.md<\/code>, phantom processes still pile up, ports conflict, and the agent burns tokens just trying to run things.<\/p>\n<p>With Aspire, all of that is one command. Every resource in your stack is defined in the apphost, and <code>aspire start<\/code> kicks off \u2014 and keeps track of \u2014 all of them. APIs, frontends, containers, databases, started in the right order, on the right ports, with the right configuration. The agent doesn&#8217;t need to know how to start each piece individually. It just runs <code>aspire start<\/code> and moves on. And the Aspire skill that ships with <code>aspire init<\/code> tells the agent how to inspect resources and keep an eye on things from there.<\/p>\n<p><div style=\"width: 1920px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-349-1\" width=\"1920\" height=\"1208\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/devblogs.microsoft.com\/aspire\/wp-content\/uploads\/sites\/90\/2026\/04\/startdemonew.mp4?_=1\" \/><a href=\"https:\/\/devblogs.microsoft.com\/aspire\/wp-content\/uploads\/sites\/90\/2026\/04\/startdemonew.mp4\">https:\/\/devblogs.microsoft.com\/aspire\/wp-content\/uploads\/sites\/90\/2026\/04\/startdemonew.mp4<\/a><\/video><\/div><\/p>\n<p>As the agent writes and iterates on code, it can restart individual resources without tearing down the whole system. All logs from every resource stream into one place as plain text, so the agent can read them without context-switching between terminals. And because everything is codified in the apphost, it&#8217;s deterministic \u2014 the same command works every time, on every machine, for every agent.<\/p>\n<p>And if you&#8217;re running multiple agents? <code>--isolated<\/code> mode means each Aspire run gets its own ports and secrets. You can spin up multiple agents in parallel across different worktrees and they won&#8217;t collide. That&#8217;s a game changer for delegated sessions and parallel workstreams.<\/p>\n<p><div class=\"alert alert-success\"><p class=\"alert-divider\"><i class=\"fabric-icon fabric-icon--Lightbulb\"><\/i><strong>Building AI features?<\/strong><\/p>This same workflow applies when the thing you&#8217;re building <em>is<\/em> AI. Aspire integrations for OpenAI, Ollama, Microsoft Foundry, and more mean your agent can wire up AI endpoints the same way it would an API project or a database &#8211; it&#8217;s just another resource in the app model.<\/div><\/p>\n<h2>\ud83d\udc40 Give your agent &#8220;eyes&#8221; &#8211; aka a real feedback loop<\/h2>\n<p>Your agent can build and run your app now, but then it hands off to you to test that things are actually <em>working<\/em>. How can we help it check its work as it goes &#8211; or, as the Aspire team says, give the agent &#8220;eyes&#8221;?<\/p>\n<p>Logs are the obvious starting point. Aspire makes every resource&#8217;s logs accessible through the CLI as plain text, so the agent can check for errors without you pointing it to the right terminal window or copy-pasting stack traces.<\/p>\n<p>But! We can do better than just logs. The Aspire CLI also exposes full OpenTelemetry data during local dev \u2014 traces, metrics, structured logs, all of it. So the agent isn&#8217;t just reading console output and trying to string together what happened between services based on timestamps. It can profile slow requests, trace a failing workflow across services, and pinpoint exactly where things go sideways. That&#8217;s production-grade observability, right in the agent&#8217;s terminal, during dev. If you&#8217;ve used the Aspire dashboard, you already know how nice it is to have OTel data presented in a human-readable way. Now, we&#8217;re giving that same power to the agent.<\/p>\n<p><div style=\"width: 3596px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-349-2\" width=\"3596\" height=\"2264\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/devblogs.microsoft.com\/aspire\/wp-content\/uploads\/sites\/90\/2026\/04\/describelogsdemo.mp4?_=2\" \/><a href=\"https:\/\/devblogs.microsoft.com\/aspire\/wp-content\/uploads\/sites\/90\/2026\/04\/describelogsdemo.mp4\">https:\/\/devblogs.microsoft.com\/aspire\/wp-content\/uploads\/sites\/90\/2026\/04\/describelogsdemo.mp4<\/a><\/video><\/div><\/p>\n<p>If you really want to go full hands-off: pair Aspire with something like the Playwright CLI or a browser agent. Now your agent can actually <em>use<\/em> your app by clicking through flows, filling out forms, or checking the DOM. It tests the experience, sees something broken in the telemetry, fixes the code, restarts the resource, tests again. No screenshots to copy-paste, no &#8220;do it right this time, make no mistakes&#8221;. Build, run, observe, fix, rinse, repeat! That&#8217;s the loop.<\/p>\n<h2>\ud83d\udcab Get started<\/h2>\n<p><strong>New to Aspire?<\/strong> Head to <a href=\"https:\/\/get.aspire.dev\">get.aspire.dev<\/a> to install the CLI, then check out the <a href=\"https:\/\/aspire.dev\/get-started\/first-app\">Getting Started guide<\/a> to build your first app or add Aspire to your existing stack.<\/p>\n<p><strong>Already using Aspire?<\/strong> Run <code>aspire update --self<\/code> to get all the 13.2 agent features, then point your favorite coding agent at your repo and see what happens. You might be surprised how much further it gets.<\/p>\n<p>We&#8217;re iterating quickly on Aspire&#8217;s agent-friendly story, so we&#8217;d love to hear how it goes for you. Share feedback on <a href=\"https:\/\/github.com\/microsoft\/aspire\">GitHub<\/a>, hang out with us on <a href=\"https:\/\/aka.ms\/aspire-discord\">Discord<\/a>, or find us on <a href=\"https:\/\/x.com\/aspiredotdev\">X<\/a> and <a href=\"https:\/\/bsky.app\/profile\/aspire.dev\">BlueSky<\/a>.<\/p>\n<p>Now, go give your agent some bumpers to bounce off of while it helps you code! Happy Aspirifying! \ud83d\udcab<\/p>\n","protected":false},"excerpt":{"rendered":"<p>AI agents can write code but struggle to run and test it. Aspire gives your agent a codified app model to build, run, and observe your whole stack.<\/p>\n","protected":false},"author":1965,"featured_media":350,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[20,1],"tags":[8,9,10,55],"class_list":["post-349","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-aspire-category","tag-ai","tag-aspire","tag-cli","tag-telemetry"],"acf":[],"blog_post_summary":"<p>AI agents can write code but struggle to run and test it. Aspire gives your agent a codified app model to build, run, and observe your whole stack.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/posts\/349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/users\/1965"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/comments?post=349"}],"version-history":[{"count":2,"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/posts\/349\/revisions"}],"predecessor-version":[{"id":366,"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/posts\/349\/revisions\/366"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/media\/350"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/media?parent=349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/categories?post=349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/aspire\/wp-json\/wp\/v2\/tags?post=349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}