Skip to content

13.4 Change log

github-actions[bot] edited this page Jun 2, 2026 · 160 revisions

Table of Contents

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.

What's New

🏠 AppHost

25 new features, 35 improvements, 36 bug fixes

New features

  1. 🌐 Blazor WebAssembly hosting integration
    Introduces Aspire.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

  2. 🎛️ 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

  3. 🐰 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

  4. 🔐 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

  5. 🔗 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

  6. 🪪 Add WithAcrPullIdentity to Azure Container App Environment
    Adds WithAcrPullIdentity to IResourceBuilder<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

  7. 🎮 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

  8. 📸 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

  9. 🙈 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

  10. 🔄 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

  11. 📦 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

  12. 📋 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

  13. 🔢 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

  14. ☁️ 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

  15. 🔔 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

  16. 🐳 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

  17. 🎛️ 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

  18. 🔐 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

  19. 🌐 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

  20. ⚙️ Process-backed resource commands
    Added a new experimental WithProcessCommand API 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. The IInteractionService now correctly returns IsAvailable=false during non-interactive CLI resource command execution.
    Owner: @davidfowl
    Changes: #16923, #16972, #16973
    Docs: microsoft/aspire.dev#918, microsoft/aspire.dev#923
    📝 Documentation required

  21. ☸️ 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

  22. ⛵ 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

  23. 🔑 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

  24. 📦 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

  25. 🐹 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

Improvements

  1. 🌉 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

  2. 🤖 Foundry hosted-agent builder API updates
    Updated Aspire.Hosting.Foundry hosted-agent builder APIs to use a project-first approach: AsHostedAgent now takes the Foundry project as the primary argument with a typed HostedAgentConfiguration callback. 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

  3. 🔧 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

  4. 🎓 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 suppressed ASPIREATS001 compiler warnings can safely remove those suppressions.
    Owner: @sebastienros
    Changes: #17602
    Docs: microsoft/aspire.dev#1112
    📝 Documentation required

  5. ⛑️ 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 like unknown 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

  6. 🤖 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

  7. 🔄 Foundry agent builder API alignment with Aspire conventions
    Foundry agent builder APIs updated to follow standard Aspire AppHost conventions: AddPromptAgent now takes the resource name as the first parameter (before the model), and PublishAsHostedAgent has been renamed to WithComputeEnvironment to align with other deployment targets. The preview-only AsHostedAgent and RunAsHostedAgent methods were removed.
    Owner: @tommasodotNET
    Changes: #17499
    Docs: microsoft/aspire.dev#997
    ⚠️ Breaking change
    📝 Documentation required

  8. 🔐 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

  9. 🌐 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

  10. 🔀 Kubernetes Ingress WithRoute renamed to WithPath
    Kubernetes Ingress WithRoute has been renamed to WithPath to match the underlying spec.rules[].http.paths[] concept in Kubernetes YAML. The shared IngressPathType enum is split into KubernetesIngressPathType (for Ingress) and KubernetesGatewayPathType (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

  11. ⛓️ 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

  12. 📦 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

  13. 🔧 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

  14. 📂 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

  15. 🔑 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

  16. 🏗️ TypeScript AppHosts use explicit ES modules (.mts)
    New TypeScript AppHosts are now scaffolded as apphost.mts using explicit ES module syntax, with the code generator emitting .mts SDK files. Existing apphost.ts projects continue to work unchanged, and aspire init in brownfield apps safely creates a nested aspire-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

  17. 🔐 Advise aspire certs trust in 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 running aspire certs trust instead of dotnet 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

  18. 🔍 Fix aspire ps hang when dashboard is unavailable
    Fixed aspire ps hanging indefinitely when the dashboard resource is unavailable. The command now fails fast in this scenario, making it usable with DistributedApplicationTestingBuilder to inspect a running app even when the dashboard is not configured.
    Owner: @davidfowl
    Changes: #16621
    🌍 Community contribution by @afscrome

  19. 📚 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

  20. ⚡ 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

  21. 🔍 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

  22. 🛑 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

  23. 🔒 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

  24. 📋 pnpm workspace file support in Dockerfile generation
    When generating Dockerfiles for JavaScript apps using pnpm, the pnpm-workspace.yaml file 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

  25. 🎓 Graduate Azure Container Apps job APIs to stable
    The Azure Container Apps job publishing APIs (PublishAsAzureContainerAppJob) are now stable and no longer require suppressing the ASPIREAZURE002 experimental 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

  26. 🌐 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

  27. 🪵 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

  28. 🛡️ 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

  29. 🐳 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

  30. 🔀 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

  31. ⚓ 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

  32. 🚧 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

  33. ✅ 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

  34. 🔍 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

  35. ☸️ 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

Bug fixes

  1. 🔗 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

  2. 🔒 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

  3. 🔓 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

  4. 🔦 Restore dotnet watch dashboard auto-launch signal
    Restores the legacy login log line that dotnet watch depends 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, breaking dotnet watch auto-launch.
    Owner: @JamesNK
    Changes: #17653

  5. 🌐 Fix dev localhost URL validation for polyglot AppHosts
    Fixes a regression where polyglot AppHosts scaffolded with *.dev.localhost URLs failed to start with aspire run because the resource service endpoint validation did not recognize RFC-reserved localhost subdomains.
    Owner: @danegsta
    Changes: #17644

  6. 🔧 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

  7. 🐛 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

  8. 🔌 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 the aux.v4 capability. 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

  9. 🛡️ 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

  10. 🐛 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

  11. 🔁 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

  12. 🎯 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

  13. 🐛 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

  14. 🏗️ 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

  15. 🔓 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

  16. 🔧 Fix AsExisting for Azure Container App Environment
    Fixes AddAzureContainerAppEnvironment(...).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 when AsExisting() is used.
    Owner: @eerhardt
    Changes: #17365
    Docs: microsoft/aspire.dev#1045

  17. 🔧 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

  18. 🔦 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., calling GetEndpoint('https') on a resource that only exposes http), the error is now surfaced in resource logs and shown in the dashboard instead of being silently lost.
    Owner: @IEvangelist
    Changes: #17265

  19. 🐳 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

  20. 🐛 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

  21. 🐛 Fix EF Migrations crash in run mode when publish steps are configured
    Fixed a crash that occurred when combining RunDatabaseUpdateOnStart() and PublishAsMigrationBundle() 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

  22. 🌐 Fix --apphost directory resolution for Rust, Go, and Java polyglot SDKs
    Fixed Rust, Go, and Java polyglot AppHosts not forwarding ASPIRE_APPHOST_FILEPATH and ASPIRE_PROJECT_DIRECTORY environment variables from the CLI, causing aspire --apphost <directory> to fail to find running AppHosts in those languages.
    Owner: @mitchdenny
    Changes: #17237

  23. 🕐 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

  24. 🔤 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

  25. ☸️ Fix Kubernetes publisher crash on scalar environment variable values
    The Kubernetes publisher no longer crashes with NotSupportedException when environment variables are set to non-string scalar values (such as bool, int, or double) by third-party integrations.
    Owner: @mitchdenny
    Changes: #15560

  26. 📍 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

  27. 🔕 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

  28. 🔑 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

  29. 🔓 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

  30. 🔧 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

  31. 🤖 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

  32. 🔧 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

  33. 🔧 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

  34. 🔬 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

  35. 🕐 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

  36. 🔧 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

💻 CLI

7 new features, 39 improvements, 55 bug fixes

New features

  1. 📡 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

  2. ⏱️ --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

  3. 📋 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

  4. 🔍 aspire doctor shows all Aspire CLI installations
    Running aspire doctor now 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 json option includes the same data as an installations array for tooling consumption.
    Owner: @radical
    Changes: #17105
    📝 Documentation required

  5. 🛸 Aspire deployment agent skill
    A dedicated Aspire deployment skill is now bundled with aspire 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

  6. 🔎 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

  7. 🔍 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

Improvements

  1. 📋 Load Aspire skills catalog from bundle manifest
    aspire agent init now loads available skills from the bundled microsoft/aspire-skills manifest instead of a hardcoded list, making all six bundle skills (including aspire-init, aspire-monitoring, and aspire-orchestration) visible in the interactive prompt and via --skills.
    Owner: @IEvangelist
    Changes: #17673
    Docs: microsoft/aspire.dev#1137
    📝 Documentation required

  2. 🧹 Simplified aspire ps command
    The aspire ps command no longer supports --resources and --include-hidden flags, which overlapped with aspire describe. Consumers needing per-resource data should use aspire describe --follow --apphost instead. The VS Code extension's AppHostDataRepository has been updated accordingly.
    Owner: @mitchdenny
    Changes: #17579
    Docs: microsoft/aspire.dev#1109
    ⚠️ Breaking change
    📝 Documentation required

  3. 🛡️ 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

  4. 🌲 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

  5. 📦 Aspire agent skills distributed via external npm bundle
    The Aspire CLI now downloads workflow skills (aspire, aspireify, aspire-deployment) from an external @microsoft/aspire-skills npm 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

  6. ⏱️ 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

  7. 🖥️ Remove Logs column from aspire ps table output
    The Logs column has been removed from the aspire ps table display because log file paths were too long, pushing Dashboard URLs off-screen and causing awkward line wrapping. Log paths remain available via aspire ps --format json for programmatic access and are still shown in the aspire run startup banner.
    Owner: @JamesNK
    Changes: #17459
    Docs: microsoft/aspire.dev#1064

  8. 🔐 Partial Linux certificate trust treated as success in non-interactive mode
    The aspire certs trust --non-interactive command 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

  9. 🔇 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

  10. ⚡ 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

  11. 🔕 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 json is used, ensuring machine-readable stdout is never polluted with banner text.
    Owner: @JamesNK
    Changes: #17350

  12. 📡 CLI startup self-profiling with trace export
    The hidden --capture-profile flag 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 for aspire 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

  13. 🔐 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

  14. 🔬 Improved diagnostics for integration assembly load failures
    When aspire new fails 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

  15. 🚀 Faster CLI startup with AppHost metadata caching
    aspire run --no-build now 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 with aspire cache clear.
    Owner: @davidfowl
    Changes: #17246

  16. ✏️ 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

  17. 🌐 CLI init command localization
    All user-facing messages in the aspire init command 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

  18. 🩺 aspire doctor reports Yarn Classic as unsupported
    aspire doctor now 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

  19. 🔄 Auto-migrate legacy .aspire/settings.json on CLI startup
    The CLI now automatically migrates legacy .aspire/settings.json files to the new aspire.config.json format on every startup, regardless of which command is run. Previously, read-only commands like aspire doctor and aspire ls would not trigger migration, leaving workspaces stuck on the old layout.
    Owner: @mitchdenny
    Changes: #17234

  20. 🩺 Improved aspire start readiness diagnostics
    aspire start now 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

  21. 🎨 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

  22. 📋 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 ps shows 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

  23. 🚀 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

  24. 📦 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

  25. 🧹 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

  26. 🪵 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

  27. 🩺 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

  28. 🗣️ 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

  29. 🔍 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

  30. 🏷️ 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

  31. 🔗 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

  32. 🎯 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

  33. ✅ 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

  34. 🛑 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

  35. 🔗 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

  36. 📁 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

  37. ✨ Improve CLI init output spacing
    Improved output spacing in the aspire init command for a cleaner and more readable terminal experience.
    Owner: @JamesNK
    Changes: #16718

  38. 🚀 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

  39. 📋 Show AppHost SDK version in aspire ps
    The aspire ps command 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

Bug fixes

  1. 📡 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

  2. 🔍 Fix aspire add hiding non-default channel integrations
    Restores implicit-channel discovery in aspire add so 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

  3. 🐛 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

  4. 🔍 Fix process inspection race during shutdown
    Fixed a Win32Exception on macOS where aspire stop --all would 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

  5. 🛑 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

  6. 🐛 Fix CLI template channel forwarding for identity-based channels
    Fixed a bug where running aspire new without an explicit --channel argument 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 resolving Aspire.ProjectTemplates from nuget.org instead of the channel-appropriate NuGet feed.
    Owner: @mitchdenny
    Changes: #17637
    Docs: microsoft/aspire.dev#1118

  7. 🐛 Fix aspire stop falsely reporting failure on Unix
    Fixed a race condition on Unix/Linux where aspire stop would 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

  8. 🐛 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

  9. 📌 Fix template version pinning in aspire new
    When using a channel flag with aspire 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

  10. 🔬 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

  11. 📦 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

  12. 🛑 Friendly error for 'aspire do --list-steps' without a step
    Running aspire do --list-steps without specifying a step argument now shows a clear, localized error message with examples (aspire do deploy --list-steps) instead of crashing with an unrelated InvalidOperationException. The step argument is required when using --list-steps.
    Owner: @mitchdenny
    Changes: #17543

  13. 🔐 Fix Aspire skills attestation build type
    Fixed aspire agent init --skills failing 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 by actions/attest-build-provenance@v3.
    Owner: @IEvangelist
    Changes: #17525

  14. 📦 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

  15. 📌 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

  16. 🚦 Fix aspire stop --all exit code when no app hosts are running
    aspire stop --all now returns exit code 0 (success) with an informational message when no app hosts are running, matching the behavior of interactive aspire stop. Previously, --all returned exit code 7 (FailedToFindProject) with an error, causing scripting failures in environments where no app hosts may be running.
    Owner: @JamesNK
    Changes: #17463

  17. 📡 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

  18. 🔒 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 on dotnet run to trigger first-run certificate generation. The DashboardServiceHost scheme resolution is also fixed to correctly default to HTTPS. Certificate generation can be disabled by setting ASPIRE_CLI_GENERATE_HTTPS_CERTIFICATE=false.
    Owner: @JamesNK
    Changes: #17454

  19. 🐛 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

  20. 🐛 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

  21. 🚨 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

  22. 🐛 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

  23. 📡 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

  24. 🔧 Fix aspire run MSBuild server timeout on Linux
    Fixed aspire run failing 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 sets DOTNET_CLI_USE_MSBUILD_SERVER, letting the .NET SDK manage MSBuild server behavior.
    Owner: @davidfowl
    Changes: #17313

  25. 🐛 Fix aspire add integration search on dogfood and local-hive CLIs
    Fixed aspire add and aspire integration list/search returning zero results when using dogfood or locally-built CLI builds. The root cause was that dotnet package search does 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

  26. 🐛 Fix PR-acquired CLI using mismatched packages for aspire new
    PR-acquired CLI instances now automatically use matching PR packages when running aspire new, preventing type load errors caused by mixed package versions from mismatched sources.
    Owner: @radical
    Changes: #17280

  27. 🩹 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

  28. 🔗 Fix aspire start in VS Code terminal
    Fixed aspire start launched 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

  29. 🔍 Fix config discovery for nested AppHost
    Fixed a bug where running aspire run from a parent directory would create a duplicate aspire.config.json instead of updating the existing config file nearest the AppHost.
    Owner: @adamint
    Changes: #17147

  30. 🔄 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

  31. ⏱️ 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

  32. 🛡️ Fix staging channel synthesis on non-stable CLI builds
    Daily, local, and PR CLI builds no longer silently resolve --channel staging to daily package versions. These builds now exit with a clear error message naming the running identity and pointing to recovery options (overrideStagingFeed config or installing a staging/stable CLI). Stable and staging-identity CLIs are unaffected.
    Owner: @mitchdenny
    Changes: #17235

  33. 🔊 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

  34. 📦 Fix staging CLI channel registration
    A CLI binary built with the staging channel identity now automatically registers the staging NuGet package source, ensuring commands like aspire new use the correct staging channel packages without requiring manual configuration.
    Owner: @radical
    Changes: #17155

  35. 🔌 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

  36. 🔧 Fix regressions in aspire update
    Multiple regressions in aspire update are 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

  37. 🔧 Fix Aspire skill description length for agent init
    Fixed an issue where aspire agent init would 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

  38. 🐛 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

  39. 🔧 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

  40. 🔌 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

  41. 🐛 Fix aspire new TypeScript starter on daily and staging channels
    Fixed aspire new failing to scaffold the aspire-ts-starter template on daily and staging CLI channels. The scaffolding service was requiring a stable Aspire.Hosting version, which does not exist on preview channels, causing the template creation to fail.
    Owner: @radical
    Changes: #17120

  42. 🔩 Fix aspire init on non-stable channels
    Fixed multiple aspire init failures 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

  43. 🐛 Fix NuGet feed error handling in aspire new
    Fixed aspire new not catching NuGetPackageCacheException, 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

  44. 📦 Fix NuGet integration restore in AppHost
    NuGet package-backed integrations are now loaded from a probe manifest instead of being copied into mutable .aspire/.../libs folders 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

  45. 🔧 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

  46. 🛑 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

  47. 💬 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

  48. 🔧 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

  49. 🗑️ 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

  50. 🔗 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

  51. 🌐 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

  52. 🐛 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

  53. 🔧 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

  54. 🌐 Fix aspire new empty AppHost language picker
    Fixed the language picker prompt in aspire new when creating an empty AppHost so that it correctly lists and applies the selected language.
    Owner: @maddymontaquila
    Changes: #16666

  55. 🔧 Fix --apphost directory resolution
    Fixed --apphost flag 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

📊 Dashboard

4 new features, 10 improvements, 11 bug fixes

New features

  1. ⏲️ 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

  2. ⏱️ 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

  3. 🤖 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

  4. ⏳ 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

Improvements

  1. 📋 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

  2. 🔍 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

  3. 🤖 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

  4. ⚡ 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

  5. 📭 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

  6. 🎛️ 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

  7. 📈 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

  8. 🔔 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

  9. 📋 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

  10. 🧹 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

Bug fixes

  1. 🔧 Fix Dashboard loading error with .NET 11 preview
    Updated blazor.web.js to 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

  2. 🔑 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

  3. 🔢 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

  4. 🏗️ 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

  5. 🔍 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

  6. 🐛 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

  7. 📐 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

  8. 🔍 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

  9. 🌐 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

  10. 🔲 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

  11. 🐞 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

🔧 Engineering

3 new features, 18 improvements, 7 bug fixes

New features

  1. 🔍 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

  2. 🛠️ 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

  3. ⏱️ 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

Improvements

  1. 🍺 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

  2. ⚡ 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

  3. 📦 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

  4. 🍺 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

  5. ⚙️ 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

  6. 📦 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

  7. 🧪 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

  8. 🚀 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

  9. 🔑 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

  10. 🛠️ 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

  11. 🎯 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

  12. 🔐 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

  13. 📝 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

  14. 🔥 Aspire skill hot reload guidance
    Added hot reload guidance to the Aspire agent skill, clarifying when AppHost-level changes require rerunning aspire 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

  15. 📋 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

  16. 🐳 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

  17. 🔄 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

  18. 📦 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

Bug fixes

  1. 🔨 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

  2. 🔩 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 blocked corepack yarn@1.22.22 from downloading Yarn due to network isolation, causing extension builds to fail. The fix invokes the configured yarn executable directly while preserving the frozen-lockfile restore path.
    Owner: @joperezr
    Changes: #17628

  3. 🔧 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

  4. 🔧 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 the Upload CLI Assets to GitHub Release job on NetCore1ESPool-Internal Windows agents where gh was not on PATH.
    Owner: @radical
    Changes: #17478

  5. 🐛 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

  6. 🚰 Fix release pipeline stage dependencies and asset download
    Fixed two release pipeline blockers: the GitHubTasks stage now correctly declares its dependency on PrepareArtifacts so 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

  7. 🔀 Fix CI changed-file detection to use three-dot diff
    The check-changed-files GitHub 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

🧩 Extensions

4 new features, 8 improvements, 5 bug fixes

New features

  1. 🐹 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

  2. 🏘️ 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

  3. ⌨️ 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 to aspire resource.
    Owner: @davidfowl
    Changes: #17187
    📝 Documentation required

  4. 🔭 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

Improvements

  1. 🌳 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

  2. 📋 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

  3. 📁 Prompt for new project location in VS Code
    When launching aspire new from 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

  4. 🏷️ 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

  5. 🧹 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

  6. 🐚 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

  7. 📡 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

  8. ⚙️ 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

Bug fixes

  1. 🔍 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

  2. 🩹 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

  3. 🐛 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

  4. 👁️ 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

  5. 🔔 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

🔌 Integrations

1 new feature, 3 improvements

New features

  1. 🦫 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

Improvements

  1. 🐰 Bump RabbitMQ default container image to 4.3
    The default RabbitMQ container image used by AddRabbitMQ has been updated from 4.2 to 4.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

  2. 🏗️ 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

  3. 📨 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

📄 Templates

2 bug fixes

Bug fixes

  1. 🔒 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

  2. 🐛 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

🧪 Testing

2 bug fixes

Bug fixes

  1. 🐛 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

  2. 🔒 Fix CreateHttpClient to prefer HTTPS endpoints
    CreateHttpClient and GetEndpointUriString in Aspire.Hosting.Testing now prefer the https endpoint over http when no endpoint name is specified, matching the https+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