Skip to content

13.5 Change log

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

Table of Contents

38 new features, 93 improvements, 101 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

13 new features, 29 improvements, 22 bug fixes

New features

  1. ⚙️ 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
    📝 Documentation required

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

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

  4. 💾 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.
    Owner: @mitchdenny
    Changes: #16929
    Docs: microsoft/aspire.dev#1328
    📝 Documentation required

  5. ⏳ 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.
    Owner: @JamesNK
    Changes: #18493
    Docs: microsoft/aspire.dev#1347
    📝 Documentation required

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

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

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

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

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

  12. 💚 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
    📝 Documentation required

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

Improvements

  1. 🔄 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
    📝 Documentation required

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

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

  4. 🐞 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
    📝 Documentation required
    🌍 Community contribution by @air-hand

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  22. ⏸️ 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

  23. 🌍 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
    📝 Documentation required
    🌍 Community contribution by @kola-tm

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

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

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

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

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

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

Bug fixes

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

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

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

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

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

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

  7. 🗝️ 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

💻 CLI

6 new features, 30 improvements, 28 bug fixes

New features

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

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

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

  4. 📦 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 now includes install, verify, update, and troubleshooting guidance, and a postinstall check warns when the matching native platform package is missing on supported platforms.
    Owner: @adamint
    Changes: #17297, #18455
    Docs: microsoft/aspire.dev#1239, microsoft/aspire.dev#1243, microsoft/aspire.dev#1252
    📝 Documentation required

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

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

Improvements

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

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

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

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

  5. 🩺 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
    📝 Documentation required

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

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

  8. 🔍 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
    📝 Documentation required

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

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

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

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

  13. 🖼️ 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Bug fixes

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

📊 Dashboard

3 new features, 17 improvements, 25 bug fixes

New features

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

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

Improvements

  1. 🤖 Improved AI agent observability messaging
    Updated the introductory text in the AI agents dialog to better explain how Aspire gives AI coding agents deep observability into your app, enabling faster issue diagnosis and fix verification.
    Owner: @JamesNK
    Changes: #18868

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

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

  4. 🗑️ 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
    ⚠️ Breaking change
    📝 Documentation required

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

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

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

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

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

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

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

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

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

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

  16. 🔢 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: @JamesNK
    Changes: #17708
    🌍 Community contribution by @ellahathaway

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

Bug fixes

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

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

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

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

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

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

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

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

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

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

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

  12. 🖱️ 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

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

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

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

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

  18. 🖱️ 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

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

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

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

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

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

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

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

🧩 Extensions

9 new features, 11 improvements, 16 bug fixes

New features

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

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

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

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

  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: @adamint
    Changes: #17848
    📝 Documentation required
    🌍 Community contribution by @ellahathaway

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

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

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

  9. 🗂️ 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: @adamint
    Changes: #17506
    📝 Documentation required
    🌍 Community contribution by @ellahathaway

Improvements

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

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

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

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

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

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

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

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

  10. 🎛️ 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: @adamint
    Changes: #17881
    🌍 Community contribution by @ellahathaway

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

Bug fixes

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

🔌 Integrations

6 new features, 6 improvements, 10 bug fixes

New features

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

  2. 🏷️ 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
    📝 Documentation required

  3. 🌐 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
    📝 Documentation required

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

  5. 🔷 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
    📝 Documentation required

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

Improvements

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

  2. 🔧 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
    ⚠️ Breaking change
    📝 Documentation required

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

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

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

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

Bug fixes

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

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

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

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

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

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

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

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

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

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

📄 Templates

1 new feature

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

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

PRs processed: ✅ 248 included · ❌ 209 excluded · ⏳ 0 unprocessed · 457 total merged in milestone (View full PR tracker) Docs PRs: ✅ 45 included · ❌ 139 excluded · ⏳ 0 unprocessed · 144 total from microsoft/aspire.dev (View docs PR tracker) PRs analyzed through: #18980 merged 2026-08-04 17:05 UTC

Clone this wiki locally