Skip to content

13.5 Change log

github-actions[bot] edited this page Aug 18, 2026 · 163 revisions

Table of Contents

41 new features, 111 improvements, 133 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

14 new features, 34 improvements, 34 bug fixes

New features

  1. 🐳 TypeScript AppHosts support container file copying
    TypeScript (ATS) AppHosts can now export withContainerFiles to copy host files into container resources, with support for owner, group, and umask options. This brings TypeScript polyglot AppHosts to parity with C# AppHosts that use WithContainerFiles.
    Owner: @sebastienros
    Changes: #17877
    Docs: microsoft/aspire.dev#1204
    📝 Documentation required

  2. 💚 Custom health checks for TypeScript AppHosts
    TypeScript (ATS) AppHosts can now register custom health check callbacks using builder.addHealthCheck() and attach them to resources. Project resources also gain withEndpointsInEnvironment() to control which endpoints are injected into their environment variables.
    Owner: @sebastienros
    Changes: #17878
    Docs: microsoft/aspire.dev#1466
    📝 Documentation required

  3. 🔧 HTTP resource commands support user-defined arguments
    HTTP resource commands (WithHttpCommand) can now declare named arguments, allowing the Dashboard and CLI to prompt for input before invoking them. TypeScript AppHosts have full parity through ATS exports, and CLI callers can pass arguments with named options. The Foundry hosted-agent command now exposes a stable send-message command name.
    Owner: @davidfowl
    Changes: #17950
    📝 Documentation required

  4. 🌐 IInteractionService available in polyglot app hosts
    IInteractionService (prompts, message boxes, notifications, and dynamic inputs) is now available in polyglot app hosts written in TypeScript, Python, Go, Java, and Rust. Callback contexts such as IServiceProvider and builder overloads are also exposed to polyglot hosts, enabling feature parity with C# app hosts.
    Owner: @sebastienros
    Changes: #17959, #18059
    Docs: microsoft/aspire.dev#1347
    📝 Documentation required

  5. 🖥️ Interactive terminal sessions with WithTerminal()
    AppHost authors can now call WithTerminal() on a resource to enable interactive terminal sessions. The dashboard and CLI can attach to and detach from the session at will, enabling interactive use of REPLs, shells, and other terminal programs running as Aspire resources.
    Owner: @mitchdenny
    Changes: #17866
    Docs: microsoft/aspire.dev#1244, microsoft/aspire.dev#1329
    📝 Documentation required

  6. 🌐 Azure resource scope support
    Aspire now supports targeting Azure resources outside the default deployment resource group. You can reference existing resources across subscriptions, resource groups, or at subscription and tenant scope when modeling your Azure infrastructure.
    Owner: @davidfowl
    Changes: #17988
    📝 Documentation required

  7. 👁️ HiddenAnnotation and HiddenBehavior made public
    HiddenAnnotation and HiddenBehavior are now part of the public API, allowing callers to apply the same visibility annotation that Aspire uses internally to control whether a resource is hidden in the dashboard.
    Owner: @davidfowl
    Changes: #18370
    📝 Documentation required
    🌍 Community contribution by @@afscrome

  8. 🏷️ Custom Orleans provider type annotation
    Users can now explicitly specify the Orleans provider type for a resource using WithOrleansProviderType(). This is useful for drop-in replacements like Garnet for Redis, where Orleans cannot automatically derive the correct provider type from the resource name.
    Owner: @davidfowl
    Changes: #13630
    📝 Documentation required
    🌍 Community contribution by @@flensrocker

  9. ⏳ Progress dialog API for AppHost commands and IInteractionService
    A new PromptProgressAsync API on IInteractionService lets AppHost code display a non-dismissable progress dialog in the dashboard during long-running operations, with optional cancel support. CommandOptions also gains a CommandProgressOptions property so resource commands can automatically show a progress dialog while they execute. The API shape was refined before shipping so message stays the only required positional argument, with title moved into ProgressInteractionOptions (and the polyglot InteractionProgressOptions) for consistency across C#, TypeScript, Python, Java, Go, and Rust.
    Owner: @JamesNK
    Changes: #18493, #19424
    Docs: microsoft/aspire.dev#1347
    📝 Documentation required

  10. 💾 Kubernetes persistent volume first-class support
    A new KubernetesPersistentVolumeResource lets AppHost authors configure durable Kubernetes volumes in the app model and bind them to container or project workloads via WithPersistentVolume(). Includes YAML serializer fixes for PV/PVC/StatefulSet manifests that previously emitted invalid empty object blocks. Workloads bound with WithPersistentVolume() now also get a default pod security context (fsGroup: 2000, OnRootMismatch) so non-root containers can write to the mounted volume without manual configuration; the default can be overridden or removed via the existing PublishAsKubernetesService customization callback.
    Owner: @mitchdenny
    Changes: #16929, #19401
    Docs: microsoft/aspire.dev#1328, microsoft/aspire.dev#1450
    📝 Documentation required

  11. 💾 shm_size support for Docker Compose services
    Docker Compose services generated by Aspire now support the shm_size property. AppHost authors can set the shared memory size for a container service when publishing to Docker Compose.
    Owner: @mitchdenny
    Changes: #18646
    📝 Documentation required
    🌍 Community contribution by @@alirezafzali

  12. 📁 File upload support for Interaction Service
    A new File input type for IInteractionService lets AppHost commands display a file picker dialog in the dashboard and CLI, allowing users to select and upload files to the app host. Includes single and multiple file selection, configurable size limits, and full support for C# and TypeScript app hosts.
    Owner: @JamesNK
    Changes: #14882
    Docs: microsoft/aspire.dev#1347
    📝 Documentation required
    🌍 Community contribution by @@mcumming

  13. ⚙️ Run mode configuration for execution context
    Added RunConfiguration with a WatchEnabled property to DistributedApplicationExecutionContext, allowing app hosts to detect and respond to watch-mode runs and adjust resource launch behavior accordingly. This is part of the Project v2 work stream.
    Owner: @karolz-ms
    Changes: #18863
    Docs: microsoft/aspire.dev#1471
    📝 Documentation required

  14. 📌 Local tool manifest support for AppHost DNX invocation
    C# AppHost projects can now opt into DNX resolution that honors an in-scope .NET local tools manifest, letting a repository pin the Aspire CLI version in .config/dotnet-tools.json and have that version used when launching an AppHost through dotnet run.
    Owner: @DamianEdwards
    Changes: #19315
    📝 Documentation required

Improvements

  1. 🔌 Backchannel property compatibility improvements
    Preserves auxiliary backchannel backward compatibility while enabling rich JSON property values (numbers, booleans, arrays) for clients that advertise the new aux.v4 capability. The CLI now sends its client capabilities when using v2 resource snapshots.
    Owner: @adamint
    Changes: #17507

  2. 🌐 Blazor gateway Docker Compose publish support
    Adds Docker Compose publish support for the Blazor gateway and addresses various review feedback items including resource name attributes and improved OTLP warning placement.
    Owner: @davidfowl
    Changes: #17384
    📝 Documentation required
    🌍 Community contribution by @@javiercn

  3. ⚓ Helm v4.2.0+ version validation for Kubernetes deploy
    Aspire now validates that Helm v4.2.0 or later is installed before running Kubernetes deployments. Previously, missing or outdated Helm produced cryptic low-level errors; users now see a clear, actionable message.
    Owner: @mitchdenny
    Changes: #17491
    Docs: microsoft/aspire.dev#1090, microsoft/aspire.dev#1097
    📝 Documentation required

  4. ⚙️ Standardize resource service endpoint URL config name
    The resource service endpoint URL is now resolved using KnownConfigNames (ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL) with a legacy fallback to DOTNET_RESOURCE_SERVICE_ENDPOINT_URL, improving consistency with Aspire naming conventions.
    Owner: @JamesNK
    Changes: #17385

  5. 🎉 TypeScript/polyglot AppHost support is GA
    TypeScript/polyglot AppHost support is now generally available. The ASPIREATS001 experimental diagnostic has been removed, so projects no longer need to suppress it.
    Owner: @sebastienros
    Changes: #17600
    Docs: microsoft/aspire.dev#1230
    📝 Documentation required

  6. 🤖 Updated Foundry hosted agent builder APIs
    The Aspire.Hosting.Foundry hosted-agent builder APIs have been updated with a cleaner project-first API (AsHostedAgent). Publish-mode agents now attach the Foundry project reference to the correct deployment target resource, and Azure Container Registry is only added for publish/deploy scenarios.
    Owner: @tommasodotNET
    Changes: #17545, #17687
    Docs: microsoft/aspire.dev#1130
    📝 Documentation required

  7. 🌍 DevTunnel region configuration
    Added a Region property to DevTunnelOptions, allowing you to specify the region where the dev tunnel is created. The fully qualified tunnel ID now includes the region.
    Owner: @DamianEdwards
    Changes: #14112
    Docs: microsoft/aspire.dev#1468
    📝 Documentation required
    🌍 Community contribution by @@kola-tm

  8. ⏸️ Defer explicit-start resource configuration
    Session-scoped resources marked with WithExplicitStart() no longer run their execution configuration callbacks (arguments, environment variables, certificates) until the user manually starts them. Previously these callbacks ran at AppHost startup, which could prompt for user input prematurely.
    Owner: @danegsta
    Changes: #17825
    Docs: microsoft/aspire.dev#1194

  9. 🤖 Foundry Local integration updated to use foundry CLI
    The Foundry Local integration (RunAsFoundryLocal) now uses the installed foundry CLI for service lifecycle management instead of internal SDK APIs, ensuring compatibility with Foundry Local 1.1.0. The AppHost API is unchanged, but the foundry CLI must be installed and available on PATH.
    Owner: @sebastienros
    Changes: #17889
    Docs: microsoft/aspire.dev#1210
    📝 Documentation required

  10. 🩺 Friendly error messages for health check failures
    Health check failures now display concise, actionable error messages instead of raw exception stack traces, making it easier to diagnose why a resource health check is failing in the Dashboard.
    Owner: @davidfowl
    Changes: #14072

  11. ⚙️ WithProcessCommand supports named arguments and TypeScript callbacks
    WithProcessCommand now supports named arguments end-to-end, including process spec callbacks, result callbacks, CLI/backchannel invocation, and TypeScript/polyglot AppHosts, completing the argument-passing feature for process commands.
    Owner: @davidfowl
    Changes: #17968
    📝 Documentation required

  12. 🚫 PublishAsConnectionString marked obsolete
    The PublishAsConnectionString extension methods in Aspire.Hosting and Aspire.Hosting.Azure are now marked obsolete. This API only changes the manifest representation of a resource and can mislead callers into thinking it converts resources for all publishers. Callers should switch to AddConnectionString in publish-mode app model code.
    Owner: @davidfowl
    Changes: #18044
    Docs: microsoft/aspire.dev#1237
    ⚠️ Breaking change
    📝 Documentation required

  13. 🔄 ServiceProvider renamed to Services on context types
    The ServiceProvider property on all hosting context types is now marked obsolete and replaced with a new Services property, consistent with existing patterns like BeforeStartEvent.Services and DistributedApplication.Services. The old property still works but will generate a compiler warning.
    Owner: @JamesNK
    Changes: #18034
    ⚠️ Breaking change
    📝 Documentation required

  14. ✅ IInteractionService promoted to stable
    IInteractionService and all related interaction types (InteractionInput, InteractionInputCollection, InputType, InteractionOptions, and others) have been promoted from experimental to stable and no longer require suppressing the ASPIREINTERACTION001 diagnostic.
    Owner: @JamesNK
    Changes: #18032
    Docs: microsoft/aspire.dev#1347, microsoft/aspire.dev#1408
    📝 Documentation required

  15. 🔌 Consistent port allocation for proxyless endpoints
    Proxyless endpoints without explicit public ports now receive deterministic host port assignments during DCP service preparation. The allocator scans a configurable port range (default 10000–32767, overridable via ASPIRE_PROXYLESS_ENDPOINT_PORT_RANGE) and persists assigned ports for persistent resources in user secrets.
    Owner: @danegsta
    Changes: #17924
    Docs: microsoft/aspire.dev#1199
    ⚠️ Breaking change
    📝 Documentation required

  16. 📋 Custom database creation scripts log execution details
    When a custom database creation script is provided via WithCreationScript(), the resource logger now emits informational messages showing the script being executed and its outcome. This applies to SQL Server, PostgreSQL, MySQL, and Azure Kusto database resources.
    Owner: @mitchdenny
    Changes: #18138

  17. 🌌 Azure Cosmos DB vNext emulator GA alignment
    The Azure Cosmos DB Linux-based (vNext) emulator is now fully aligned with the GA vnext-latest image. RunAsPreviewEmulator() pulls mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest; the Data Explorer is now opt-in (call WithDataExplorer() to enable it instead of running unconditionally); and WithDataVolume() no longer sets the AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE variable for the vNext emulator since the GA image uses implicit /data volume persistence instead.
    Owner: @sebastienros
    Changes: #18158, #18161
    📝 Documentation required
    🌍 Community contribution by @@guanzhousongmicrosoft

  18. 🔍 Improved Azure provisioning diagnostics
    Azure provisioning failures now surface richer diagnostics with actionable recovery guidance in resource state and aspire deploy output. Errors such as unsupported regions, missing subscriptions, and invalid resource properties are normalized into provider-specific details with targeted remediation steps instead of generic ARM wrapper messages.
    Owner: @davidfowl
    Changes: #18132
    📝 Documentation required

  19. 🏷️ Resource property metadata moved to producers
    Resource producers such as projects, containers, executables, parameters, and .NET tools now supply their own property display metadata (labels, default visibility, and ordering) via the resource snapshot protocol. The dashboard uses this producer-supplied metadata instead of hardcoded per-resource-type lookups, enabling custom resources to control how their properties appear in the resource details panel.
    Owner: @davidfowl
    Changes: #18202
    📝 Documentation required

  20. 🔔 Smarter ignore for pre-release version update notifications
    When dismissing a version update notification for a pre-release (e.g. 13.5.0-preview1), Aspire now stores a wildcard pattern (13.5.0-*) that suppresses notifications for all subsequent pre-releases of the same version. The notification reappears when the stable release (13.5.0) becomes available.
    Owner: @JamesNK
    Changes: #18233

  21. ⚙️ AppHost projects default to CLI bundle
    C# AppHost projects now use the Aspire CLI bundle by default, without requiring AspireUseCliBundle=true in the project file. If the CLI bundle cannot be resolved, the build reports ASPIRE009 with install guidance. Users can opt out by setting false in their project file, which emits ASPIRE010.
    Owner: @DamianEdwards
    Changes: #18188
    ⚠️ Breaking change
    📝 Documentation required

  22. 🔐 Combined certificate and private key PEM file in TLS contexts
    HTTPS certificate contexts now include a combined certificate-with-key PEM file alongside the separate certificate and key files, making it easier for containers and executables to consume TLS credentials without concatenating them manually.
    Owner: @danegsta
    Changes: #18216
    🌍 Community contribution by @@aradalvand

  23. 📋 Third-party dashboard log filtering
    Dashboard logs forwarded to the AppHost console are now split into two categories: Aspire's own dashboard logs (e.g., icon resolution warnings) appear at Warning+ severity, while third-party library logs (e.g., Kestrel, ASP.NET Core) are filtered to Error+ only. A single log filter on the ThirdParty prefix silences all background library noise.
    Owner: @JamesNK
    Changes: #18390

  24. 🔄 Improved Azure provisioning recovery commands
    Azure provisioning recovery is now more actionable. A new cancel-azure-operation resource command cancels in-flight Azure operations from the CLI or dashboard, while reprovision and delete-azure-resource are highlighted as recovery actions with clearer state tracking (Starting, Deleting, Canceling). Key Vault soft-delete tombstones are automatically purged during reprovision, and ARM deployment state is reconciled from Azure on AppHost restart.
    Owner: @davidfowl
    Changes: #18269
    📝 Documentation required

  25. 🔑 HTTPS certificate support for project resources
    ASP.NET project resources can now use Aspire HTTPS certificate configuration without needing their own Kestrel certificate mapping. When a project resource has a TLS endpoint and an HTTPS certificate is configured, the generated PFX path and password are automatically mapped to Kestrel's default certificate environment variables.
    Owner: @danegsta
    Changes: #18481
    📝 Documentation required

  26. 🐞 Improved Go Delve debugger attach workflow
    Go resources now default to multi-client Delve mode, so the debugger session persists when a debugger detaches instead of exiting. Typed options for common Delve server flags (including --continue for services that should start running immediately under Delve) are exposed via GoDelveServerAnnotation for C# AppHost configuration.
    Owner: @davidfowl
    Changes: #18611
    Docs: microsoft/aspire.dev#1449
    📝 Documentation required
    🌍 Community contribution by @@air-hand

  27. 🔄 Updated Foundry hosted agent protocol payload
    The Foundry hosted agent deployment protocol payload was updated to the latest Foundry API shape, with protocol_versions and container image placed under container_configuration.image. Backward compatibility is preserved: the existing asHostedAgent polyglot signature retains Responses protocol 2.0.0 defaults, while a new asHostedAgentWithProtocol form supports explicit protocol selection.
    Owner: @tommasodotNET
    Changes: #18692, #18980
    Docs: microsoft/aspire.dev#1475
    📝 Documentation required

  28. 🐞 Debugging support for DotnetProjectResource
    Applications using the experimental DotnetProjectResource can now be debugged. A new SupportsDebuggingAnnotation is introduced in Aspire.Hosting so resource types can declare debugging support, and the VS Code extension wires this up to enable attaching a debugger to DotnetProjectResource workloads.
    Owner: @karolz-ms
    Changes: #18729
    📝 Documentation required

  29. 🔒 Terminal implementation types made internal
    The experimental terminal implementation types TerminalAnnotation, TerminalHostResource, and TerminalHostLayout are no longer part of the public API. Terminal configuration remains available through WithTerminal() and TerminalOptions, which carry the ASPIRETERMINAL001 experimental diagnostic.
    Owner: @sebastienros
    Changes: #18978
    ⚠️ Breaking change
    📝 Documentation required

  30. 🖥️ TerminalOptions breaking changes and validation improvements
    The misleading TerminalOptions.Shell property (which never had any effect) has been removed from the public API. Additionally, TerminalOptions.Columns and TerminalOptions.Rows now validate that values are positive at AppHost model construction time, preventing silent errors at runtime.
    Owner: @mitchdenny
    Changes: #18991, #18992
    Docs: microsoft/aspire.dev#1478, microsoft/aspire.dev#1479
    ⚠️ Breaking change
    📝 Documentation required

  31. 🔓 Language hosting packages decoupled from Aspire.Hosting internals
    Language packages (Dotnet, Go, Python, JavaScript) are now fully decoupled from Aspire.Hosting internals, with InternalsVisibleTo dependencies removed. This enables independent evolution of language packages and opens the door for third-party language support in Aspire.
    Owner: @karolz-ms
    Changes: #18918
    📝 Documentation required

  32. 🔀 Flexible CLI invocation mode with DNX fallback for AppHosts
    AspireUseCliBundle is now opt-in (false by default again), and a new AspireCliInvocationMode=Dnx MSBuild property lets AppHosts force CLI resolution via DNX, which restores and executes the exact Aspire CLI version paired with the AppHost SDK. When opt-in is enabled, the CLI is resolved in order: explicit AspireCliPath, forced DNX, aspire on PATH, then dnx on PATH.
    Owner: @DamianEdwards
    Changes: #18850
    📝 Documentation required

  33. 🔗 Surfaced ASPIRE010 help link inline in warning text
    The ASPIRE010 MSBuild warning now includes its documentation link directly in the console-visible warning text, since MSBuild's HelpLink metadata isn't rendered in terminal output.
    Owner: @joperezr
    Changes: #19415

  34. 🚫 Actionable error when publishing DotnetProjectResource
    Publishing a DotnetProjectResource, which doesn't yet support publish, now surfaces an actionable error instead of silently failing.
    Owner: @karolz-ms
    Changes: #19399

Bug fixes

  1. 🌐 Fix aspire run with .dev.localhost resource service URLs
    Fixed aspire run failing for polyglot AppHosts that use *.dev.localhost URLs. The resource service endpoint validation now accepts localhost subdomains in addition to loopback IPs.
    Owner: @danegsta
    Changes: #17639

  2. 🔓 Fix TypeScript AppHost async callback deadlock
    Fixed a deadlock in TypeScript AppHosts where async callbacks stored in IOptions.Configure were invoked on the StreamJsonRpc non-concurrent dispatcher during BeforeStartEvent, causing the AppHost to hang.
    Owner: @IEvangelist
    Changes: #17575

  3. 🔗 Fix proxyless endpoint on-demand allocation
    Fixed failures when proxyless container endpoint references were accessed before container creation. Endpoint allocation now uses dependency analysis to distinguish circular or unsafe references from safe lazy ones, so only truly unsafe references trigger early fallback allocation.
    Owner: @danegsta
    Changes: #17851, #17879

  4. 🔧 Fix WithBrowserLogs() startup timeout
    Fixed a startup reliability issue with WithBrowserLogs() where tracked browser sessions could fail with Browser debug pipe closed errors even when the browser eventually became responsive. The CDP startup command timeout has been increased to accommodate slower browser starts.
    Owner: @maddymontaquila
    Changes: #18091

  5. 🔄 DCP reconnection included in request retry loop
    Reconnecting to the DCP API server is now part of the DCP request retry loop, protecting against timing issues with missing or partially written DCP kubeconfig files on startup.
    Owner: @karolz-ms
    Changes: #18121

  6. 🐛 Fix addParameter error for invalid option combination
    Fixed misleading error classification in TypeScript AppHost when addParameter() is called with both secret: true and publishValueAsDefault: true. The invalid option combination now correctly surfaces an INVALID_ARGUMENT error with a clear diagnostic message instead of a confusing TYPE_MISMATCH capability error.
    Owner: @ellahathaway
    Changes: #18024

  7. 🐛 Fix Foundry hosted agent deployment with explicit target port
    Fixed a deployment failure when Foundry hosted agents were configured with an explicit targetPort (e.g., .WithHttpEndpoint(targetPort: 9000).AsHostedAgent(...)). The publish path no longer attempts to emit unsupported TargetPort endpoint metadata for Foundry deployment targets.
    Owner: @tommasodotNET
    Changes: #17903

  8. 🔒 Secret parameter values redacted in backchannel snapshots
    Secret parameter values marked with secret: true were exposed in plaintext through the backchannel API (used by aspire describe and MCP resource tools) when consumed via WithEnvironment. The AppHost now redacts these values before snapshots leave the host, covering all backchannel consumers.
    Owner: @mitchdenny
    Changes: #18089
    🌍 Community contribution by @@shauryalowkeygotaura

  9. 🔧 Fix ASPIREEXPORT001 false positive with C# 14 extension blocks
    The ASPIREEXPORT001 analyzer no longer incorrectly flags [AspireExport]-decorated methods declared inside C# 14 extension blocks as non-static. Developers can now use C# 14 extension block syntax when defining TypeScript AppHost exports without spurious analyzer warnings.
    Owner: @sebastienros
    Changes: #18292

  10. 🔒 Thread-safe ResourceAnnotationCollection
    ResourceAnnotationCollection is now thread-safe, preventing race conditions when pipeline steps concurrently read and write annotations during publish and deploy operations. Reads are lock-free via snapshot enumeration, while writes are lock-protected.
    Owner: @JamesNK
    Changes: #18259

  11. 🐛 Fix terminal resources not connecting in IDE debug sessions
    Resources configured with WithTerminal() now always run as a plain process rather than through the IDE debugger, ensuring their terminal sessions connect correctly when debugging. Previously, IDE debug sessions would route terminal-attached resources through IDE execution, which bypasses the PTY bridging required for terminal attachment.
    Owner: @mitchdenny
    Changes: #18308

  12. 🔌 Fix port collision when running multiple isolated AppHost instances
    When running multiple AppHost instances with --isolated, each instance now binds its resource service endpoint to a random OS-assigned port instead of the fixed port from the launch profile. This prevents 'address already in use' errors when starting a second --isolated instance on the same machine.
    Owner: @JamesNK
    Changes: #18332

  13. 🔗 Fix polyglot codegen binding failure on CLI/SDK version skew
    Polyglot AppHost code generation (TypeScript, Python, Java, Go, Rust) now succeeds reliably when the Aspire CLI and AppHost SDK are built at different times. The fix freezes the strong-name AssemblyVersion of Aspire.TypeSystem at a stable baseline so the cross-ALC type identity contract is always satisfied regardless of version skew.
    Owner: @sebastienros
    Changes: #18386

  14. 🔐 Fix user secrets escaping for special characters
    Special characters like & and + in parameter values were incorrectly escaped as Unicode sequences (\u0026, \u002B) when written to user secrets files, corrupting passwords and tokens. Values are now preserved verbatim.
    Owner: @JamesNK
    Changes: #18431

  15. 🐛 Fix AzurePromptAgentResource startup crash in run mode
    Fixes a runtime crash (InvalidOperationException) when running apps that use AzurePromptAgentResource in run mode. The resource's pipeline step dependency was referencing a provisioning step that was removed earlier in the milestone, causing startup to fail.
    Owner: @JamesNK
    Changes: #18496

  16. 🗝️ Fix Key Vault soft-delete conflict during Azure reprovisioning
    When a Key Vault is soft-deleted, Aspire now correctly includes implicit Key Vault children (such as those created for PostgreSQL password authentication) during parent resource reprovision, avoiding ARM deleted-state conflicts and surfacing clearer diagnostics.
    Owner: @davidfowl
    Changes: #18465
    📝 Documentation required

  17. 📋 Logs flushed before terminal resource state notifications
    When a container or executable resource fails rapidly at startup, its stdout/stderr logs are now flushed to host loggers before the terminal state is reported. This ensures that DistributedApplicationTestingBuilder tests capture failure logs when using WaitForResourceAsync.
    Owner: @davidfowl
    Changes: #18539
    Docs: microsoft/aspire.dev#1435

  18. 🔧 Fix Kubernetes GetEndpoint using targetPort instead of service port
    Fixed a bug where GetEndpoint() on a Kubernetes-published resource with distinct port and targetPort (e.g., WithHttpEndpoint(port: 9002, targetPort: 9000)) returned a URL built from the container targetPort instead of the exposed service port. Ingress and Gateway route rules are also corrected to use the service port.
    Owner: @davidfowl
    Changes: #18630

  19. 🐛 Fix false-positive node/npm required-command banners for Bun apps
    Fixed false-positive "Required command 'node'/'npm' was not found on PATH" dashboard banners when using AddViteApp().WithBun() or other Bun-based JavaScript apps. Bun handles both install and run, so the node/npm requirements added by the default toolchain are now correctly removed when WithBun() is applied.
    Owner: @davidfowl
    Changes: #18631

  20. 🔗 External service URIs accept paths without trailing slash
    External service resources and WithReference(Uri) now accept URIs whose absolute path does not end with a slash. Previously, valid references like https://tempuri.org/data.xml were incorrectly rejected.
    Owner: @karolz-ms
    Changes: #18745
    🌍 Community contribution by @@afscrome

  21. 🕒 Fixed DCP monitor timestamp serialization
    Container and executable resources with parent-process lifetime could fail to start on Linux because DCP rejected boot-relative monitor timestamps that didn't match the six-digit MicroTime format it requires. Monitor timestamps are now always serialized with fixed-width fractional seconds.
    Owner: @danegsta
    Changes: #18798

  22. 🔐 Fixed Vite HTTPS config wrapper path in hoisted node_modules
    The generated Vite HTTPS config wrapper is now written under the app's nearest node_modules directory instead of node_modules/.bin, fixing failures in Yarn or npm workspace monorepos where dependencies are hoisted and .bin may not exist.
    Owner: @danegsta
    Changes: #15857

  23. 🔧 Fix disabled argument validation for interactive resource commands
    Interactive resource commands with disabled dynamic inputs no longer fail with "Argument is disabled." when arguments are accepted via an interactive prompt.
    Owner: @JamesNK
    Changes: #18889

  24. 🐛 Fix resource wait skipping for custom resources
    Fixed a bug where the wait behavior for custom resources was sometimes skipped entirely, allowing resources to start before their dependencies were ready.
    Owner: @karolz-ms
    Changes: #18930

  25. ⏱️ No timeout on long-running HTTP commands
    HTTP resource commands no longer fail after 100 seconds due to the default HttpClient timeout. Commands invoked without a named HTTP client now run until they complete or the command cancellation token is cancelled.
    Owner: @JamesNK
    Changes: #18986
    Docs: microsoft/aspire.dev#1515

  26. 🔁 Fix duplicate resource update notifications
    Fixed the app model repeatedly emitting object update notifications for resources that hadn't actually changed, reducing unnecessary churn in resource state processing.
    Owner: @karolz-ms
    Changes: #18952

  27. 👻 Fix ghost dev tunnel conflicts
    Dev tunnel startup no longer gets stuck retrying a create/update sequence when the tunnel service has a ghost record for a deterministic tunnel ID. Aspire now stops after one attempt and reports an actionable error telling you how to select a fresh explicit tunnel ID.
    Owner: @DamianEdwards
    Changes: #18912
    🌍 Community contribution by @@krubenok

  28. 🌍 Fix DevTunnelRegion member naming
    Renamed DevTunnelRegion.UkSouth to UKSouth and SouthEastAsia to SoutheastAsia to align with .NET naming conventions, and removed the explicit byte underlying type. Update any code referencing the old member names.
    Owner: @sebastienros
    Changes: #19060
    ⚠️ Breaking change
    📝 Documentation required

  29. 🚫 Fix progress command cancellation handling
    Canceling a dashboard progress command now stays a cancellation all the way through IInteractionService and resource command execution, instead of surfacing as a success or failure. This applies to every command using CommandProgressOptions, including WithHttpCommand and Foundry prompt-agent send-message commands.
    Owner: @JamesNK
    Changes: #18600

  30. 🔄 Fix missed updates for recreated resources during local run
    Local runs now correctly recognize DCP resources that were deleted and recreated while the watch connection was disconnected, so late console-log subscribers keep receiving logs for the replacement resource instead of missing updates. A follow-up fix further improves handling of log deduplication for recreated resources.
    Owner: @karolz-ms
    Changes: #19199, #19240

  31. 🐛 Separate regular arguments from launch tool ("entrypoint") arguments
    Fixed WithDebugSupport's argsCallback incorrectly subtracting the tool entrypoint (e.g. go run , python -m ) via an ordinary WithArgs callback, which only worked when registered in a specific order and left the app model IDE-only. Regular arguments are now separated from launch tool (entrypoint) arguments.
    Owner: @karolz-ms
    Changes: #19234
    Docs: microsoft/aspire.dev#1458
    📝 Documentation required

  32. 🔌 Fix persistent resources using port 0 (auto-allocated)
    Fixed persistent resources configured with port 0 (meaning "automatically allocate a port") being incorrectly treated as if a specific port had been prescribed by the app host code, which could prevent proper port allocation.
    Owner: @karolz-ms
    Changes: #19218

  33. ⏱️ Fixed hang when waiting on a nonexistent resource
    WaitForResourceHealthyAsync with WaitBehavior.StopOnResourceUnavailable now fails immediately when the named resource is missing from the application model, instead of hanging indefinitely waiting for events that would never arrive.
    Owner: @mitchdenny
    Changes: #19260
    🌍 Community contribution by @@rsd-darshan

  34. 🚀 Fixed custom IDE project launch argument handling
    Fixed a regression where custom IDE project launches (e.g., Azure Functions) combining launch-profile arguments with AppHost arguments received an invalid -- separator meant only for dotnet run/dotnet watch, producing malformed commands. Custom launchers now receive their arguments directly, and Aspire no longer attempts an invalid Process fallback when no runnable process invocation was prepared.
    Owner: @karolz-ms
    Changes: #19348

💻 CLI

6 new features, 33 improvements, 37 bug fixes

New features

  1. 📦 Embedded Aspire skills bundle fallback
    The Aspire skills bundle is now embedded in the CLI as a reliable fallback. When GitHub release asset acquisition is unavailable, the CLI uses the embedded bundle and shows a non-fatal warning instead of failing the entire command.
    Owner: @IEvangelist
    Changes: #17537, #17547
    Docs: microsoft/aspire.dev#1137
    📝 Documentation required

  2. 📦 Aspire CLI available via npm
    The Aspire CLI is now available as an npm package (@microsoft/aspire-cli), providing an alternative installation method. The npm package README includes install, verify, update, and troubleshooting guidance, a postinstall check warns when the matching native platform package is missing, and the README now also includes a link to the official CLI release notes.
    Owner: @adamint
    Changes: #17297, #18455, #18606
    Docs: microsoft/aspire.dev#1239, microsoft/aspire.dev#1243, microsoft/aspire.dev#1252
    📝 Documentation required

  3. 🐧 Aspire CLI available via Nix
    NixOS and Nix users can now install and run the official Aspire CLI directly from the first-party Nix flake without building from source. Use nix run github:microsoft/aspire#aspire-cli to run the CLI, or add it to a dev shell via the flake's package output or overlay.
    Owner: @davidfowl
    Changes: #18410
    Docs: microsoft/aspire.dev#1286
    📝 Documentation required

  4. 🔄 aspire update --migrate for TypeScript AppHost format
    The aspire update command now supports a --migrate flag that detects and automatically upgrades legacy apphost.ts TypeScript AppHosts to the newer apphost.mts format. A warning is shown when running other CLI commands against an unmigrated project. The migration system is pluggable so future format migrations can be added without new commands.
    Owner: @sebastienros
    Changes: #18294
    📝 Documentation required

  5. 🔭 AI agent skill-usage telemetry
    Running aspire agent init now installs telemetry hook scripts that record AI skill and MCP tool usage through the CLI telemetry pipeline. Opt out at any time by setting the ASPIRE_CLI_TELEMETRY_OPTOUT environment variable.
    Owner: @IEvangelist
    Changes: #18009
    Docs: microsoft/aspire.dev#1229
    📝 Documentation required

  6. 🧹 aspire stop --force cleans up persistent resources
    The new aspire stop --force command cleans up persistent DCP resources for an AppHost without relaunching it, letting developers fully tear down all persistent container resources in a single step.
    Owner: @danegsta
    Changes: #18718
    Docs: microsoft/aspire.dev#1387
    📝 Documentation required

Improvements

  1. 🎨 Improved aspire agent init install output
    The aspire agent init command now collects updated skill/location pairs and prints one compact summary instead of repeating a success line for every skill at every install target.
    Owner: @IEvangelist
    Changes: #17519

  2. 🔍 Enriched AppHost codegen TypeLoadException diagnostics
    When AppHost code generation fails due to a TypeLoadException (typically caused by a version mismatch between the CLI and the user project), the CLI now provides enriched diagnostic output to help identify the cause.
    Owner: @IEvangelist
    Changes: #17262
    Docs: microsoft/aspire.dev#1101, microsoft/aspire.dev#1103
    📝 Documentation required

  3. 🔎 Updated --search option help text
    The --search option in aspire logs and telemetry commands now includes a link to aka.ms/aspire/cli-search and clarifies support for both full-text search and field filters.
    Owner: @JamesNK
    Changes: #17544
    Docs: microsoft/aspire.dev#948, microsoft/aspire.dev#1081, microsoft/aspire.dev#1121

  4. 🗑️ aspire ps --resources flag removed
    The --resources flag (and --include-hidden) has been removed from aspire ps, which now focuses on AppHost-level summaries. Use aspire describe to stream detailed resource data.
    Owner: @mitchdenny
    Changes: #17479
    Docs: microsoft/aspire.dev#1155, microsoft/aspire.dev#1166
    ⚠️ Breaking change
    📝 Documentation required

  5. 📚 Aspire skills catalog loaded from bundle manifest
    The aspire agent init skill catalog is now loaded dynamically from the bundle manifest instead of being hardcoded to three skills. All skills published in the microsoft/aspire-skills bundle are now discoverable by the CLI.
    Owner: @IEvangelist
    Changes: #17553
    Docs: microsoft/aspire.dev#1077
    📝 Documentation required

  6. 🔀 dotnet run delegates to aspire run for bundled AppHosts
    When AspireUseCliBundle is enabled, running dotnet run on an AppHost project automatically delegates to aspire run, using bundled CLI behavior consistently. Requires Aspire CLI 13.5 or later; dotnet run falls back to normal behavior when the CLI is older or unavailable.
    Owner: @davidfowl
    Changes: #17748, #18360
    📝 Documentation required

  7. 🤖 CLI detects coding agent environment in telemetry
    The Aspire CLI now detects known coding agent environments (such as GitHub Copilot, Cursor, and others) and records the detected agent name in CLI telemetry. This helps the team understand usage patterns when the CLI is invoked from AI-assisted workflows.
    Owner: @DamianEdwards
    Changes: #18065, #18094
    Docs: microsoft/aspire.dev#1242

  8. ⚡ Faster TypeScript AppHost startup
    TypeScript AppHost startup no longer waits a fixed delay before the CLI attempts to connect. The CLI now races the RPC connection retry loop against process exit, reducing the time from aspire run to an active AppHost.
    Owner: @davidfowl
    Changes: #18075

  9. 🛠️ Actionable AppHost/CLI version mismatch errors
    Version mismatch errors between the AppHost and CLI now specify which side is out of date and include the exact update command to run, replacing the previous generic incompatibility message. The error display was also updated to use an aligned grid with consistent lowercase labels for better readability.
    Owner: @JamesNK
    Changes: #18067, #18139
    🌍 Community contribution by @@shauryalowkeygotaura

  10. 🚫 Resources excluded from MCP tools by ExcludeFromMcp property
    Resources marked with the ExcludeFromMcp property are now filtered from all CLI MCP tool results, including resource listings, console logs, structured logs, traces, and command execution.
    Owner: @JamesNK
    Changes: #18106
    📝 Documentation required

  11. 🛠️ --skills and --skill-locations flags for init and new commands
    The aspire init, aspire new, and aspire agent init commands now accept --skills and --skill-locations flags to control which agent skills are installed during initialization. These flags support non-interactive mode, allowing use in scripts and CI environments without interactive prompts.
    Owner: @JamesNK
    Changes: #18191, #18192
    Docs: microsoft/aspire.dev#1348
    📝 Documentation required
    🌍 Community contribution by @@nanookclaw

  12. 🧹 No nuget.config generated for stable channel projects
    When creating or updating projects using aspire new or aspire update with the stable channel, a project-level nuget.config is no longer generated since it only maps to nuget.org (the default NuGet source). Existing nuget.config files are still cleaned up to remove stale feed entries.
    Owner: @JamesNK
    Changes: #18211
    📝 Documentation required

  13. ✅ Strict SemVer validation for Playwright CLI version override
    Specifying an invalid version string (such as a range like >=1.0.0, a dist-tag like 'latest', or a non-strict SemVer string) for the Playwright CLI version override configuration now fails with a clear, actionable error message instead of a confusing npm resolve failure.
    Owner: @mitchdenny
    Changes: #18225

  14. 🩺 aspire doctor detects legacy settings files
    The aspire doctor command now detects workspaces that have a legacy .aspire/settings.json without a sibling aspire.config.json. When found, it surfaces a warning hint directing users to run aspire init (or any aspire run/add/update command) to trigger automatic migration to the current configuration format.
    Owner: @ellahathaway
    Changes: #17934

  15. 🏷️ Runtime CLI identity resolution
    The Aspire CLI's channel, version, and commit identity is now resolved at runtime rather than baked into the binary at build time. Identity can be overridden via environment variables (ASPIRE_CLI_CHANNEL, ASPIRE_CLI_VERSION, ASPIRE_CLI_COMMIT, ASPIRE_CLI_NUGET_SERVICE_INDEX, ASPIRE_CLI_PACKAGES) or an .aspire-install.json sidecar file, enabling accurate staging and stable behavior testing in pre-release environments.
    Owner: @mitchdenny
    Changes: #18087
    📝 Documentation required

  16. 🖥️ OS information in aspire doctor
    The aspire doctor command now reports the current operating system, including the OS version and, on Linux, the distro name from /etc/os-release. This information appears in both human-readable and structured JSON (--format json) output.
    Owner: @danegsta
    Changes: #18252
    Docs: microsoft/aspire.dev#1267
    📝 Documentation required

  17. 🔍 Improved docs search relevance
    The aspire docs search command now returns significantly more accurate results by normalizing query and document text consistently, applying inverse document frequency weighting, and rewarding phrase matches in titles, headings, and summaries over incidental body mentions. Benchmarks showed Top 1 accuracy improving from 31.5% to 86.5% on real aspire.dev content.
    Owner: @davidfowl
    Changes: #18074

  18. 🔗 DCP connection health check in aspire doctor
    The aspire doctor command now validates connectivity to the bundled Developer Control Plane (DCP), catching HTTPS trust problems—such as untrusted or expired certificates—before an AppHost is involved. The check covers both DCP-managed ephemeral certificate mode and ASP.NET Core developer certificate mode.
    Owner: @danegsta
    Changes: #18255

  19. 🖼️ Aspire CLI displays application icon on Windows
    The aspire.exe and aspire-managed.exe processes now display the Aspire application icon in Windows Task Manager, File Explorer, and other shell surfaces.
    Owner: @JamesNK
    Changes: #18303

  20. 🔤 Clear error for miscased CLI options
    The Aspire CLI now detects when a command option is typed with the wrong case (e.g., --AppHost instead of --apphost) and returns a clear error with the correct spelling, rather than silently ignoring the option.
    Owner: @JamesNK
    Changes: #18393

  21. 🛑 Unified graceful shutdown for aspire run
    The aspire run command now uses a unified graceful shutdown sequence for all AppHost types (C# and TypeScript/JavaScript). On Windows, child processes are launched in an isolated console with proper Ctrl+C propagation to avoid signal inheritance issues with wrapper processes like tsx and npm. This makes shutdown reliable and consistent with aspire start/aspire stop on all platforms.
    Owner: @danegsta
    Changes: #17814
    Docs: microsoft/aspire.dev#1291
    📝 Documentation required

  22. ⚡ Faster AppHost discovery in large repositories
    AppHost discovery (used by aspire ls, aspire run, and other commands) is significantly faster in large repositories. A lightweight XML pre-filter now skips full MSBuild evaluation for projects that clearly are not AppHosts, reducing cold discovery time. The pre-filter also correctly recognizes ancestor Directory.Build.* files, SDK-style imports, and MSBuild walk-up imports as AppHost markers.
    Owner: @ellahathaway
    Changes: #18436, #18555

  23. ⚡ CLI telemetry tag calculation no longer blocks startup
    Default telemetry tags (machine ID, OS info, version, identity) are now computed asynchronously in the background rather than blocking CLI startup. Tags are applied to telemetry spans at export time, improving how quickly the CLI becomes responsive after launch.
    Owner: @JamesNK
    Changes: #18454

  24. 🔍 aspire add filters to polyglot-compatible integrations
    aspire add and aspire integration list/search now filter results to show only integrations compatible with the active AppHost language. Polyglot AppHost users (TypeScript, Python, Go, Java, Rust) no longer see C#-only packages they cannot wire up.
    Owner: @sebastienros
    Changes: #18293
    Docs: microsoft/aspire.dev#1457
    📝 Documentation required

  25. 💬 Clearer AppHost backchannel connection error messages
    When the AppHost process exits before the CLI can establish a backchannel connection, the error message now includes the exit code and uses clearer wording, removing the previously redundant phrasing. This makes it easier to diagnose AppHost startup failures.
    Owner: @JamesNK
    Changes: #18051
    🌍 Community contribution by @@mehara-rothila

  26. 🔒 Linux certificate cleanup handles missing NSS tools gracefully
    On Linux, aspire certs clean now completes successfully even when certutil is unavailable, treating NSS database cleanup as best-effort rather than a hard failure. aspire doctor also reports a warning when certutil is missing, suggesting installation of the distribution's NSS tools package (e.g., libnss3-tools) for full browser certificate trust.
    Owner: @danegsta
    Changes: #18580
    Docs: microsoft/aspire.dev#1436

  27. 🩺 aspire doctor recommends VS Code extension
    The aspire doctor command now detects when VS Code is present but the Aspire VS Code extension is not installed, and surfaces a warning with a Marketplace link. When the extension is already installed it reports a pass; when VS Code is not detected at all the check stays silent.
    Owner: @ellahathaway
    Changes: #18624
    Docs: microsoft/aspire.dev#1440
    📝 Documentation required

  28. 🔄 dotnet-inspect AI skill stays current across releases
    The dotnet-inspect skill bundled with the Aspire CLI is now a thin bootstrapper that delegates to the installed tool's own skill guide. AI-assisted inspection guidance is always current and reflects the installed dotnet-inspect version rather than being frozen at the CLI release.
    Owner: @JamesNK
    Changes: #18723
    🌍 Community contribution by @@richlander

  29. 🔒 Improved Linux dev certificate trust handling
    On Linux, Aspire now preserves system certificate roots when configuring SSL_CERT_DIR for local project and executable resources. Previously, Aspire could overwrite SSL_CERT_DIR with only its own generated certificate directory, causing outbound HTTPS requests to fail by losing OpenSSL's implicit system trust anchors.
    Owner: @danegsta
    Changes: #18851
    Docs: microsoft/aspire.dev#1446

  30. ⏱️ Timeouts for aspire doctor checks
    aspire doctor now bounds each environment check to 30 seconds and the entire check aggregate to 2 minutes. Previously a blocked check or installation discovery could cause the command to hang indefinitely.
    Owner: @JamesNK
    Changes: #18969
    Docs: microsoft/aspire.dev#1472

  31. ⚡ CLI package metadata prefetching made opt-in
    CLI commands no longer prefetch NuGet package metadata by default. Prefetching is now opt-in for commands that actually need it, reducing unnecessary network requests and improving startup time for commands that do not consume package metadata.
    Owner: @JamesNK
    Changes: #18968

  32. ⏳ Show bundle preparation status in aspire dashboard run
    When aspire dashboard run takes longer than 200 ms to prepare or extract the dashboard bundle, the CLI now displays a Preparing dashboard bits... status message instead of appearing idle.
    Owner: @JamesNK
    Changes: #18985

  33. 🔒 Aspire Skills bundle integrity checks use SHA-512
    The Aspire Skills bundle's archive integrity checks now use SHA-512, aligning it with the digest already used by the CLI acquisition scripts. The experimental remote-fetch preview toggle is also hidden from aspire config output and generated VS Code schemas.
    Owner: @IEvangelist
    Changes: #19448

Bug fixes

  1. 🔒 Fix Aspire skills attestation verification
    Fixed a bug where aspire agent init failed to install the Aspire skills bundle because the attestation verifier used a stale SLSA build type URL. The verifier now accepts the current GitHub Actions build type URL.
    Owner: @IEvangelist
    Changes: #17521

  2. 💬 Friendly error for aspire do --list-steps without a step
    Running aspire do --list-steps without specifying a step now gives a clear validation error instead of launching the AppHost and crashing with an obscure exception.
    Owner: @mitchdenny
    Changes: #17535
    Docs: microsoft/aspire.dev#1091
    📝 Documentation required

  3. 🐛 Fix aspire stop false failure on Unix
    Fixed a bug where aspire stop falsely reported failure on Unix because the AppHost process was orphaned during the shutdown cascade instead of being properly reaped.
    Owner: @danegsta
    Changes: #17612

  4. 🛑 Fix CLI Ctrl+C/SIGTERM shutdown responsiveness
    Multiple CLI shutdown improvements: fixed Ctrl+C responsiveness during AppHost startup, fixed a double-signal bug causing immediate force-kill, and added an immediate "Stopping Aspire..." message after 200ms when shutdown is in progress.
    Owner: @JamesNK
    Changes: #17588, #17652
    Docs: microsoft/aspire.dev#1353

  5. 🔧 Fix localhive.sh CLI install with subdirectories
    Fixed localhive.sh CLI installation failing when the publish output contains subdirectories such as culture-specific resource folders. The script now uses cp -r to correctly copy all files and directories.
    Owner: @sebastienros
    Changes: #17670
    Docs: microsoft/aspire.dev#1128

  6. 📋 Fix aspire ls discovery and settings bugs
    Fixed five bugs in aspire ls related to the settings discovery pipeline: settings.json compatibility, aspire.config.json handling, parallel discovery races, macOS symlink resolution, and discovery path normalization.
    Owner: @adamint
    Changes: #17631

  7. 🐛 Fix duplicate profiles block in empty AppHost template
    Fixed a bug where the empty C# AppHost template generated an aspire.config.json with a duplicated profiles block.
    Owner: @mitchdenny
    Changes: #17781
    Docs: microsoft/aspire.dev#1176

  8. 🔨 TypeScript AppHosts honor --no-build
    TypeScript AppHosts now correctly skip the TypeScript compilation check (tsc --noEmit) when the --no-build flag is passed, so developers can skip all build steps consistently.
    Owner: @davidfowl
    Changes: #17994

  9. 🧹 Fix stale backchannel sockets blocking CLI commands
    Stale AppHost backchannel socket files left behind by exited processes no longer block CLI commands like aspire add. The CLI now automatically prunes orphaned PID-qualified sockets before probing, preventing spurious connection errors.
    Owner: @davidfowl
    Changes: #18038

  10. ⏱️ Fix CLI orphan detector process start time comparison
    The CLI orphan detector now correctly compares process start times near second boundaries, preventing false PID-reuse exclusions that could cause orphaned processes to linger between CLI sessions.
    Owner: @JamesNK
    Changes: #18136

  11. 🐛 Fix non-interactive self-update channel selection
    Running aspire update --self --non-interactive now correctly auto-detects the update channel from the CLI's current identity, fixing a failure when --channel is not specified.
    Owner: @JamesNK
    Changes: #17512
    🌍 Community contribution by @@alirezafzali

  12. 🔧 Fix false version-skew warning during aspire update
    Fixes a false positive version-mismatch warning that appeared during aspire update. The in-memory configuration was already updated to the CLI's current version but had not yet been flushed to disk, causing an incorrect version-skew warning to be shown to users.
    Owner: @JamesNK
    Changes: #18208

  13. 📐 Fix aspire doctor text wrapping
    Fixes text alignment in the aspire doctor output so that long messages wrap correctly, aligning continuation lines with the message text rather than indenting under the emoji icon.
    Owner: @JamesNK
    Changes: #18257

  14. 🐛 Fix AppHost selection error in non-interactive mode
    Non-interactive CLI commands such as aspire describe now return a clear, actionable error message instead of crashing when AppHost selection is ambiguous and an interactive prompt is unavailable.
    Owner: @mitchdenny
    Changes: #18297

  15. 🔗 Fix --apphost commands with symlinked paths
    aspire describe --apphost and other commands that accept --apphost now correctly resolve symlinked paths when locating the running AppHost backchannel socket, preventing spurious "No AppHost is currently running" errors on macOS (/tmp → /private/tmp) and other systems with symlinked workspaces.
    Owner: @mitchdenny
    Changes: #18298

  16. 🔖 Restore commit SHA in aspire --version output
    The aspire --version command now again shows the commit SHA alongside the version number (e.g., 13.4.5+73114e86c64...), which was unintentionally lost during the identity sidecar refactoring.
    Owner: @mitchdenny
    Changes: #18315

  17. 📤 Fix aspire resource command polluting stdout
    Status messages from the aspire resource command are now routed to stderr instead of stdout, allowing JSON output to be piped cleanly to tools like jq.
    Owner: @JamesNK
    Changes: #18395

  18. 🔧 Fix NuGet package source mapping overwrite during aspire update
    When running aspire update, the NuGet config merger no longer incorrectly adds a wildcard (*) pattern to user-defined package sources that already have specific patterns configured, preventing unintended overwriting of custom source mappings.
    Owner: @JamesNK
    Changes: #18394

  19. 🧹 Fix stale socket file after aspire stop
    The Aspire CLI now deletes the backchannel socket file when aspire stop terminates an AppHost, preventing subsequent commands like aspire add from failing with connection timeouts when trying to reconnect to the stopped process.
    Owner: @mitchdenny
    Changes: #18296
    Docs: microsoft/aspire.dev#1283

  20. 🔕 Fix spurious backchannel error logging in aspire run
    Fixed spurious error-level logging when aspire run ends normally — a race condition caused ConnectionLostException and FailedToConnectBackchannelConnection errors to surface as warnings instead of being silently treated as expected disconnects.
    Owner: @JamesNK
    Changes: #18487

  21. 🔍 Fix agent skill snippets incorrectly listed as AppHosts
    The CLI's aspire ls command and the VS Code extension no longer mistakenly list .agents/skills/** code snippets as runnable AppHosts. The CLI now skips the .agents directory during default discovery, and the extension applies the same exclusion across all AppHost candidate sources.
    Owner: @ellahathaway
    Changes: #18407
    Docs: microsoft/aspire.dev#1433

  22. 🧹 Fix Aspire-managed process leaks
    Fixes multiple process-leak scenarios: adds PID+start-time validation to RemoteHost orphan detection to prevent false positives from PID reuse, adds orphan detection to the dashboard and nuget commands, prevents detached processes from surviving a SIGKILL of the launcher, and actively reaps already-leaked orphaned processes.
    Owner: @karolz-ms
    Changes: #18566
    Docs: microsoft/aspire.dev#1439

  23. 🔍 Fix CLI project discovery regression
    Fixed a regression in the Aspire CLI where project discovery incorrectly stopped searching parent directories for AppHost projects when encountering certain workspace configuration files.
    Owner: @JamesNK
    Changes: #18700

  24. 🎨 Fix CLI text wrapping for long file paths
    Fixed incorrect text wrapping when rendering long file paths (e.g. log file names) at narrow terminal widths by updating Spectre.Console to 0.57.2.
    Owner: @JamesNK
    Changes: #18705

  25. 🧬 Fixed detached CLI launches being killed with the launcher process group on Unix
    aspire start detached launches on Linux and macOS now start the child CLI and AppHost in a fresh process group/session using DCP's fork-process helper, so the detached app survives cleanup of the original launcher's process group instead of being torn down with it.
    Owner: @danegsta
    Changes: #18678

  26. 🛑 Fix duplicate shutdown message for aspire dashboard run
    Stopping the standalone dashboard with Ctrl+C previously displayed two shutdown messages. The CLI now emits a single, correctly punctuated shutdown line.
    Owner: @JamesNK
    Changes: #18827
    Docs: microsoft/aspire.dev#1445

  27. 🔄 Fix transient bundle file lock errors on Windows
    CLI bundle promotion on Windows now retries when antivirus or indexing software temporarily locks freshly extracted files, preventing spurious access-denied errors during bundle updates.
    Owner: @danegsta
    Changes: #18839

  28. 🔧 Fix NuGet search helper process leak in CLI read-only commands
    Fixes a process leak where aspire ls and aspire ps accumulated orphaned NuGet search helper processes that were never awaited or cancelled, causing lock file buildup under $TMPDIR/NuGetScratch/lock and potential dotnet restore deadlocks. Read-only commands now opt out of unnecessary prefetching, and the prefetch service correctly awaits task completion before shutdown.
    Owner: @JamesNK
    Changes: #18958
    🌍 Community contribution by @@Arasz

  29. 🐛 Improved error when guest AppHost exit code is unavailable
    When the CLI loses the guest AppHost backchannel before the exit code is available, it no longer reports a misleading synthetic exit code -1 and instead shows a clearer error message.
    Owner: @adamint
    Changes: #18597

  30. 🔍 Gate polyglot integration filtering behind an off-by-default feature flag
    Fixed aspire add, aspire integration list, and aspire integration search returning no results in polyglot (non-C#) AppHosts because the polyglot compatibility filter relied on tags:polyglot NuGet queries that remote feeds don't answer reliably. The filter is now gated behind an off-by-default features.polyglotIntegrationFilterEnabled flag.
    Owner: @mitchdenny
    Changes: #19233
    📝 Documentation required

  31. 🩺 Fixed dotnet path resolution in doctor checks
    aspire doctor now resolves the dotnet executable through the same PATH lookup used elsewhere before launching the SDK and deprecated-workload checks, so results are consistent instead of relying on an unresolved bare dotnet invocation.
    Owner: @JamesNK
    Changes: #19263

  32. 🧹 Suppressed CLI progress rendering during console logging
    CLI progress spinners and cursor updates no longer interleave with diagnostic logs when console logging is enabled (e.g. aspire doctor -l trace), so timestamps and log lines stay clean and unshifted.
    Owner: @JamesNK
    Changes: #19256

  33. 🔐 TypeScript AppHost trusts the dev certificate
    TypeScript AppHosts could not validate Aspire-managed development certificates when opening TLS connections to resources in run mode. The trusted development certificate is now exported into a content-addressed PEM cache and wired into the TypeScript runtime's certificate bundle, preserving any existing NODE_EXTRA_CA_CERTS value.
    Owner: @danegsta
    Changes: #19365

  34. 📦 Fixed Aspire CLI bundle resolution on fresh installs
    Fresh Aspire CLI installations with AspireUseCliBundle=true could fail to build or launch because the embedded CLI bundle hadn't been extracted yet, leaving the AppHost without DCP or dashboard metadata. AppHost builds and installers now ensure the bundle is resolved before launch, and setup failures now produce actionable diagnostics instead of a metadata-free AppHost.
    Owner: @karolz-ms
    Changes: #19364

  35. 🌐 Honor --source during template discovery
    Fixed aspire new --source ignoring the explicit source during template discovery and installation, which could cause NuGet.org traffic in restricted enterprise environments where it is blocked.
    Owner: @adamint
    Changes: #19378

  36. 📦 Fixed npm registry hard-coded to internal feed
    aspire agent init, generated JavaScript Dockerfiles, and shipped starter templates now default to the public npm registry again instead of an internal Azure Artifacts mirror, fixing install failures caused by the mirror returning 401 for uncached transitive dependencies. The Dockerfile registry remains overridable via --build-arg NPM_REGISTRY.
    Owner: @IEvangelist
    Changes: #19417

  37. 🧭 Fixed mixed-quality staging package discovery for polyglot AppHosts
    On stable-shaped staging CLI builds, TypeScript (and other polyglot) AppHosts can now discover build-matched prerelease-only integrations, such as Azure Kubernetes, from the same SHA-specific feed that C# AppHosts already used. Previously those integrations were filtered out and unavailable via aspire add for TypeScript AppHosts.
    Owner: @mitchdenny
    Changes: #19427

📊 Dashboard

3 new features, 20 improvements, 30 bug fixes

New features

  1. 🕐 Timestamp filter for telemetry
    You can now filter telemetry logs and traces by timestamp using a dedicated timestamp search qualifier in the Aspire Dashboard filter dialog.
    Owner: @JamesNK
    Changes: #17816
    Docs: microsoft/aspire.dev#1181
    📝 Documentation required

  2. 🔁 Dashboard reconnects gracefully on resource service disconnect
    When the gRPC connection between the dashboard and AppHost resource service is lost, the dashboard now shows a reconnect modal with a status message and animation. After 5 failed retry attempts, a Reconnect now button appears so users can trigger an immediate reconnect.
    Owner: @JamesNK
    Changes: #18111
    📝 Documentation required

  3. 🔎 Text filter for console logs
    A search box on the Console Logs page filters displayed log lines by case-insensitive substring match, making it easier to find relevant output in noisy log streams.
    Owner: @ellahathaway
    Changes: #18565
    📝 Documentation required

Improvements

  1. 📋 Dashboard startup log formatting improvements
    Dashboard startup log output now uses indented bullet formatting for URLs and emits the container access warning as a separate log entry. The legacy login URL line is also restored so dotnet watch can detect AppHost readiness and auto-launch the browser.
    Owner: @JamesNK
    Changes: #17595, #17610

  2. 🔢 Equality operators in numeric telemetry filter
    The telemetry filter dialog now includes == and != operators for numeric fields, making it easier to filter for exact values in logs and traces.
    Owner: @ellahathaway
    Changes: #17708

  3. 🔍 Text visualizer hides markdown option for structured data
    The TextVisualizerDialog now disables the markdown format option when content is detected as JSON or XML, preventing users from selecting a display mode that is not meaningful for structured data.
    Owner: @JamesNK
    Changes: #17970

  4. ♿ Mobile navigation and Help dialog accessibility improvements
    The dashboard mobile navigation now shows a visible checkmark for the active page and stays within the viewport at high zoom levels. The Help dialog keyboard shortcuts now use semantic term/definition pairs for improved screen reader compatibility.
    Owner: @adamint
    Changes: #17927

  5. 🔗 Troubleshooting links in dashboard connection error logs
    Dashboard connection error logs now include a troubleshooting link when the dashboard fails to connect to the AppHost resource service, helping users quickly find the relevant documentation.
    Owner: @JamesNK
    Changes: #18194
    Docs: microsoft/aspire.dev#1255

  6. ♿ Improved dashboard dialog and control accessibility
    Dashboard dialogs now return focus to the launcher element after closing, improving keyboard navigation. Assistant feedback buttons now expose an aria-pressed state, the Text Visualizer format picker uses a proper select control with disabled unavailable options, and console resource prefix colors meet WCAG AA contrast requirements in both light and dark themes.
    Owner: @adamint
    Changes: #17929

  7. 🏷️ Rename 'Export JSON' action to 'View JSON' in Dashboard
    The resource action menu item previously labeled 'Export JSON' is now called 'View JSON', accurately reflecting that it opens a text visualizer rather than downloading a file. The sensitive value confirmation message is also clarified to indicate it is scoped to the current browser.
    Owner: @JamesNK
    Changes: #18107
    🌍 Community contribution by @@nanookclaw

  8. 🏷️ Interactive filter tags on metrics charts
    Filter value tags on the metrics page are now clickable — clicking a tag immediately applies or removes that filter. Clicking the overflow (+N) badge opens the filter popover directly. Tags are ordered numerically when all values parse as numbers, otherwise alphabetically.
    Owner: @JamesNK
    Changes: #18199, #18382
    🌍 Community contribution by @@inlineHamed

  9. 🧹 Parameters hidden from resource graph view
    Parameters are now hidden from the Dashboard's Graph view and the resource type filter. Parameters have their own dedicated Parameters tab, so excluding them from the graph reduces visual clutter and makes resource dependency relationships easier to read.
    Owner: @JamesNK
    Changes: #18313

  10. ⌨️ Keyboard navigation for dashboard scroll areas
    Dashboard pages now support keyboard navigation (Home, End, PgUp, PgDown) for scrolling through resources, logs, traces, and console output. Previously, users had to click into the scroll area first before keyboard shortcuts would work.
    Owner: @JamesNK
    Changes: #18256

  11. 🔀 Console/Terminal view toggle in ConsoleLogs page
    The ConsoleLogs page now shows a Console logs / Terminal toggle in the toolbar options menu for resources with WithTerminal(). Previously, selecting a terminal resource would immediately switch to the terminal frame, hiding any console log output such as startup messages and wait-for dependencies.
    Owner: @mitchdenny
    Changes: #18574
    Docs: microsoft/aspire.dev#1438

  12. 🌐 Localized file upload error messages in Interactions dialog
    File upload error messages in the Interactions dialog (exceeds maximum size, upload failed) are now localized using the standard string localizer, consistent with the rest of the dialog.
    Owner: @radical
    Changes: #18665

  13. 🔔 Dashboard shows unsupported version notice
    When an AppHost requires a newer Aspire dashboard version than the one currently running, the dashboard now shows a clear modal notice with upgrade guidance instead of silently waiting.
    Owner: @JamesNK
    Changes: #18679

  14. 🗑️ AI Assistant chat removed from dashboard
    The AI Assistant chat feature has been removed from the dashboard, including AssistantChat, AssistantModalDialog, AssistantSidebarDialog, ExplainErrorsButton, and "Ask GitHub Copilot" context menu items. The GenAI visualizer and AI Agents dialog remain unaffected.
    Owner: @JamesNK
    Changes: #18726
    Docs: microsoft/aspire.dev#1442
    ⚠️ Breaking change
    📝 Documentation required

  15. ♿ Accessible name for Markdown copy button
    The copy button on Markdown code blocks in the AI Agents dialog now has an accessible name ('Copy to clipboard'), allowing screen readers to announce it correctly instead of just 'button'.
    Owner: @adamint
    Changes: #18816

  16. 🖥️ Terminal view default for live terminal resources
    When navigating to Console logs for a running resource with WithTerminal(), the dashboard now defaults to the Terminal view instead of the Console view, making the interactive terminal immediately visible for live resources.
    Owner: @mitchdenny
    Changes: #18867
    Docs: microsoft/aspire.dev#1447

  17. 🤖 Improved AI agent observability messaging
    Updated AI agents dialog text to better explain that coding agents use the same observability information visible in the dashboard. The AppHost mode dialog now includes a Getting started section to make CLI setup steps easier to find.
    Owner: @JamesNK
    Changes: #18868, #19042

  18. 🎨 Dashboard design-token system and visual refresh
    The Aspire Dashboard received a major visual refresh including a CSS design-token system for consistent colors, spacing, and typography, a Geist font update, UX polish across multiple pages, and accessibility fixes: focus rings on Fluent text inputs, corrected scroll control viewport behavior, and WCAG AA contrast for syntax colors and accent button states.
    Owner: @IEvangelist
    Changes: #18943, #19027

  19. ⚡ Lazy dashboard menu initialization
    Dashboard action menus now initialize lazily on first open rather than all at once on page load, reducing component construction and JavaScript overhead when many menu buttons are displayed.
    Owner: @JamesNK
    Changes: #18989

  20. 🎨 Official Aspire branding in the dashboard
    The dashboard now uses the official Aspire brand palette and current logo artwork in both light and dark themes, replacing drifted accent colors while preserving WCAG AA contrast.
    Owner: @maddymontaquila
    Changes: #19281

Bug fixes

  1. 🔄 Fix telemetry streaming with resource filter
    Fixed a bug where streaming telemetry (spans/logs) with a resource filter would return empty immediately if the resource had not yet emitted any telemetry. The stream now waits for the resource to appear before returning results.
    Owner: @JamesNK
    Changes: #17821

  2. 🎨 Fix button appearance in dashboard dialogs
    Stealth and lightweight buttons in dashboard dialogs now use a transparent background instead of the dialog background color, fixing visual glitches when buttons appear inside table header rows such as the Manage Data dialog.
    Owner: @JamesNK
    Changes: #17984

  3. 🔤 Fix duplicate replica display names in telemetry
    Fixed a display name collision for telemetry resources with multiple replicas. The dashboard now uses the last 8 characters of the service.instance.id GUID instead of the first 8, which prevents identical display names when using version 7 GUIDs (Guid.CreateVersion7()).
    Owner: @radical
    Changes: #18064
    🌍 Community contribution by @@shauryalowkeygotaura

  4. 🔍 Fix trace detail span pane on navigation
    The span detail pane is now properly cleared when navigating between traces in the dashboard. Previously, navigating away from a trace left the pane open showing a span from the old trace.
    Owner: @JamesNK
    Changes: #18146

  5. ♿ Fix Manage Data selection accessibility semantics
    Fixed accessibility semantics in the Manage Data dialog so screen reader users receive accessible names, checkbox roles, and aria-checked state for each selection control. Selection items now announce their name and checked state correctly.
    Owner: @adamint
    Changes: #17928

  6. 🐛 Fix: filter removal preserves selected log entry
    Removing a filter from the structured logs or resources list no longer incorrectly clears the currently selected entry. The selection is preserved when a filter is removed (which can only expand the result set), and is only cleared when the active filters actually exclude the selected item.
    Owner: @JamesNK
    Changes: #15825

  7. 📈 Metrics chart correctness improvements
    Several correctness issues in the metrics charting pipeline have been fixed: histogram traces (P50/P90/P99) now appear in a guaranteed consistent order, the metrics table tab is correctly labeled "Table" instead of "Resources", and metric values are compared correctly across timezones.
    Owner: @JamesNK
    Changes: #18312

  8. 🖱️ Fix endpoint URL tooltip in Resources page
    When hovering over an endpoint link in the Resources page URLs column, the tooltip previously showed all endpoint display texts combined. Now each endpoint shows the specific URL it navigates to on hover, making it clear where clicking will take you.
    Owner: @JamesNK
    Changes: #18373
    🌍 Community contribution by @@afscrome

  9. 🎨 Fallback icons for unknown resource command icon names
    When resource commands specify an unknown or missing icon name, the dashboard now renders a fallback icon instead of raw display-name text, preventing the actions row from overflowing the viewport and hiding the overflow menu.
    Owner: @JamesNK
    Changes: #18389
    Docs: microsoft/aspire.dev#1277

  10. 🚦 Cap URLs column rendering to prevent SignalR disconnect
    The dashboard URLs column now caps the number of rendered items at 20, preventing excessive DOM elements from blocking the browser UI thread and disconnecting the Blazor Server SignalR connection when a resource exposes hundreds of endpoints.
    Owner: @JamesNK
    Changes: #18383

  11. 🛑 Fix metrics filter disconnect with many tag values
    The dashboard no longer loses its SignalR connection when a metrics dimension has hundreds of tag values. Filter tags are now capped at 20 rendered items to prevent the browser reflow that was blocking the UI thread and causing the disconnect.
    Owner: @JamesNK
    Changes: #18382

  12. 📐 Fix markdown content overflow in text visualizer
    Fixed horizontal overflow in the text visualizer dialog when displaying markdown content with long unbreakable text such as URLs, tokens, or words without spaces.
    Owner: @JamesNK
    Changes: #18492

  13. ♿ Fix GenAI copy button accessible name
    Fixed a missing accessible name on the copy button in the GenAI visualizer dialog. Screen readers and other accessibility tools now correctly announce the button's purpose when it receives focus.
    Owner: @adamint
    Changes: #18501

  14. 🖱️ Fix URL click opening resource details panel
    Clicking a URL link in the Resources grid no longer also opens the resource details side panel. Click events on the URL column are now properly stopped from propagating to the row click handler.
    Owner: @JamesNK
    Changes: #18644
    🌍 Community contribution by @@eso-cyber

  15. ♿ Fix mobile nav focus visibility at high zoom
    The mobile Resources navigation menu now keeps the focus ring visible at high zoom levels (1280x768 / 200%), scrolls nav items into view during keyboard navigation, and supports Escape to close the menu from the keyboard.
    Owner: @adamint
    Changes: #18502

  16. 📤 Fix Dashboard file upload size limit
    The Dashboard was silently capping IInteractionService file uploads at 1 MB instead of deferring to the server-configured limit (100 MB by default). Files between 1 MB and 100 MB are now accepted correctly.
    Owner: @radical
    Changes: #18669

  17. ♿ Resources page keyboard accessibility and reflow fixes
    Keyboard and screen reader users now get correct navigation on the Resources page: View Options announces expanded/collapsed state, focus returns after menu selection, nested row controls no longer trigger parent row actions, and the active tab stays visible and keyboard-reachable in narrow tab strips.
    Owner: @adamint
    Changes: #17926

  18. 🔍 Fix trace negative filter logic
    Negative trace filters such as 'Not Contains' and 'Not Equal' now correctly exclude traces when any span violates the filter condition. Previously, a multi-span trace could slip through a negative filter if any sibling span did not match the excluded value.
    Owner: @JamesNK
    Changes: #18701

  19. 📜 Fix trace details grid scrolling
    The trace details grid could scroll the wrong ancestor element when its content exceeded the visible height. The container height is now set to 100% so scrolling stays within the grid.
    Owner: @JamesNK
    Changes: #18843

  20. ⏸️ Fix telemetry pause warning display
    Pausing capture on the structured logs, traces, and metrics pages now displays the 'Capture paused' warning immediately. Previously the page did not rerender until it was manually refreshed.
    Owner: @JamesNK
    Changes: #18841

  21. 🗑️ Fix removing resources without telemetry
    Resources with no remaining telemetry data types can now be selected and removed from the 'Manage logs and telemetry' page. Previously their checkbox and row were non-interactive, making removal impossible.
    Owner: @JamesNK
    Changes: #18829
    Docs: microsoft/aspire.dev#1444

  22. 🧹 Fix dashboard memory leak from retained menus
    Resolves a memory leak where FluentMenu components were not unregistered on disposal, causing dashboard memory usage to grow as users navigate through telemetry views.
    Owner: @JamesNK
    Changes: #18853

  23. 🎯 Restore keyboard focus after menu selections
    Fixed an issue where selecting an item from a dashboard button menu left keyboard focus on the page body. Focus now correctly returns to the trigger button after selection, improving keyboard navigation and accessibility.
    Owner: @adamint
    Changes: #18862

  24. 🔒 Fix HTML injection in code block titles
    Fixed an HTML injection vulnerability in the Markdown renderer where crafted fenced code block language metadata could inject arbitrary HTML into dashboard pages.
    Owner: @JamesNK
    Changes: #18866

  25. 📉 Fix histogram display crash from mismatched bucket counts
    Fixed a crash when viewing metric charts for histogram instruments that received data points with different bucket layouts. The dashboard now rejects mismatched points instead of failing to render the chart.
    Owner: @JamesNK
    Changes: #18865

  26. 🔑 Fix Dashboard login token whitespace handling
    Fixed a bug where leading or trailing whitespace in a login token prevented successful authentication in the Dashboard. The token is now trimmed before validation.
    Owner: @adamint
    Changes: #18998
    🌍 Community contribution by @@heintz06

  27. 🕐 Fix metrics chart 24-hour time format
    The metrics chart now respects the dashboard's configured time format preference. When 24-hour time is selected, chart axis labels use 24-hour format consistently with the rest of the dashboard.
    Owner: @JamesNK
    Changes: #19043
    Docs: microsoft/aspire.dev#1521
    📝 Documentation required

  28. 📈 Fix metric label selection behavior
    Clicking a metric dimension label now selects only that value, so charts can be focused on a single value without deselecting every other value first. Shift+click (or Shift+Enter/Space) retains the previous toggle behavior for adding or removing multiple values.
    Owner: @JamesNK
    Changes: #19225

  29. 🧹 Cleaned up uploaded interaction files
    Uploaded files used by IInteractionService (e.g., file prompts) could be left on disk after failed or canceled interactions, growing disk usage over the AppHost's lifetime. Uploads are now tied to their owning interaction and input, and failed or canceled uploads are cleaned up immediately, preventing stale or mismatched file references from being submitted.
    Owner: @JamesNK
    Changes: #19334

  30. 🎨 Matched dark-mode accent buttons to hyperlinks
    Dark-mode primary action buttons previously used a lighter lavender fill than dashboard hyperlinks. Buttons and hyperlinks now share the same accent color in dark mode, keeping primary actions visually consistent with the established accent styling.
    Owner: @JamesNK
    Changes: #19332

🧩 Extensions

9 new features, 15 improvements, 19 bug fixes

New features

  1. 🗂️ Show discovered AppHosts in VS Code Aspire pane
    The VS Code Aspire pane now displays idle (non-running) AppHosts discovered via aspire ls, with right-click context menu actions to Run, Debug, Open Source, or Copy Path.
    Owner: @ellahathaway
    Changes: #17506
    📝 Documentation required

  2. 🔗 Support launchUrl in launchSettings.json
    The VS Code extension now respects the launchUrl property in launchSettings.json, using it as the serverReadyAction URI format when launching the debugger.
    Owner: @adamint
    Changes: #17634
    📝 Documentation required
    🌍 Community contribution by @@neoGeneva

  3. 📡 VS Code extension telemetry
    The VS Code extension now collects telemetry signals including extension activation, debug session start/stop, and dashboard interactions to help improve the product. Data collection follows Microsoft privacy policies.
    Owner: @adamint
    Changes: #17723
    📝 Documentation required

  4. 🎮 Resource commands in VS Code tree view
    Resource commands (such as Start, Stop, and custom commands) are now displayed as child items under each resource in the Aspire VS Code extension tree view. Both enabled and disabled commands are shown.
    Owner: @adamint
    Changes: #17698
    📝 Documentation required
    🌍 Community contribution by @@shivamgoel008

  5. 🐛 Bun debugging support in VS Code extension
    The Aspire VS Code extension now supports debugging Bun applications via the WebKit Inspector Protocol debug adapter. Set breakpoints in your Bun code and debug it directly from VS Code when running an AppHost with a Bun resource (requires the oven.bun-vscode extension).
    Owner: @ellahathaway
    Changes: #17848
    📝 Documentation required

  6. 🪟 Open Aspire Dashboard in side panel from VS Code
    A new VS Code command lets you open the Aspire Dashboard in a side-by-side panel instead of an external browser, making it easier to monitor your application while editing code.
    Owner: @adamint
    Changes: #17864
    🌍 Community contribution by @@Jah-yee

  7. 🔗 VS Code extension exposes AppHost and resource management APIs
    The Aspire VS Code extension now exposes AppHost query and resource management APIs through its extension API surface, enabling C# Dev Kit v2 and other tools to programmatically query AppHost state and manage Aspire resources from the extension.
    Owner: @adamint
    Changes: #17705
    📝 Documentation required
    🌍 Community contribution by @@LittleLittleCloud

  8. 📱 MAUI platform debugging in VS Code extension
    Aspire MAUI resources are now debuggable from the VS Code extension using the MAUI debugger. Supports iOS simulator, Mac Catalyst, Windows, and Android emulator/device targets when the ms-dotnettools.dotnet-maui extension is installed; falls back to process launch on IDEs without MAUI debug support.
    Owner: @adamint
    Changes: #17857
    📝 Documentation required

  9. 🖥️ Open terminal from resource context menu in VS Code
    Resources that support terminal access can now be opened directly from the VS Code extension's resource tree context menu, running aspire terminal attach for the selected resource without leaving the IDE.
    Owner: @mitchdenny
    Changes: #18260

Improvements

  1. 🏷️ VS Code extension renamed to Aspire
    The VS Code extension has been rebranded from ".NET Aspire" to "Aspire". Users will see the updated display name and icon in the VS Code marketplace and extension panel.
    Owner: @adamint
    Changes: #17843
    Docs: microsoft/aspire.dev#1211

  2. 🎛️ Improved parameter display in VS Code extension
    Parameters now display consistently in both the VS Code extension resource tree and inline AppHost CodeLens. Missing values show as "Value missing" with a warning icon, secret parameters show a masked value, non-secret values show inline text (truncated to 80 characters), and command order now matches the Aspire dashboard.
    Owner: @ellahathaway
    Changes: #17881

  3. 🔒 VS Code extension hardened against terminal command injection
    VS Code extension terminal commands (Stop AppHost, View Resource Logs, Run Resource Commands) now use structured shell arguments instead of pre-built shell fragments, preventing shell injection via malicious workspace paths or resource names. Control characters are also rejected before terminal input.
    Owner: @adamint
    Changes: #17930

  4. ⚡ VS Code AppHost discovery efficiency improvements
    VS Code AppHost discovery now respects files.exclude and search.exclude workspace settings, debounces file-change events to prevent repeated refresh floods, and avoids overlapping discovery runs. Large workspaces with generated folders should see significantly less background scanning.
    Owner: @adamint
    Changes: #17897

  5. 🔔 Dashboard browser launch is now opt-in in VS Code
    The VS Code extension no longer auto-opens the Aspire Dashboard when an AppHost starts. Configure the preferred launch behavior — notification, external browser, integrated browser, or browser-debug — using the new aspire.dashboardBrowser setting or the per-launch dashboardBrowser property in launch.json. Legacy aspire.enableAspireDashboardAutoLaunch settings are preserved for backward compatibility.
    Owner: @adamint
    Changes: #18361
    Docs: microsoft/aspire.dev#1323
    ⚠️ Breaking change
    📝 Documentation required

  6. 📡 Improved VS Code extension Marketplace page and first-run funnel telemetry
    Updated the VS Code Marketplace README to showcase the AppHost discovery, run/debug, and dashboard workflow with real screenshots. Added bounded first-run funnel telemetry (activation, CLI availability, AppHost discovery, and launch events) using coarse enum and count values only — no paths, command output, or user content is collected.
    Owner: @adamint
    Changes: #17898

  7. 🌲 Simplified AppHosts tree view for single AppHosts
    The VS Code extension's AppHosts tree no longer wraps a lone AppHost in a redundant 'Running AppHosts (1)' or 'Workspace AppHosts (1)' grouping node. Single AppHosts are now shown directly at the top level, reducing unnecessary nesting and eliminating the extra click needed to expand the group.
    Owner: @ellahathaway
    Changes: #18523

  8. 🔇 Resource commands run without opening a terminal
    VS Code resource commands (start, stop, restart, and custom commands) now run via the CLI backchannel instead of opening a visible terminal. Results surface as notifications, preventing command output from mixing with unrelated terminal content and avoiding sensitive argument exposure in terminal scrollback.
    Owner: @adamint
    Changes: #18457

  9. 🚀 Faster AppHost startup from VS Code extension
    The VS Code extension now passes --nologo on all hidden CLI probe calls (config info, ls, ps, describe, resource commands), making AppHost startup faster by skipping interactive startup output. Older CLIs that do not support --nologo are automatically detected and retried without it.
    Owner: @adamint
    Changes: #18517

  10. 🔄 Improved AppHost runtime tracking in VS Code
    Refactored AppHost runtime tracking in the VS Code extension so aspire ps is the single source of running AppHosts. Each running AppHost now gets its own aspire describe --follow stream, allowing resources to populate before workspace discovery completes.
    Owner: @ellahathaway
    Changes: #18527
    Docs: microsoft/aspire.dev#1382
    📝 Documentation required

  11. 📡 VS Code extension telemetry wire names
    VS Code extension telemetry events are now emitted with Aspire-specific wire names (aspire/vscode/* and aspire/dashboard/*), while retaining VS Code's privacy safeguards, telemetry opt-in mechanisms, and automatic exception handling.
    Owner: @adamint
    Changes: #18562

  12. 📋 Copy AppHost path to clipboard in VS Code
    Clicking the Path row under an AppHost in the VS Code Aspire AppHosts tree now copies the AppHost file path to the clipboard, matching the expected behavior when clicking a path.
    Owner: @adamint
    Changes: #18621

  13. ⚠️ Show unhealthy resources as warnings in VS Code
    Resources in RuntimeUnhealthy or FailedToStart states are now displayed as warnings in the VS Code resource tree, CodeLens, and editor gutter, matching the severity levels shown in the Aspire Dashboard.
    Owner: @adamint
    Changes: #18973
    🌍 Community contribution by @@mturac

  14. 🏃 Accurate run/debug wording for AppHost launches in VS Code
    When launching an AppHost without debugging in VS Code, the Debug Console now shows a "run" message instead of a "debug" message, accurately reflecting the launch mode and avoiding confusion about whether a debug session is active.
    Owner: @adamint
    Changes: #18987
    🌍 Community contribution by @@vivekjm

  15. ⚡ Incremental AppHost discovery in VS Code panel
    The VS Code Aspire panel now renders AppHosts incrementally as they are discovered via streaming, rather than waiting for all discovery to complete. This eliminates the empty-workspace flash on refresh and provides a more responsive experience in repositories with many AppHosts.
    Owner: @ellahathaway
    Changes: #18443

Bug fixes

  1. 🛠️ Fix VS Code AppHost launch path resolution
    Fixed an issue in the VS Code extension where starting an Aspire debug session from a source file (e.g., Program.cs) would pass the source path to the CLI instead of the project file path, causing the session to fail.
    Owner: @davidfowl
    Changes: #17408

  2. 🔒 Security update: tmp package path traversal fix
    Updated the tmp npm package to 0.2.6 in the VS Code extension to resolve a path traversal vulnerability (GHSA-ph9p-34f9-6g65).
    Owner: @IEvangelist
    Changes: #17594
    Docs: microsoft/aspire.dev#1123

  3. 🔒 Security fixes in VS Code extension dependencies
    Multiple security vulnerabilities in VS Code extension npm dependencies have been patched. Upgrades include undici (7.27.0) for CRLF injection, WebSocket parser crash, and HTTP smuggling; and @nevware21/ts-utils (0.14.0), fast-uri (3.1.2), qs (6.15.2), and ws (8.21.0) for additional high and moderate severity CVEs.
    Owner: @IEvangelist
    Changes: #17868, #17951

  4. 🔌 Fix extension compatibility error for empty AppHost describe
    The VS Code extension now shows a compatibility error when a running AppHost successfully returns no resource data from aspire describe, instead of silently displaying no resources. This surfaces a clear message when the AppHost uses an older Aspire.Hosting version (13.1.0 or earlier) that does not support the describe protocol.
    Owner: @adamint
    Changes: #17925

  5. 🔄 Fix concurrent AppHost backchannel connection setup
    The CLI extension backchannel now serializes concurrent ConnectAsync calls, preventing a race condition that caused errors when multiple AppHost connections were initiated simultaneously.
    Owner: @adamint
    Changes: #18322

  6. 🔧 Fix stale AppHost running state in VS Code extension
    Stopped AppHosts are now reliably cleared from the VS Code extension running state after debug sessions end. Stop-state transitions are command-aware, so only run command terminations trigger stop state; non-run commands like publish no longer incorrectly mark AppHosts as stopping.
    Owner: @ellahathaway
    Changes: #17965

  7. 🔔 Fix false CLI upgrade warning in VS Code extension
    The VS Code extension no longer shows CLI upgrade guidance for generic fetch or runtime errors. Upgrade prompts now only appear when a genuine CLI compatibility or version mismatch is detected, reducing false-positive noise in the Aspire panel.
    Owner: @ellahathaway
    Changes: #18358

  8. ⏱️ Fix VS Code debug timeout with pre-build AppHost breakpoints
    The VS Code extension now sets an extended startup timeout for extension-managed AppHost debug sessions, preventing the CLI from terminating debug sessions when paused on a breakpoint before builder.Build() is called.
    Owner: @adamint
    Changes: #18353

  9. 🛡️ Fix extension terminal display fallback security
    The VS Code extension's CLI display fallback (InteractionService.displayLines) no longer routes text to the integrated terminal as shell input when no active debug session exists. Display output is now sent to the Aspire log output channel, closing a terminal-injection path for command-shaped or control-character-containing text.
    Owner: @adamint
    Changes: #18500

  10. 🪟 Fix global AppHosts showing in workspace view
    Fixed a bug where AppHosts discovered in global view were incorrectly shown in the workspace view when VS Code had no open workspace. Switching back to workspace view now immediately re-applies workspace filters to the current snapshot instead of waiting for the next poll cycle.
    Owner: @adamint
    Changes: #18516

  11. 🐚 Fixed VS Code extension CLI install walkthrough on all shells
    The VS Code extension's 'Install Aspire CLI' walkthrough now works correctly on all shells. Previously it sent PowerShell-specific install commands into terminals that might be running cmd.exe on Windows, causing the install to fail. The walkthrough now offers a package-manager picker for stable releases and a shell-safe script for daily builds.
    Owner: @ellahathaway
    Changes: #18522
    Docs: microsoft/aspire.dev#1434

  12. 🔧 Fix CLI bundle path forwarding in VS Code extension
    When aspire.aspireCliExecutablePath is set to a dev-built CLI, the extension now forwards the configured path as AspireCliPath to all build processes — terminals, tasks, debugger child processes, and language-server builds — preventing bundle path mismatches that caused runtime failures such as <unresolved-aspire-terminalhost>.
    Owner: @adamint
    Changes: #18362

  13. 🐛 Fix debuggee exit code in VS Code extension
    Fixed a bug in the VS Code extension where a crashed debuggee was incorrectly reported with exit code 0, causing dependent resources (using .WaitFor()) to start even when their dependency had failed.
    Owner: @ellahathaway
    Changes: #18712

  14. 🐛 Fix debug session stop ordering in VS Code
    Fixed an issue in the VS Code extension where the global debug stop command would stop the synthetic Aspire parent session before stopping the real AppHost debug session, leaving the AppHost registry populated after stopping.
    Owner: @adamint
    Changes: #18561

  15. 🐛 Fix stale global AppHost entry in VS Code after debug stop
    The VS Code extension now correctly prunes a stale global AppHost entry after a debug stop when workspace discovery polling is temporarily unavailable. Stop tracking is now source-aware, ensuring the global view reflects the true AppHost state once polling resumes.
    Owner: @adamint
    Changes: #18594

  16. 🪟 Fix Windows global-tool Aspire CLI discovery in VS Code
    Fixes the VS Code extension failing to discover the Aspire CLI on Windows when installed as a global tool via dotnet tool install --global Aspire.Cli. The extension now correctly probes aspire.cmd in addition to aspire.exe, resolves Windows PATH shims to fully qualified paths, and honors DOTNET_CLI_HOME.
    Owner: @adamint
    Changes: #18940

  17. 🔒 Security fix: pin VS Code extension supply-chain dependency
    Pinned the cacheable-request npm dependency in the VS Code extension after an active supply-chain compromise published a malicious version. This protects extension users from potential malicious code execution during install.
    Owner: @adamint
    Changes: #18997

  18. 🛠️ Fix VS Code file AppHost build ownership
    Fixed a bug where starting a file-based AppHost from VS Code would trigger a redundant rebuild after the Aspire CLI had already built it, potentially using a different SDK version from the wrong working directory and causing the launch to fail.
    Owner: @adamint
    Changes: #18984

  19. 🔐 Fixed Azure Functions HTTPS debugging in VS Code
    The VS Code extension no longer misroutes .NET Azure Functions HTTPS resources through the normal .NET launch path, which incorrectly passed --cert and --password arguments to dotnet. Functions apps now build and start func host from the compiled output directory, with HTTPS arguments correctly forwarded across PowerShell, cmd, and POSIX shells.
    Owner: @ellahathaway
    Changes: #19001

🔌 Integrations

8 new features, 8 improvements, 13 bug fixes

New features

  1. 🧩 Redis module support via WithModule()
    Redis resources can now load native Redis 8+ modules or custom .so modules using WithModule(). Supported built-in modules include RedisNativeModule.Json and RedisNativeModule.Search. TypeScript polyglot AppHosts get a matching withModule() export.
    Owner: @sebastienros
    Changes: #18025
    📝 Documentation required
    🌍 Community contribution by @@aradalvand

  2. 🔷 Aspire.Hosting.Dotnet integration package
    Adds Aspire.Hosting.Dotnet, a new language integration package that brings C# project support on par with the existing Go, Python, and JavaScript integrations. This is the first part of the Project V2 workstream.
    Owner: @karolz-ms
    Changes: #18442
    Docs: microsoft/aspire.dev#1437
    📝 Documentation required

  3. 🌐 Aspire.Hosting.Radius integration (preview)
    A new preview integration Aspire.Hosting.Radius lets Aspire AppHosts target Radius as a compute environment alongside Kubernetes, Docker Compose, and Azure Container Apps. Call AddRadiusEnvironment() and aspire publish/deploy emits a native app.bicep and runs rad deploy. Run mode is inert — local development is unchanged. Includes in-code Azure and AWS cloud providers with typed credential modes that are never inlined into generated Bicep.
    Owner: @mitchdenny
    Changes: #18696
    📝 Documentation required
    🌍 Community contribution by @@nellshamrell

  4. 🌐 App Service virtual network integration support
    Azure App Service environments now support delegated subnet configuration via WithDelegatedSubnet(). AppHost authors can wire an Azure Virtual Network subnet to an App Service environment to enable regional VNet integration for outbound traffic, including workload sites, deployment slots, and the dashboard.
    Owner: @davidfowl
    Changes: #18738
    Docs: microsoft/aspire.dev#1441
    📝 Documentation required

  5. 🏷️ Collision-free Azure Container App environment naming with WithUniqueResourceNaming()
    A new WithUniqueResourceNaming() extension method lets AppHost authors opt into digit-preserving managed environment names for Azure Container App environments, preventing name collisions when multiple environments are deployed to the same resource group. Aspire now also validates and fails fast with actionable guidance when legacy names would collide.
    Owner: @mitchdenny
    Changes: #18737
    Docs: microsoft/aspire.dev#1443
    📝 Documentation required

  6. 🗂️ Kubernetes projected volume support
    The Kubernetes publisher now supports projected volumes, allowing secrets, config maps, service account tokens, and downward API data to be mounted into the same directory. This enables scenarios requiring multiple volume sources under a single mount point.
    Owner: @mitchdenny
    Changes: #16555
    📝 Documentation required
    🌍 Community contribution by @@ndhansen

  7. 🌐 Ergonomic Azure subnet service-delegation API
    New fluent helpers WithServiceDelegation and WithContainerInstanceDelegation on IResourceBuilder make it easy to delegate Azure subnets to services like Azure Container Instances without duplicating the service name string.
    Owner: @IEvangelist
    Changes: #18728
    📝 Documentation required

  8. 💾 AKS persistent volume support
    AKS environments now expose AddPersistentVolume directly, so workloads targeting AKS can configure and mount persistent storage (backed by an Azure managed disk by default) without reaching into the underlying Kubernetes integration.
    Owner: @mitchdenny
    Changes: #19264
    📝 Documentation required

Improvements

  1. 🌇 GitHub Models integration deprecated
    The Aspire.Hosting.GitHub.Models integration has been retired. All public APIs are now marked [Obsolete] and the package is hidden from aspire add. Users relying on GitHub Models should migrate to alternative AI service integrations.
    Owner: @sebastienros
    Changes: #18405
    Docs: microsoft/aspire.dev#1279
    📝 Documentation required

  2. 🏗️ Serialized builds for MAUI platform resources
    Aspire now serializes MSBuild invocations for MAUI platform resources (Android, iOS, Mac Catalyst, Windows) that share the same project file. This prevents intermittent file-locking and XamlC assembly resolution failures caused by running multiple platform builds concurrently. Build state is reflected as Queued and Building in the dashboard.
    Owner: @radical
    Changes: #15958
    🌍 Community contribution by @@jfversluis

  3. 🔧 ConfigurationSchemaGenerator filename fix and opt-out support
    Fixes a typo in the MSBuild variable (AsemblyNameAssemblyName) that caused the configuration schema generator's intermediate response file to be unnamed, preventing per-project identification and risking cross-project file collisions in shared output paths. Also adds a ConfigurationSchemaGeneratorEnabled MSBuild property so integration projects can opt out of schema generation.
    Owner: @JamesNK
    Changes: #18688
    🌍 Community contribution by @@bart-vmware

  4. 🔧 Cleaner Go polyglot API for optional parameters
    The Go polyglot code generator now emits a cleaner API when a method has a single optional DTO named options: the DTO type is threaded directly as a variadic parameter instead of being wrapped in a generated method-options struct, matching the TypeScript generator behavior.
    Owner: @ellahathaway
    Changes: #18698
    Docs: microsoft/aspire.dev#1360
    ⚠️ Breaking change
    📝 Documentation required

  5. 🔧 DotnetProjectResource moved to Aspire.Hosting.Dotnet namespace
    DotnetProjectResource has been moved from the shared ApplicationModel namespace to Aspire.Hosting.Dotnet and marked with the ASPIREDOTNETPROJECT001 experimental diagnostic, aligning it with Go, Python, and JavaScript resource APIs.
    Owner: @sebastienros
    Changes: #18981
    Docs: microsoft/aspire.dev#1473
    ⚠️ Breaking change
    📝 Documentation required

  6. 🔒 Orleans provider annotation made internal
    OrleansProviderTypeAnnotation is now an internal implementation type. The supported public API is WithOrleansProviderType, which continues to work as before.
    Owner: @sebastienros
    Changes: #18975
    ⚠️ Breaking change
    📝 Documentation required

  7. 🎓 Graduate experimental APIs to stable
    Two previously experimental APIs have been promoted to stable: ContainerAppExtensions.ConfigureCustomDomain (ASPIREACADOMAINS001) and CompletionState (ASPIREPIPELINES001). Consumers can now use these APIs without suppressing their respective experimental diagnostics.
    Owner: @sebastienros
    Changes: #19007
    Docs: microsoft/aspire.dev#1507
    📝 Documentation required

  8. 🖼️ Resource icons for hosting integration packages
    Added explicit resource icons to hosting integration packages that previously fell back to generic type-based heuristics. Resources in the dashboard now show semantically meaningful icons (database, message broker, AI model, cloud service, etc.) instead of a generic box or code icon.
    Owner: @JamesNK
    Changes: #18954
    🌍 Community contribution by @@afscrome

Bug fixes

  1. 🐛 Fix EF Hosting migration pipeline step handling
    Fixed issues in the Entity Framework hosting integration migration pipeline where migration steps were unconditionally added to the bundle-generate step. Improves reliability of EF migration orchestration in AppHost.
    Owner: @AndriySvyryd
    Changes: #16966

  2. 🔒 Fix Redis TLS persistent container startup deadlock
    Fixed a deadlock that could occur during Redis container startup when TLS was enabled and the container used a persistent lifetime. The TLS startup arguments now correctly use target-port bindings instead of allocated ports.
    Owner: @danegsta
    Changes: #17827

  3. 🐛 Fix RabbitMQ structured log event name display
    RabbitMQ log entries no longer show misleading level names ('Error', 'Warn', 'Info') as the event name in the Aspire dashboard structured log view. The event name is now left unset, with log level still flowing correctly via LogLevel.
    Owner: @radical
    Changes: #17355
    🌍 Community contribution by @@alirezafzali

  4. 🔐 Fix Entra ID auth in SqlServer client integrations
    The SqlServer client integrations (Aspire.Microsoft.Data.SqlClient and Aspire.Microsoft.EntityFrameworkCore.SqlServer) now reference Microsoft.Data.SqlClient.Extensions.Azure, which contains the Entra ID authentication providers that were moved out of the core SqlClient driver in version 7.0. Apps using managed identity or Active Directory authentication against Azure SQL no longer fail at runtime with 'Cannot find an authentication provider for ActiveDirectoryDefault'.
    Owner: @sebastienros
    Changes: #18149
    📝 Documentation required
    🌍 Community contribution by @@0xharkirat

  5. 📡 Fix MAUI OTLP dev tunnel endpoint for dynamic dashboard ports
    Fixes MAUI OTLP dev tunnel endpoint resolution when the Aspire dashboard uses dynamically allocated ports. Previously, the tunnel could fall back to the stale default port 18889, causing telemetry from MAUI apps to not appear in the dashboard.
    Owner: @JamesNK
    Changes: #18053
    🌍 Community contribution by @@jfversluis

  6. 🐛 Fix EF publish-mode connection string placeholder error
    Fixed a bug where aspire publish would fail EF migration bundle generation because connection string environment variables resolved to manifest placeholders in publish mode, causing the design-time EF tool to throw an initialization error. The EF tool now skips connection string references during publish — the real connection string is supplied at deploy time.
    Owner: @mitchdenny
    Changes: #17905

  7. 🐛 Fix EF migration connection string not forwarded to dotnet-ef tool
    Resolved a bug where calling .WithReference(<db>) on an EF migration resource failed to forward the connection string to the hidden dotnet-ef tool resource, resulting in The ConnectionString property has not been initialized. errors. Connection strings are now lazily forwarded at start time so they are available regardless of declaration order.
    Owner: @mitchdenny
    Changes: #18452

  8. 🔑 Fix cross-scope ACR pull identity role assignment
    Fixes a deployment failure when using an existing Azure Container Registry in a different resource group or subscription. ACA and App Service now correctly handle ACR pull identity role assignments for cross-scope registries, resolving the Bicep BCP139 validation error.
    Owner: @davidfowl
    Changes: #18742

  9. 🔌 Fix Radius service discovery for Kubernetes deployments
    Cross-container service discovery was broken when deploying Aspire apps to Radius-enabled Kubernetes clusters. The services__* environment variables emitted to consumer containers now correctly reference the Kubernetes ClusterIP Service created by the Radius recipe, so calls between resources (e.g., a Blazor frontend to an API service) resolve correctly in-cluster.
    Owner: @mitchdenny
    Changes: #18797
    🌍 Community contribution by @@nellshamrell

  10. 🔒 Fix Azure SQL managed-identity provisioning on az14.0
    Fixes Azure SQL managed-identity provisioning failures when deploying to the az14.0 deployment image. The script no longer depends on the SqlServer PowerShell module, makes user creation idempotent so retries succeed, and validates the identity by SID so a recreated managed identity is correctly replaced.
    Owner: @mitchdenny
    Changes: #18895

  11. 📌 Pinned dashboard image for reproducible deployments
    Docker Compose and Kubernetes publish now pin the Aspire Dashboard image to a specific reproducible tag instead of an untagged reference, so generated manifests no longer resolve to a mutable :latest build that could drift from the app's Aspire version.
    Owner: @IEvangelist
    Changes: #19249

  12. 🔑 AKS credential pipeline pinned to deployment subscription
    AKS deployment now always fetches cluster credentials and resource group data scoped to the subscription Aspire selected, instead of the ambient Azure CLI default, preventing wrong-subscription credential fetches and confusing "cluster not found" errors.
    Owner: @mitchdenny
    Changes: #19271

  13. 🚦 Fixed deploy hang on route-less Gateways and Ingresses
    aspire deploy no longer hangs for ~15 minutes waiting on a Kubernetes Gateway or Ingress that was intentionally skipped for having no routes, and no longer emits a dangling cert-manager parentRef or orphaned TLS secret for it; a warning now names what was omitted.
    Owner: @mitchdenny
    Changes: #19254

📄 Templates

1 new feature, 1 improvement

New features

  1. 🆙 .NET 11 support for project templates
    Aspire project templates now support .NET 11 Preview as an opt-in target framework, allowing developers to evaluate Aspire on .NET 11 while templates continue to default to .NET 10. All nine framework-aware templates are updated, including the corresponding OpenAPI package substitutions.
    Owner: @DamianEdwards
    Changes: #18849
    📝 Documentation required

Improvements

  1. 📦 CLI bundle enabled by default in C# AppHost templates
    New C# AppHost projects and single-file AppHosts created from templates now default to the Aspire CLI bundle layout, avoiding the opt-in warning and enabling bundled dashboard and DCP features out of the box.
    Owner: @DamianEdwards
    Changes: #19294

To provide feedback, comment on the Changelog feedback issue (e.g., "Exclude PR #1234", "Rename: X → Y", "Merge PRs #1234 and #5678").

PRs processed: ✅ 308 included · ❌ 245 excluded · ⏳ 0 unprocessed · 553 total merged in milestone (View full PR tracker) Docs PRs: ✅ 78 included · ❌ 169 excluded · ⏳ 0 unprocessed · 247 total from microsoft/aspire.dev (View docs PR tracker) PRs analyzed through: #19424 merged 2026-08-17 22:37 UTC

Clone this wiki locally