Skip to content

13.6 Change log

github-actions[bot] edited this page Sep 30, 2026 · 75 revisions

Table of Contents

47 new features, 58 improvements, 114 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

6 new features, 12 improvements, 24 bug fixes

New features

  1. πŸ”— Executable references to container-network endpoints
    Executables and projects can now reference endpoints on Aspire's default container network, so a self-reference or reference to another executable no longer waits indefinitely for an allocation that was never produced. Use GetEndpoint(name, KnownNetworkIdentifiers.DefaultAspireContainerNetwork) to resolve the container-network address for an endpoint.
    Owner: @danegsta
    Changes: #20214
    Docs: microsoft/aspire.dev#1723
    πŸ“ Documentation required

  2. πŸ–₯️ AppHost-owned interactive terminals
    The AppHost can now create and own interactive terminal processes independent of resources orchestrated by DCP, via new experimental TerminalService, AspireTerminal, and TerminalLaunchOptions APIs in Aspire.Hosting.ApplicationModel. Terminals can be placed in the dashboard dock, shown in a dialog via IInteractionService.PromptTerminalAsync, or run headlessly for automation, enabling scenarios like authenticating an external tool or running interactive setup from AppHost code.
    Owner: @mitchdenny
    Changes: #19887, #20261
    Docs: microsoft/aspire.dev#1684, microsoft/aspire.dev#1726
    πŸ“ Documentation required

  3. πŸš€ DotnetProjectResource publishing support
    AddDotnetProject() resources can now be published and deployed, matching the capabilities already available to AddProject() resources. Docker Compose, Kubernetes, Azure Container Apps, Azure App Service, Azure Sandboxes, Foundry, and Radius publishers all recognize publishable .NET program resources, and EF Core migration and hosted Blazor scenarios work with the newer Project V2 model.
    Owner: @karolz-ms
    Changes: #19997
    πŸ“ Documentation required

  4. πŸ“‚ Portable volume path environment variables
    Volume mount paths can now be resolved through environment variables, so the same volume configuration works whether a project or executable runs locally on the host filesystem or in a container under Docker Compose, Kubernetes, or Azure Container Apps.
    Owner: @mitchdenny
    Changes: #19404
    Docs: microsoft/aspire.dev#1593
    πŸ“ Documentation required

  5. 🌱 Expose resolved environment variables to debug launch producers
    Debug launch configuration producers can now read Aspire-resolved environment variables through a new context-based WithDebugSupport overload, enabling IDE launch configurations that depend on resolved values.
    Owner: @adamint
    Changes: #19077
    πŸ“ Documentation required

  6. 🧰 Local tool manifest support for AppHost DNX invocation
    C# AppHosts can now opt into DNX resolution that honors an in-scope .NET local tools manifest, letting a repository pin the Aspire.Cli version used to launch the AppHost via dotnet run.
    Owner: @DamianEdwards
    Changes: #19310
    πŸ“ Documentation required

Improvements

  1. ⚑ Enable multithreaded .NET project builds
    Project V2's coordinated build and rebuild commands now use MSBuild's multithreaded task execution (-mt) when the selected .NET SDK supports it, reducing the time it takes for coordinated project builds to complete and the dashboard to reach full readiness.
    Owner: @karolz-ms
    Changes: #20441
    Docs: microsoft/aspire.dev#1744

  2. πŸ”’ Consistent socket and directory permissions
    Aspire now applies consistent default permissions to the Unix domain sockets it creates and the parent directories within the user's ~/.aspire folder, reducing the risk of unintended local access.
    Owner: @mitchdenny
    Changes: #20427

  3. πŸ”— Portable connection-string environment variable aliases
    Connection-string environment variables now separate the logical .NET configuration name from the physical environment-variable name. WithReference emits both the legacy alias (e.g. ConnectionStrings__my-db) and a portable alias without - (e.g. ConnectionStrings__my_db) when supported, while strict deployment targets such as Azure App Service and Kubernetes emit only the portable alias. Updated Aspire client integrations resolve the logical name first, then fall back to the portable key; consumers using older integrations or direct IConfiguration lookup on strict targets can migrate explicitly with WithReference(database, connectionName: "my_db").
    Owner: @sebastienros
    Changes: #19729
    Docs: microsoft/aspire.dev#1778
    ⚠️ Breaking change
    πŸ“ Documentation required

  4. ⚑ Unified restore for Project V2 builds
    Project V2's coordinated builds now restore compatible project groups together in a single NuGet graph instead of restoring each root project separately, reducing redundant restore work and improving startup performance. Projects that need per-project restore hooks can opt back in with Aspire:Dotnet:RestoreProjectsIndividually.
    Owner: @karolz-ms
    Changes: #20294
    Docs: microsoft/aspire.dev#1722
    πŸ“ Documentation required

  5. ☁️ Distinct icon for Azure environment resource
    The dashboard's Resources page now shows a filled cloud-and-cube icon for the azure-environment control resource instead of the generic cog fallback, making it easier to identify at a glance.
    Owner: @maddymontaquila
    Changes: #20011
    Docs: microsoft/aspire.dev#1664
    πŸ“ Documentation required

  6. πŸ—οΈ Coordinated project build phase
    Project resources now share one coordinated initial build phase instead of building independently, preventing nondeterministic failures when multiple services reference the same .csproj and write to shared bin/obj directories concurrently.
    Owner: @karolz-ms
    Changes: #19678
    πŸ“ Documentation required

  7. πŸ™ˆ Hide Azure environment when all resources use emulators
    The azure-environment resource is now hidden in the dashboard when every Azure resource in the model runs through a local emulator, since there is nothing to provision.
    Owner: @eerhardt
    Changes: #19843
    Docs: microsoft/aspire.dev#1618

  8. πŸ“Ž Harden interaction file uploads
    File uploads in interactions are now consistently enforced across the Dashboard, CLI, and custom clients: upload counts respect AllowMultipleFiles, uploads are bounded instead of unbounded, and client-provided filenames are sanitized before use.
    Owner: @JamesNK
    Changes: #19488
    Docs: microsoft/aspire.dev#1554
    πŸ“ Documentation required

  9. βš™οΈ Support advanced dotnet invocation options
    Executable-annotated project resources now recognize additional supported dotnet command prefixes (like dotnet --diagnostics run or dotnet -d watch), so more valid invocation styles get the expected configuration and launch-profile handling instead of being skipped.
    Owner: @karolz-ms
    Changes: #19352

  10. πŸ“ Move progress prompt title to options
    The interaction service's progress prompt title is now configurable through options rather than a fixed positional parameter, making the API more flexible and consistent across C# and polyglot AppHosts.
    Owner: @JamesNK
    Changes: #19382

  11. ⚠️ Require confirmation before change-location deletes Azure resources
    The change-location dev-time command previously could delete and recreate an existing location-immutable Azure resource without warning, risking permanent data loss. It now requires an explicit confirmation (--confirm-delete on the CLI, a dashboard warning checkbox, or arguments.confirmDelete=true via MCP) before deleting a live Azure resource.
    Owner: @IEvangelist
    Changes: #19345
    πŸ“ Documentation required

  12. ⚠️ Warn when the update notification can't be dismissed
    When clicking Ignore on the AppHost update notification silently failed because user secrets weren't configured correctly, the notification kept returning on later runs. The AppHost now logs a warning explaining the failure and links to user-secrets documentation.
    Owner: @JamesNK
    Changes: #19162

Bug fixes

  1. πŸ“œ Fix log streaming for terminal-backed executables
    Fixed a DCP 400 BadRequest when reading logs for terminal-backed executables (WithTerminal()). Aspire no longer requests unavailable separate stdout/stderr streams for these executables; startup and system logs remain visible via aspire logs, the dashboard, and other log subscribers.
    Owner: @karolz-ms
    Changes: #20317
    Docs: microsoft/aspire.dev#1717

  2. πŸ›‘οΈ Fix startup crash from stale pending DCP address observations
    Fixed a startup crash ("Service should have valid address at this point") caused by a stale, pending DCP service observation overwriting an already-allocated endpoint port with 0 right before workload endpoints were created. Pending address data can no longer regress a usable allocation.
    Owner: @danegsta
    Changes: #20326

  3. 🩹 Fix file-based C# resource launch in unsupported IDE sessions
    File-based C# resources (bare .cs files) now run using primary process execution when Visual Studio's IDE session can't load them as a project, instead of incorrectly attempting IDE-based debugging. VS Code .cs debugging is unaffected.
    Owner: @karolz-ms
    Changes: #20243
    Docs: microsoft/aspire.dev#1721

  4. πŸ” Fixed duplicate resource-stopped notifications during restart
    Fixed a bug where an OnResourceStopped handler that initiates a restart could receive a duplicate callback for the same stop, because restart preparation changed the snapshot state that was being compared. The handler now fires exactly once per real stop.
    Owner: @JamesNK
    Changes: #20279
    Docs: microsoft/aspire.dev#1705

  5. πŸ” Preserve explicit Kestrel certificate configuration
    WithProjectDefaults no longer overwrites an explicit Kestrel certificate configuration (Kestrel__Certificates__Default__Path, KeyPath, or Subject) set via WithHttpsCertificateConfiguration. Previously the built-in PFX default replaced the certificate path while leaving a stale key path, producing a mixed PFX/PEM configuration that Kestrel rejected with "The provided key file is missing or invalid."
    Owner: @karolz-ms
    Changes: #20133
    Docs: microsoft/aspire.dev#1669
    πŸ“ Documentation required

  6. πŸ”• Terminal-host telemetry now opt-in
    Terminal-host telemetry from WithTerminal() is now disabled by default, so its hidden helper resources no longer show up in the dashboard's telemetry resource list (including the Traces filter) unless explicitly opted into with ShowTerminalHost = true.
    Owner: @mitchdenny
    Changes: #20005
    Docs: microsoft/aspire.dev#1651

  7. ☸️ Fix Helm cleanup ordering for AKS destroy
    aspire destroy no longer fails for AKS deployments when the cluster isn't already selected in the ambient kubeconfig; a dedicated credential step now runs before Helm cleanup so it doesn't race resource-group deletion.
    Owner: @sebastienros
    Changes: #19243
    Docs: microsoft/aspire.dev#1620

  8. 🎯 Avoid ephemeral executable target port collisions
    DCP no longer briefly releases an ephemeral port between reservation and use when allocating executable target ports, closing a window where an unrelated outbound connection could claim the port and cause workloads like the dashboard to fail binding.
    Owner: @danegsta
    Changes: #19822

  9. πŸ“ Fix polyglot AppHost settings discovery from project root
    Polyglot AppHosts now load appsettings.json and other configuration files from the guest AppHost's project root instead of the CLI-owned server directory, so configuration files placed next to apphost.mts are discovered correctly.
    Owner: @sebastienros
    Changes: #19719

  10. πŸ” Isolate deployment state for source-file AppHosts
    Source-file AppHosts in the same directory previously shared a directory-scoped deployment-state identity, letting one AppHost read or clear state belonging to a sibling. Each source AppHost now gets its own deployment-state identity while preserving safe access to legacy state during migration.
    Owner: @spboyer
    Changes: #19709
    πŸ“ Documentation required

  11. ⏱️ Extend DCP startup timeout through API readiness
    AppHost startup no longer fails when DCP's kubeconfig is ready but its first API call is still slow. The startup timeout budget now extends through the first successful DCP API operation instead of ending as soon as the kubeconfig is parsed.
    Owner: @adamint
    Changes: #19641

  12. 🌐 Fix Kubernetes hostname publishing and routing
    Kubernetes publishing no longer hardcodes runtime-only hostname parameter values or leaves hostless Ingress paths and Gateway routes as catch-all rules, so WithHostname(...) provides the documented routing scope and publishValueAsDefault: false is honored for these resources.
    Owner: @mitchdenny
    Changes: #19430
    Docs: microsoft/aspire.dev#1574

  13. ⏱️ Use separate timeout for DCP initialization
    DCP can take longer than 20 seconds to write its initial kubeconfig on contended CI hosts, which previously aborted AppHost startup. Initial kubeconfig discovery and client creation now get a separate 60-second timeout, while subsequent DCP API calls keep the existing 20-second timeout.
    Owner: @adamint
    Changes: #19636

  14. πŸ”— Fix DevTunnel endpoint URL publication
    After upgrading to Aspire 13.5, DevTunnel port resources could become Running and Healthy while the Dashboard and MCP resource snapshots still reported no URLs. The proxyless endpoint allocator's temporary localhost port assignment for DevTunnelPortResource is now handled correctly, restoring endpoint URL publication.
    Owner: @danegsta
    Changes: #19590
    Docs: microsoft/aspire.dev#1570

  15. πŸ” Avoid duplicate dashboard connection metadata
    Azure provisioning could raise ConnectionStringAvailableEvent multiple times for a resource, causing duplicate dashboard connection metadata and duplicate-property warnings. Publishing connection metadata is now idempotent, replacing existing resource.connectionString and resource.connectionProperties values by property name instead of appending duplicates.
    Owner: @sebastienros
    Changes: #19613

  16. ⎈ Fix incomplete Kubernetes values for embedded parameters
    Kubernetes publishing now declares embedded config and secret parameters in values.yaml instead of emitting Helm references without the corresponding values, fixing incomplete generated output such as http:///test.
    Owner: @mitchdenny
    Changes: #19429
    Docs: microsoft/aspire.dev#1565

  17. πŸ”• Stop redisplaying dismissed parameters notification
    Dismissing the unresolved-parameters notification no longer causes it to immediately reappear; parameters remain unresolved but can still be set from their resource commands.
    Owner: @JamesNK
    Changes: #19336

  18. πŸͺͺ Detect principal type from credential
    The Bicep provisioner now detects the actual principal type from the Azure credential instead of hardcoding "User", fixing role-assignment failures when the AppHost runs under a service principal or federated workload identity (e.g., CI/CD pipelines, Codespaces).
    Owner: @denisivan0v
    Changes: #18063
    🌍 Community contribution by @denisivan0v

  19. 🧹 Handle SIGTERM in terminal host and clean up orphaned sockets
    WithTerminal() could leave orphaned per-replica Unix-domain sockets under ~/.aspire/trmnl/ when a terminal host was stopped with SIGTERM or its owning AppHost exited unexpectedly. Terminal lifecycle cleanup is now resilient across graceful stops, forced termination, crashes, PID reuse, reboots, containers, and concurrent AppHosts.
    Owner: @IEvangelist
    Changes: #19344

  20. πŸ•ΆοΈ Fix secret leak in describe for owning resources
    aspire describe --format json redacted generated secret parameters (such as passwords created by AddPostgres) when they flowed into a dependent resource, but still leaked the plaintext value via the owning resource's own environment variable (e.g. POSTGRES_PASSWORD). Redaction discovery now walks the full dependency graph so owning resources' own secret env vars are redacted too.
    Owner: @IEvangelist
    Changes: #19248
    Docs: microsoft/aspire.dev#1499

  21. πŸ”’ TypeScript AppHosts now trust the dev certificate
    TypeScript AppHosts now trust the ASP.NET Core development certificate when custom AppHost code opens TLS connections to Aspire-managed resources in run mode, fixing TLS handshake failures for polyglot AppHosts.
    Owner: @danegsta
    Changes: #15634

  22. πŸ› οΈ Fix custom IDE project launch argument separator regression
    Fixed a regression where custom IDE project launches (such as Azure Functions) that combined launch-profile and AppHost arguments received an invalid dotnet -- ... separator, producing a broken command line.
    Owner: @karolz-ms
    Changes: #19306

  23. ⏱️ Fix hang when waiting on an unavailable resource that doesn't exist
    Calling WaitForResourceHealthyAsync with WaitBehavior.StopOnResourceUnavailable for a resource name that isn't registered in the application model used to hang indefinitely. The wait now checks the application model upfront and stops immediately when the resource doesn't exist.
    Owner: @mitchdenny
    Changes: #17351
    🌍 Community contribution by @rsd-darshan

  24. 🚦 Fix deployment hang from route-less Gateways and Ingresses
    Deploying an AppHost with a Gateway that had no routes (or an Ingress with no paths) could make aspire deploy hang for around 15 minutes waiting on Kubernetes objects that were never created, and could leave TLS certificates stuck in a pending state. Route-less Gateways and path-less Ingresses are now consistently excluded from all TLS and deployment steps, and a clear warning names what was skipped.
    Owner: @mitchdenny
    Changes: #19220
    Docs: microsoft/aspire.dev#1470
    πŸ“ Documentation required

πŸ’» CLI

11 new features, 10 improvements, 22 bug fixes

New features

  1. 🎬 CLI terminal automation and tape commands
    The CLI adds terminal commands (terminal attach, terminal ps, terminal tape, terminal tape play) for inspecting and driving AppHost-owned or resource terminals, including a VHS-style tape subset for scripted input/wait sequences and recording final screen output for automation and testing scenarios. These commands no longer require enabling the features.terminalCommandsEnabled feature flag.
    Owner: @mitchdenny
    Changes: #19887, #20548
    Docs: microsoft/aspire.dev#1684
    πŸ“ Documentation required

  2. 🧭 Project v2 migration skill for AI agents
    The Aspire CLI's agent-init skill installer now embeds the official attested Project v2 migration skill, giving AI coding agents an approval-first workflow for migrating AppHosts to Project v2.
    Owner: @karolz-ms
    Changes: #20405
    πŸ“ Documentation required

  3. πŸ” Firefox NSS certificate support in the CLI
    The CLI's development-certificate trust support now recognizes Firefox NSS certificate databases under XDG_CONFIG_HOME. The override is now exposed as standard Aspire configuration (certificates.nssDbPaths, including user-level ~/.aspire settings) instead of a dedicated environment variable, and takes precedence over the existing DOTNET_DEV_CERTS_NSSDB_PATHS upstream environment variable.
    Owner: @danegsta
    Changes: #20210, #20298
    Docs: microsoft/aspire.dev#1716, microsoft/aspire.dev#1725
    πŸ“ Documentation required

  4. πŸ“Œ aspire update now updates repository CLI manifest pins
    aspire update now updates repository-local Aspire CLI tool manifest pins (.config/dotnet-tools.json, dotnet-tools.json, and package.json) alongside AppHost integration updates, instead of treating CLI version pinning as a --self-only operation. Restoring/installing the updated CLI and refreshing lockfiles remains the package manager's responsibility; aspire update --self is unchanged.
    Owner: @eerhardt
    Changes: #20295
    Docs: microsoft/aspire.dev#1715
    πŸ“ Documentation required

  5. 🧹 Opt-in volume cleanup for aspire stop
    The aspire stop --force command now supports an opt-in --volumes flag to also remove persistent volumes created by the AppHost, while preserving them by default.
    Owner: @danegsta
    Changes: #20195
    Docs: microsoft/aspire.dev#1729, microsoft/aspire.dev#1746
    πŸ“ Documentation required

  6. πŸ“„ New --file-based option for aspire init
    Added --file-based to aspire init so an empty, file-based C# AppHost can be scaffolded in the current directory without .NET solution discovery, avoiding unwanted prompts or solution-based scaffolding caused by incidental .sln/.slnx files.
    Owner: @mitchdenny
    Changes: #20004
    Docs: microsoft/aspire.dev#1648
    πŸ“ Documentation required

  7. πŸ¦• Deno support for TypeScript AppHost
    The CLI's TypeScript AppHost toolchain resolver now detects and supports Deno 2+ projects, adding scaffolding, doctor diagnostics, CI images, and VS Code debugger handoff.
    Owner: @sebastienros
    Changes: #18627
    πŸ“ Documentation required
    🌍 Community contribution by @rickylabs

  8. πŸ€– Detect GitHub Copilot App as an agent client
    aspire agent init now detects and configures the GitHub Copilot App as an agent client, not just Copilot CLI, since both share the Copilot runtime, MCP configuration, skills, and hooks.
    Owner: @ellahathaway
    Changes: #19820
    πŸ“ Documentation required

  9. πŸ“˜ Export canonical TypeScript API data from the CLI
    Added aspire sdk export, which emits a deterministic TypeScript API reference as JSON for Aspire.Hosting at the running CLI SDK version, or for an exact PackageName@Version supplied with --package. Generated TypeScript signatures and the exported documentation model now share the same projector.
    Owner: @adamint
    Changes: #19032
    πŸ“ Documentation required

  10. 🚦 Launch profile selection for aspire run and start
    Added --launch-profile <name> (and the -lp alias) to aspire run and aspire start, letting users pick a specific launch profile. When the direct AppHost launcher can't safely reproduce the selected profile, the request is forwarded to dotnet run so the .NET SDK remains responsible for validation and diagnostics.
    Owner: @adamint
    Changes: #19494
    πŸ“ Documentation required
    🌍 Community contribution by @prom3theu5

  11. πŸ“¦ Enable the CLI bundle in generated C# AppHosts
    New C# AppHost templates and aspire init single-file AppHosts now opt into the Aspire CLI bundle by default. Generated projects use bundled dashboard and DCP components without requiring a manual AspireUseCliBundle opt-in.
    Owner: @DamianEdwards
    Changes: #19076
    Docs: microsoft/aspire.dev#1483, microsoft/aspire.dev#1511, microsoft/aspire.dev#1586
    πŸ“ Documentation required

Improvements

  1. πŸ” In-process NuGet operations in the CLI
    Bundled NuGet operations (search, restore, and package inspection) now run in-process in the native aspire.exe instead of launching a separate aspire-managed helper process. This also enables installed NuGet credential provider plugins (for example, for Azure Artifacts) to authenticate feeds that previously returned 401 errors.
    Owner: @eerhardt
    Changes: #19847, #20391
    πŸ“ Documentation required

  2. πŸ” MCP configuration now opt-in in agent setup
    The chained agent setup in aspire new and aspire init no longer offers to install the Aspire MCP server, and non-interactive aspire agent init never selects MCP through its default skill set. The standalone aspire agent init command still lets you opt in with a new --mcp confirm prompt, unselected by default.
    Owner: @ellahathaway
    Changes: #19893
    ⚠️ Breaking change
    πŸ“ Documentation required

  3. πŸ” Harden CLI Sigstore/TUF trust root verification
    Updated the Aspire CLI's Sigstore and TUF dependencies to 1.0.1, refreshing the embedded TUF trust root and hardening sequential trust-root rotation verification used for CLI provenance checks.
    Owner: @mitchdenny
    Changes: #19595

  4. πŸ” Aspire CLI executables signed with Microsoft certificate
    Windows and Linux Aspire CLI executables are now signed with Arcade's general Microsoft first-party certificate instead of the .NET-specific certificate, so the publisher identity shown to users reflects Microsoft.
    Owner: @DamianEdwards
    Changes: #19686

  5. πŸ”­ Reusable CLI resource observation for describe and wait
    aspire describe --follow now streams from a single resource snapshot subscription for both initial state and later updates, and aspire wait uses a shared typed wait service with consistent timeout, cancellation, and failure handling.
    Owner: @adamint
    Changes: #19567
    Docs: microsoft/aspire.dev#1591
    πŸ“ Documentation required

  6. πŸ”’ Harden Aspire skills bundle caching
    The Aspire skills cache is now keyed by both bundle version and archive SHA-512 digest, so an updated skills bundle whose contents changed without a version bump is no longer served from a stale cached extraction.
    Owner: @ellahathaway
    Changes: #19068

  7. 🎨 Color statuses in aspire ps output
    aspire ps now color-codes known resource statuses in table output β€” running in green and stopped in red β€” making it easier to scan AppHost state at a glance. JSON output is unchanged.
    Owner: @JamesNK
    Changes: #19369

  8. πŸ”’ Use SHA-512 for Aspire Skills bundle integrity checks
    The Aspire Skills bundle now verifies integrity using SHA-512 instead of SHA-256, aligning with the CLI acquisition scripts, and the preview aspireSkillsRemoteFetchEnabled toggle is hidden from user-facing surfaces.
    Owner: @IEvangelist
    Changes: #19303

  9. 🏑 Honor ASPIRE_HOME for deployment state
    Deployment state now respects the CLI's effective ASPIRE_HOME instead of always writing to the persistent user profile, which was breaking isolated CI runs and side-by-side CLI usage. Deployment parameters and secrets are stored under <ASPIRE_HOME>/deployments/<AppHostSha>/<environment>.json, with ~/.aspire retained as the fallback.
    Owner: @sebastienros
    Changes: #19244
    πŸ“ Documentation required

  10. πŸ’¬ Clearer error message when no AppHost is found
    When no AppHost can be found, the CLI's error message now correctly names the --apphost option instead of referring to a nonexistent "project argument", and no longer implies .NET-only projects.
    Owner: @adamint
    Changes: #19069

Bug fixes

  1. πŸ”Œ Fix aspire stop hang from auxiliary backchannel shutdown race
    aspire stop could hang while scanning AppHosts when an auxiliary backchannel connection was accepted just as the AppHost began shutting down. Accepted connections are now tracked and drained during shutdown so clients observe disconnection promptly instead of the AppHost hanging.
    Owner: @danegsta
    Changes: #20319

  2. πŸš€ Honor selected launch profile in bundled dotnet run
    dotnet run --launch-profile <name> now honors the selected profile when it delegates to aspire run with CLI bundles enabled, instead of always falling back to the first profile.
    Owner: @karolz-ms
    Changes: #19958
    🌍 Community contribution by @gabisonia

  3. πŸ”’ CLI MessagePack dependency vulnerability fix
    The CLI's transitive MessagePack dependency is pinned to 2.5.302, removing two known vulnerabilities (CVE-2026-48109 and CVE-2026-48506) without changing RPC contracts, serializers, or the NativeAOT StreamJsonRpc preview.
    Owner: @joperezr
    Changes: #20071

  4. 🎯 VS Code now preselects CLI-default agent assets
    The VS Code Quick Pick for AI agent skills during aspire new and aspire init now preselects the same skill location and bundled skills that the Aspire CLI terminal prompt already defaults to, instead of opening with nothing checked.
    Owner: @ellahathaway
    Changes: #19996
    Docs: microsoft/aspire.dev#1660
    πŸ“ Documentation required

  5. πŸ›‘ Fixed extension CLI teardown during AppHost build
    Stopping a dynamic debug session no longer force-exits the Aspire CLI while a cold single-file AppHost build is still running. Extension stop requests now route through the CLI's normal cancellation and process-tree cleanup, preventing orphaned build processes from locking their working directory.
    Owner: @ellahathaway
    Changes: #20021

  6. ⏱️ Don't count AppHost builds against CLI startup timeout
    aspire run and detached aspire start no longer count time spent restoring and building the AppHost against the startup timeout, fixing misleading timeout failures for cold or large solutions.
    Owner: @ellahathaway
    Changes: #19478
    Docs: microsoft/aspire.dev#1619

  7. πŸ–₯️ Avoid live CLI rendering when stdout is redirected
    The CLI no longer enters live Spectre rendering when stdout is redirected (e.g. in a Remote SSH session), fixing a crash that could also stop the AppHost.
    Owner: @adamint
    Changes: #19673

  8. 🧭 Match AppHosts across equivalent filesystem paths
    The CLI now compares AppHost identities using a filesystem-canonical path, so it correctly discovers and reconnects to a running AppHost even when it's referenced through paths that differ by Windows casing, Unix symbolic links, or macOS /var firmlinks.
    Owner: @danegsta
    Changes: #19762

  9. ⏱️ Bound AppHost auxiliary backchannel handshake
    An AppHost that accepts its auxiliary socket but never answers JSON-RPC can no longer hang aspire run, aspire ps, aspire stop, or other backchannel-scanning commands indefinitely β€” a 10-second deadline is now enforced around the handshake.
    Owner: @adamint
    Changes: #19832

  10. πŸ”„ Persist CLI channel across self-updates
    The Aspire CLI now records its install channel in a sidecar file that is updated on self-update, so aspire update --channel staging no longer falls back to resolving stable after a subsequent update.
    Owner: @mitchdenny
    Changes: #19469

  11. 🧬 Preserve TypeSystem compatibility with older CLIs
    TypeScript and Java AppHost codegen now probe for newer Aspire.TypeSystem members before using them, fixing a MissingMethodException/TypeLoadException when a newer SDK's generated code runs against an older installed CLI.
    Owner: @adamint
    Changes: #19506

  12. 🏠 Preserve the default AppHost for explicit runs
    Running aspire run --apphost no longer overwrites the configured default AppHost, so a later bare aspire run keeps using the original default.
    Owner: @adamint
    Changes: #19394

  13. ⏳ Bound Aspire CLI process termination wait
    Aspire CLI bundle setup commands that exceed their timeout now have a bounded five-second post-termination wait, so MSBuild reports a clear cleanup timeout instead of waiting indefinitely for process termination to complete.
    Owner: @karolz-ms
    Changes: #19367

  14. 🩹 Tolerate credential-provider stdout preamble in package search
    aspire add package search no longer fails when the NuGet Azure Artifacts Credential Provider writes progress lines to stdout before the JSON payload on an authenticated feed.
    Owner: @IEvangelist
    Changes: #19343

  15. πŸ“¦ Fixed mixed-quality staging package discovery
    The TypeScript/polyglot aspire add path no longer filters stable-shaped staging feeds as stable-only, so integrations that intentionally remain prerelease (like Azure Kubernetes) are discovered again instead of disappearing from search results.
    Owner: @mitchdenny
    Changes: #19426

  16. πŸ“¦ Fix npm registry hard-coded to internal feed
    A previous change accidentally made the internal dnceng Azure Artifacts feed the customer-facing default npm registry, which returns 401 for uncached tarballs and broke aspire agent init when installing packages such as playwright. The public npm registry is restored as the default in generated Dockerfiles and aspire new templates.
    Owner: @IEvangelist
    Changes: #19388

  17. πŸ” Fix developer certificate generation deadlock on Unix/macOS
    Synced the vendored ASP.NET Core certificate generation source to pick up a Unix/macOS process deadlock fix, avoiding hangs when generating developer HTTPS certificates.
    Owner: @sebastienros
    Changes: #19320

  18. ⏱️ Bound the NuGet package search timeout
    aspire add no longer hangs indefinitely when the bundled NuGet helper is searching package metadata; a 3-minute timeout now produces a clear timeout error instead of waiting for the 10-minute CI hang timeout.
    Owner: @adamint
    Changes: #19178

  19. 🧱 Fix misleading AppHost build failure diagnostics
    When an AppHost exists but fails MSBuild evaluation, Aspire CLI now preserves the user-selected project and surfaces the real build diagnostics instead of incorrectly claiming that no AppHost was found.
    Owner: @DamianEdwards
    Changes: #19082
    Docs: microsoft/aspire.dev#1523
    🌍 Community contribution by @ellahathaway

  20. πŸ–₯️ Suppress CLI progress spinners when console logging is enabled
    CLI commands that emit console or debug logs now keep readable status messages without interactive spinner frames. Aspire still reports progress, but renders it as stable text so verbose logging no longer interleaves with spinner output.
    Owner: @JamesNK
    Changes: #19214, #19272

  21. 🩺 Resolve dotnet paths consistently in doctor checks
    aspire doctor launched .NET SDK and deprecated-workload checks using the bare dotnet executable name. It now resolves dotnet through the CLI's shared path-lookup logic before starting the process, so checks consistently use the executable selected from PATH.
    Owner: @JamesNK
    Changes: #19232

  22. 🍎 Fix CLI hang on macOS from inherited TTY stdin
    Fixed a hang on macOS where aspire new/init/add/restore for the TypeScript starter would silently stall because a spawned guest process inherited the parent CLI's TTY and blocked on a stdin read.
    Owner: @spboyer
    Changes: #17562

πŸ“Š Dashboard

3 new features, 18 improvements, 31 bug fixes

New features

  1. 🧩 Terminal dock, detached windows, and new rendering engine
    The dashboard adds a persistent, resizable, tabbed terminal dock and detached terminal windows for interacting with AppHost-owned or resource terminals, alongside a new state-based rendering engine (@hex1b/web-terminal) that replaces xterm.js with Kitty Graphics Protocol and Sixel support, improved copy/paste, a WebGPU renderer with WebGL2 fallback, and font-size/sizing controls that persist across dock and detached windows. The dock's empty state was simplified to a console icon, heading, documentation link, and backtick-key hint, and the Terminals header button and mobile navigation entry were removed in favor of the backtick shortcut.
    Owner: @mitchdenny
    Changes: #19887, #20541, #20562
    Docs: microsoft/aspire.dev#1684
    πŸ“ Documentation required

  2. πŸ“– Run persistence help in dashboard
    The dashboard run selector now includes a Learn about runs option that opens the run-persistence documentation, helping users understand live, historical, and pinned runs. The run button's light-theme hover and pressed states are also lightened.
    Owner: @JamesNK
    Changes: #20510
    Docs: microsoft/aspire.dev#1764
    πŸ“ Documentation required

  3. πŸ—„οΈ Dashboard run history and persistence
    The Dashboard can now persist resources and telemetry to SQLite, so you can inspect completed application runs, compare telemetry before and after code changes, or resume a standalone Dashboard's data across restarts. A new run selector in the header lets you switch between the live run and historical runs.
    Owner: @JamesNK
    Changes: #18924
    Docs: microsoft/aspire.dev#1649
    πŸ“ Documentation required

Improvements

  1. 🎬 Animate terminal dock on first open
    The terminal dock now slides into view with an animation the first time it's opened after a dashboard refresh, instead of appearing instantly.
    Owner: @JamesNK
    Changes: #20432

  2. πŸ–ΌοΈ Aspire Dashboard application icon
    The Aspire Dashboard executable now displays the Aspire icon in Windows Task Manager, File Explorer, and other shell surfaces, matching the icon already used by the CLI and managed host executables.
    Owner: @JamesNK
    Changes: #20306

  3. πŸš€ Native AOT dashboard with Fluent UI v5
    The Aspire Dashboard can now publish and run as a standalone Native AOT executable, using an updated Fluent UI v5 across grids, dialogs, filters, charts, and log/telemetry views. aspire dashboard run and AppHost startup select the AOT dashboard automatically, with no new command-line options required.
    Owner: @JamesNK
    Changes: #19565
    Docs: microsoft/aspire.dev#1714
    πŸ“ Documentation required

  4. πŸ“ˆ Higher dashboard log and trace retention limits
    Default console log, structured log, and trace retention limits increased from 10,000 to 100,000 entries, keeping more diagnostic history available during longer runs. The limits remain configurable via Dashboard:Frontend:MaxConsoleLogCount, Dashboard:TelemetryLimits:MaxLogCount, and Dashboard:TelemetryLimits:MaxTraceCount.
    Owner: @JamesNK
    Changes: #20169
    πŸ“ Documentation required

  5. 🧡 Improved Fluent UI overflow handling
    Updated the dashboard's Fluent UI library to a preview build that fixes a global overlay spinner flash. Overflow menus for resource URLs, metric filter tags, and trace span summaries now keep their intrinsic width and stay bounded for large collections, and single resource URLs truncate with an ellipsis when a grid column is too narrow.
    Owner: @JamesNK
    Changes: #20176

  6. πŸ•°οΈ Dimmed links in historical dashboard runs
    Links from historical dashboard runs (resource URLs, console log links, and property-grid/text-visualizer links) now render at reduced opacity to visually distinguish them from the current run. Switching back to the current run restores normal opacity.
    Owner: @JamesNK
    Changes: #20171

  7. 🚫 Show incompatible dashboard runs as disabled
    The dashboard run selector now shows runs with an incompatible schema version as disabled items instead of hiding them, with a tooltip explaining why and the ability to pin them before retention removes them.
    Owner: @JamesNK
    Changes: #20082

  8. πŸ–±οΈ Improved dashboard scroll-to-bottom behavior
    The scroll-to-bottom button on console logs, structured logs, and traces no longer flashes during initial scroll restoration, hides immediately on click, and reliably reaches the latest content even while native smooth scrolling is still animating.
    Owner: @JamesNK
    Changes: #20139

  9. πŸ—‚οΈ Flattened dashboard persistence directory layout
    Dashboard persistence now stores all run snapshots directly under a shared runs directory instead of nesting them under an application-specific directory, and resume-mode databases move to a shared resumes directory. No configuration changes are required, and existing retention, pinning, locking, and run-selection behavior is preserved.
    Owner: @JamesNK
    Changes: #20006
    Docs: microsoft/aspire.dev#1665

  10. 🎨 Matched grid column popups to dashboard styling
    Grid column menus and column-width popups now match the dashboard's standard popup styling, with left-aligned labels, accent-colored icons, and consistent background instead of the previous mismatched Fluent UI v5 defaults.
    Owner: @JamesNK
    Changes: #20080

  11. 🎨 Dashboard migrated to Fluent UI Blazor v5
    The Aspire Dashboard now uses Fluent UI Blazor v5, refreshing dialogs, notifications, menus, grids, tabs, trees, and selectors while keeping familiar navigation and filtering workflows across Resources, Console Logs, Structured Logs, Traces, and Metrics.
    Owner: @JamesNK
    Changes: #19431

  12. πŸ•ΈοΈ Improve resource graph action discoverability
    Resource nodes in the dashboard Graph view now show a cog icon on hover to open the resource's context menu, making its actions easier to discover than right-click alone.
    Owner: @IEvangelist
    Changes: #19905
    Docs: microsoft/aspire.dev#1617

  13. ⏸️ Show consistent pause warnings across dashboard pages
    Console logs now show a localized capture-paused warning in the page footer, matching the visibility already given to structured logs and traces. The metrics pause warning has also been moved so it no longer sits below the fold inside scrollable chart content, making the active pause state harder to miss.
    Owner: @ellahathaway
    Changes: #19624

  14. 🚫 Disable autocomplete on dashboard filters
    Disabled browser autocomplete on page-level filter boxes across Structured Logs, Traces, Console Logs, Resources, and Trace Detail, so unrelated browser-saved values no longer appear when a filter receives focus. This matches the existing behavior of the Resource, Span, and Structured Log detail filters.
    Owner: @JamesNK
    Changes: #19044
    🌍 Community contribution by @vivekjm

  15. πŸ“ˆ Update dashboard metrics graphing library
    Updates the Plotly.js bundle used for dashboard metrics graphs from 2.35.2 to 4.0.0-rc.0, keeping the metrics visualization current with the upcoming Plotly.js major release.
    Owner: @JamesNK
    Changes: #19377

  16. πŸ” Clearer guidance on dashboard unsecured access risks
    Anonymous dashboard access and unauthenticated OTLP ingestion configuration now consistently link to documentation explaining the risks and mitigations, making it easier to understand the tradeoffs before opting in.
    Owner: @JamesNK
    Changes: #19461
    πŸ“ Documentation required

  17. 🧹 Lifecycle management for interaction upload files
    Uploaded interaction files are now cleaned up based on their lifecycle: files for failed or canceled interaction uploads are removed immediately, and uploads are validated against the owning interaction and input to prevent misuse.
    Owner: @JamesNK
    Changes: #19322

  18. 🎨 Official Aspire branding in the dashboard
    The dashboard now uses the official Aspire brand palette for accent colors and the embedded logo, replacing colors that had drifted from the current brand while preserving WCAG AA contrast in both light and dark themes.
    Owner: @maddymontaquila
    Changes: #19247

Bug fixes

  1. πŸ“Œ Keep dashboard run menu open when pinning
    Pinning or unpinning a historical run in the dashboard run selector no longer closes the menu, so runs can be compared or organized without reopening the selector each time.
    Owner: @JamesNK
    Changes: #20546

  2. 🧹 Fix dashboard filter badges and toolbar navigation
    Dashboard filter badges no longer stay visible with an empty count, narrow resource-details controls wrap instead of overlapping properties, and mobile Resources tab navigation updates the URL immediately unless the filter panel is open.
    Owner: @JamesNK
    Changes: #20511

  3. πŸ”• Avoid JSDisconnectedException telemetry during dashboard layout initialization
    Disconnecting from the dashboard while its layout restores saved navigation state no longer raises an unhandled JSDisconnectedException in telemetry; other browser-storage read errors continue to be logged at Information level.
    Owner: @JamesNK
    Changes: #20509

  4. βœ‚οΈ Fix truncation of selected dropdown values
    Long selected resource names in dashboard dropdowns are now truncated with an ellipsis instead of being hard-cut, making it clear the value is shortened.
    Owner: @JamesNK
    Changes: #20430

  5. ⌨️ Fix dashboard shortcut availability
    Standalone dashboards without the resource service no longer advertise or execute shortcuts for the unavailable Resources and Console Logs pages, and shortcut help now reflects the running configuration.
    Owner: @JamesNK
    Changes: #20431

  6. πŸ–±οΈ Fix scrollbars in Events grid cells
    Trace details Events grid cells no longer show internal scrollbars when span events contain nested attribute grids, keeping event names and attributes fully visible.
    Owner: @JamesNK
    Changes: #20429

  7. πŸ–±οΈ Fix dashboard menu reopen and terminal focus after Fluent UI v5 migration
    Fixed dashboard regressions introduced by the Fluent UI v5 migration: resource graph context menus now reopen reliably right after pressing Escape or clicking away, and terminal auto-fit sizing no longer steals keyboard focus from the control the user is actively using.
    Owner: @JamesNK
    Changes: #20341, #20410

  8. 🧭 Dashboard popup positioning fixes
    Fixed dashboard popups (filters, view options, profile, and URL-overflow) that could misalign with their trigger, overflow the viewport, or close unexpectedly while live metric values were updating.
    Owner: @JamesNK
    Changes: #20362, #20410
    Docs: microsoft/aspire.dev#1728

  9. πŸ” Reject empty OTLP API keys
    The dashboard's OTLP endpoint now rejects an explicitly empty API key, closing a gap where an empty configured secondary key could authenticate a request that sent an empty x-otlp-api-key header.
    Owner: @JamesNK
    Changes: #20363, #20408

  10. πŸͺ Scope dashboard cookies by application name
    Dashboard authentication and antiforgery cookie names, and collapsed-resource storage keys, are now scoped by the configured application name so multiple dashboards on the same hostname no longer interfere with each other's cookies or resource-expansion state.
    Owner: @JamesNK
    Changes: #20299, #20407
    πŸ“ Documentation required

  11. πŸ”’ Fixed dashboard startup race on lock file cleanup
    Fixed a race on Unix where parallel dashboard processes could delete a lock file another dashboard had just created, causing it to fail to start with an IOException. Only unheld lock files at least a day old are now cleaned up.
    Owner: @JamesNK
    Changes: #20223

  12. 🦊 Force WebGL2 for Firefox dashboard terminals
    Dashboard terminals now explicitly use the WebGL2 renderer on desktop and Android Firefox to avoid a WebGPU performance issue in that browser, even when WebGPU is otherwise available.
    Owner: @mitchdenny
    Changes: #20262
    Docs: microsoft/aspire.dev#1703

  13. πŸ“ Fixed tall dashboard submenu overflow
    Updated the Fluent UI Blazor package to fix tall, nested dashboard menus overflowing outside the viewport instead of staying within it.
    Owner: @JamesNK
    Changes: #20197

  14. 🏷️ Fixed metric filter tag overflow
    Metric dimension filter tags no longer truncate unnecessarily when multiple values are displayed side by side. Each tag now keeps its natural width, overflowing values move into the overflow count, and a tag is only ellipsized when it is the sole displayed value and still too wide to fit.
    Owner: @JamesNK
    Changes: #20220

  15. 🎨 Fixed dashboard layout and disabled control styling
    Fixed dashboard styling regressions: dialogs now expand to fit their content instead of scrolling prematurely, an empty message bar no longer reserves visible space, and disabled text inputs, dropdowns, number inputs, and checkboxes use consistent dark-theme surfaces and cursors.
    Owner: @JamesNK
    Changes: #20170
    Docs: microsoft/aspire.dev#1682
    πŸ“ Documentation required

  16. βœ… Fixed dashboard selection indicators
    Fixed the selection checkmark in the Console Logs settings menu overlapping the label, and removed a stray fallback checkmark that appeared alongside the accent styling in selected Fluent dropdown options.
    Owner: @JamesNK
    Changes: #20141

  17. 🧹 Clean up stale dashboard run locks
    The dashboard now cleans up abandoned run lock files left behind by an interrupted process, preventing stale locks from lingering indefinitely while active locks and unrelated files remain untouched.
    Owner: @JamesNK
    Changes: #20140

  18. πŸ›‘ Fixed dashboard SQLite cancellation error
    Cancelling a dashboard metrics read while a SQLite statement was preparing could surface an unrelated SQLite error instead of a normal cancellation, causing intermittent dashboard metrics failures. Any SQLite failure is now treated as cancellation when the caller's token is already canceled.
    Owner: @JamesNK
    Changes: #20007

  19. 🎨 Fixed dashboard disabled and row hover styles
    Fixed visual regressions from the Fluent UI v5 upgrade: disabled dropdown options and menu items now share consistent opacity without hover/active/focus backgrounds, and resource and structured log grid rows use the correct light-mode hover color again.
    Owner: @JamesNK
    Changes: #20084

  20. πŸ“ Fixed dashboard overflow behavior
    Resizing the dashboard no longer lets secondary resource URLs or metric dimension values displace the primary value before it is truncated. Filter popups on the Metrics and Resources pages now cap their width and ellipsize long checkbox labels instead of overflowing.
    Owner: @JamesNK
    Changes: #20079

  21. 🧹 Filter blank values from dashboard filter dialog
    Filter value comboboxes in the dashboard no longer display blank options with a count, such as an empty trace ID. Empty values are removed from suggestions while non-empty values keep their aggregated counts.
    Owner: @JamesNK
    Changes: #20081
    πŸ“ Documentation required

  22. πŸ—„οΈ Fix SQLite-backed dashboard telemetry filtering
    Dashboard telemetry filtering now runs entirely through SQLite for both production and tests, fixing incorrect negative service-name filtering and stale asynchronous filter results clearing a newer structured-log selection.
    Owner: @JamesNK
    Changes: #19661

  23. πŸ”’ Harden Markdown link validation
    Markdown links with URLs that couldn't be parsed by System.Uri were previously rendered instead of being blocked. These URLs are now classified as prohibited, closing a gap where browsers or registered protocol handlers could still act on them.
    Owner: @JamesNK
    Changes: #19698

  24. πŸ”’ Restore dashboard unsecured endpoint FWLink
    The unsecured endpoint warning in the dashboard UI once again links to the stable https://aka.ms/aspire/api-endpoint-unsecured FWLink instead of a direct security-considerations URL, so the destination documentation can change without requiring a dashboard update.
    Owner: @JamesNK
    Changes: #19462

  25. πŸ–ΌοΈ Fix Graph view crash for multi-path icons
    Fixed a crash in the dashboard's Graph view for resources (such as Azure Blob storage) whose icon uses multiple sibling SVG paths, by combining them into a single compound path before rendering.
    Owner: @sebastienros
    Changes: #19579

  26. πŸ”’ Harden dashboard WebSocket origin validation
    The dashboard now validates the Origin header on Blazor Server WebSocket upgrade requests, rejecting cross-origin or malformed connection attempts with 403 Forbidden to prevent unauthorized pages from hijacking a dashboard session.
    Owner: @JamesNK
    Changes: #19484

  27. ↩️ Revert parent resource state from replicas
    Reverted the parent resource state derived-from-replicas change while preserving the resource subscription race fix, restoring the dashboard's previous parent resource state behavior after issues were found.
    Owner: @adamint
    Changes: #19545

  28. 🏁 Fix dashboard resource subscription race
    Fixed a race between applying a resource update and notifying dashboard subscribers that could cause a newly-registered subscriber to receive both a stale in-flight change and the updated snapshot.
    Owner: @JamesNK
    Changes: #19534

  29. 🧬 Update parent resource state from replicas
    Dashboard resource rows now reflect the state of their replica child rows, fixing the case where a deployed Azure Container Apps parent row stayed "Scaled to zero" even after one of its replicas reported "Running".
    Owner: @adamint
    Changes: #18642

  30. β™Ώ Fix Dashboard HTML language under invariant culture
    Fixed the Dashboard rendering <html lang=""> when running under invariant culture, which broke accessibility tooling; invariant culture now maps to lang="en".
    Owner: @sebastienros
    Changes: #19331

  31. πŸ—„οΈ Fix database resource peer resolution
    The dashboard now resolves database peers more accurately for telemetry spans that share a server address, using the reported database name to prefer the matching database resource instead of attributing spans to the wrong container or sibling database.
    Owner: @JamesNK
    Changes: #19224
    Docs: microsoft/aspire.dev#1508

πŸ”§ Engineering

2 bug fixes

Bug fixes

  1. 🍺 Fixed Homebrew cask deprecation warnings
    Fixed the Homebrew cask template so brew update and cask validation no longer emit deprecation warnings, and preserved release-binary signing/notarization verification during cask audits.
    Owner: @JamesNK
    Changes: #19965
    🌍 Community contribution by @askpt

  2. πŸ“¦ Restore WinGet publication
    Restored WinGet package publication by installing the .NET 9 runtime required by the latest wingetcreate tool, fixing failed release publication to WinGet.
    Owner: @radical
    Changes: #19551

🧩 Extensions

6 new features, 9 improvements, 17 bug fixes

New features

  1. 🧡 Managed Blazor WebAssembly debugging in VS Code
    Debugging a Blazor WebAssembly client resource in the VS Code extension now hands the browser launch to the C# extension's managed blazorwasm debugger instead of always starting a plain JavaScript debugger, so breakpoints set in client C# code are hit directly. Generic browser resources continue to use js-debug.
    Owner: @adamint
    Changes: #20001
    πŸ“ Documentation required

  2. ⚠️ Warn when VS Code uses an outdated Aspire CLI
    VS Code now warns when the Aspire CLI selected for an active extension operation is outdated for its installed published release lane, for example when a stable CLI is older than the latest stable release.
    Owner: @ellahathaway
    Changes: #19670
    Docs: microsoft/aspire.dev#1608
    πŸ“ Documentation required

  3. πŸ› οΈ Debugger setup hints for missing extensions
    The VS Code extension now shows setup guidance when a running resource supports debugging (Python, Go, Bun, Rust, Java, .NET MAUI, Azure Functions) but the required language extension isn't installed.
    Owner: @adamint
    Changes: #19131
    πŸ“ Documentation required

  4. πŸš€ Deploy, publish, and pipeline actions in Aspire pane
    AppHost items in the Aspire pane now expose Deploy, Publish, Run pipeline step, and Debug pipeline step actions directly, so these operations no longer require finding the matching Command Palette command.
    Owner: @adamint
    Changes: #19466
    Docs: microsoft/aspire.dev#1750
    πŸ“ Documentation required
    🌍 Community contribution by @SankeerthNara

  5. ✨ Create Aspire projects from the pane
    The Aspire pane now offers a "Create with Aspire..." action to start the aspire new and aspire init project creation flows directly from the toolbar, instead of requiring the Command Palette.
    Owner: @adamint
    Changes: #19539
    Docs: microsoft/aspire.dev#1749
    πŸ“ Documentation required
    🌍 Community contribution by @SankeerthNara

  6. πŸ€– Let agents start and stop AppHosts through VS Code
    Added aspire_apphost_start and aspire_apphost_stop Language Model tools so AI agents in VS Code can start and stop a discovered AppHost directly instead of spawning a separate CLI process.
    Owner: @adamint
    Changes: #19134
    πŸ“ Documentation required

Improvements

  1. πŸ› οΈ Consolidated VS Code AppHost build failure notifications
    AppHost build failures in VS Code now surface as a single consolidated error notification with Open CLI Log and Open AppHost Log actions, instead of separate error and log-path notifications that had to be copied manually.
    Owner: @ellahathaway
    Changes: #19755
    Docs: microsoft/aspire.dev#1605
    πŸ“ Documentation required

  2. πŸͺ΅ Deduplicate and colorize AppHost logs in VS Code
    AppHost logs shown in the VS Code debug console are now deduplicated across the CLI backchannel, console logger, and .NET debug logger paths and color-coded, making output easier to read.
    Owner: @adamint
    Changes: #19129

  3. πŸ”• Show Hot Reload advisory only once per workspace
    The C# Dev Kit Hot Reload advisory now appears at most once per workspace instead of reappearing after every extension-host reload. It can also be disabled entirely with the new aspire.enableHotReloadNotification setting.
    Owner: @adamint
    Changes: #19672
    πŸ“ Documentation required

  4. πŸ” Retry invalid project creation destinations
    Aspire: New Aspire Project now reopens the folder picker instead of aborting when the chosen destination is invalid, and unqualified local template resolution now deterministically selects the Aspire.ProjectTemplates package matching the running CLI version.
    Owner: @adamint
    Changes: #19300

  5. ❓ Prompt for AppHost on ambiguous directory launch
    The VS Code extension now prompts you to pick an AppHost when a debug configuration's directory contains multiple buildable AppHosts, instead of failing the launch with no way to disambiguate.
    Owner: @adamint
    Changes: #19541
    🌍 Community contribution by @SankeerthNara

  6. 🌳 Scope AppHost lifecycle by git worktree
    Running an AppHost from a linked git worktree in VS Code no longer conflicts with the primary checkout's ports and user secrets, and aspire stop without --apphost no longer stops an AppHost running in a nested linked worktree.
    Owner: @adamint
    Changes: #19384
    Docs: microsoft/aspire.dev#1745
    🌍 Community contribution by @Shaurya2k06

  7. πŸ—‚οΈ Show AppHosts from every VS Code workspace root
    The VS Code extension's AppHosts view now discovers and combines AppHosts from every open workspace root instead of only the first, so multi-root workspaces show all available AppHosts.
    Owner: @adamint
    Changes: #19295

  8. πŸ”” Make Aspire extension activity progress dismissible
    Long-running Aspire extension activity now shows as window progress instead of a modal notification, so it can be ignored or hidden without blocking the editor while builds, AppHost startup, or dashboard startup continue.
    Owner: @adamint
    Changes: #19124

  9. πŸ”₯ Make C# Dev Kit Hot Reload discoverable while debugging
    The VS Code extension now surfaces whether C# Dev Kit Hot Reload is enabled for .NET project debug sessions, showing an advisory with a direct link to the relevant setting when Hot Reload is off.
    Owner: @adamint
    Changes: #19067

Bug fixes

  1. 🌐 Fixed Edge compatibility layer breaking browser debugging
    Fixed a VS Code issue where an inherited __COMPAT_LAYER environment variable could cause Edge to replace its initial process during Debug in Browser, leaving the browser stuck at about:blank instead of launching correctly.
    Owner: @adamint
    Changes: #20152

  2. πŸ¦• Fixed Deno debugger missing startup breakpoints
    Debugging a Deno resource in the VS Code extension could silently miss breakpoints in startup code because the generated launch released Deno as soon as the debugger connected, before breakpoints were configured. The generated launch now uses --inspect-brk so Deno stays paused until breakpoints are set.
    Owner: @ellahathaway
    Changes: #20020

  3. πŸͺŸ Fix unpackaged WinUI debugging
    Fixed a crash when debugging unpackaged WinUI 3 project resources through the Aspire VS Code extension by detecting unpackaged WinUI projects and launching them correctly.
    Owner: @ellahathaway
    Changes: #19877

  4. πŸ•’ Consistent CLI notification claim timestamps
    Fixed an inconsistency in the Aspire CLI notification claim timestamps used by the VS Code extension's cross-window suppression handshake.
    Owner: @ellahathaway
    Changes: #19854

  5. β˜• Fix Java starter JDK and transport reliability
    Fixed the Java starter using the wrong JDK (Java 21 from the ambient process instead of the modeled Java 25 toolchain) and tightened the surrounding Java AppHost path, including Maven wrapper/module resolution and JSON-RPC response routing reliability.
    Owner: @adamint
    Changes: #19635

  6. πŸ¦€ Fix Rust AppHost run-session notification routing
    Fixed Rust AppHosts launched through CodeLLDB or cppvsdbg sometimes leaving a resource stuck at PID 0 with no logs or proxy, caused by an empty run-session ID being sent to DCP before the Rust resource started.
    Owner: @adamint
    Changes: #19831

  7. πŸ™ˆ Prevent Aspire view from stealing sidebar focus
    Reloading VS Code while another sidebar view was active no longer causes the Aspire view to steal focus and reappear in the Activity Bar; AppHost discovery no longer force-reveals itself when the view is hidden.
    Owner: @ellahathaway
    Changes: #19754
    Docs: microsoft/aspire.dev#1598

  8. πŸ› Fix dashboard launch blocking AppHost startup
    Fixed a VS Code extension issue where a debugger-backed dashboard browser launch could block AppHost startup completion; the browser launch now runs as observed background work instead.
    Owner: @adamint
    Changes: #19559

  9. πŸ›‘οΈ Harden Azure Functions VS Code launch lifecycle
    Hardened the Azure Functions VS Code launch lifecycle: launch arguments are validated and quoted before building, more POSIX shells (dash, ash, zsh, fish, ksh) are supported, and malformed Core Tools output or invalid worker PIDs are reported with a clear error instead of failing silently.
    Owner: @ellahathaway
    Changes: #19205

  10. πŸ—‚οΈ Fix remembered AppHost folder in multi-root workspaces
    In multi-root VS Code workspaces, the extension now remembers which workspace folder's AppHost was selected instead of always resolving to the first folder on a later F5.
    Owner: @adamint
    Changes: #19359

  11. πŸš€ Honor selected AppHost launch profile in VS Code
    The VS Code extension now honors the AppHost launch profile selected in launch.json instead of launching with the default profile's environment variables and URL when an older Aspire CLI flattens them.
    Owner: @adamint
    Changes: #19400

  12. ⚑ Fix Azure Functions task launch in VS Code
    Fixed Azure Functions resources failing to start in current VS Code releases by launching them through an Aspire-owned registered func: host start task instead of relying on a dynamic task type VS Code doesn't recognize.
    Owner: @adamint
    Changes: #19313

  13. πŸ› VS Code debugger fixes for browser targets, webRoot, and shutdown ordering
    Fixed VS Code debugger issues: browser debug targets now validate against an explicit allowlist with clearer errors, empty webRoot values no longer break source-map resolution, and resource debug sessions now stop in an ordered, concurrent sequence before the AppHost.
    Owner: @adamint
    Changes: #19145

  14. πŸͺŸ Close dashboard debug browsers when sessions end
    Stopping an Aspire debug session in VS Code now also closes the dashboard browser by default, preventing orphaned browser windows from accumulating after AppHosts stop.
    Owner: @adamint
    Changes: #19296

  15. πŸ”— Fix AppHost editor state in symlinked workspaces
    CodeLens and gutter resource state now keep working when an AppHost is opened through a symlinked workspace path. The extension falls back to canonical filesystem paths when normalized paths do not match directly.
    Owner: @adamint
    Changes: #19292

  16. πŸ”Œ Fix DCP session termination when stopping resources from VS Code
    Stopping a VS Code-controlled resource from the Aspire dashboard now reliably emits a single terminal notification and keeps DCP run-session lifecycle consistent across requested stops, natural exits, and stale WebSocket reconnects.
    Owner: @adamint
    Changes: #19125

  17. 🎯 Keep launch-configuration AppHost targets out of the workspace default
    Debugging a specific AppHost via a launch.json configuration no longer silently overwrites the workspace's default AppHost in aspire.config.json. The default is only established or replaced through normal discovery or explicit user selection.
    Owner: @adamint
    Changes: #19126

πŸ”Œ Integrations

20 new features, 9 improvements, 17 bug fixes

New features

  1. ⌨️ Docked REPL commands for database and cache integrations
    Added opt-in dashboard REPL access for PostgreSQL, Redis, Valkey, MongoDB, MySQL, and SQL Server. Selecting the REPL command on a running resource opens the bundled client (psql, redis-cli, valkey-cli, mongosh, mysql, or sqlcmd) in the dashboard terminal dock, already authenticated to the container, so developers can query local resources without installing clients or copying credentials.
    Owner: @mitchdenny
    Changes: #20419
    Docs: microsoft/aspire.dev#1752
    πŸ“ Documentation required

  2. 🧬 Complete Azure provisioning SDK integration coverage
    Twelve new opt-in Azure Provisioning SDK proxy packages let polyglot AppHosts customize generated Bicep for AppConfiguration, AppContainers, AppService, Cdn, ContainerService, Kusto, Network, PrivateDns, PostgreSql, Redis, RedisEnterprise, and SignalR, extending the experimental proxy model to the remaining hosting integrations.
    Owner: @sebastienros
    Changes: #20131
    Docs: microsoft/aspire.dev#1748
    πŸ“ Documentation required

  3. 🧭 Launch profile options for polyglot addDotnetProject
    Polyglot AppHosts can now configure named or excluded .NET launch profiles when calling addDotnetProject, using a new flat DotnetProjectOptions object that supports launchProfileName, excludeLaunchProfile, and excludeKestrelEndpoints with the same semantics as the existing C# options.
    Owner: @karolz-ms
    Changes: #20157
    Docs: microsoft/aspire.dev#1695
    πŸ“ Documentation required

  4. ⚑ Azure Container Apps Express support
    Added experimental, opt-in support for Azure Container Apps Express deployment mode via .AsExpress() on a Container App environment (available from both C# and TypeScript AppHosts). Express environments default to zero minimum replicas and skip the implicit Consumption workload profile, managed dashboard, and .NET data-protection configuration, while app-to-app references resolve to standard public HTTPS endpoints.
    Owner: @eerhardt
    Changes: #20115
    Docs: microsoft/aspire.dev#1694
    πŸ“ Documentation required

  5. πŸƒ MongoDB replica set resource
    Introduced a new MongoDBReplicaSetResource meta-resource type for modeling a MongoDB replica set as a single Aspire resource. A follow-up adds a simpler WithReplicaSet() opt-in directly on the standalone MongoDB server resource, enabling transactions and change streams for the common single-member inner-loop scenario without a separate replica-set resource or TLS configuration.
    Owner: @sebastienros
    Changes: #18196, #19961
    Docs: microsoft/aspire.dev#1730
    πŸ“ Documentation required
    🌍 Community contribution by @aradalvand

  6. 🧬 Polyglot Azure provisioning proxy SDKs
    Polyglot AppHosts written in TypeScript, Python, Go, and Java can now customize generated Azure infrastructure the same way C# AppHosts do, using new opt-in, integration-specific Azure provisioning proxy packages (Application Insights, Cognitive Services, Container Registry, Cosmos DB, Event Hubs, Key Vault, Operational Insights, Search, Service Bus, SQL, Storage, and Web PubSub). Each ConfigureInfrastructure callback exposes Bicep literals, expressions, secure values, and resource references through a bounded, source-generated ATS surface.
    Owner: @sebastienros
    Changes: #19675
    Docs: microsoft/aspire.dev#1756
    πŸ“ Documentation required

  7. ⏱️ Configurable DevTunnel idle expiration
    Added a WithExpiration(int expirationHours) option for DevTunnel resources so AppHosts can set the tunnel's idle expiration explicitly, from 1 hour up to 30 days. This helps keep dev tunnel usage under account limits without manually deleting tunnels.
    Owner: @krubenok
    Changes: #19987
    πŸ“ Documentation required
    🌍 Community contribution by @krubenok

  8. 🧰 Foundry Toolbox resource
    Aspire.Hosting.Foundry now supports Foundry Toolbox data-plane resources, letting AppHosts create toolboxes that bundle web search, MCP, and Azure AI Search tools behind a single MCP endpoint via AddToolbox().
    Owner: @davidfowl
    Changes: #17742
    πŸ“ Documentation required

  9. πŸ”— Azure Connector Namespace integration
    Added the Aspire.Hosting.Azure.ConnectorNamespace integration for provisioning Azure Connector Namespace resources.
    Owner: @spboyer
    Changes: #19024
    πŸ“ Documentation required

  10. πŸ¦• Add Deno hosting support
    Aspire.Hosting.JavaScript now supports first-class Deno application hosting via AddDenoApp / DenoAppResource, running deno run, named deno task tasks, or deno serve handlers alongside the existing Node and Bun support.
    Owner: @sebastienros
    Changes: #18628
    πŸ“ Documentation required
    🌍 Community contribution by @rickylabs

  11. πŸ—ƒοΈ Add CSI volume source to Kubernetes VolumeV1
    VolumeV1 in Aspire.Hosting.Kubernetes now supports the csi volume source, enabling inline ephemeral CSI volumes such as those projected by the Secrets Store CSI driver.
    Owner: @mitchdenny
    Changes: #19826
    πŸ“ Documentation required
    🌍 Community contribution by @timritzer

  12. πŸ“‘ Emit OpenTelemetry from Cosmos DB preview emulator
    The Cosmos DB preview emulator now emits OpenTelemetry traces by default, giving visibility into emulator activity in the dashboard alongside the rest of the application.
    Owner: @davidfowl
    Changes: #15671
    🌍 Community contribution by @afscrome

  13. πŸ“¦ Azure Container Apps Sandboxes deployment target
    Added an experimental Aspire.Hosting.Azure.Sandboxes deployment target so Aspire applications can publish container-backed compute resources to Azure Container Apps Sandboxes.
    Owner: @spboyer
    Changes: #19008, #19801
    Docs: microsoft/aspire.dev#1752
    πŸ“ Documentation required

  14. 🌍 Blazor gateway APIs for polyglot AppHosts
    Polyglot AppHosts (Python, Go, Java, TypeScript, Rust) can now call the DotnetProjectResource-backed Blazor gateway APIs, which were previously only usable from C# AppHosts.
    Owner: @karolz-ms
    Changes: #19026
    Docs: microsoft/aspire.dev#1564
    πŸ“ Documentation required

  15. πŸ› Blazor WebAssembly debugging support
    Blazor hosting now supports opt-in browser debugging for WebAssembly client apps, laying the groundwork for attaching a debugger to Blazor WebAssembly resources launched by the AppHost.
    Owner: @maraf
    Changes: #18928
    πŸ“ Documentation required
    🌍 Community contribution by @maraf

  16. β˜• Java hosting integration
    Adds Aspire.Hosting.Java, a new hosting integration for running and building Java applications (including Maven and Gradle projects), ported and reworked from the Community Toolkit for parity with the existing Rust, Go, Node, and Python resource integrations.
    Owner: @adamint
    Changes: #18033
    Docs: microsoft/aspire.dev#1794
    πŸ“ Documentation required
    🌍 Community contribution by @marshalhayes

  17. πŸ¦€ Add Rust hosting support with VS Code debugging
    Aspire now has first-party support for Rust hosting via a new Aspire.Hosting.Rust integration that models Cargo applications, resolves Cargo targets for debugging and publishing, and exports APIs to C# and polyglot AppHosts. The VS Code extension adds matching debugger wiring for Rust resources and Rust AppHosts.
    Owner: @afscrome
    Changes: #18906
    πŸ“ Documentation required
    🌍 Community contribution by @afscrome

  18. 🌐 Add command to show dev tunnel URLs
    Dev tunnel port resources now publish their public tunnel, inspect, and local endpoint URLs as highlighted resource properties, and add a Show tunnel URLs dashboard action to view them.
    Owner: @maddymontaquila
    Changes: #16842
    Docs: microsoft/aspire.dev#1492
    πŸ“ Documentation required

  19. πŸ’Ύ AKS persistent volume support
    AKS workloads can now configure and mount Kubernetes persistent volumes directly through AddPersistentVolume on AzureKubernetesEnvironmentResource, instead of reaching through to the underlying Kubernetes integration. Claims use the cluster's default storage class, dynamically provisioning an Azure managed disk on standard AKS clusters, when none is specified.
    Owner: @mitchdenny
    Changes: #19226
    Docs: microsoft/aspire.dev#1474
    πŸ“ Documentation required

  20. πŸ” Radius recipe parameters and secret management
    AppHosts can now customize Radius recipe parameters and supply secrets declaratively in the app model, instead of configuring them out-of-band against the cluster.
    Owner: @nellshamrell
    Changes: #18834
    πŸ“ Documentation required

Improvements

  1. πŸ”“ Stabilize Aspire.Hosting.Dotnet APIs
    Aspire.Hosting.Dotnet APIs no longer require the ASPIREDOTNETPROJECT001 experimental suppression to use, though the package itself remains prerelease. The remaining diagnostic references in Blazor gateway methods, tests, and playground code have also been cleaned up.
    Owner: @eerhardt
    Changes: #20496, #20581
    πŸ“ Documentation required

  2. 🚫 Remove redundant experimental annotations from Azure Sandboxes
    Removed the ASPIREAZURE001 experimental-API annotations from Azure Sandbox resources, extension methods, options, and enums, since the entire Aspire.Hosting.Azure.Sandboxes package is already prerelease. Consumers no longer need to suppress ASPIREAZURE001 to use Azure Sandboxes.
    Owner: @eerhardt
    Changes: #20483
    πŸ“ Documentation required

  3. πŸ”— "Manage" link pattern extended to remaining management UI integrations
    phpMyAdmin, pgAdmin, pgweb, Kafka UI, Mongo Express, and Attu now hide their management tool containers and add a "Manage" link back onto the resource(s) they manage, matching the pattern already used by Redis. Qdrant, RabbitMQ, the Durable Task Scheduler emulator, and Cosmos DB's built-in dashboard links are also renamed to "Manage" for consistency, and "Manage" links now sort above a resource's other URLs.
    Owner: @JamesNK
    Changes: #20070
    🌍 Community contribution by @afscrome

  4. πŸͺͺ Front Door origin identity now reflects backend hostname
    Azure Front Door origin names now include the backend hostname, so switching a compute resource's backend creates a distinct origin instead of silently reusing the previous origin's Azure identity. Existing deployments receive new origin names the first time this ships; use ConfigureInfrastructure to restore the previous naming if needed.
    Owner: @eerhardt
    Changes: #20035
    Docs: microsoft/aspire.dev#1646
    ⚠️ Breaking change
    πŸ“ Documentation required

  5. πŸ§ͺ Improve Azure Sandbox defaults
    Azure Sandbox groups now work as compute environments without requiring every workload to opt in through PublishAsAzureSandbox, automatically assigning and deploying projects while keeping endpoints private by default.
    Owner: @mitchdenny
    Changes: #19810
    Docs: microsoft/aspire.dev#1623
    ⚠️ Breaking change
    πŸ“ Documentation required

  6. πŸ“‚ Allow skipping main.bicep generation
    AzurePublishingContext can now skip building and writing the root main.bicep for publishers that deploy each resource module directly, avoiding unnecessary compilation failures for models that don't need the root template.
    Owner: @eerhardt
    Changes: #19914

  7. ⚑ Reuse generated TypeScript fluent promise implementations
    Generated TypeScript SDKs for provisioning proxy packages are now smaller and compile faster: a shared FluentPromise<T> runtime dispatcher replaces hundreds of repeated fluent forwarding implementations, cutting generated SDK size by roughly 10% and clean build time by up to 17% in measured fixtures, with no change to public TypeScript APIs.
    Owner: @sebastienros
    Changes: #19728

  8. 🌐 Cosmos DB emulator now defaults to vNext
    RunAsEmulator for Azure Cosmos DB now defaults to the Linux-based vNext emulator image. A new RunAsClassicEmulator API preserves access to the classic emulator, and the former RunAsPreviewEmulator is now an obsolete alias that forwards to RunAsEmulator.
    Owner: @eerhardt
    Changes: #19510
    Docs: microsoft/aspire.dev#1563
    ⚠️ Breaking change
    πŸ“ Documentation required

  9. πŸ’“ Health check for Azure App Configuration emulator
    The Azure App Configuration emulator now exposes an HTTP health check, so OnResourceReady only fires once the emulator is actually ready to accept requests instead of racing its startup.
    Owner: @sebastienros
    Changes: #19041
    🌍 Community contribution by @zhiyuanliang-ms

Bug fixes

  1. πŸ› Fix Azure sandbox ExtraSmall and Small tier disk sizes
    Fixed Azure sandbox deployments always failing for the ExtraSmall and Small tiers because requested disk sizes exceeded the Azure Container Apps Sandboxes service's per-tier maximum. ExtraSmall now requests 5Gi and Small requests 10Gi, matching the service's cores x 20Gi limit.
    Owner: @eerhardt
    Changes: #20479

  2. πŸ—‘οΈ Removed retired GitHub Models integration
    GitHub Models was fully retired, so the Aspire.Hosting.GitHub.Models integration no longer worked and has been removed from the repository. Existing users must migrate to another model provider, such as Microsoft Foundry. Previously published package versions remain hidden from aspire add.
    Owner: @eerhardt
    Changes: #19848
    Docs: microsoft/aspire.dev#1672
    ⚠️ Breaking change
    πŸ“ Documentation required

  3. πŸ›°οΈ Fixed Radius backing resource connections
    Aspire apps deployed to Radius could not reach their own backing resources (Redis, PostgreSQL, MongoDB, SQL Server, RabbitMQ) because connection values were derived from Aspire's endpoint model instead of the Radius recipe's actual outputs. Connection strings, hosts, ports, usernames, and passwords are now projected from recipe outputs so they always match what the recipe deployed, and misconfigurations that previously failed silently now surface as publish-time diagnostics. Radius is also upgraded to 0.60.
    Owner: @nellshamrell
    Changes: #19555
    ⚠️ Breaking change
    πŸ“ Documentation required

  4. 🩹 Fixed Kafka health-check producer leak
    Kafka AppHost health checks now reuse a DI-owned, keyed singleton producer per resource instead of creating a new producer on every check. This stops polling threads from accumulating over time and releases them when the AppHost is disposed.
    Owner: @davidfowl
    Changes: #20092

  5. πŸ”’ Patched Snappier dependency for MongoDB v2 security fix
    Aspire.MongoDB.Driver.v2 now requires Snappier 1.3.1 or later, fixing a vulnerability (CVE-2026-44302) where malformed compressed data could cause an infinite loop during decompression.
    Owner: @joperezr
    Changes: #20072

  6. πŸ”— Fixed Redis "Manage" links to tool resources
    Redis Commander/Insight "Manage" links now appear on every Redis resource in the app instead of only the one that called WithRedisCommander()/WithRedisInsight(), and a DCP bug that left cross-resource URLs stuck as inactive after the tool started has been fixed.
    Owner: @DamianEdwards
    Changes: #19969
    🌍 Community contribution by @afscrome

  7. πŸ“‘ Fix MAUI OTLP dev tunnel resolution
    Fixed WithOtlpDevTunnel() so MAUI apps on Android and iOS reliably reach the Aspire Dashboard's OTLP endpoint, preferring OTLP/HTTP over the resolved local listener port and refreshing mobile launch environment variables on restart.
    Owner: @IEvangelist
    Changes: #19386
    🌍 Community contribution by @jfversluis

  8. 🚦 Fix MAUI launch queue handoff
    Fixed a NETSDK1085 build failure in the MAUI shared-project launch handoff on .NET SDK 10.0.201 by making the build queue platform-aware, so multiple platform resources for one MAUI project continue to build and launch serially without errors.
    Owner: @IEvangelist
    Changes: #19383
    🌍 Community contribution by @jfversluis

  9. πŸ€– Fix Foundry Local lifecycle and remote endpoints
    Fixed Aspire hanging when Foundry Local daemonizes through the newer foundry server CLI, and added support for connecting to a Foundry Local service already running on another host from WSL2 and Linux AppHosts.
    Owner: @sebastienros
    Changes: #19197
    Docs: microsoft/aspire.dev#1621

  10. 🐍 Fix Python callback handle wrapping
    Fixed Python callbacks exported as resource builder actions receiving the wrong handle type, which caused calls like with_host_port to fail at runtime.
    Owner: @sebastienros
    Changes: #19870

  11. πŸ”€ Fix enum values in YARP environment configuration
    Fixed WithForwarderRequestConfig enum values such as HttpVersionPolicy.RequestVersionExact being dropped when YARP configuration was flattened to environment variables, which prevented HTTPS-terminating proxies from forwarding gRPC traffic to h2c backends correctly.
    Owner: @IEvangelist
    Changes: #19403
    🌍 Community contribution by @air-hand

  12. πŸ₯ Implement health checks for Azure AI Inference clients
    Health checks for Aspire.Azure.AI.Inference's ChatCompletionsClient and EmbeddingsClient now actually run instead of being silently disabled β€” they were previously hardcoded off and would throw NotImplementedException if enabled.
    Owner: @sebastienros
    Changes: #15969
    🌍 Community contribution by @Formatted

  13. 🩺 Fix DevTunnel health check for auto-selected regions
    Fixed DevTunnel health checks failing when a tunnel region was auto-selected, because per-port access queries require the cluster-qualified tunnel ID rather than the bare tunnel ID returned by devtunnel show.
    Owner: @DamianEdwards
    Changes: #19230
    🌍 Community contribution by @Vladipz

  14. 🧡 Fix TypeScript codegen Promise wrapper for zero-capability builders
    Fixed TypeScript AppHost codegen so exported methods returning a zero-capability resource builder still generate the *Promise wrapper, preventing TS2552 compile errors for undeclared references such as ResourceWithServiceDiscoveryPromise.
    Owner: @adamint
    Changes: #19577
    🌍 Community contribution by @flojon

  15. 🩺 Cosmos DB health check
    The Azure Cosmos DB client integration now registers a health check, so /health and readiness probes correctly report unhealthy when Cosmos DB is unreachable instead of falsely reporting healthy.
    Owner: @thomhurst
    Changes: #18554
    🌍 Community contribution by @thomhurst

  16. πŸ”‘ Pin AKS credential fetch to the deployment subscription
    Fetching AKS cluster credentials during deployment now passes --subscription to the Azure CLI, so it always targets the subscription Aspire selected for the deployment rather than whichever subscription the ambient az CLI happened to default to (a risk for multi-subscription tenants and CI agents).
    Owner: @mitchdenny
    Changes: #19219
    Docs: microsoft/aspire.dev#1476
    πŸ“ Documentation required

  17. πŸ› Fix duplicate default Azure Storage service
    Fixed a bug where adding a custom-named blob, queue, or data lake service and then calling AddBlobContainer/AddQueue/AddDataLakeFileSystem created a duplicate default-named service instead of reusing the custom one.
    Owner: @spboyer
    Changes: #16275

πŸ“„ Templates

1 bug fix

Bug fixes

  1. 🩹 Fixed port replacer leaking into vendored files
    The aspire-starter template's port substitution previously replaced any matching numeric literal, corrupting unrelated values in vendored files like bootstrap.bundle.js when they happened to match a default port. Port substitution now only applies in localhost:<port> contexts, so generated projects no longer have spurious diffs in vendored assets.
    Owner: @JamesNK
    Changes: #20031
    🌍 Community contribution by @bart-vmware

πŸ§ͺ Testing

1 new feature

New features

  1. πŸ§ͺ Run the dashboard from tests
    DistributedApplicationTestingBuilderOptions now supports EnableDashboard, allowing an application test to start the Aspire dashboard alongside the app under test and retrieve its login URL.
    Owner: @adamint
    Changes: #19135
    πŸ“ 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: βœ… 229 included Β· ❌ 196 excluded Β· ⏳ 0 unprocessed Β· 425 total merged in milestone (View full PR tracker) Docs PRs: βœ… 60 included Β· ❌ 111 excluded Β· ⏳ 0 unprocessed Β· 171 total from microsoft/aspire.dev (View docs PR tracker) PRs analyzed through: #20583 merged 2026-09-29 18:49 UTC