Repository navigation
13.4 Change log
44 new features, 113 improvements, 118 bug fixes
ℹ️ This changelog is automatically generated from merged pull requests and may contain inaccuracies. For official release notes, see https://aka.ms/aspire/update-latest.
- 2026-06-01 01:34 — 🌉 Cross-environment Foundry hosted-agent endpoint resolution and RBAC auto-wiring
- 2026-05-31 18:43 — 📡 Fix staging darc feed routing for prerelease-shaped CLI builds
- 2026-05-31 03:12 — 🤖 Foundry hosted-agent builder API updates
- 2026-05-30 21:55 — 🐛 Fix DistributedApplicationTestingBuilder dashboard with dynamic ports
- 2026-05-30 21:54 — 🔧 13.4 API review conformance fixes
- 2026-05-30 20:35 — 🔍 Fix aspire add hiding non-default channel integrations
- 2026-05-30 03:48 — 🐛 Fix five aspire ls bugs
- 2026-05-30 02:12 — 🔗 Fix Foundry hosted-agent publish reference placement
- 2026-05-29 22:11 — 🔒 Keep Aspire.Hosting.Blazor as preview on 13.4.x
- 2026-05-29 22:09 — 🔓 Fix TypeScript AppHost deadlock for async callbacks
25 new features, 35 improvements, 36 bug fixes
-
🌐 Blazor WebAssembly hosting integration
IntroducesAspire.Hosting.Blazor, a new integration that extends Aspire orchestration to Blazor WebAssembly applications. Blazor WASM clients can now use Aspire service discovery, send OpenTelemetry traces and logs to the Aspire dashboard, and participate in the same structured lifecycle as server-side resources. The gateway also supports Docker Compose publish mode by emitting environment variable expressions for the gateway origin URL.
Owner: @davidfowl
Changes: #15691, #17540
Docs: microsoft/aspire.dev#1061
📝 Documentation required
🌍 Community contribution by @javiercn -
🎛️ Dynamic inputs for resource commands
Resource commands can now define dynamic inputs whose enabled state, default values, or choice options depend on earlier answers. This metadata flows from the hosting model through the CLI and VS Code extension so tool clients can prompt users correctly.
Owner: @davidfowl
Changes: #17249
📝 Documentation required -
🐰 AddBunApp for Bun-native apps
Adds AddBunApp to Aspire.Hosting.JavaScript, enabling orchestration of Bun-native apps (TypeScript or JavaScript files run directly with bun). Bun apps get automatic OTLP exporter wiring, certificate trust, and Dockerfile generation with multi-stage builds using the official oven/bun image.
Owner: @davidfowl
Changes: #17416
📝 Documentation required -
🔐 WithAcrPullIdentity for Azure App Service Environment
AzureAppServiceEnvironmentResource now supports WithAcrPullIdentity(), allowing a user-assigned managed identity to be specified for pulling container images from Azure Container Registry, mirroring the existing WithAcrPullIdentity() on Container Apps environments.
Owner: @davidfowl
Changes: #17379
📝 Documentation required -
🔗 External service support in TypeScript withEnvironment
TypeScript AppHosts can now pass an ExternalServiceResource directly to withEnvironment, matching the existing C# WithEnvironment(name, externalService) behavior. Previously the TypeScript ATS signature omitted external service resources, causing type-check failures for valid usage patterns.
Owner: @maddymontaquila
Changes: #17393
Docs: microsoft/aspire.dev#1048
📝 Documentation required -
🪪 Add WithAcrPullIdentity to Azure Container App Environment
AddsWithAcrPullIdentitytoIResourceBuilder<AzureContainerAppEnvironmentResource>, allowing a user-assigned managed identity to be used for pulling container images from Azure Container Registry instead of the auto-generated identity.
Owner: @eerhardt
Changes: #17365
Docs: microsoft/aspire.dev#1045
📝 Documentation required -
🎮 Resource command service for polyglot AppHosts
TypeScript and other polyglot AppHosts can now resolve ResourceCommandService and programmatically invoke resource commands. Commands can be invoked using either a string resource ID or a resource builder handle, and can pass optional command arguments, closing the gap with C# AppHosts.
Owner: @sebastienros
Changes: #17330, #17358
Docs: microsoft/aspire.dev#1031
📝 Documentation required -
📸 Resource snapshot access in polyglot command state callbacks
Polyglot AppHost command updateState callbacks can now access the resource's current health and lifecycle snapshot via resourceSnapshot(). This enables health-gated command enable/disable logic in TypeScript, Python, Go, and Java AppHosts, closing the gap with C# AppHosts that already had access to resource state in command callbacks.
Owner: @sebastienros
Changes: #17328
Docs: microsoft/aspire.dev#1042
📝 Documentation required -
🙈 Hide resources with WithHidden() and WithHiddenOnCompletion()
AppHost authors can now hide implementation-detail resources from default resource views using WithHidden() and WithHiddenOnCompletion() extension methods. Hidden resources remain in the app model and are addressable by name, but are excluded from dashboard and CLI resource lists unless explicitly requested — keeping views clean when resources like setup helpers, migration services, or certificate collections are implementation details rather than end-user concerns.
Owner: @davidfowl
Changes: #16070
📝 Documentation required
🌍 Community contribution by @afscrome -
🔄 Persistent executable and project lifetimes
Executable and project resources now support persistent lifetimes, enabling stable process, endpoint, and environment behavior across AppHost/DCP restarts. This aligns with the existing persistent container lifetime model and includes updated DCP executable model fields (persistent, start, stop).
Owner: @danegsta
Changes: #17112
Docs: microsoft/aspire.dev#1083, microsoft/aspire.dev#1084
⚠️ Breaking change
📝 Documentation required -
📦 Publish Aspire.Hosting.Integration.Analyzers as preview package
The Aspire.Hosting.Integration.Analyzers package is now published as a standalone preview NuGet package, enabling third-party integration authors to use the same ATS/polyglot analyzer guidance used within the Aspire repository itself.
Owner: @sebastienros
Changes: #17276
📝 Documentation required -
📋 Custom parameter input options for polyglot AppHosts
Polyglot AppHosts (TypeScript, Python, Go, Java) can now configure custom parameter prompts using serializable ParameterCustomInputOptions, enabling the same rich input UX as C# WithCustomInput without leaking the C# delegate model through ATS code generation.
Owner: @sebastienros
Changes: #17130
📝 Documentation required -
🔢 Nullable scalar support in polyglot SDK code generation
Nullable C# scalar properties (e.g. string?) are now correctly emitted as nullable types in generated TypeScript (| null) and Python (| None) polyglot SDKs. Go, Java, and Rust behavior is unchanged.
Owner: @sebastienros
Changes: #17153
📝 Documentation required -
☁️ Azure provisioning helpers for polyglot AppHosts
Polyglot AppHosts (TypeScript, Python, Go, Java) can now customize Azure Container Apps scale settings and App Service site configuration using strongly typed helper APIs (configureScale, configureSiteConfig, configureSlotSiteConfig), with full code generation support across all polyglot SDKs.
Owner: @sebastienros
Changes: #17133
📝 Documentation required -
🔔 Publish lifecycle events for polyglot AppHosts
TypeScript and other polyglot AppHosts can now subscribe to BeforePublishEvent and AfterPublishEvent lifecycle events, enabling pre/post publish logic in non-C# app hosts — closing the gap with the C# OnBeforePublish and OnAfterPublish APIs.
Owner: @sebastienros
Changes: #17129
Docs: microsoft/aspire.dev#998
📝 Documentation required -
🐳 Docker Compose object model helpers for polyglot AppHosts
Polyglot AppHosts (TypeScript, Go, Java, Python, Rust, etc.) can now create and configure top-level Docker Compose services, networks, volumes, configs, secrets, and service volume mounts using ergonomic SDK helpers, reaching feature parity with the C# Docker Compose customization API.
Owner: @sebastienros
Changes: #17128
📝 Documentation required -
🎛️ Resource command arguments, visibility, and immediate result display
Resource commands now support typed input arguments with metadata (descriptions, default values, allowed values) and per-command visibility controls. Built-in commands such as parameter-set, ef-migrations-add, and browser configuration now declare structured arguments, enabling consistent value supply from the dashboard, CLI, and MCP. Command results can be flagged to display immediately in the dashboard, and visibility can be set per-command to control where they appear.
Owner: @davidfowl
Changes: #16710, #16906, #17021
Docs: microsoft/aspire.dev#892, microsoft/aspire.dev#897, microsoft/aspire.dev#974
📝 Documentation required -
🔐 Cert-manager integration for Kubernetes and AKS
Typed cert-manager API for Kubernetes environments lets you install cert-manager, create ClusterIssuers backed by Let’s Encrypt (staging or production) or a custom ACME server, and wire TLS directly to gateways — all through the Aspire app model without dropping into raw Helm values or annotations.
Owner: @mitchdenny
Changes: #17008
Docs: microsoft/aspire.dev#973
📝 Documentation required -
🌐 Gateway API and AGC ingress for AKS environments
Azure Application Gateway for Containers (AGC) is now fully wired up in AddAzureKubernetesEnvironment. When AddLoadBalancer(...) is used, Aspire automatically provisions the AGC ingress profile on AKS, grants the controller identity the required Network Contributor role, and exposes Gateway API — delivering a complete ingress story with a single aspire deploy.
Owner: @mitchdenny
Changes: #16990
Docs: microsoft/aspire.dev#973
📝 Documentation required -
⚙️ Process-backed resource commands
Added a new experimentalWithProcessCommandAPI so AppHost authors can expose process-backed resource commands — commands that run local tools, scripts, or CLIs and capture their output. Supports static and dynamic process specs, stdin, environment variables, bounded output, and a factory variant for TypeScript polyglot AppHosts. TheIInteractionServicenow correctly returnsIsAvailable=falseduring non-interactive CLI resource command execution.
Owner: @davidfowl
Changes: #16923, #16972, #16973
Docs: microsoft/aspire.dev#918, microsoft/aspire.dev#923
📝 Documentation required -
☸️ Kubernetes manifest resource API
Added KubernetesManifestResource with a polyglot-friendly server-side API for adding arbitrary Kubernetes manifests to deployment pipelines. Resources can be configured with namespaces, labels, annotations, and arbitrary YAML field paths via the new AddManifest(...) helper on KubernetesResource.
Owner: @sebastienros
Changes: #16883
Docs: microsoft/aspire.dev#927
📝 Documentation required -
⛵ AddHelmChart for external Helm charts
Added AddHelmChart infrastructure for installing external Helm charts into a Kubernetes environment as aspire deploy pipeline steps. This enables deploying third-party Helm charts (such as ingress controllers or monitoring stacks) alongside your Aspire application.
Owner: @mitchdenny
Changes: #16589
Docs: microsoft/aspire.dev#905, microsoft/aspire.dev#1172
📝 Documentation required -
🔑 Public AzureRoleAssignmentResource type
Introduced a new public AzureRoleAssignmentResource type that allows pipeline steps and application model code to inspect and reason about Azure role assignments, enabling custom deployment logic based on what roles are assigned to which Azure resources.
Owner: @eerhardt
Changes: #16888
Docs: microsoft/aspire.dev#896
📝 Documentation required -
📦 AppHost CLI bundle opt-in
C# AppHost projects can now opt in to using the Aspire CLI bundle for DCP and Dashboard by setting true, enabling the AppHost to use the bundled tools from the Aspire CLI installation instead of the SDK-distributed ones.
Owner: @DamianEdwards
Changes: #16811
Docs: microsoft/aspire.dev#894
📝 Documentation required -
🐹 Go polyglot AppHost support
Completed Go polyglot AppHost support with fixture tests, updated code generator, transport fixes, and a Go starter template — reaching parity with the TypeScript AppHost implementation.
Owner: @sebastienros
Changes: #16038
Docs: microsoft/aspire.dev#950
📝 Documentation required
🌍 Community contribution by @edmondshtogu
-
🌉 Cross-environment Foundry hosted-agent endpoint resolution and RBAC auto-wiring
Resolves two cross-compute-environment gaps for Foundry hosted agents: publishers (ACA, App Service, Kubernetes) now correctly delegate endpoint resolution to the owning compute environment rather than failing when a referenced resource lives in a different environment, and referencing a hosted agent automatically provisions the consumer's managed identity with the Azure AI User role on the Foundry account — eliminating two manual post-deploy steps.
Owner: @davidfowl
Changes: #17756
📝 Documentation required -
🤖 Foundry hosted-agent builder API updates
UpdatedAspire.Hosting.Foundryhosted-agent builder APIs to use a project-first approach:AsHostedAgentnow takes the Foundry project as the primary argument with a typedHostedAgentConfigurationcallback. Protocol selection is now supported so agents can be configured to use either the responses or invocations protocol in both local and Azure publish modes. Local run mode no longer creates an unnecessary default Azure Container Registry resource.
Owner: @tommasodotNET
Changes: #17669, #17732
Docs: microsoft/aspire.dev#1130
⚠️ Breaking change
📝 Documentation required -
🔧 13.4 API review conformance fixes
Addresses API design review feedback for 13.4: restores accidentally removed public members (NetworkID, DefaultNetworkID, ContextNetworkID), aligns internal naming to the Id convention, marks AzureRoleAssignmentResource as experimental, seals new 13.4 resource classes, and resolves WithHiddenOnCompletion overload ambiguity.
Owner: @joperezr
Changes: #17706 -
🎓 ATS polyglot APIs graduate from experimental
The Aspire Type System (ATS) APIs for polyglot AppHost authoring are now generally available in Aspire 13.4. Projects that previously suppressedASPIREATS001compiler warnings can safely remove those suppressions.
Owner: @sebastienros
Changes: #17602
Docs: microsoft/aspire.dev#1112
📝 Documentation required -
⛑️ Validate Helm CLI version (≥ 4.2.0) before Kubernetes deploy
The Kubernetes deployment pipeline now validates that Helm 4.2.0 or later is installed before attempting to deploy. Previously, a missing or outdated Helm produced cryptic errors likeunknown flag: --force-conflicts; now a single clear, actionable error message is shown with a link to the Helm installation docs.
Owner: @mitchdenny
Changes: #17542
Docs: microsoft/aspire.dev#1090, microsoft/aspire.dev#1097 -
🤖 Foundry inference endpoint exposed as env var
Foundry deployment references now expose an ENDPOINTAIINFERENCE environment variable so non-.NET consumers can use the AI inference endpoint directly without parsing the composite connection string.
Owner: @tommasodotNET
Changes: #17497 -
🔄 Foundry agent builder API alignment with Aspire conventions
Foundry agent builder APIs updated to follow standard Aspire AppHost conventions:AddPromptAgentnow takes the resource name as the first parameter (before the model), andPublishAsHostedAgenthas been renamed toWithComputeEnvironmentto align with other deployment targets. The preview-onlyAsHostedAgentandRunAsHostedAgentmethods were removed.
Owner: @tommasodotNET
Changes: #17499
Docs: microsoft/aspire.dev#997
⚠️ Breaking change
📝 Documentation required -
🔐 DCP dev cert TLS file support for macOS and Linux
DCP now uses ASP.NET Core developer certificate TLS files on macOS and Linux, enabling the same cross-platform HTTPS developer experience previously only available on Windows via certificate thumbprint. The opt-out env var ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE=false preserves the old ephemeral certificate behavior.
Owner: @danegsta
Changes: #17449
Docs: microsoft/aspire.dev#1069
📝 Documentation required -
🌐 Blazor and Dockerfile factory APIs in TypeScript AppHosts
Exposes Blazor gateway APIs (addBlazorGateway, withBlazorClientApp, addBlazorWasmProject) and Dockerfile factory APIs (withDockerfileFactory, addDockerfileFactory) to TypeScript and other polyglot AppHosts via the Aspire TypeScript SDK (ATS).
Owner: @sebastienros
Changes: #17420
Docs: microsoft/aspire.dev#1061
📝 Documentation required -
🔀 Kubernetes Ingress WithRoute renamed to WithPath
Kubernetes IngressWithRoutehas been renamed toWithPathto match the underlyingspec.rules[].http.paths[]concept in Kubernetes YAML. The sharedIngressPathTypeenum is split intoKubernetesIngressPathType(for Ingress) andKubernetesGatewayPathType(for Gateway API) so each builder's path types accurately reflect the spec it targets.
Owner: @mitchdenny
Changes: #17424
Docs: microsoft/aspire.dev#1060
⚠️ Breaking change
📝 Documentation required -
⛓️ Async method chaining in TypeScript AppHosts
TypeScript AppHost code generation now supports fluent async method chaining. Generated async methods that return chainable wrapper types expose the same thenable surface, so builders like builder.addContainer(...).withReference(...) work seamlessly even when async methods are in the chain — without requiring callers to split the chain or double-await.
Owner: @sebastienros
Changes: #17400
Docs: microsoft/aspire.dev#1056
📝 Documentation required -
📦 Renamed JavaScript publish API to PublishAsPackageScript
Renamed PublishAsNpmPackageScript to PublishAsPackageScript and startScriptName to scriptName, reflecting that the API supports npm, pnpm, Yarn, and Bun — not just npm. Update call sites to use the new names.
Owner: @davidfowl
Changes: #17382
Docs: microsoft/aspire.dev#1020
⚠️ Breaking change
📝 Documentation required -
🔧 Optional OTLP and resource service configuration in app host
ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL and ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL no longer need to be configured in launchSettings.json — ports are now assigned dynamically. This simplifies app host setup and makes it easier to enable the dashboard in tests.
Owner: @JamesNK
Changes: #16046
🌍 Community contribution by @afscrome -
📂 Polyglot SDK modules consolidated under .aspire directory
Generated polyglot SDK modules are now consolidated under.aspire/modules/instead of being split across.modules/and.aspire/, reducing clutter in project root directories. All generated language references (TypeScript imports, Go replace directives, Python editable paths, Java source lists, Rust module paths) are updated automatically.
Owner: @eerhardt
Changes: #17145
Docs: microsoft/aspire.dev#1057
⚠️ Breaking change
📝 Documentation required -
🔑 Public ITokenCredentialProvider
The ITokenCredentialProvider interface is now public in Aspire.Hosting.Azure, allowing integrations and app host code to resolve the same TokenCredential that Aspire uses for provisioning and Azure API calls.
Owner: @eerhardt
Changes: #17387
📝 Documentation required -
🏗️ TypeScript AppHosts use explicit ES modules (.mts)
New TypeScript AppHosts are now scaffolded asapphost.mtsusing explicit ES module syntax, with the code generator emitting.mtsSDK files. Existingapphost.tsprojects continue to work unchanged, andaspire initin brownfield apps safely creates a nestedaspire-apphost/package without modifying the root module settings.
Owner: @sebastienros
Changes: #16984
Docs: microsoft/aspire.dev#1049, microsoft/aspire.dev#1073, microsoft/aspire.dev#1075
📝 Documentation required -
🔐 Advise
aspire certs trustin polyglot HTTPS dev-cert errors
When a polyglot AppHost (TypeScript, Python, etc.) fails to start due to a missing or untrusted HTTPS developer certificate, the error message now advises runningaspire certs trustinstead ofdotnet dev-certs, since the .NET SDK is not always on PATH in polyglot environments.
Owner: @mitchdenny
Changes: #17348
Docs: microsoft/aspire.dev#1032
📝 Documentation required -
🔍 Fix aspire ps hang when dashboard is unavailable
Fixedaspire pshanging indefinitely when the dashboard resource is unavailable. The command now fails fast in this scenario, making it usable withDistributedApplicationTestingBuilderto inspect a running app even when the dashboard is not configured.
Owner: @davidfowl
Changes: #16621
🌍 Community contribution by @afscrome -
📚 TypeScript SDK APIs now include JSDoc from C# XML docs
The generated TypeScript SDK now includes JSDoc documentation derived from C# XML docs. Summaries, remarks, parameters, return values, callback parameters, and enum values from the C# source are preserved in the generated TypeScript SDK surface. The C# API XML docs were also migrated to language-neutral ATS format, ensuring all polyglot SDKs (TypeScript, Python, Go, Java) receive accurate documentation without C#-specific XML shapes.
Owner: @sebastienros
Changes: #16992, #17289
Docs: microsoft/aspire.dev#999, microsoft/aspire.dev#1027
📝 Documentation required -
⚡ Faster AppHost warm builds via optimized RID selection
Warm AppHost builds are now faster because RID selection for Dashboard and DCP packages uses the .NET SDK's built-in task instead of launching an external process on every build.
Owner: @davidfowl
Changes: #17259 -
🔍 TypeScript AppHost scaffold ESLint config single-source-of-truth
The TypeScript AppHost scaffold's eslint.config.mjs and tsconfig.apphost.json are now single-source-of-truth files shared between aspire init and the code generator, eliminating drift. Regression tests now verify that the ESLint rules correctly catch unawaited async calls in AppHost code.
Owner: @IEvangelist
Changes: #17213 -
🛑 Error on JavaScript run script and Dockerfile conflict
When AddJavaScriptApp is configured with both a user-authored Dockerfile and a run script, Aspire now fails fast with a clear error instead of silently ignoring the run script. This prevents hard-to-diagnose issues where the Dockerfile entrypoint overrides the configured run script.
Owner: @sebastienros
Changes: #16969
Docs: microsoft/aspire.dev#1014
📝 Documentation required -
🔒 Kubernetes ingress and gateway routes require external endpoints
Routing a non-external endpoint through a Kubernetes ingress or gateway resource now throws an InvalidOperationException at publish time. Previously, any endpoint could be routed, potentially exposing internal services to public traffic unintentionally. Use WithExternalHttpEndpoints() on the target resource to opt in to external routing.
Owner: @mitchdenny
Changes: #17232
⚠️ Breaking change
📝 Documentation required -
📋 pnpm workspace file support in Dockerfile generation
When generating Dockerfiles for JavaScript apps using pnpm, thepnpm-workspace.yamlfile is now copied into the Docker image before the install step, enabling correct pnpm workspace resolution during the container build.
Owner: @sebastienros
Changes: #17124
🌍 Community contribution by @vsantele -
🎓 Graduate Azure Container Apps job APIs to stable
The Azure Container Apps job publishing APIs (PublishAsAzureContainerAppJob) are now stable and no longer require suppressing theASPIREAZURE002experimental warning, completing the graduation of ACA job publishing APIs for general use.
Owner: @eerhardt
Changes: #17219
Docs: microsoft/aspire.dev#1018, microsoft/aspire.dev#1001
📝 Documentation required -
🌐 WithComputeEnvironment support for polyglot AppHosts
WithComputeEnvironment, previously available only to C# app hosts, is now exported to the ATS/polyglot SDK surface. TypeScript and other polyglot AppHosts can now configure the target compute environment for resources, reaching parity with the C# API.
Owner: @sebastienros
Changes: #17093
📝 Documentation required -
🪵 Improved version log messages at startup
Version log messages emitted at startup are now more descriptive and distinguishable between CLI, AppHost, and Dashboard processes, making it easier to identify the source of log output.
Owner: @JamesNK
Changes: #17163 -
🛡️ Validate environment variable names for Foundry hosted agents
Foundry hosted agents now validate environment variable names up-front, raising a DistributedApplicationException for any name containing characters outside ASCII letters, digits, and underscores — the only characters accepted by the Foundry platform. This prevents confusing silent failures at deploy time.
Owner: @eerhardt
Changes: #16884 -
🐳 Use Aspire container runtime for project image builds
Aspire now propagates the active container runtime (Docker or Podman) to .NET project image builds via PublishContainer, ensuring project images are always built with the same runtime used for container resources.
Owner: @davidfowl
Changes: #16871 -
🔀 Deferred YARP resource endpoint resolution
YARP cluster target resolution for resource, endpoint, and external service destinations is now deferred until environment configuration is generated. This ensures late endpoint scheme changes (e.g., AddUvicornApp upgrading to HTTPS) are correctly picked up by YARP.
Owner: @danegsta
Changes: #16834 -
⚓ Consolidated Helm chart options on WithHelm(...)
Helm chart name, version, and description can now be configured entirely through the WithHelm(...) extension method, replacing the previous parallel property-based API on KubernetesEnvironmentResource. This provides a single, consistent configuration surface for Helm chart settings.
Owner: @mitchdenny
Changes: #16759
⚠️ Breaking change
📝 Documentation required -
🚧 Container tunnel reserved name validation
Added startup validation that prevents a container resource from using the name "aspire", which is reserved for the container tunnel. This catches naming conflicts early rather than allowing confusing DNS errors at runtime.
Owner: @karolz-ms
Changes: #16748 -
✅ Validate TypeScript AppHosts before startup
TypeScript AppHosts are now validated (type-checked and compiled) before the application starts up, providing early feedback on build errors rather than failing at runtime.
Owner: @sebastienros
Changes: #16689 -
🔍 Improved container tunnel error reporting
Container tunnel errors are now reported with more diagnostic detail, making it easier to diagnose connection failures when tunneling into containers.
Owner: @karolz-ms
Changes: #16537 -
☸️ Azure Kubernetes API review improvements
Applied API review feedback to the Azure Kubernetes hosting extensions, improving naming consistency and API design for AKS SKU tier and ingress configuration.
Owner: @eerhardt
Changes: #16673
-
🔗 Fix Foundry hosted-agent publish reference placement
Publish-mode Foundry hosted agents now correctly attach the Foundry project connection to the deployment target resource rather than the wrapper resource, ensuring container build and deployment steps see the required environment annotations.
Owner: @davidfowl
Changes: #17704
🌍 Community contribution by @tommasodotNET -
🔒 Keep Aspire.Hosting.Blazor as preview on 13.4.x
The Aspire.Hosting.Blazor 13.4.0 stable package had an issue where gateway scripts were only deployed under buildTransitive rather than lib, causing TypeScript AppHosts using addBlazorGateway to fail with a capability error. The package is kept preview-shaped on the 13.4.x release branch to prevent users from picking up the broken stable version while the packaging fix is being addressed.
Owner: @joperezr
Changes: #17694 -
🔓 Fix TypeScript AppHost deadlock for async callbacks
Fixed a deadlock in TypeScript AppHosts where RunSyncOnBackgroundThread on AspireExport methods was ignored for async-returning exports, causing aspire start/run to hang during startup. A follow-up fix also ensures the Aspire.Hosting/run capability itself opts into RunSyncOnBackgroundThread, preventing a remaining deadlock when async TypeScript callbacks are stored in lazy IOptions.Configure and resolved during BeforeStartEvent.
Owner: @IEvangelist
Changes: #17508, #17689
Docs: microsoft/aspire.dev#1079
📝 Documentation required -
🔦 Restore dotnet watch dashboard auto-launch signal
Restores the legacy login log line thatdotnet watchdepends on to detect when the AppHost is ready and auto-open the browser dashboard. This line was inadvertently removed during the 13.4 dashboard summary refactoring, breakingdotnet watchauto-launch.
Owner: @JamesNK
Changes: #17653 -
🌐 Fix dev localhost URL validation for polyglot AppHosts
Fixes a regression where polyglot AppHosts scaffolded with*.dev.localhostURLs failed to start withaspire runbecause the resource service endpoint validation did not recognize RFC-reserved localhost subdomains.
Owner: @danegsta
Changes: #17644 -
🔧 Fix ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL env var not being honored
The ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL environment variable was previously ignored when configuring the resource service endpoint. It is now correctly honored, with fallback to the legacy DOTNET_RESOURCE_SERVICE_ENDPOINT_URL name.
Owner: @JamesNK
Changes: #17571 -
🐛 Fix EF Migrations pipeline run-mode and connection-string issues
Fixed several bugs in the EF Migrations pipeline: publish-mode pipeline steps were incorrectly registered as dependencies in run mode causing a startup failure; connection-string resolution now correctly prefers explicit.WithReference()over.WaitFor()inference; and exit code reading from EFCore operation snapshots was corrected to use the strongly-typed property.
Owner: @AndriySvyryd
Changes: #17531
Docs: microsoft/aspire.dev#1088 -
🔌 Fix backchannel compatibility for non-string resource properties
Older auxiliary backchannel clients remain compatible when the AppHost serves resource properties containing non-string values such as booleans, numbers, and arrays. Newer clients can opt in to typed JSON properties via theaux.v4capability. The resource action menu Start command filtering was also simplified to use the resource command model as the single source of truth.
Owner: @adamint
Changes: #17522 -
🛡️ Guard against subscribing to interface or abstract event types
Subscribing to IDistributedApplicationEvent or any abstract class via Eventing.Subscribe now throws an ArgumentException immediately instead of silently registering a no-op subscription that would never fire.
Owner: @maddymontaquila
Changes: #17094
📝 Documentation required -
🐛 Fix Docker Compose .env arbitrary IValueProvider source resolution
Docker Compose .env file generation now resolves any IValueProvider source instead of only ParameterResource and ContainerImageReference. Custom resource types implementing IValueProvider that were previously silently ignored will now have their values correctly written to the .env file.
Owner: @davidfowl
Changes: #17471
🌍 Community contribution by @sliekens -
🔁 Fix Azure role assignment preparation idempotency
Azure role assignment preparation is now idempotent: shared resources such as Storage or SignalR no longer fail with duplicate role-assignment resources when multiple projects reference the same target during the BeforeStart pipeline and again on publish or deploy.
Owner: @davidfowl
Changes: #17494 -
🎯 Fix target platform for Dockerfile builds in local dev
Dockerfile builds in local dev (DCP) now correctly honor the configured target platform. The AddDockerfile default no longer pins linux/amd64 unconditionally — it only sets that platform in publish mode, using host architecture in run mode to avoid slow emulation. Fixes a bug where the local DCP path ignored the ContainerBuildOptionsCallbackAnnotation platform setting.
Owner: @mitchdenny
Changes: #16700
🌍 Community contribution by @McDonaldSean -
🐛 Fix Kubernetes ingress parameter resolution
Fixes a bug where Kubernetes ingress and gateway resources that referenced a ParameterResource via WithIngressClass, WithHostname, or WithTls generated literal format strings (e.g., "{0}") instead of valid Helm template expressions in the published YAML.
Owner: @mitchdenny
Changes: #17423 -
🏗️ Existing Azure App Service Plan support
Applying AsExisting() or PublishAsExisting() to AzureAppServiceEnvironmentResource now correctly carries through the full publish pipeline, emitting the App Service Plan as an existing resource in generated Bicep rather than attempting to create it. A related fix prevents Aspire from printing a dashboard URL when .WithDashboard(false) is used.
Owner: @davidfowl
Changes: #17379
📝 Documentation required -
🔓 Fix polyglot endpoint callback deadlocks
Fixed deadlocks that occurred in polyglot AppHosts when endpoint callback functions (withEndpointCallback, withHttpEndpointCallback, withHttpsEndpointCallback) made nested ATS/RPC mutations. The fix also hardens the ASPIREEXPORT010 analyzer to catch future exported methods that could cause the same issue.
Owner: @sebastienros
Changes: #17397 -
🔧 Fix AsExisting for Azure Container App Environment
FixesAddAzureContainerAppEnvironment(...).AsExisting(...)generating a new managed environment at publish time instead of referencing the existing one. The generated Bicep now correctly references the pre-existing environment whenAsExisting()is used.
Owner: @eerhardt
Changes: #17365
Docs: microsoft/aspire.dev#1045 -
🔧 Fix init-only property setter generation in polyglot SDKs
Init-only C# properties are now correctly omitted from setter generation in ATS-generated TypeScript, Python, Java, and other polyglot SDKs. Previously, these properties were incorrectly exposed as mutable setter capabilities despite being read-only after initialization.
Owner: @sebastienros
Changes: #17285 -
🔦 Surface endpoint reference error diagnostics
When a resource fails to start because it references an endpoint that doesn't exist on another resource (e.g., callingGetEndpoint('https')on a resource that only exposeshttp), the error is now surfaced in resource logs and shown in the dashboard instead of being silently lost.
Owner: @IEvangelist
Changes: #17265 -
🐳 Fix pnpm runtime container startup for PublishAsNpmScript
pnpm-enabled apps using PublishAsNpmScript could fail to start in containers with exit code 127 because pnpm was not available in the final runtime image. The generated Dockerfile now enables Corepack and resolves pnpm in the runtime stage before the entrypoint runs.
Owner: @davidfowl
Changes: #17178
Docs: microsoft/aspire.dev#1020 -
🐛 Fix DTO collection inputs in polyglot SDKs
Fixed DTO property collection type mapping in TypeScript, Go, Java, and Python polyglot SDKs, where mutable collection properties incorrectly generated handle-backed wrappers (e.g., AspireList) instead of plain JSON input types, preventing callers from using collection literals.
Owner: @sebastienros
Changes: #17098
Docs: microsoft/aspire.dev#1017
📝 Documentation required -
🐛 Fix EF Migrations crash in run mode when publish steps are configured
Fixed a crash that occurred when combiningRunDatabaseUpdateOnStart()andPublishAsMigrationBundle()on an EF Migrations resource. The run mode pipeline no longer fails with an invalid step dependency error when publish steps are also configured.
Owner: @sebastienros
Changes: #17207
🌍 Community contribution by @Waleed-KH -
🌐 Fix --apphost directory resolution for Rust, Go, and Java polyglot SDKs
Fixed Rust, Go, and Java polyglot AppHosts not forwardingASPIRE_APPHOST_FILEPATHandASPIRE_PROJECT_DIRECTORYenvironment variables from the CLI, causingaspire --apphost <directory>to fail to find running AppHosts in those languages.
Owner: @mitchdenny
Changes: #17237 -
🕐 Fix BrowserPageSession reconnect delay to use TimeProvider
Fixed the BrowserPageSession reconnect loop to use the injected TimeProvider for delays instead of the ambient Task.Delay overload, ensuring correct behavior in tests and environments using non-default time providers.
Owner: @mitchdenny
Changes: #17228 -
🔤 Fix environment variable name comparison to use OrdinalIgnoreCase
EnvironmentVariableName comparisons in StringComparers and StringComparisons were using InvariantCultureIgnoreCase instead of OrdinalIgnoreCase. Environment variable names are programmatic ASCII identifiers, and OrdinalIgnoreCase is the correct choice — it avoids unexpected locale-sensitive case-folding (e.g., Turkish İ/ı rules).
Owner: @JamesNK
Changes: #17194 -
☸️ Fix Kubernetes publisher crash on scalar environment variable values
The Kubernetes publisher no longer crashes withNotSupportedExceptionwhen environment variables are set to non-string scalar values (such asbool,int, ordouble) by third-party integrations.
Owner: @mitchdenny
Changes: #15560 -
📍 Fix endpoint materialization for host resources
Fixed a bug where endpoints set directly on HostResourceWithEndpoints were not being materialized, which could cause missing endpoint configuration for container resources.
Owner: @karolz-ms
Changes: #17091 -
🔕 Fix log level cascading to child resources
Fixed a bug where specifying --log-level on the CLI caused the log level to cascade into all child project resources via Logging__LogLevel__Default, producing excessive log output. A new ASPIRE_APPHOST_LOGLEVEL environment variable is now used, scoped only to the AppHost and CLI.
Owner: @JamesNK
Changes: #17071 -
🔑 Fix Keycloak HTTPS primary endpoint
The primary Keycloak endpoint is now HTTPS when the dev certificate is enabled, fixing an issue where the HTTPS endpoint was unstable and caused previously issued tokens to become invalid on restart.
Owner: @danegsta
Changes: #17058
⚠️ Breaking change
📝 Documentation required -
🔓 Fix startup deadlock for tunnel-dependent containers
Fixed a startup deadlock that occurred when containers using the container tunnel also waited on other resources. The tunnel startup is now decoupled from the container startup sequence, allowing tunnel-dependent containers to start at any point during the application lifecycle.
Owner: @karolz-ms
Changes: #16988 -
🔧 Fix ATS polyglot SDK name collision and export issues
Fixed multiple ATS polyglot SDK export issues: name collisions and duplicate property issues affecting Orleans, Azure role assignments, GitHub Models, YARP, and inherited resource types; missing Docker service config/secret/ulimit reference node type exports; a Foundry search connection export warning caused by an incompatible raw resource parameter overload; and exact-target export shadowing that caused Keycloak's target-specific OTLP export to collide with the generic IResourceWithEnvironment export.
Owner: @sebastienros
Changes: #16881, #16886, #16896, #16898, #16900, #16953, #16954, #16955
Docs: microsoft/aspire.dev#895, microsoft/aspire.dev#1124 -
🤖 Foundry hosted-agent deployment fixes
Fixed multiple issues in the Azure AI Foundry hosted-agent flow: project endpoints now use the correct customSubDomainName format, the Foundry-created agent identity is assigned the Cognitive Services User role automatically, and the app identity is no longer incorrectly injected into the hosted-agent environment.
Owner: @tommasodotNET
Changes: #16846 -
🔧 Fix spurious publish-environment validation in run mode
Fixes a regression introduced in 13.3 where compute environment validation steps (such as Azure Container Apps, App Service, Docker Compose, and Kubernetes checks) were incorrectly running during 'aspire run', causing startup failures even when the app was correctly configured for publishing.
Owner: @eerhardt
Changes: #16945 -
🔧 Fix polyglot AppHost builder and callback generation
Fixed bugs in the polyglot AppHost builder and callback generation for Go, Java, and Python AppHosts, including transport fixes that bring Go polyglot support to parity with TypeScript.
Owner: @sebastienros
Changes: #16691 -
🔬 Fix ATS generated member collision analyzer
Fixed the ATS (App Type System) analyzer incorrectly flagging generated member names as collisions when they were not actually conflicting, reducing false-positive warnings in polyglot AppHost projects.
Owner: @sebastienros
Changes: #16864 -
🕐 Preserve console log timestamps and normalize carriage-return output
DCP system log timestamps are no longer dropped when formatting [sys] messages, fixing sort order in the dashboard. Terminal-oriented output (such as curl progress bars) is no longer split on carriage returns into timestamp-less fragments.
Owner: @karolz-ms
Changes: #16796 -
🔧 Honor explicit DCP config for polyglot AppHosts
Fixed polyglot AppHosts (Go, TypeScript) to correctly honor an explicitly configured DCP (Developer Control Plane) path rather than falling back to auto-detection.
Owner: @sebastienros
Changes: #16734
7 new features, 39 improvements, 55 bug fixes
-
📡 Live streaming aspire ps with --follow and --resources
Adds --follow and --resources flags to aspire ps, enabling live streaming of AppHost and resource snapshots as newline-delimited JSON. This allows consumers like the VS Code extension to receive real-time AppHost updates without increased polling overhead.
Owner: @adamint
Changes: #16836 -
⏱️ --min-duration flag for CLI telemetry commands
The aspire telemetry spans and aspire telemetry traces commands now accept --min-duration (or --min-duration-ms) to filter output to spans that meet a minimum millisecond duration threshold, making it easy to cut noise from large traces when profiling.
Owner: @davidfowl
Changes: #17299
📝 Documentation required -
📋 New aspire ls command
Added a new aspire ls command that lists candidate AppHost projects in the current directory without starting one, supporting interactive table output and machine-readable JSON output. In interactive terminals, discovered AppHosts now stream into the live table as validation completes, giving users visible progress rather than a blank screen during large workspace scans.
Owner: @davidfowl
Changes: #16696, #17113
📝 Documentation required -
🔍 aspire doctor shows all Aspire CLI installations
Runningaspire doctornow displays a table of every Aspire CLI installation discovered on the machine, including the active binary, peer installs, shadowed binaries, and dotnet tool store installs. Each row shows the path, version, channel, install route, and path status. The--format jsonoption includes the same data as aninstallationsarray for tooling consumption.
Owner: @radical
Changes: #17105
📝 Documentation required -
🛸 Aspire deployment agent skill
A dedicated Aspire deployment skill is now bundled withaspire agent init, providing guided deployment workflows for Docker Compose, Kubernetes, Azure, and AWS. The skill includes target selection, preflight checks, CI/CD guidance, and GitHub Actions workflow templates.
Owner: @davidfowl
Changes: #17182
📝 Documentation required -
🔎 Search filter for logs and telemetry commands
Added a --search option to aspire logs and aspire otel commands, allowing users to filter output by keyword directly from the CLI without manual post-processing. Server-side filtering was subsequently added so the AppHost applies search, tail, and resource filters before streaming logs back to the CLI — reducing a 131-second full-transfer into a sub-second response for large log streams.
Owner: @JamesNK
Changes: #16939, #17010
Docs: microsoft/aspire.dev#948
📝 Documentation required -
🔍 Integration search and list commands
Added a new aspire integration command group with aspire integration list and aspire integration search subcommands for discovering available Aspire hosting integrations without modifying an AppHost project.
Owner: @davidfowl
Changes: #16845
📝 Documentation required
-
📋 Load Aspire skills catalog from bundle manifest
aspire agent initnow loads available skills from the bundledmicrosoft/aspire-skillsmanifest instead of a hardcoded list, making all six bundle skills (includingaspire-init,aspire-monitoring, andaspire-orchestration) visible in the interactive prompt and via--skills.
Owner: @IEvangelist
Changes: #17673
Docs: microsoft/aspire.dev#1137
📝 Documentation required -
🧹 Simplified
aspire pscommand
Theaspire pscommand no longer supports--resourcesand--include-hiddenflags, which overlapped withaspire describe. Consumers needing per-resource data should useaspire describe --follow --apphostinstead. The VS Code extension's AppHostDataRepository has been updated accordingly.
Owner: @mitchdenny
Changes: #17579
Docs: microsoft/aspire.dev#1109
⚠️ Breaking change
📝 Documentation required -
🛡️ Embedded fallback for Aspire skills bundle
The CLI now falls back to an embedded, validated skills bundle snapshot when GitHub release asset acquisition is unavailable. This ensures agent init commands complete reliably in restricted network environments or when the online source is temporarily unavailable. The resolution order is: existing validated cache → verified GitHub release asset → embedded snapshot.
Owner: @IEvangelist
Changes: #17548 -
🌲 Improved TypeScript brownfield workspace validation
TypeScript brownfield init now preserves existing root aspire:* scripts, adds only missing AppHost delegate scripts when safe, and respects package-manager boundaries between the AppHost package and guest apps.
Owner: @sebastienros
Changes: #17510
Docs: microsoft/aspire.dev#1080 -
📦 Aspire agent skills distributed via external npm bundle
The Aspire CLI now downloads workflow skills (aspire,aspireify,aspire-deployment) from an external@microsoft/aspire-skillsnpm package instead of embedding them in the CLI binary. Skills are verified via npm provenance and tarball integrity, cached under the Aspire cache directory, and can be updated independently of CLI releases.
Owner: @IEvangelist
Changes: #17323
Docs: microsoft/aspire.dev#1137, microsoft/aspire.dev#1077
📝 Documentation required -
⏱️ ASPIRE_CLI_START_TIMEOUT env var for aspire start and run
Adds the ASPIRE_CLI_START_TIMEOUT environment variable to configure the AppHost startup timeout for aspire start and aspire run, including detached launches. This provides a reliable escape hatch for slow machines or CI environments where the default wait period is insufficient.
Owner: @sebastienros
Changes: #16686
📝 Documentation required -
🖥️ Remove Logs column from aspire ps table output
The Logs column has been removed from theaspire pstable display because log file paths were too long, pushing Dashboard URLs off-screen and causing awkward line wrapping. Log paths remain available viaaspire ps --format jsonfor programmatic access and are still shown in theaspire runstartup banner.
Owner: @JamesNK
Changes: #17459
Docs: microsoft/aspire.dev#1064 -
🔐 Partial Linux certificate trust treated as success in non-interactive mode
Theaspire certs trust --non-interactivecommand on Linux now exits successfully when the certificate is partially trusted (OpenSSL trusted but browser/NSS trust incomplete). A warning is printed to guide users; full trust failures and interactive runs still fail as before.
Owner: @davidfowl
Changes: #17447 -
🔇 Buffer console logs during interactive prompts
Pauses terminal debug logging while interactive CLI prompts are active so the prompt UI stays readable, then replays buffered lines when the prompt completes.
Owner: @JamesNK
Changes: #15959
🌍 Community contribution by @Victor-johnsson -
⚡ Faster AppHost startup via direct launch
The CLI now caches the SDK-provided run metadata (RunCommand, RunArguments, RunWorkingDirectory) during AppHost resolution and launches the AppHost executable directly, skipping the post-build dotnet run --no-build overhead and saving approximately 1.3 seconds per startup. Users can opt out via aspire config set dotnetAppHostDirectLaunchDisabled true.
Owner: @davidfowl
Changes: #17335 -
🔕 CLI update notifications are now opt-in
Update notifications are now opt-in — only user-facing interactive commands display them. Notifications are also suppressed when--format jsonis used, ensuring machine-readable stdout is never polluted with banner text.
Owner: @JamesNK
Changes: #17350 -
📡 CLI startup self-profiling with trace export
The hidden--capture-profileflag captures end-to-end profiling traces spanning the CLI, AppHost (including lifecycle hooks, DCP operations, and resource creation), TypeScript AppHost managed server, and DCP startup scopes. Profiling spans are also instrumented foraspire add, covering package search, selection, and installation. A dedicated OTLP provider exports all spans to a dashboard archive (traces/profile.json), making it possible to diagnose startup and operation bottlenecks across the entire stack.
Owner: @davidfowl
Changes: #17099, #17177, #17165, #17347 -
🔐 CLI bundle version protection with leases
The CLI now acquires per-version leases on bundle directories, preventing race conditions where upgrading the CLI could delete or invalidate bundle files still in use by a running AppHost, dashboard, or NuGet helper process.
Owner: @danegsta
Changes: #17282 -
🔬 Improved diagnostics for integration assembly load failures
Whenaspire newfails to find a code generator or language support, it now surfaces clear diagnostic warnings—listing available languages and describing likely causes such as version mismatches between the bundled AppHost server and integration assemblies.
Owner: @IEvangelist
Changes: #17311
Docs: microsoft/aspire.dev#1024 -
🚀 Faster CLI startup with AppHost metadata caching
aspire run --no-buildnow caches AppHost MSBuild metadata to disk, eliminating redundant project evaluations across CLI invocations. Benchmarks show up to 2 seconds faster startup when the cache is warm; users can clear it withaspire cache clear.
Owner: @davidfowl
Changes: #17246 -
✏️ Fix trailing periods after interpolated content in error messages
Removed extraneous trailing periods from error and status messages in the CLI and Dashboard that appeared after interpolated values (e.g. resource names, error descriptions), producing grammatically consistent output.
Owner: @JamesNK
Changes: #17288
🌍 Community contribution by @ellahathaway -
🌐 CLI init command localization
All user-facing messages in theaspire initcommand are now stored in a localization resource file, enabling proper translation into supported languages. The emoji shown when a file already exists was also updated.
Owner: @JamesNK
Changes: #17260 -
🩺 aspire doctor reports Yarn Classic as unsupported
aspire doctornow correctly reports a structured failure when a TypeScript AppHost workspace uses Yarn Classic (v1), which is not supported. Previously, Yarn Classic workspaces produced no output at all from the TypeScript AppHost diagnostics.
Owner: @IEvangelist
Changes: #17214 -
🔄 Auto-migrate legacy .aspire/settings.json on CLI startup
The CLI now automatically migrates legacy.aspire/settings.jsonfiles to the newaspire.config.jsonformat on every startup, regardless of which command is run. Previously, read-only commands likeaspire doctorandaspire lswould not trigger migration, leaving workspaces stuck on the old layout.
Owner: @mitchdenny
Changes: #17234 -
🩺 Improved aspire start readiness diagnostics
aspire startnow waits for the AppHost to reach a stable startup state before detaching, so early startup failures—such as TypeScript syntax errors in a polyglot AppHost or C# compile errors in a .NET AppHost—are surfaced immediately with clear diagnostics rather than silently swallowed.
Owner: @danegsta
Changes: #17141
Docs: microsoft/aspire.dev#1002 -
🎨 Improved text wrapping in CLI messages
Console error and informational messages now use a two-column grid layout, placing the emoji prefix in a fixed-width column and the message text in a wrapping column. Long messages wrap cleanly beneath the text without running under the icon.
Owner: @JamesNK
Changes: #17198 -
📋 CLI log path surfaced in aspire ps and on command failures
The CLI log file path is now communicated via the backchannel and surfaced to users:aspire psshows a new "Logs" column with a clickable link to the log file, and when a resource command fails, the CLI prints the log path so users can inspect detailed logs.
Owner: @JamesNK
Changes: #17168
Docs: microsoft/aspire.dev#991
📝 Documentation required -
🚀 CLI deployment commands are now generally available
The CLI deployment commands (aspire deploy, aspire destroy, aspire do, aspire publish, aspire update) are no longer labeled as preview in their help text and documentation, indicating they are now generally available.
Owner: @davidfowl
Changes: #17174
📝 Documentation required -
📦 CLI bundle co-located with binary for packager-managed installs
The Aspire CLI bundle is now stored alongside the CLI binary for packager-managed installs (winget, Homebrew, dotnet tool), ensuring bundle files are fully cleaned up during package removal or upgrade. Script-based installs retain the existing layout unchanged.
Owner: @radical
Changes: #16817 -
🧹 Centralized CLI command error and cancellation handling
CLI commands now use a structured CommandResult type instead of raw integer exit codes, centralizing error message display and cancellation handling in BaseCommand. The log file path and update notifications are no longer shown when a command is cancelled or displays help.
Owner: @JamesNK
Changes: #17005 -
🪵 Logs command UX improvements
The aspire logs command now renders timestamps with dimmed styling for visual clarity, and displays an informational 'No logs found.' message when no log entries are available — keeping JSON output unchanged for programmatic consumers.
Owner: @JamesNK
Changes: #17066, #17067 -
🩺 Aspire version checks in aspire doctor
aspire doctor now reports the current Aspire CLI version (with an update notice if a newer version is available) and the AppHost SDK version when an AppHost is detected, making version mismatches immediately visible without running other commands.
Owner: @davidfowl
Changes: #17003
Docs: microsoft/aspire.dev#949
📝 Documentation required -
🗣️ Echo selection result after interactive prompts
After an interactive selection prompt completes, the CLI now echoes the prompt text and chosen value(s) as plain text. This makes it easy to see what was selected, especially when subsequent output follows quickly.
Owner: @JamesNK
Changes: #16996 -
🔍 Improved CLI docs parsing and search
CLI docs source switched to llms-full.txt for correctly formatted code blocks, with a 3x faster parser, reduced query allocations, and new BenchmarkDotNet harness for ongoing profiling.
Owner: @davidfowl
Changes: #16982 -
🏷️ CLI channel identity baked into assembly metadata
The CLI channel identity is now baked into assembly metadata at build time, eliminating cross-install drift where different acquisition routes could silently overwrite each other's channel selection. The channel is set as an assembly attribute and read at startup, making the CLI self-describing.
Owner: @radical
Changes: #16820 -
🔗 Clickable log file paths in CLI output
The Aspire CLI now displays log file references as clickable terminal hyperlinks, making it easy to open log files directly from CLI output.
Owner: @IEvangelist
Changes: #16603 -
🎯 Named resource command options and resource-scoped help
Resource command inputs are now parsed as named CLI options (e.g., --name value) instead of positional arguments, making optional inputs easier to use. Running aspire resource --help now shows the commands available for that specific resource.
Owner: @davidfowl
Changes: #16903, #16921
Docs: microsoft/aspire.dev#898, microsoft/aspire.dev#904 -
✅ Require --yes for update command in non-interactive mode
The aspire update command now requires --yes when running in non-interactive mode, matching the behavior of aspire destroy. The validation logic is shared between both commands via a common base helper.
Owner: @JamesNK
Changes: #16829
Docs: microsoft/aspire.dev#902 -
🛑 Clearer aspire stop --all output
The aspire stop --all command now tags each status message with the AppHost name it applies to, and appends the PID when multiple instances share the same project path, making output clearer when stopping multiple running AppHost instances.
Owner: @davidfowl
Changes: #16854 -
🔗 Graceful link degradation in CLI output
CLI output now uses MarkupHelpers.SafeLink for graceful link degradation, rendering clickable hyperlinks in terminals that support them while falling back to plain text in terminals that do not.
Owner: @JamesNK
Changes: #16853 -
📁 Improved output path handling in aspire new
The aspire new command now correctly handles output paths with spaces, relative paths, and other edge cases when scaffolding new AppHost projects.
Owner: @JamesNK
Changes: #16772 -
✨ Improve CLI init output spacing
Improved output spacing in theaspire initcommand for a cleaner and more readable terminal experience.
Owner: @JamesNK
Changes: #16718 -
🚀 Avoid AppHost discovery when config path is valid
The CLI now skips unnecessary AppHost project discovery when an explicit, valid config path has already been specified, improving startup performance.
Owner: @adamint
Changes: #16653 -
📋 Show AppHost SDK version in aspire ps
Theaspire pscommand now shows the AppHost SDK version alongside each running AppHost, making it easier to identify which version of Aspire is in use.
Owner: @adamint
Changes: #16517
-
📡 Fix staging darc feed routing for prerelease-shaped CLI builds
Fixed a bug where a prerelease-shaped staging-identity CLI incorrectly resolved Aspire* packages from the shared daily feed instead of the build-specific darc-pub-microsoft-aspire- feed. This caused aspire add in TypeScript (polyglot) apphosts to offer the wrong package versions. Staging-identity CLIs now always route to their own SHA-specific darc feed regardless of version shape.
Owner: @mitchdenny
Changes: #17743 -
🔍 Fix aspire add hiding non-default channel integrations
Restores implicit-channel discovery inaspire addso Kubernetes, Foundry, and other non-default-channel integrations are no longer hidden. Also guards the non-interactive fuzzy auto-pick from selecting the wrong package when running in CI or scripted environments.
Owner: @mitchdenny
Changes: #17728 -
🐛 Fix five aspire ls bugs
Fixed five bugs in aspire ls: read commands no longer silently create aspire.config.json next to an existing .aspire/settings.json, migration warnings now reference the user-authored file, --stream output is arrival-ordered, invalid path characters in appHost.path produce a clear localized error, and on macOS symlinked paths are deduplicated so the same AppHost is not listed twice.
Owner: @davidfowl
Changes: #17688
Docs: microsoft/aspire.dev#1134
🌍 Community contribution by @adamint -
🔍 Fix process inspection race during shutdown
Fixed aWin32Exceptionon macOS whereaspire stop --allwould report failure even though the AppHost had already exited cleanly. The process signaler now treats this inspection race the same as a missing or already-exited process.
Owner: @danegsta
Changes: #17676 -
🛑 Fix CLI Ctrl+C/SIGTERM responsive shutdown
Fixes the CLI's Ctrl+C/SIGTERM handling to be responsive during AppHost startup and eliminates a double-signal bug on Linux where both SIGINT handlers fired simultaneously, triggering force-kill instead of graceful shutdown. A second Ctrl+C now forces immediate termination when graceful shutdown is taking too long.
Owner: @JamesNK
Changes: #17641 -
🐛 Fix CLI template channel forwarding for identity-based channels
Fixed a bug where runningaspire newwithout an explicit--channelargument failed to forward the CLI's identity channel to template resolution for dotnet-runtime templates. Daily, staging, and PR builds would silently fall back to resolvingAspire.ProjectTemplatesfrom nuget.org instead of the channel-appropriate NuGet feed.
Owner: @mitchdenny
Changes: #17637
Docs: microsoft/aspire.dev#1118 -
🐛 Fix
aspire stopfalsely reporting failure on Unix
Fixed a race condition on Unix/Linux whereaspire stopwould falsely report failure even when the AppHost stopped successfully. The root cause was the shutdown cascade through the launcher CLI — on Unix, SIGTERM is now sent directly to the AppHost PID so every process is reaped by its actual parent, eliminating the orphan/zombie scenario that caused ~40-second timeouts.
Owner: @danegsta
Changes: #17623 -
🐛 Fix polyglot AppHost hang with staging CLI builds
Resolved a hang during DI and assembly loading in polyglot AppHosts running staging CLI builds. The staging NuGet package cache now uses a stable absolute path under ASPIRE_HOME keyed by CLI commit SHA instead of a temp directory that was deleted after restore, causing cached assemblies to disappear.
Owner: @danegsta
Changes: #17573 -
📌 Fix template version pinning in
aspire new
When using a channel flag withaspire new, the CLI now pins to the current bundled CLI/SDK version instead of floating to newer incompatible packages, preventing TypeScript AppHost failures caused by version mismatches across releases.
Owner: @sebastienros
Changes: #17564
Docs: microsoft/aspire.dev#1106
📝 Documentation required -
🔬 Actionable diagnostics for TypeScript AppHost version mismatches
When the Aspire CLI and SDK versions are incompatible, TypeScript AppHost operations now show a clear, actionable error message with remediation steps instead of an opaque TypeLoadException followed by a 60-second timeout. A pre-flight version-skew warning is also shown, and stale backchannel sockets are automatically cleaned up.
Owner: @IEvangelist
Changes: #17556
Docs: microsoft/aspire.dev#1103 -
📦 Fix staging CLI package feed resolution
Fixed a bug where the 13.4 staging CLI incorrectly identified itself as the stable channel, causing aspire init to write a nuget.config pointing only at nuget.org. Commands such as aspire add would then resolve the prior stable version or fail to find stabilizing packages. The packaging service now correctly detects the channel and routes stable-shaped staging builds to the SHA-derived Aspire staging feed.
Owner: @mitchdenny
Changes: #17528 -
🛑 Friendly error for 'aspire do --list-steps' without a step
Runningaspire do --list-stepswithout specifying a step argument now shows a clear, localized error message with examples (aspire do deploy --list-steps) instead of crashing with an unrelatedInvalidOperationException. Thestepargument is required when using--list-steps.
Owner: @mitchdenny
Changes: #17543 -
🔐 Fix Aspire skills attestation build type
Fixedaspire agent init --skillsfailing to install the released Aspire skills bundle because the attestation verifier expected a stale SLSA build type URL. The installer now validates the GitHub release-asset build type used byactions/attest-build-provenance@v3.
Owner: @IEvangelist
Changes: #17525 -
📦 Fix CLI bundle extraction for sidecar-less installs
CLI bundle extraction now defaults to the user-owned Aspire home directory ($ASPIRE_HOME or ~/.aspire) for sidecar-less installs, fixing failures when the CLI is installed in read-only or system-managed locations such as a Nix store.
Owner: @danegsta
Changes: #17505 -
📌 Persist channel in aspire.config.json on init and update
Fixes a bug where aspire init on non-stable CLI builds (daily, staging, pr-N) did not write the channel key to aspire.config.json, causing subsequent commands like aspire add to fall back to the stable nuget.org channel instead of the intended channel. Also fixes aspire update --channel not persisting the new channel to aspire.config.json.
Owner: @mitchdenny
Changes: #17452
Docs: microsoft/aspire.dev#1068 -
🚦 Fix aspire stop --all exit code when no app hosts are running
aspire stop --allnow returns exit code 0 (success) with an informational message when no app hosts are running, matching the behavior of interactiveaspire stop. Previously,--allreturned exit code 7 (FailedToFindProject) with an error, causing scripting failures in environments where no app hosts may be running.
Owner: @JamesNK
Changes: #17463 -
📡 Fix Remote SSH dashboard auto-launch regression
Fixes a regression where launching an Aspire AppHost from VS Code via Remote SSH would enter debug mode but never open the dashboard browser. The CLI now sends dashboard URL information and the startup-complete notification to the extension before entering the live remote endpoint display loop.
Owner: @adamint
Changes: #17389 -
🔒 Auto-generate HTTPS dev cert for non-.NET AppHosts
The CLI now automatically generates an HTTPS developer certificate in non-interactive mode when none exists, fixing startup failures for TypeScript and other polyglot AppHosts that cannot rely ondotnet runto trigger first-run certificate generation. The DashboardServiceHost scheme resolution is also fixed to correctly default to HTTPS. Certificate generation can be disabled by settingASPIRE_CLI_GENERATE_HTTPS_CERTIFICATE=false.
Owner: @JamesNK
Changes: #17454 -
🐛 Fix banner crash when stdout is redirected
Fixes a crash (System.IO.IOException: The handle is invalid) that occurred when running the CLI with --banner and stdout redirected. The animated banner now correctly requires interactive output support even when --banner is explicitly passed.
Owner: @JamesNK
Changes: #17443 -
🐛 Fix CLI spinner crash during publish
Fixes a race condition in ConsoleActivityLogger where the CLI spinner could crash aspire publish with ArgumentOutOfRangeException when publish-pipeline output interleaved with cursor movement. The fix holds a shared lock around the spinner draw and cursor cleanup, and adds a defensive safe-move helper for edge cases where cursor wrapping or stdout redirection may cause cursor manipulation to fail.
Owner: @mitchdenny
Changes: #17422 -
🚨 Surface polyglot AppHost startup errors
When a polyglot AppHost starts but fails immediately (e.g., an unproxied endpoint without a port), aspire run and aspire start now surface the concrete AppHost error instead of the generic RPC/backchannel connection failure.
Owner: @danegsta
Changes: #17363 -
🐛 Fix WinGet-installed CLI first-run layout discovery failure
Fixed a first-run failure for WinGet-installed CLI where bundle extraction succeeded but layout discovery validated against the raw WinGet Links launcher path instead of the resolved symlink target, causing the post-flip validation to fail with 'Bundle extraction failed'.
Owner: @radical
Changes: #17115 -
📡 Fix backchannel socket path limits for long home directories
Fixes a failure for users with long or non-ASCII home directory paths that exceeded Unix domain socket path length limits. Backchannel sockets now use compact base64url identifiers under~/.aspire/cli/bch/, and the CLI retains fallback discovery for legacy socket formats.
Owner: @karolz-ms
Changes: #17226 -
🔧 Fix aspire run MSBuild server timeout on Linux
Fixedaspire runfailing on Linux with .NET SDK 10.0.300 due to a named-pipe timeout when the CLI forced MSBuild server usage. The CLI no longer setsDOTNET_CLI_USE_MSBUILD_SERVER, letting the .NET SDK manage MSBuild server behavior.
Owner: @davidfowl
Changes: #17313 -
🐛 Fix aspire add integration search on dogfood and local-hive CLIs
Fixedaspire addandaspire integration list/searchreturning zero results when using dogfood or locally-built CLI builds. The root cause was thatdotnet package searchdoes not support local folder sources; internal framework packages (AppHost, Sdk, Orchestration, Testing) and deprecated packages no longer leak into the integration picker either.
Owner: @radical
Changes: #17105 -
🐛 Fix PR-acquired CLI using mismatched packages for
aspire new
PR-acquired CLI instances now automatically use matching PR packages when runningaspire new, preventing type load errors caused by mixed package versions from mismatched sources.
Owner: @radical
Changes: #17280 -
🩹 Fix guest AppHost restore package source selection
Guest-language aspire new scaffolding now correctly pins Aspire packages to the --source feed (or auto-detected PR/hive channel) during AppHost restore, preventing mismatched Aspire assembly versions and TypeScript codegen failures when using local or PR package sources.
Owner: @radical
Changes: #17166 -
🔗 Fix aspire start in VS Code terminal
Fixedaspire startlaunched from the Aspire terminal in VS Code to properly integrate with the debug session lifecycle, enabling DCP resources to be associated with the extension's registered debug session and auto-attach to work correctly.
Owner: @adamint
Changes: #17240 -
🔍 Fix config discovery for nested AppHost
Fixed a bug where runningaspire runfrom a parent directory would create a duplicateaspire.config.jsoninstead of updating the existing config file nearest the AppHost.
Owner: @adamint
Changes: #17147 -
🔄 Fix guest AppHost update with older CLI
Fixes a bug where aspire update could break TypeScript AppHost projects by advancing the SDK version before regeneration completed. The CLI now preflights updates against the target SDK version and prompts for a CLI upgrade when the target SDK is newer than the running CLI, and only persists config changes after regeneration succeeds.
Owner: @sebastienros
Changes: #17100
Docs: microsoft/aspire.dev#1013, microsoft/aspire.dev#1067
📝 Documentation required -
⏱️ Fix CLI graceful shutdown race condition
Resolved a race condition between System.CommandLine's built-in cancellation and Aspire CLI signal handling. The CLI now waits up to 5 seconds for graceful shutdown on SIGINT/SIGTERM before forcing termination, with consistent POSIX signal registration across platforms.
Owner: @JamesNK
Changes: #17251 -
🛡️ Fix staging channel synthesis on non-stable CLI builds
Daily, local, and PR CLI builds no longer silently resolve--channel stagingto daily package versions. These builds now exit with a clear error message naming the running identity and pointing to recovery options (overrideStagingFeedconfig or installing a staging/stable CLI). Stable and staging-identity CLIs are unaffected.
Owner: @mitchdenny
Changes: #17235 -
🔊 Fix CLI error messages always route to stderr
Error messages and error-context messages in the Aspire CLI (including log file paths shown on failure and cancellation notices) now consistently write to stderr instead of stdout, preventing them from being silently discarded when redirecting stdout or when using structured output.
Owner: @davidfowl
Changes: #17230, #17231
🌍 Community contribution by @ellahathaway -
📦 Fix staging CLI channel registration
A CLI binary built with thestagingchannel identity now automatically registers the staging NuGet package source, ensuring commands likeaspire newuse the correct staging channel packages without requiring manual configuration.
Owner: @radical
Changes: #17155 -
🔌 Fix CLI hang when AppHost exits before backchannel opens
The CLI no longer hangs at 'Connecting to apphost...' when an AppHost exits cleanly (exit code 0) before opening the backchannel. Both .NET and polyglot AppHost backchannel startup now treat any exited process as terminal.
Owner: @adamint
Changes: #17097 -
🔧 Fix regressions in aspire update
Multiple regressions inaspire updateare resolved: crashes when the AppHost references a since-replaced PR hive, incorrect default channel selection, and wrong NuGet hive configuration after a channel switch.
Owner: @mitchdenny
Changes: #17192 -
🔧 Fix Aspire skill description length for agent init
Fixed an issue whereaspire agent initwould fail to install the bundled Aspire skill because the frontmatter description exceeded the 1024-character limit enforced by Codex and the latest Copilot CLI.
Owner: @davidfowl
Changes: #17183 -
🐛 Fix CLI shutdown cancellation race
Fixed a shutdown race condition in the CLI where signal callbacks could call Cancel() on an already-disposed CancellationTokenSource, resulting in an ObjectDisposedException.
Owner: @JamesNK
Changes: #17179 -
🔧 Fix aspire update channel switch NU1103 error
aspire update --channel <channel>no longer fails mid-update with NU1103 when switching to a non-stable channel on projects with multiple Aspire package references. The fix defers the NuGet restore until after all package version edits are applied, preventing partial update failures.
Owner: @mitchdenny
Changes: #17017
Docs: microsoft/aspire.dev#989
📝 Documentation required -
🔌 Fix shutdown-time backchannel stream cancellation
Backchannel streaming RPC calls that occur while the app host is shutting down no longer cause errors. The CLI now exits immediately when the linked cancellation token is already canceled, ensuring clean shutdown behavior.
Owner: @JamesNK
Changes: #17114 -
🐛 Fix aspire new TypeScript starter on daily and staging channels
Fixedaspire newfailing to scaffold theaspire-ts-startertemplate on daily and staging CLI channels. The scaffolding service was requiring a stableAspire.Hostingversion, which does not exist on preview channels, causing the template creation to fail.
Owner: @radical
Changes: #17120 -
🔩 Fix aspire init on non-stable channels
Fixed multipleaspire initfailures on non-stable CLI builds: template installation now works on preview and CI channels, and generated AppHost projects no longer fail to restore because the workspace NuGet config correctly references the local package hive.
Owner: @radical
Changes: #16690, #17009 -
🐛 Fix NuGet feed error handling in aspire new
Fixedaspire newnot catchingNuGetPackageCacheException, which caused NuGet feed failures (offline, bad config, expired auth) to surface as unexpected error stack traces instead of friendly messages.
Owner: @JamesNK
Changes: #17061
🌍 Community contribution by @ellahathaway -
📦 Fix NuGet integration restore in AppHost
NuGet package-backed integrations are now loaded from a probe manifest instead of being copied into mutable.aspire/.../libsfolders during AppHost restore. This fixes stale-cache issues when integration packages change and ensures corrupt or outdated cache entries are detected and regenerated.
Owner: @danegsta
Changes: #16683 -
🔧 Fix orphan AppHost package references after aspire update
aspire update no longer leaves behind orphan Aspire.Hosting.AppHost package references when the AppHost SDK is already current. Previously, projects already on the new Sdk attribute format could accumulate stale PackageVersion or PackageReference entries that caused NU1009 restore failures on subsequent runs.
Owner: @mitchdenny
Changes: #17016 -
🛑 Fix detached App Host graceful shutdown on Windows
Fixed graceful shutdown for detached app hosts on Windows. Detached app hosts are now assigned to a new console group, and the stop command sends Ctrl+C first to allow a clean shutdown before forcefully killing the process if needed.
Owner: @danegsta
Changes: #17027 -
💬 Fix output directory not empty message in interactive mode
Fixed a misleading error message in aspire new when the output directory is non-empty. In interactive mode the prompt now says Specify a different location rather than incorrectly suggesting the --output flag.
Owner: @JamesNK
Changes: #16995 -
🔧 Fix aspire run hang on build failure with watch mode
Fixed a hang in aspire run when the defaultWatchEnabled feature flag is set and the AppHost has a build error. Previously, aspire run would hang indefinitely instead of reporting the build failure and exiting.
Owner: @davidfowl
Changes: #16702
🌍 Community contribution by @Bertolossi -
🗑️ Remove aspire exec command
The experimental aspire exec command has been removed from the CLI along with its associated AppHost backchannel, feature flag, and localized resources.
Owner: @davidfowl
Changes: #16913
Docs: microsoft/aspire.dev#901
⚠️ Breaking change -
🔗 Fix whitespace trimming in CLI markdown links
Fixed leading and trailing whitespace being included in rendered markdown link text in the CLI output, ensuring links display cleanly in both Spectre.Console markup and plain-text modes.
Owner: @JamesNK
Changes: #16926 -
🌐 aspire run honors dev.localhost URLs from aspire.config.json
Fixed aspire run ignoring *.dev.localhost URLs configured in aspire.config.json. After creating a project with --localhost-tld, aspire run now correctly opens the dashboard at the configured dev.localhost address instead of the default localhost URL.
Owner: @mitchdenny
Changes: #16828 -
🐛 Fix aspire run failing when dashboard is disabled
Fixed aspire run crashing when the dashboard was disabled via the DisableDashboard configuration option.
Owner: @JamesNK
Changes: #16773 -
🔧 Fix missing apphost.run.json from aspire init
Fixed aspire init not generating the required apphost.run.json file when initializing a single-file skeleton AppHost, which caused subsequent aspire run commands to fail.
Owner: @mitchdenny
Changes: #16812 -
🌐 Fix aspire new empty AppHost language picker
Fixed the language picker prompt inaspire newwhen creating an empty AppHost so that it correctly lists and applies the selected language.
Owner: @maddymontaquila
Changes: #16666 -
🔧 Fix --apphost directory resolution
Fixed--apphostflag resolution for stop-side CLI commands so explicit AppHost project-file paths go directly to the socket lookup path while directory-valued inputs resolve correctly via project detection.
Owner: @adamint
Changes: #16406
4 new features, 10 improvements, 11 bug fixes
-
⏲️ Duration filter on Traces page
A new duration filter is now available on the Traces page, letting you filter traces by their overall duration (from the first span start to the last span end). This makes it easy to identify slow or long-running traces in busy applications.
Owner: @JamesNK
Changes: #17388
📝 Documentation required
🌍 Community contribution by @ellahathaway -
⏱️ Minimum span duration filtering in trace detail
A new Duration (ms) field with numeric comparison operators (>=, >, <=, <) is available in the trace detail filter dialog, letting you hide short-lived spans that add noise to large traces. Ancestor spans are preserved so the trace tree stays navigable, and the underlying trace query gained major performance improvements — a no-match duration filter on 10k spans now completes in ~67 µs instead of ~1 ms.
Owner: @davidfowl
Changes: #17299
📝 Documentation required -
🤖 AI Agents dialog in dashboard header
Added an AI Agents dialog accessible from the dashboard header, providing quick access to AI agent information and actions. The dialog now includes a link to the CLI installation page, guiding users to install the Aspire CLI before running AI agent commands.
Owner: @JamesNK
Changes: #16869, #17331
Docs: microsoft/aspire.dev#888
📝 Documentation required -
⏳ Show waiting dependency details in dashboard
When a resource is waiting for dependencies to start, the dashboard and CLI now show the specific blocking resource names in the state description. In the dashboard, dependency names are rendered as clickable links to the dependent resource's detail page.
Owner: @adamint
Changes: #17089
📝 Documentation required
-
📋 Improved dashboard startup summary log formatting
Dashboard startup log output now uses indented bullet formatting for the dashboard and OTLP endpoint URLs, and the container access guidance is emitted as a separate log entry rather than appended to the summary template. This makes the startup summary easier to scan.
Owner: @JamesNK
Changes: #17640 -
🔍 Structured text search for traces and logs
Text search across traces, logs, and spans now supports structured field qualifiers (e.g., status:error, severity:warning, duration:>100), attribute filters (@attr:value), negation, and numeric comparisons — all terms are ANDed together for precise filtering.
Owner: @JamesNK
Changes: #17482
Docs: microsoft/aspire.dev#1081, microsoft/aspire.dev#1121
📝 Documentation required -
🤖 Improved AI agents dialog descriptions
Rewrites the AI agents dialog text in the dashboard to be more concise and scannable. The updated copy leads with the value proposition and uses bullet lists to highlight available data types at a glance.
Owner: @JamesNK
Changes: #17446 -
⚡ Reduce allocations in waiting-dependency tooltip
Optimizes the waiting-dependency tooltip resolution path in the Dashboard by eliminating unnecessary resource collection materialization. Resources are now enumerated directly instead of being copied to an array on each hover, reducing per-hover allocations.
Owner: @adamint
Changes: #17353 -
📭 Console logs empty state
The console logs panel now shows an empty state message after a brief delay when a resource has not emitted any output. The empty state is hidden immediately once logs arrive or the subscription changes.
Owner: @JamesNK
Changes: #17340
🌍 Community contribution by @nightt5879 -
🎛️ Structured filter dialog on trace detail page
A structured "Add filter" dialog is now available on the trace detail (waterfall) page, matching the experience on the Traces list page. Filters apply per-span with AND logic, and parent spans remain visible when a descendant matches.
Owner: @JamesNK
Changes: #17284
🌍 Community contribution by @ellahathaway -
📈 Increased MCP AI tool data limits
The MCP AI tools now have significantly higher data limits: traces and structured logs increased from 200 to 800, and console logs from 500 to 2000. This provides AI agents with substantially more telemetry context when searching through Aspire dashboard data.
Owner: @JamesNK
Changes: #17238 -
🔔 Canceled resource commands stay visible in notification center
When a resource command is canceled, its notification now remains visible in the notification center with a warning status instead of being removed. This helps users track which commands were interrupted rather than leaving them with no record of the cancellation.
Owner: @JamesNK
Changes: #17204
Docs: microsoft/aspire.dev#1008 -
📋 Dashboard startup URL always logged regardless of auth mode
The Aspire Dashboard now always logs a startup summary including the dashboard URL and OTLP endpoint details, regardless of the frontend authentication mode. Previously, access details were only logged in BrowserToken auth mode, leaving other auth configurations without visible startup output.
Owner: @JamesNK
Changes: #17206 -
🧹 Resource command proto improvements
Cleaned up the ResourceCommandRequest and ResourceCommandResponse proto messages in the dashboard gRPC protocol. Arguments are now passed as a map instead of a generic Value, and the unused argument_inputs field has been removed from the response.
Owner: @JamesNK
Changes: #16916
-
🔧 Fix Dashboard loading error with .NET 11 preview
Updatedblazor.web.jsto the latest version to fix Dashboard failures when running with .NET 11 preview. The outdated file caused JS interop errors (e.g.,Blazor._internal.Virtualize.refreshObservers is not a function) that prevented the Dashboard from loading.
Owner: @JamesNK
Changes: #17445 -
🔑 Fix browser token authentication over HTTP
Fixes dashboard browser-token authentication when the frontend is reachable over both HTTPS and HTTP. The dashboard now uses separate auth cookie names for each scheme, preventing HTTPS cookies from shadowing the HTTP sign-in flow.
Owner: @adamint
Changes: #17368 -
🔢 Fix numeric and boolean resource properties lost in JSON export
Fixed a data loss bug where numeric and boolean resource properties (e.g., container port numbers) were silently converted to null when exporting resource JSON via the telemetry export service.
Owner: @JamesNK
Changes: #17287
🌍 Community contribution by @ellahathaway -
🏗️ Fix Azure provisioning dialog stuck on resource group selection
Selecting an existing resource group in the Azure provisioning dialog no longer leaves the Location field empty and blocks submission. The disabled Location input now correctly inherits the server-provided resource group location.
Owner: @DamianEdwards
Changes: #17278 -
🔍 Fix Settings dialog button overlap at high zoom
Fixed the Manage button overlapping the Close button in the Settings dialog when the browser is at high zoom levels.
Owner: @JamesNK
Changes: #17258 -
🐛 Fix stack overflow when opening dialogs from notification center
Fixed a stack overflow (maximum call stack size exceeded) that occurred when opening the Text Visualizer dialog from the notification center. The notification center dialog is now hidden while a child dialog is open, preventing infinite focus-trap recursion.
Owner: @JamesNK
Changes: #17261 -
📐 Fix dashboard menu and popover positioning
Menus and popovers in the dashboard now calculate their vertical flip threshold dynamically based on the number of items, ensuring they correctly open above the cursor when there is insufficient space below.
Owner: @JamesNK
Changes: #17196 -
🔍 Fix traces not-equals filter returning empty results
Fixed a bug on the Dashboard Traces page where applying a != (not equals) or "not contains" filter condition caused all traces to be filtered out regardless of the filter value. The equals and contains filters were unaffected.
Owner: @JamesNK
Changes: #16932 -
🌐 Fix static web assets in non-Development environments
Fixed static web assets (such as FluentUI JS/CSS files) not being served when running the Aspire Dashboard from source with a non-Development ASPNETCORE_ENVIRONMENT setting.
Owner: @JamesNK
Changes: #16931 -
🔲 Display Unknown state in resource details panel
Fixed the resource detail panel not showing a state row when a resource has no state. The resource grid already displayed "Unknown" in this scenario, and now the detail panel is consistent.
Owner: @JamesNK
Changes: #16928 -
🐞 Fix misleading state detail for containers that failed to start
Fixed the dashboard incorrectly showing "Container is no longer running" for containers in FailedToStart state. These containers now show a more accurate state detail indicating they failed to start rather than suggesting they previously ran.
Owner: @JamesNK
Changes: #16747
3 new features, 18 improvements, 7 bug fixes
-
🔍 TypeScript API compatibility check
A new CI workflow and tool prevent undeclared breaking changes to the TypeScript AppHost API surface. PRs are automatically validated against the ATS baseline, and intentional breaks require explicit suppressions with full traceability.
Owner: @sebastienros
Changes: #17103 -
🛠️ Dotnet-tool install mode for PR dogfooding scripts
PR dogfooding scripts now support dotnet-tool install mode alongside the default archive mode. Bug fixes address PowerShell PATH update reliability and invalid flag rejection outside tool mode.
Owner: @radical
Changes: #16535, #17142 -
⏱️ Aspire startup OTEL profiling harness
Added an OpenTelemetry-based startup profiling harness that measures Aspire application startup performance. The harness exports startup spans, includes a validator script, and integrates with the CLI backchannel for accurate end-to-end timing.
Owner: @davidfowl
Changes: #16775
-
🍺 Switch Homebrew cask to upstream autobump
The Aspire Homebrew cask now uses Homebrew's upstream autobump flow for version bumps, installing from GitHub release assets instead of ci.dot.net. The custom bot-driven submission pipeline has been removed in favor of the standard brew bump-cask-pr workflow, and cask validation now matches the upstream Homebrew CI checks.
Owner: @radical
Changes: #17405 -
⚡ Faster TypeScript API compatibility checks
The TypeScript API compatibility CI check now compares against the checked-in ATS baseline instead of regenerating it, and uses a single CLI invocation with the new --output-directory flag to scan multiple integrations. This significantly reduces CI time and process overhead for pull requests.
Owner: @sebastienros
Changes: #17415 -
📦 TypeScript validation respects package manager markers
The TypeScript polyglot validation CI now respects each fixture's package manager markers (npm, pnpm, Yarn, Bun) instead of always using npm. Dedicated TypeScript validation AppHosts for each package manager are added to ensure marker-based behavior is exercised in CI.
Owner: @sebastienros
Changes: #17419 -
🍺 WinGet and Homebrew installer dogfood flows for PR builds
GitHub Actions CI now builds and publishes WinGet manifests and Homebrew cask artifacts for PR builds, enabling anyone to test the WinGet or Homebrew install path of any open PR locally before it merges. Also adds an osx-x64 native CLI archive so Homebrew cask generation can hash both macOS architectures.
Owner: @radical
Changes: #17115 -
⚙️ Automated release stabilization with dynamic package version computation
Release stabilization is now a single-line change in eng/Versions.props (flipping StabilizePackageVersion to true) — no more hand-editing package version files, CI job overrides, or SKIP lists. A new Stabilization Check CI job validates stable packing, CLI tests, and template smoke tests on every PR, catching NU5104 and restore regressions before stabilization time.
Owner: @joperezr
Changes: #15681 -
📦 CLI archive verifier now covers TypeScript AppHosts
The CLI archive verifier now validates TypeScript AppHost archive layout in addition to the C# starter path. It asserts that the managed AppHost server, dashboard web assets, and DCP are present in the extracted archive, then exercises the TypeScript starter flow end-to-end, catching archive layout issues that would break TypeScript users before they reach production.
Owner: @sebastienros
Changes: #17274 -
🧪 TypeScript AppHost CI validates multiple Node LTS versions
The TypeScript AppHost validation CI now tests against multiple Node LTS runtimes. PR builds validate against Node 24.x (current LTS), while main branch builds additionally validate Node 22.x, improving compatibility coverage for the TypeScript AppHost runtime.
Owner: @sebastienros
Changes: #17101 -
🚀 Automated release workflow chaining
The release process now automatically chains GitHub release tasks (tagging, GitHub Release creation, merge-back and baseline PRs) directly from the AzDO NuGet publish pipeline. Follow-up improvements auto-derive ReleaseVersion from the source build, improve NuGet push retry behavior, and ensure the workflow always dispatches from the latest main so updates take effect without backporting.
Owner: @joperezr
Changes: #17073, #17131, #17150 -
🔑 Use app token for automated PR pushes
Automated PR workflows now use a GitHub App token for git push operations, ensuring that CI is triggered on pull_request.synchronize events after automated pushes. Previously the default GITHUB_TOKEN was used, which GitHub suppresses from triggering CI.
Owner: @sebastienros
Changes: #17109 -
🛠️ Skip WinGet/Homebrew artifact work when publish is skipped
The release publish pipeline now skips WinGet and Homebrew artifact downloads and SBOM-stamping when the corresponding SkipWinGetPublish or SkipHomebrewPublish flags are set, eliminating unnecessary work during conditional pipeline re-runs.
Owner: @joperezr
Changes: #17069 -
🎯 Deterministic docs-check signal catalog
The pr-docs-check workflow now uses a deterministic signal catalog — 32 boolean signals computed from changed file paths, diff content, PR body, and labels — to decide whether documentation is required. This replaces the previous AI-judged approach that was inconsistent and missed user-facing changes.
Owner: @IEvangelist
Changes: #16983 -
🔐 Explicit permissions in CI workflow
The top-level ci.yml workflow now declares an explicit contents: read permission block, ensuring the GITHUB_TOKEN follows the principle of least privilege rather than inheriting potentially broader default scopes.
Owner: @radical
Changes: #17007
🌍 Community contribution by @arpitjain099 -
📝 Milestone changelog workflow improvements
Improved the milestone changelog workflow with better backport PR filtering, docs PR enrichment, deterministic target-branch resolution, capping the docs PR date range to the batch cutoff to prevent premature exclusion, and various other cleanup improvements for more accurate and complete changelogs.
Owner: @JamesNK
Changes: #16933, #16950, #16936 -
🔥 Aspire skill hot reload guidance
Added hot reload guidance to the Aspire agent skill, clarifying when AppHost-level changes require rerunningaspire start, when resource-specific changes should keep the AppHost running, and how frontend frameworks with HMR (Vite, Next.js) handle code changes automatically without requiring restarts.
Owner: @davidfowl
Changes: #16868 -
📋 Release-driven support docs workflow
Added a release-driven agentic workflow that automatically updates the support.mdx page when a stable release is published, and fixed PR docs check to include a drafted-PR link and SME reviewer assignment.
Owner: @IEvangelist
Changes: #16778 -
🐳 Prebuilt CLI E2E Docker image
CLI E2E tests now use a prebuilt shared Docker image instead of building the image from scratch in each isolated CI job, reducing redundant apt/docker build work and speeding up E2E test runs.
Owner: @sebastienros
Changes: #16787 -
🔄 Backport PR support in changelog workflow
The milestone changelog workflow now correctly detects and processes backport PRs, attributing them to the original PR author and content rather than the backport bot.
Owner: @JamesNK
Changes: #16712 -
📦 Deterministic native CLI package staging
Native CLI tool packages are now staged deterministically in the build pipeline, improving reproducibility of release builds.
Owner: @radical
Changes: #16631
-
🔨 Fix CLI archive verifier build break and add GitHub CI coverage
Fixed multiple issues in the CLI archive verifier build pipeline: removed failing TypeScript and C# starter checks that could not run in the 1ES signed-build agent (both depend on NuGet feeds unreachable from the build agent), added lightweight GitHub CI coverage to catch verifier regressions before they reach the post-merge pipeline, and fixed a latent scope-narrowing bug in the sidecar check that would have silently missed stray sidecars in archives with a top-level directory.
Owner: @radical
Changes: #17341, #17346, #17646 -
🔩 Fix VS Code extension build scripts Corepack network failure
Reverts the Corepack-specific Yarn invocation from the 13.4 release branch VS Code extension build scripts. Internal Azure Pipelines builds blockedcorepack yarn@1.22.22from downloading Yarn due to network isolation, causing extension builds to fail. The fix invokes the configuredyarnexecutable directly while preserving the frozen-lockfile restore path.
Owner: @joperezr
Changes: #17628 -
🔧 Fix stable CLI version installs in get-aspire-cli scripts
Stable exact-version installs through the get-aspire-cli scripts now download from GitHub release assets instead of ci.dot.net, which does not serve stable release archives. Prerelease and dev versions continue using the existing ci.dot.net path.
Owner: @radical
Changes: #17517 -
🔧 Fix GitHub CLI missing on AzDO release agent
The AzDO release pipeline (microsoft-aspire-Release-To-NuGet) now installs the GitHub CLI before running release tasks, fixing failures in theUpload CLI Assets to GitHub Releasejob onNetCore1ESPool-InternalWindows agents whereghwas not on PATH.
Owner: @radical
Changes: #17478 -
🐛 Fix support workflow release trigger
Fixed the release-driven support page automation workflow to listen for the GitHub release published event instead of released, ensuring stable Aspire releases correctly trigger the aspire.dev support page PR automation.
Owner: @IEvangelist
Changes: #17322 -
🚰 Fix release pipeline stage dependencies and asset download
Fixed two release pipeline blockers: theGitHubTasksstage now correctly declares its dependency onPrepareArtifactsso the release version variable resolves, and the CLI asset download glob pattern is corrected to match the full artifact directory prefix.
Owner: @joperezr
Changes: #17248 -
🔀 Fix CI changed-file detection to use three-dot diff
Thecheck-changed-filesGitHub Action now uses a three-dot diff (BASE...HEAD) instead of a two-dot diff, ensuring only files actually changed by a PR are detected rather than all files that diverged from the base branch tip.
Owner: @joperezr
Changes: #17220
4 new features, 8 improvements, 5 bug fixes
-
🐹 VS Code Go debugging support
Go resources can now be debugged natively from the Aspire VS Code extension when the Go extension is installed, using dlv-dap for launch configuration. The AppHost emits Go launch metadata and the extension maps it to the golang.go debugger.
Owner: @davidfowl
Changes: #17406
Docs: microsoft/aspire.dev#1082
📝 Documentation required -
🏘️ Live multi-AppHost workspace support in VS Code
The VS Code extension now supports live workspace updates for multi-AppHost workspaces. Running AppHosts are rendered independently in the workspace tree, resource actions and CodeLens are scoped to the owning AppHost, and stale progress notifications are cleared when the CLI connection closes.
Owner: @adamint
Changes: #16836 -
⌨️ VS Code resource command argument inputs
The VS Code extension now prompts for resource command argument inputs using native QuickInput controls when invoking commands that require arguments. Both the resource tree view and CodeLens command paths collect argument values and pass them through toaspire resource.
Owner: @davidfowl
Changes: #17187
📝 Documentation required -
🔭 AppHost code lenses without opening panel
AppHost code lenses (Run, Stop, Restart) are now shown directly in the editor without requiring the Aspire panel to be open. New Open Dashboard and View Logs code lenses have also been added.
Owner: @adamint
Changes: #16667
📝 Documentation required
-
🌳 Parser-backed AppHost resource detection in VS Code extension
The VS Code extension now uses a parser-backed syntax analyzer (Tree-sitter) to detect AppHost resources, ensuring that commented-out resource declarations and sample code inside string literals are no longer incorrectly treated as active resources.
Owner: @davidfowl
Changes: #17361, #17413, #17480 -
📋 App host logs viewer in VS Code extension
The VS Code extension now shows an AppHost logs tree item that opens the log file directly in the editor when clicked, plus a View source context menu item that displays the full raw JSON from aspire ps for each app host.
Owner: @JamesNK
Changes: #17465 -
📁 Prompt for new project location in VS Code
When launchingaspire newfrom the VS Code extension, users are now prompted to choose where the new project should be created — either in a named subdirectory or directly in the selected folder. The resolved output path is shared consistently between the extension and CLI.
Owner: @adamint
Changes: #17279 -
🏷️ Fix CodeLens button text to use command displayName
VS Code CodeLens buttons for custom resource commands now display the short displayName instead of the full description. Empty or whitespace-only display names fall back to the command name, preventing blank labels.
Owner: @JamesNK
Changes: #16909 -
🧹 Reliable cleanup of extension Aspire CLI child processes
The VS Code extension now tracks and reliably terminates all in-flight Aspire CLI child processes (aspire describe --follow, aspire ps, aspire extension get-apphosts) when polling stops or the repository is disposed. A shared termination helper sends a graceful signal and forces termination if the process does not exit within the grace period.
Owner: @adamint
Changes: #17087 -
🐚 Shell integration for Aspire terminal commands
VS Code terminal shell integration is now used when sending Aspire CLI commands to the Aspire terminal, allowing VS Code to interrupt running commands more cleanly. When shell integration is unavailable, the previous Ctrl+C fallback is used.
Owner: @adamint
Changes: #16835 -
📡 Improved VS Code debug output for AppHost sessions
VS Code debug adapter output is now forwarded to the Aspire dashboard logs, and AppHost errors are shown directly in the Aspire debug session console. Debug console output for TypeScript and C# AppHosts has been further improved for clarity and reduced noise.
Owner: @adamint
Changes: #16512, #16795 -
⚙️ Disable VS Code extension auto-restore by default
The VS Code extension no longer automatically runs dotnet restore on startup by default, reducing unwanted background activity.
Owner: @adamint
Changes: #16658
-
🔍 Fix VS Code AppHost launch path resolution
The VS Code extension now uses CLI-backed discovery (aspire ls) as the source of truth for launch targets, fixing issues where starting a debug session from an AppHost source file could pass an incorrect path to the CLI and fail to launch.
Owner: @davidfowl
Changes: #17560 -
🩹 Fix health status icons in resource tree view tooltips
Health check status icons in VS Code extension resource tree view tooltips now display correctly as emoji instead of VS Code codicon references (e.g.,$(pass)), which were rendered as literal text in markdown strings.
Owner: @JamesNK
Changes: #17489 -
🐛 Fix VS Code debug launch for Blazor WebAssembly resources
Fixes the VS Code extension incorrectly attempting to launch Blazor WebAssembly project output through the coreclr debugger. WASM runtimeconfig files lack a standard framework entry, so the extension now detects this case and skips the incompatible debug launch path.
Owner: @adamint
Changes: #17364 -
👁️ Show resourceless AppHosts in VS Code extension
AppHosts that are running but have no resources are now visible in the VS Code extension's Running AppHosts view, allowing users to access the dashboard and AppHost logs even when no resources have been added yet.
Owner: @adamint
Changes: #17082 -
🔔 Fix sticky Finding apphosts notification
Fixed a bug in the VS Code extension where the "Finding apphosts" notification would remain visible indefinitely instead of disappearing after AppHost discovery completed.
Owner: @adamint
Changes: #16664
1 new feature, 3 improvements
-
🦫 Go application hosting integration
Added Aspire.Hosting.Go — a first-class hosting integration for Go applications, bringing Go to parity with Aspire.Hosting.Python and Aspire.Hosting.JavaScript. Supports build flags (tags, ldflags, gcflags), race detector, Delve remote debugging with VS Code integration, go mod lifecycle commands (tidy, vendor, download), and a production-ready go-starter template with Redis, OTLP telemetry, and health checks.
Owner: @davidfowl
Changes: #16879
📝 Documentation required
🌍 Community contribution by @edmondshtogu
-
🐰 Bump RabbitMQ default container image to 4.3
The default RabbitMQ container image used byAddRabbitMQhas been updated from4.2to4.3. Note that RabbitMQ 4.3 rejects transient (non-durable) non-exclusive queue declarations by default; applications relying on such queues will need to update their queue declarations.
Owner: @joperezr
Changes: #17148
Docs: microsoft/aspire.dev#1003
📝 Documentation required -
🏗️ Azure FrontDoor CDN uses Azure.Provisioning name generation
Azure FrontDoor CDN resources now use Azure.Provisioning's built-in name generation algorithm instead of Aspire's custom logic, removing the manual name length cap. Upgrading from 13.3 may produce duplicate endpoint, origin group, or route names — remove and re-add the affected resource, or set the Name explicitly via ConfigureInfrastructure, to avoid conflicts.
Owner: @eerhardt
Changes: #16986
Docs: microsoft/aspire.dev#965
⚠️ Breaking change
📝 Documentation required -
📨 NATS integration registers INatsClient and defaults JSON serializer
AddNatsClient now also registers INatsClient and defaults the SerializerRegistry to NatsClientDefaultSerializerRegistry, enabling typed publish/subscribe without requiring explicit serializer configuration. User-provided registries still take precedence, and users working with primitives or raw bytes are unaffected.
Owner: @eerhardt
Changes: #16980
📝 Documentation required
🌍 Community contribution by @mtmk
2 bug fixes
-
🔒 Patched high-severity DoS vulnerability in JavaScript templates
Updated OpenTelemetry JS dependencies in the Java and TypeScript starter templates to address a high-severity Prometheus exporter DoS vulnerability via malformed HTTP requests (GHSA-q7rr-3cgh-j5r3).
Owner: @IEvangelist
Changes: #17171 -
🐛 Fix Python starter TypeScript health check build
Fixed a build error in the Python starter template where the TypeScript health check component failed to compile due to missing configuration.
Owner: @sebastienros
Changes: #16625
2 bug fixes
-
🐛 Fix DistributedApplicationTestingBuilder dashboard with dynamic ports
Fixes failures when DistributedApplicationTestingBuilder enables the dashboard with dynamic-port endpoints. The resource service gRPC host now uses Listen(IPAddress, port) for loopback IPs enabling port-0 binding, and AllowUnsecuredTransport is correctly defaulted to true in testing scenarios.
Owner: @JamesNK
Changes: #17731 -
🔒 Fix CreateHttpClient to prefer HTTPS endpoints
CreateHttpClientandGetEndpointUriStringinAspire.Hosting.Testingnow prefer thehttpsendpoint overhttpwhen no endpoint name is specified, matching thehttps+http://service discovery behavior.
Owner: @maddymontaquila
Changes: #17095
To provide feedback, comment on the Changelog feedback issue (e.g., "Exclude PR #1234", "Rename: X → Y", "Merge PRs #1234 and #5678").
PRs processed: ✅ 306 included · ❌ 112 excluded · ⏳ 0 unprocessed · 417 total merged in milestone (View full PR tracker) Docs PRs: ✅ 73 included · ❌ 100 excluded · ⏳ 0 unprocessed · 173 total from microsoft/aspire.dev (View docs PR tracker) PRs analyzed through: #17756 merged 2026-06-01 01:34 UTC