Skip to content

17.0 Change log

github-actions[bot] edited this page Oct 17, 2026 · 25 revisions

Table of Contents

24 new features, 56 improvements, 39 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, 16 improvements, 6 bug fixes

New features

  1. ⚡ TypeScript Azure Functions app support
    AppHost can now model, run, publish, and deploy TypeScript/JavaScript Azure Functions apps (Node worker) as directory-based resources, with local Core Tools launch support and deterministic Dockerfile publishing for Azure Container Apps.
    Owner: @davidfowl
    Changes: #17980
    📝 Documentation required

  2. 🪪 Entra ID application hosting integration
    Added a new Aspire.Hosting.Azure.EntraId integration that models Entra ID application registrations as a first-class AppHost resource, including client-secret, certificate, and federated-identity credential types. This provides a single source of truth that the AppHost, CLI, and dashboard can read to configure authentication for referencing services and project publish-mode federated credentials.
    Owner: @eerhardt
    Changes: #14668
    📝 Documentation required
    🌍 Community contribution by @jmprieur

  3. 🎛️ Optional and programmatic parameter values
    Parameter resources can now be marked optional with WithOptional()/WithRequired(), allowing unset values to resolve to null without prompting or blocking publish. AppHost code can also inspect and set parameter values programmatically with TryGetCurrentValue() and SetValueAsync(), with changes syncing to the dashboard and prompts across C# and TypeScript AppHosts.
    Owner: @davidfowl
    Changes: #18108
    📝 Documentation required

  4. 🔑 Kubernetes fileKeyRef environment variable support
    Kubernetes workloads can now source individual environment variables from an env file written by an init container, using the new FileKeySelectorV1 and EnvVarSourceV1.FileKeyRef APIs matching Kubernetes 1.35's EnvFiles schema, without mounting the file or overriding the entrypoint.
    Owner: @mitchdenny
    Changes: #20847
    Docs: microsoft/aspire.dev#1868
    📝 Documentation required

  5. 🚇 Configurable container tunnel base image
    Aspire now exposes configuration for the base image used by DCP's container network tunnel, via aspire config set containerTunnel.baseImage, the DcpPublisher:ContainerTunnelBaseImage setting, or the --dcp-container-tunnel-base-image argument. This lets environments that require a customized or mirrored image configure the tunnel without modifying DCP directly.
    Owner: @danegsta
    Changes: #20667
    📝 Documentation required

  6. 📦 Customizable Kubernetes PersistentVolumeClaims
    Adds WithConfiguration(...) for customizing the generated Kubernetes PersistentVolumeClaim for first-class persistent volumes, plus WithoutStorageClass() and polyglot WithPersistentVolumeName(...) for claiming existing volumes. This lets callers mutate claim metadata and spec fields not covered by the existing volume configuration methods.
    Owner: @mitchdenny
    Changes: #19900
    📝 Documentation required
    🌍 Community contribution by @cdbrown2018

Improvements

  1. 📦 Deprecate Aspire.AppHost.Sdk
    Aspire.Hosting.AppHost.Sdk is now obsolete (ASPIRE012) as the default C# AppHost experience moves to explicit package references, AddDotnetProject, and the CLI bundle. The warning is suppressible via SuppressAspireAppHostSdkObsoleteWarning or NoWarn, and C# templates/aspire init now generate projects using the explicit AppHost and Dotnet packages instead of the SDK.
    Owner: @davidfowl
    Changes: #20867
    ⚠️ Breaking change
    📝 Documentation required

  2. ☸️ Standard control-plane tier default for AKS clusters
    Aspire-managed AKS clusters now default to the Standard control-plane tier, providing an uptime SLA suited for production as the integration moves toward general availability. Existing AppHost code can opt back into the Free tier via ConfigureInfrastructure; applying updated infrastructure to an existing cluster can change its tier and introduce a cluster-management charge.
    Owner: @mitchdenny
    Changes: #20917
    ⚠️ Breaking change
    📝 Documentation required

  3. 🧹 Graduate Dockerfile builder APIs to stable
    Consumers can now use the Dockerfile builder API family without suppressing the ASPIREDOCKERFILEBUILDER001 experimental-API warning. Signatures, defaults, and runtime behavior are unchanged.
    Owner: @mitchdenny
    Changes: #20823

  4. 🧹 Graduate deployment-state APIs to stable
    Consumers can now use IDeploymentStateManager and DeploymentStateSection without suppressing the ASPIREPIPELINES002 experimental-API warning. Signatures, defaults, and behavior are unchanged.
    Owner: @mitchdenny
    Changes: #20816

  5. 🧹 Graduate user secrets APIs to stable
    Consumers can now use Aspire's user-secrets manager (IUserSecretsManager, IDistributedApplicationBuilder.UserSecretsManager) without suppressing the ASPIREUSERSECRETS001 experimental-API warning. Signatures, defaults, and persistence behavior are unchanged.
    Owner: @mitchdenny
    Changes: #20817

  6. ⚠️ Obsolete AddCSharpApp in favor of AddDotnetProject
    AddCSharpApp is now marked [Obsolete] with a warning directing consumers to AddDotnetProject from Aspire.Hosting.Dotnet. Signatures, defaults, and behavior are otherwise unchanged; existing callers should migrate to AddDotnetProject.
    Owner: @mitchdenny
    Changes: #20825
    ⚠️ Breaking change
    📝 Documentation required

  7. 🧹 Graduate pipeline output service APIs to stable
    Consumers can now use IPipelineOutputService and related pipeline output-directory APIs without suppressing the ASPIREPIPELINES004 experimental-API warning. Method signatures, output/temp-directory behavior, and lifecycle semantics are unchanged.
    Owner: @mitchdenny
    Changes: #20814

  8. 🧹 Graduate core pipeline APIs to stable
    Consumers can now use the core pipeline API family (including IDistributedApplicationBuilder.Pipeline) without suppressing the ASPIREPIPELINES001 experimental-API warning. This is an attribute-only graduation; signatures, defaults, and runtime behavior are unchanged.
    Owner: @mitchdenny
    Changes: #20809

  9. 🧹 Graduate HTTP probe APIs to stable
    Consumers can now use the existing HTTP probe APIs (WithHttpProbe and related types) without suppressing the ASPIREPROBES001 experimental-API warning. This is an attribute-only graduation; signatures, defaults, and runtime behavior are unchanged.
    Owner: @mitchdenny
    Changes: #20813

  10. 🧹 Graduate filesystem APIs to stable
    Consumers can now use Aspire's filesystem services and temporary-file abstractions (IFileSystemService, ITempFileSystemService, TempDirectory, TempFile) without suppressing the ASPIREFILESYSTEM001 experimental-API warning. APIs, signatures, and behavior are unchanged.
    Owner: @mitchdenny
    Changes: #20808

  11. 🙈 Hide terminal hosts by default
    Terminal hosts are now always hidden by default instead of being controlled by a separate TerminalOptions.ShowTerminalHost AppHost option, which has been removed. Use the dashboard's Show hidden resources control to reveal them without restarting the AppHost.
    Owner: @mitchdenny
    Changes: #20756
    ⚠️ Breaking change
    📝 Documentation required

  12. 🌉 Use Blazor gateway CLI during development
    Standalone Blazor WebAssembly apps added via AddBlazorWasmApp/AddBlazorGateway now use the official Blazor Gateway CLI during local development instead of Aspire's generated file-based gateway, keeping development aligned with the ASP.NET Core gateway implementation while preserving the existing API, endpoints, and dashboard experience.
    Owner: @JamesNK
    Changes: #19432
    📝 Documentation required
    🌍 Community contribution by @javiercn

  13. 🔇 Quieter AppHost logs for CLI connections and readiness checks
    AppHost diagnostic logs are quieter during normal operation: expected CLI backchannel connects/disconnects and already-healthy resource readiness checks no longer emit routine Debug noise, and the CLI backchannel filters noisy HttpClientFactory Debug logs. Errors and unexpected failures are still reported.
    Owner: @JamesNK
    Changes: #20542

  14. 🔢 DisplayOrder property for resource URLs
    ResourceUrlAnnotation.DisplayOrder is now a non-obsolete, nullable read/write property instead of an obsolete field, so consumers can set WithUrlForEndpoint ordering without obsolete warnings. Replacing a field with a property is a binary compatibility break for consumers compiled against the old field; rebuild against the updated package.
    Owner: @JamesNK
    Changes: #20637
    ⚠️ Breaking change
    📝 Documentation required

  15. 🔒 Consistent local socket permissions
    Backchannel, DCP, and terminal local sockets now consistently get restrictive directory and endpoint permissions before binding, reducing the risk of other local users accessing these channels.
    Owner: @mitchdenny
    Changes: #20330

  16. 🧭 Clearer startup error reporting
    Startup failures now surface the specific DCP dependency-check reason (such as an unsupported Docker CLI version) in warnings and exceptions, and executable process-start failures include the resolved working directory to help distinguish an invalid working directory from an invalid executable path.
    Owner: @karolz-ms
    Changes: #20334

Bug fixes

  1. 🚦 Fail promptly when dotnet run launches an AppHost in publish mode
    dotnet run --operation publish no longer hangs at "Starting dashboard..." when the CLI run hook starts an AppHost in publish mode. The backchannel now rejects the dashboard-readiness request and exits promptly with guidance to use aspire publish instead.
    Owner: @DamianEdwards
    Changes: #21065

  2. 🚰 Keep DCP watches draining and close abandoned connections
    Aspire now actively drains DCP watch responses and closes them on cancellation or periodic restart, so a paused resource handler or canceled watch setup no longer exhausts the HTTP/2 receive window and blocks DCP watcher publication and resource mutations.
    Owner: @danegsta
    Changes: #20972

  3. 🔐 Pre-acquire Azure deployment token audiences
    Azure deployments using short-lived federated credentials could finish lengthy ARM provisioning and then fail when ACR authentication requested a different token audience. Deployment now pre-acquires all required token audiences before resource-group creation, avoiding this class of late-stage authentication failure.
    Owner: @mitchdenny
    Changes: #20907

  4. 🧯 Recover ambiguous DCP creates with configurable timeouts
    Resources no longer fail to start after a timed-out or HTTP 504 DCP create that the server actually committed. AppHost now checks for an existing resource before retrying, with configurable KubernetesApiTimeout, KubernetesInitializationAdditionalTimeout, and KubernetesCreateRecoveryTimeout settings for slower environments.
    Owner: @danegsta
    Changes: #20752
    📝 Documentation required

  5. 🐛 Fix Go AppHost start timeout error
    Fixed a Go AppHost startup timeout error caused by the generated ATS transport client, so Go-authored AppHosts start reliably.
    Owner: @IEvangelist
    Changes: #20086

  6. 🧯 Skip Blazor WASM client discovery on unsupported SDKs instead of crashing
    Hosted Blazor WebAssembly client discovery no longer crashes the entire AppHost with an MSB4057 error when the active .NET SDK doesn't support the required MSBuild target. Aspire now probes the SDK version first and logs a warning and skips discovery instead of throwing.
    Owner: @JamesNK
    Changes: #20575
    🌍 Community contribution by @maraf

💻 CLI

5 new features, 9 improvements, 3 bug fixes

New features

  1. 🔐 Environment-specific Aspire secrets for deployment
    Added aspire secret commands (set, get, list, delete, path) with --environment/-e support, so deployment workflows can configure secrets per environment ahead of time instead of relying on Development-only user secrets or prompts. Secrets now live in Aspire-owned files under ~/.aspire/secrets/<apphost-id>/<environment>.json, with existing Development .NET user secrets imported automatically.
    Owner: @davidfowl
    Changes: #20135
    ⚠️ Breaking change
    📝 Documentation required

  2. 🌐 Polyglot hosting integrations through ATS projection
    Hosting integrations can now be authored outside .NET through Aspire's ATS metadata, SDK generation, and runtime dispatch pipeline. A consuming AppHost gets normal generated builder methods while the integration runs in its own runtime and configures the same .NET resource model as a managed integration. TypeScript-authored examples ship today, including Kafka, Deno, and a real @aspire/nuxt preview integration.
    Owner: @davidfowl
    Changes: #16110
    📝 Documentation required

  3. 📡 CLI Azure Monitor log export for product events
    The CLI now exports reported usage/error events and errors to Azure Monitor as structured logs, in addition to its existing operation-span trace export. This uses a separate, isolated telemetry pipeline honoring ASPIRE_CLI_TELEMETRY_OPTOUT.
    Owner: @JamesNK
    Changes: #20730
    📝 Documentation required

  4. 🖥️ Experimental tray companion for AppHost management
    An experimental native tray companion (macOS menu bar / Windows notification area) lets users manage running AppHosts — view health, open the dashboard, stop instances, and pin favorites — without repeatedly running aspire ps. Start it with aspire tray start; the CLI supplies a versioned discovery/health stream backing the native frontend.
    Owner: @davidfowl
    Changes: #20096
    📝 Documentation required

  5. ⌨️ CLI shell completions
    Adds aspire completions script [bash|fish|pwsh|zsh] to generate shell tab-completion scripts for commands, subcommands, options, and completion-enabled values. Release installers (shell, PowerShell, Homebrew) register completions automatically where supported, with a --skip-completions opt-out.
    Owner: @DamianEdwards
    Changes: #20026
    📝 Documentation required

Improvements

  1. 🤝 Unified agent client and scope selection
    aspire agent init, new, and init now share a unified prompt flow for choosing agent clients (GitHub Copilot, Claude Code, OpenCode), assets, and project/global installation scope, instead of asking users to pick skill folders directly. Detected agents are preselected, and selecting no agents performs no writes.
    Owner: @ellahathaway
    Changes: #20932
    📝 Documentation required

  2. 🩺 WSLc recognized by aspire doctor
    aspire doctor now recognizes WSLc as a supported container runtime on Windows and only checks the runtime you've configured via the environment variable, instead of reporting unrelated problems from runtimes you aren't using. Auto-detection lists all installed runtimes (Docker, Podman, WSLc) in priority order and marks the active one.
    Owner: @danegsta
    Changes: #21004
    Docs: microsoft/aspire.dev#1898
    📝 Documentation required

  3. 🔄 Unified NuGet restore and channel-update policy for AppHosts
    Unified how the CLI composes NuGet restore, package/template discovery, and channel-update policy across package-only and polyglot AppHosts, so the packages offered by discovery now agree with what can actually be restored and persisted configuration stays consistent after a channel update.
    Owner: @danegsta
    Changes: #19763
    📝 Documentation required

  4. 🚀 TerminalHost ships as a standalone Native AOT executable
    WithTerminal() now launches a standalone Native AOT Aspire.TerminalHost executable instead of running inside the managed aspire-managed process, improving startup and resource usage. Older Hosting versions keep working through a thin aspire-managed terminalhost compatibility shim.
    Owner: @mitchdenny
    Changes: #20775
    Docs: microsoft/aspire.dev#1866
    📝 Documentation required

  5. 🛟 More durable telemetry shutdown
    CLI and Dashboard product telemetry shutdown now follows an explicit persist-first policy: successful local commands write queued telemetry without waiting on ingestion, failed commands get a bounded persistence-and-delivery window, and CI commands attempt delivery immediately instead of relying on a later invocation. No commands or flags changed.
    Owner: @JamesNK
    Changes: #20851
    Docs: microsoft/aspire.dev#1864
    📝 Documentation required

  6. 🔏 Hardened Sigstore cache configuration
    The CLI's Sigstore and TUF dependencies are upgraded to stable 1.1.0, using one shared verifier configured via dependency injection with its TUF cache under ~/.aspire/cache/tuf. This improves attestation verification reliability for npm and GitHub artifacts and respects custom Aspire-home settings.
    Owner: @mitchdenny
    Changes: #20538

  7. 🔓 Terminal commands available by default
    The aspire terminal commands (ps, attach, tape play) are now available by default without enabling the features.terminalCommandsEnabled experimental flag. The experimental WithTerminal() AppHost API is unchanged.
    Owner: @mitchdenny
    Changes: #20525
    📝 Documentation required

  8. 🎯 CLI retargeted to .NET 11
    The Aspire CLI now targets .NET 11 instead of .NET 10. Behavior for users of the native aspire binary is unchanged, but the Aspire.Cli.<rid> dotnet tool packages now place the binary under tools/any/<rid>/ instead of a TFM-specific folder, matching the pointer package's layout.
    Owner: @eerhardt
    Changes: #20436

  9. ⚡ Faster agent telemetry hooks
    Reduces CLI agent telemetry hook startup overhead by removing shell startup and synchronous upload waits, while preserving existing telemetry coverage. Also upgrades OpenTelemetry packages, which lowers the default maximum OTLP request size from 128 MiB to 64 MiB; configure OtlpExporterOptions.MaxRequestSizeBytes if your project relies on the previous limit.
    Owner: @IEvangelist
    Changes: #20387
    ⚠️ Breaking change
    📝 Documentation required

Bug fixes

  1. ⚖️ Fix CLI/SDK version-skew warning false positives
    The CLI/SDK version-skew warning now appears only when the CLI has lower precedence than the AppHost's SDK, so newer CLIs running AppHosts pinned to older SDKs no longer see a misleading warning. During aspire update, the comparison now checks the target SDK version instead of the stale on-disk value.
    Owner: @spboyer
    Changes: #20477

  2. 🔧 Fix experimental polyglot AppHost feature key names
    aspire config set for experimental polyglot AppHost languages (Java, Go, Python, Rust) now uses flat feature keys (e.g., experimentalPolyglotJava) instead of colon-separated names, which previously produced an invalid nested features object. Existing settings using the old experimentalPolyglot:java-style keys must be renamed to the new flat key names.
    Owner: @sebastienros
    Changes: #20481
    ⚠️ Breaking change
    📝 Documentation required

  3. 🧹 Fix Windows AppHost cleanup leaving stray containers
    On Windows, session-scoped containers could survive AppHost shutdown (via Ctrl+C or aspire stop) because DCP was killed by a nested process job before it finished cleanup. .NET AppHosts launched through dotnet run/dotnet watch now let DCP complete removing session-scoped resources, while persistent resources are unaffected.
    Owner: @danegsta
    Changes: #20494

📊 Dashboard

6 new features, 19 improvements, 14 bug fixes

New features

  1. 🔌 Terminal disconnect recovery
    The dashboard now keeps the last terminal screen (including Sixel/Kitty graphics) visible when a workload exits or the connection drops, instead of clearing it. A disconnect banner explains what happened and offers recovery actions: restarting the owning resource for resource terminals, or closing the tab for docked terminals, while a collapsible top-right icon lets you uncover the retained output.
    Owner: @mitchdenny
    Changes: #20726
    📝 Documentation required

  2. 📈 Dashboard startup telemetry
    The Dashboard now records an aspire/dashboard/startup product telemetry event capturing startup result, duration, and launch context (AppHost, CLI, or container), helping track startup reliability and performance across launch scenarios.
    Owner: @JamesNK
    Changes: #20846
    Docs: microsoft/aspire.dev#1867
    📝 Documentation required

  3. 📖 Markdown descriptions in text visualizer dialogs
    Text visualizer dialogs (used for Mermaid graph exports and other content) can now show an optional Markdown description above the source or rendered content, with a link to relevant Aspire documentation.
    Owner: @JamesNK
    Changes: #20819
    Docs: microsoft/aspire.dev#1863
    📝 Documentation required

  4. 🖍️ Add SQL highlighting to the dashboard text visualizer
    The dashboard's text visualizer now applies syntax highlighting to SQL content, making query text easier to read alongside the existing JSON and XML highlighting.
    Owner: @JamesNK
    Changes: #20754
    📝 Documentation required

  5. 🧭 Add Mermaid resource graph export to the dashboard and CLI
    Resource graphs can now be exported as Mermaid diagrams from both the dashboard (Export as Mermaid, with copy/download as resources.mmd) and the CLI via aspire resources --format mermaid / aspire describe --format mermaid, reflecting current filters and hidden-resource visibility.
    Owner: @mitchdenny
    Changes: #20746
    📝 Documentation required

  6. 🔌 Setting to disable Dashboard WebSocket compression
    A new Dashboard:Frontend:DisableWebSocketCompression setting lets users disable Blazor WebSocket compression through configuration or an environment variable, fixing standalone Dashboard initialization failures behind IIS ARR without needing to strip headers at the reverse proxy.
    Owner: @JamesNK
    Changes: #20633
    📝 Documentation required

Improvements

  1. 📡 Align dashboard and CLI telemetry metadata
    Dashboard product telemetry attributes are renamed to lowercase, dot-separated OpenTelemetry-style keys and now share the CLI's environment, OS, machine, and Microsoft-internal enrichment. Startup events also report the configured persistence mode (none, run, resume, or unknown).
    Owner: @JamesNK
    Changes: #20905
    ⚠️ Breaking change
    📝 Documentation required

  2. 📦 Migrate dashboard consumers to canonical Aspire images
    Dashboard consumers (Docker Compose, Kubernetes, and standalone documentation) now reference the canonical mcr.microsoft.com/aspire image repositories instead of the legacy dotnet/aspire-dashboard repositories. Generated deployments keep their existing pinned tags; only the repository name changes.
    Owner: @IEvangelist
    Changes: #20177
    Docs: microsoft/aspire.dev#1679

  3. 🙈 Visually distinguish hidden resources
    Hidden resources shown via "Show hidden resources" now display an eye-off icon and a subtle background tint in the Resources grid, Parameters view, and graph, making them easy to distinguish from normally visible resources without appearing disabled.
    Owner: @JamesNK
    Changes: #20155
    🌍 Community contribution by @afscrome

  4. 📡 Migrate Dashboard product telemetry to Azure Monitor
    Dashboard product usage/error reporting moves from the IDE telemetry transport to direct Azure Monitor export, so reporting now works for CLI-launched, standalone, and deployed dashboards without an IDE debug session or OpenTelemetry Collector. Dashboard product telemetry no longer honors IDE telemetry consent; set ASPIRE_DASHBOARD_TELEMETRY_OPTOUT=true to opt out instead.
    Owner: @JamesNK
    Changes: #20730
    ⚠️ Breaking change
    📝 Documentation required

  5. ⌨️ Add Terminals keyboard shortcut and improve shortcut help
    The dashboard's Terminals page now has a keyboard shortcut (E) to open it, matching its navigation availability. Shortcut help also places Page navigation before Panels and aligns category card heights for a cleaner layout.
    Owner: @JamesNK
    Changes: #20748

  6. ⚡ Reduce dashboard CPU under sustained metric ingestion
    Dashboard CPU usage no longer steadily increases under sustained metric ingestion. Metric retention previously re-ranked every retained point on each insertion even when below the retention limit; it now caches the retained point count and only trims the oldest surplus points when capacity is exceeded, giving roughly 45x faster exports in benchmarks.
    Owner: @JamesNK
    Changes: #20736

  7. 🧵 Preserve child exception stacks in dashboard error telemetry
    Dashboard telemetry for Blazor circuit errors now records the child exception types, messages, and stack traces from aggregate disposal exceptions instead of an empty aggregate stack trace, so disposal failures can be traced back to the affected components.
    Owner: @JamesNK
    Changes: #20732

  8. ⌨️ Prefer Terminal shortcuts for terminal-enabled resources
    Resource rows now use Terminal as their default output shortcut when a live terminal is defined, instead of always defaulting to Console logs. Ordinary resources, disconnected dashboards, and historical runs still default to Console logs, and both views remain reachable from resource menus.
    Owner: @mitchdenny
    Changes: #20719

  9. 🖥️ Upgraded terminal engine with new navigation and metadata
    The dashboard terminal integration is upgraded to Hex1b 0.171.0, adding a canvas overlay scrollbar with retained command marks, a header showing workload title/working directory/progress with copy support, reorderable dock tabs with keyboard and drag/drop support, and an explicit Dark/Light terminal palette selector independent of the dashboard theme. A follow-up upgrade to Hex1b 0.172.0 further refines the scrollbar with circular command markers, improved marker hit-testing, rounded track geometry, and palette-derived colors.
    Owner: @mitchdenny
    Changes: #20255, #20721
    📝 Documentation required

  10. 🏷️ Configure dashboard OTLP service name
    Dashboard traces exported through OTLP now use aspire-dashboard as the default service.name instead of the OpenTelemetry SDK's generic default, making dashboard telemetry identifiable. Deployments can still override the name with OTEL_SERVICE_NAME.
    Owner: @JamesNK
    Changes: #20600
    📝 Documentation required

  11. ⌨️ Keycap styling for terminal F6 shortcut
    The terminal footer's F6 shortcut is now rendered as a theme-aware keyboard key (kbd) instead of plain text, making it easier to recognize as a focus-the-controls shortcut.
    Owner: @JamesNK
    Changes: #20694

  12. 🔔 Smaller dashboard notification badge
    The dashboard header notification badge is more compact: 18x18px for single-digit counts and 22x18px for the "9+" overflow indicator, down from roughly 26x20px.
    Owner: @JamesNK
    Changes: #20647

  13. 🖳 Dedicated dashboard Terminals page
    Resource terminals now have a dedicated Terminals page in the dashboard navigation instead of sharing the Console logs page, making terminals easier to discover and keeping log viewing focused. The page defaults to no selection and only lists terminal-capable resources.
    Owner: @JamesNK
    Changes: #20650
    📝 Documentation required

  14. 🧹 Simplified dashboard terminal navigation
    The dashboard's top-right Terminals button and mobile Terminal menu entry are removed to reduce navigation clutter. The backtick (`) shortcut remains the entry point for opening the terminal dock on both desktop and mobile layouts.
    Owner: @mitchdenny
    Changes: #20528
    📝 Documentation required

  15. ✨ Match dashboard brand hover to Aspire website
    Hovering the dashboard logo, application name, or page title now applies the same brightness treatment used on aspire.dev, in both light and dark themes.
    Owner: @JamesNK
    Changes: #20416

  16. 🖌️ Update Fluent UI to v5 RTM
    Updates Fluent UI Blazor Components and Icons to the 5.0.0 RTM release. The AppBar overflow trigger now renders as a native button matching the navigation toggle's sizing, icon alignment, and hover styling, and dashboard navigation shuts down cleanly instead of failing when a browser disconnects during a pending page-state update.
    Owner: @JamesNK
    Changes: #20527
    📝 Documentation required

  17. 🧽 Simplify terminal dock empty state
    The terminal dock's empty state is simplified to its heading, console icon, documentation link, and backtick-key hint. The More information link is now a plain underlined text link with a visible keyboard-focus outline instead of a button-styled hover background.
    Owner: @mitchdenny
    Changes: #20537
    📝 Documentation required

  18. ❓ Run persistence help in dashboard
    The dashboard run selector menu now includes a Learn about runs option that explains live, historical, and pinned runs and links to the run persistence documentation.
    Owner: @JamesNK
    Changes: #20469
    Docs: microsoft/aspire.dev#1764
    📝 Documentation required

  19. 🎬 Animated terminal dock first open
    The terminal dock now slides into view on its first open after a dashboard refresh, instead of appearing immediately. Subsequent open and close transitions are unchanged.
    Owner: @JamesNK
    Changes: #20414

Bug fixes

  1. 🧯 Fix dashboard command failure toasts with HTML-like output
    Resource command failure toasts no longer throw a rendering exception when the output contains HTML-like text, such as Playwright assertion diagnostics. The output is now HTML-encoded and truncated to a 250-character preview, so the original diagnostic text is shown literally instead of being interpreted as markup.
    Owner: @JamesNK
    Changes: #20888

  2. 📉 Fix histogram temporality and bucket aggregation
    Histogram charts on the Metrics page no longer show incorrect counts or percentiles with delta data, cumulative resets, or mismatched bucket layouts across dimensions. When selected dimensions share no bucket boundaries, percentiles are now hidden with a warning instead of showing invented values, while the count view remains usable.
    Owner: @JamesNK
    Changes: #20755
    Docs: microsoft/aspire.dev#1865
    📝 Documentation required

  3. 🧩 Fix dashboard graph initialization and teardown errors
    Fixed unhandled errors on the Resources page when switching to the graph view before the first resource snapshot loads, or when the browser circuit disconnects during graph teardown.
    Owner: @JamesNK
    Changes: #20811

  4. 🎯 Fix dashboard selection of shortened resource instance IDs
    Selecting a replicated resource by its shortened GUID instance ID (for example dotnet-cli-6a764b7d) could incorrectly reset the Traces, Structured logs, or Metrics resource selector to (All). Resource lookup now also resolves shortened instance IDs, so selection stays consistent across these pages.
    Owner: @JamesNK
    Changes: #20783

  5. 🔢 Localize dashboard record counts
    Large record counts on the Structured logs, Traces, and Resources pages now use locale-aware digit grouping (for example, 10,000 in en-US versus 10.000 in de-DE) instead of a fixed format.
    Owner: @JamesNK
    Changes: #20753

  6. 🖱️ Fix metrics tree scrolling
    The Metrics page's left-hand meter/instrument tree can now be scrolled with the mouse wheel when it's taller than the window. This regressed when the dashboard moved to Fluent UI Blazor v5, which removed the tree pane's scroll container.
    Owner: @JamesNK
    Changes: #20758
    🌍 Community contribution by @heyysiri

  7. 🔕 Keep connected terminal clipboard and selection errors console-only
    A connected terminal no longer shows a misleading clipboard-permission or selection banner while still connected; these status errors are now logged to the console instead. Fatal disconnections still show the connection-failure banner and retry.
    Owner: @mitchdenny
    Changes: #20720

  8. 🧵 Fix intermittent telemetry read errors during eviction
    The Traces, Spans, Structured Logs, and Metrics views now read dependent SQLite telemetry rows from a consistent snapshot, fixing intermittent HTTP 500 errors and incomplete details when telemetry eviction removed rows between a selection and its related queries.
    Owner: @JamesNK
    Changes: #20597

  9. 📌 Keep dashboard run menu open when pinning
    Pinning or unpinning a historical dashboard run no longer closes the run selector menu. The selector now stays open, preserves the current run selection, and restores focus to the same pin/unpin button while the item re-sorts.
    Owner: @JamesNK
    Changes: #20523
    📝 Documentation required

  10. 🔌 Fix spurious disconnect errors during dashboard layout init
    Disconnecting from the dashboard while its layout restores browser-saved navigation state no longer reports an unhandled JSDisconnectedException circuit error. Other browser-storage read failures are still logged at Information level, and the layout falls back to defaults when storage is unavailable.
    Owner: @JamesNK
    Changes: #20472

  11. 🧰 Fix dashboard filter badges and toolbar navigation
    Dashboard filter badges no longer stay visible with an empty count or shift toolbar height when toggled. Resource details, Structured Logs, and Traces toolbars wrap more correctly at narrow widths, and a mobile Resources tab change no longer leaves a stale navigation queued when the filter panel is closed.
    Owner: @JamesNK
    Changes: #20471

  12. ⌨️ Fix dashboard shortcut availability
    The dashboard help dialog (?) now only lists shortcuts that are actually available. In standalone configurations without a resource service, Resources (r) and Console Logs (c) shortcuts are no longer listed or actionable, while panel shortcuts remain listed on every page.
    Owner: @JamesNK
    Changes: #20413

  13. 📜 Fix Events grid scrollbars
    The trace details Events grid no longer shows scrollbars inside multiline cells that contain nested attribute grids; content now clips with the existing text visualizer available for truncated values.
    Owner: @JamesNK
    Changes: #20425

  14. ✂️ Fix dropdown text truncation
    Long resource names selected in dashboard dropdowns (such as on the Console and Metrics pages) now truncate with an ellipsis on one line instead of being hard-cut before the chevron.
    Owner: @JamesNK
    Changes: #20426

🔧 Engineering

1 bug fix

Bug fixes

  1. 🔒 Fix critical and high dependency vulnerabilities
    Updates dependencies responsible for critical and high security alerts across starter templates, playground apps, VS Code extension tooling, and E2E fixtures (Next.js, brace-expansion, @grpc/grpc-js, @angular/router, urllib3, jackson-databind), so new scaffolds and repository builds no longer restore vulnerable package versions.
    Owner: @joperezr
    Changes: #20703

🧩 Extensions

3 new features, 2 bug fixes

New features

  1. 🐞 VS Code debugging for Node Azure Functions
    With the Aspire VS Code extension installed, debugging an AppHost containing a TypeScript or JavaScript Azure Functions app now starts Azure Functions Core Tools, reserves a Node inspector port, and attaches the Node debugger automatically, stopping Core Tools when the debug session ends.
    Owner: @mitchdenny
    Changes: #20943
    📝 Documentation required

  2. 🛠️ Add Aspire editor assistance language model tools
    The VS Code extension adds six new editor-assistance language-model tools for Copilot Chat: inspecting AppHost/resource debug session status, explaining the latest launch failure, opening the dashboard or Output panel, listing active debug sessions, and reporting Hot Reload applicability. The existing AppHost start/stop tools are also hardened with safer target resolution and failure handling.
    Owner: @adamint
    Changes: #19414
    📝 Documentation required

  3. 💬 One-time Aspire usefulness feedback prompt in VS Code
    Adds a draft, one-time VS Code notification that asks whether Aspire improves the user's development experience (Yes/No/Don't ask again), to measure perceived benefit without a full survey. The campaign is currently disabled pending classification/privacy approval before it can be enabled.
    Owner: @maddymontaquila
    Changes: #20399

Bug fixes

  1. 👻 Fix VS Code extension re-adding stale AppHost paths
    The VS Code extension no longer re-adds a stale or mistyped configured AppHost path as a phantom, buildable candidate. Discovery and selection are now separated, so configuration can only select an AppHost that the CLI actually discovered.
    Owner: @ellahathaway
    Changes: #20112
    🌍 Community contribution by @SankeerthNara

  2. 🧯 Fix VS Code AppHost watcher lifecycle and duplicate startup requests
    Fixed the VS Code extension leaving aspire ps --follow processes running across polling restarts and deactivation, and eliminated duplicate AppHost detail and dashboard requests when connection snapshots were unchanged.
    Owner: @ellahathaway
    Changes: #20763

🔌 Integrations

4 new features, 10 improvements, 8 bug fixes

New features

  1. 🌐 Azure Front Door endpoint resource IDs
    The Azure Front Door integration now exposes each origin's endpoint resource ID via AzureFrontDoorResource.GetEndpointId(string), alongside the existing endpoint URL, so apps can configure Azure DNS apex alias records that require the resource ID.
    Owner: @IEvangelist
    Changes: #21053
    📝 Documentation required

  2. 🤖 New Azure AI client packages replace Azure.AI.OpenAI and Azure.AI.Inference
    Replaces Aspire.Azure.AI.OpenAI and Aspire.Azure.AI.Inference, which are discontinued, with two new packages: Aspire.Azure.AI.Projects for Foundry project-based AIProjectClient registration, and Aspire.Azure.AI.Extensions.OpenAI for both Foundry project (ProjectOpenAIClient) and Azure OpenAI account registrations backed by the standard OpenAI SDK. Also fixes Foundry hosted/prompt agents failing on Send Message by aligning the Azure SDK on 3.0.0-beta.3, and removes the preview HostedAgentConfiguration.Tools property since the new SDK no longer serializes hosted-agent tools.
    Owner: @tommasodotNET
    Changes: #20712
    ⚠️ Breaking change
    📝 Documentation required

  3. 📡 Azure Web PubSub emulator support
    Azure Web PubSub hosting now supports RunAsEmulator(), letting AppHosts run locally against the Web PubSub emulator container without an Azure subscription, with local connection strings and hub event handler callbacks wired automatically. The emulator image is pinned to 1.0.0-beta.2, which exposes a built-in GET /api/health endpoint so the resource uses Aspire's standard WithHttpHealthCheck instead of a custom check.
    Owner: @davidfowl
    Changes: #20956, #21019
    📝 Documentation required
    🌍 Community contribution by @vicancy

  4. 🗄️ Choose the Service Bus emulator's SQL Server instance
    The Azure Service Bus emulator's companion SQL Server instance can now be customized or replaced. New WithSqlServer overloads on the emulator builder let you configure the auto-created SQL Server resource using the regular SQL Server integration APIs, or reuse an existing SQL Server resource instead of creating a dedicated one.
    Owner: @eerhardt
    Changes: #17885
    📝 Documentation required
    🌍 Community contribution by @thomhurst

Improvements

  1. 🧭 AKS Gateway API uses stable provisioning SDK
    Updated the AKS integration to the latest Azure Provisioning SDK, which now has typed support for ManagedClusterIngressProfile and Gateway API configuration. Gateway API-only deployments use the SDK's stable API version, while only the application load balancer feature still requires a preview API version.
    Owner: @eerhardt
    Changes: #21025

  2. 🔕 Disable dashboard telemetry in Docker and Kubernetes deployments
    Dashboards generated for Docker Compose and Kubernetes deployments now set ASPIRE_DASHBOARD_TELEMETRY_OPTOUT=true by default, so deployed dashboards no longer report product usage/error telemetry unless explicitly re-enabled. Application OpenTelemetry ingestion and local AppHost dashboard behavior are unchanged.
    Owner: @JamesNK
    Changes: #20906
    Docs: microsoft/aspire.dev#1888
    📝 Documentation required

  3. 🧰 IServiceProvider support in Cosmos DB extensions
    Cosmos DB client configuration callbacks now receive an IServiceProvider, changing Action<CosmosClientOptions> to Action<IServiceProvider, CosmosClientOptions>. This lets CustomHandlers resolve DI-registered services, and the CosmosClient is now resolved through the DI container instead of being cached as a field.
    Owner: @sebastienros
    Changes: #19349
    ⚠️ Breaking change
    📝 Documentation required
    🌍 Community contribution by @AdamDotNet

  4. 🧹 Graduate Azure role-assignment APIs to stable
    AzureRoleAssignmentResource is no longer experimental. Consumers can use Azure role-assignment APIs without suppressing the ASPIREAZURE003 experimental-API warning. Runtime provisioning and authorization behavior are unchanged.
    Owner: @eerhardt
    Changes: #20857

  5. 🧹 Graduate core Azure deployment APIs to stable
    Consumers can now use the core Azure deployment APIs (AzurePublishingContext, AzureEnvironmentResource, AddAzureEnvironment, WithLocation, WithResourceGroup) without suppressing the ASPIREAZURE001 experimental-API warning. Signatures, defaults, and provisioning/deployment behavior are unchanged.
    Owner: @mitchdenny
    Changes: #20820

  6. 🧹 Graduate Azure Container Apps resource naming APIs to stable
    Consumers of Azure Container Apps resource naming can now call WithUniqueResourceNaming() and WithCompactResourceNaming() without suppressing experimental-API diagnostics. The APIs, signatures, and opt-in defaults are unchanged.
    Owner: @mitchdenny
    Changes: #20806
    📝 Documentation required

  7. ⚡ Faster dev tunnel readiness and lifecycle tracking
    Dev tunnel resources now report ready much more promptly by observing the tunnel host's console output directly, instead of relying solely on slower service-based reconciliation. Lifecycle events like stops, disconnects, reconnects, and host takeovers now update port resources and URL availability correctly.
    Owner: @DamianEdwards
    Changes: #20658

  8. 🗑️ Removed legacy RabbitMQ.Client v6 and MongoDB.Driver v2 packages
    The legacy Aspire.RabbitMQ.Client.v6 and Aspire.MongoDB.Driver.v2 integration packages are removed from the repository and will no longer be published. Consumers should migrate to Aspire.RabbitMQ.Client (RabbitMQ.Client 7.x) and Aspire.MongoDB.Driver (MongoDB.Driver 3.x); previously published versions remain available on NuGet.
    Owner: @eerhardt
    Changes: #20608
    Docs: microsoft/aspire.dev#1800
    ⚠️ Breaking change
    📝 Documentation required

  9. 📦 Updated and consolidated MongoDB dependencies
    MongoDB integrations now consistently use MongoDB.Driver 3.12.0 across target frameworks, updated MongoDB EF Core provider versions, and ship a new net10.0 asset for Aspire.MongoDB.EntityFrameworkCore. The upstream driver now requires MongoDB Server 4.4 or later.
    Owner: @eerhardt
    Changes: #20607

  10. 🧹 Remove redundant experimental warnings from Aspire.Hosting.Dotnet
    Consumers of Aspire.Hosting.Dotnet no longer need to suppress the ASPIREDOTNETPROJECT001 experimental-API warning to use AddDotnetProject, DotnetProjectResource, or WithBuildEnvironment, since the package is already prerelease.
    Owner: @eerhardt
    Changes: #20490
    Docs: microsoft/aspire.dev#1761
    📝 Documentation required

Bug fixes

  1. 🔐 Cross-resource-group ACR pull for AKS
    AKS clusters can now pull application images from an existing Azure Container Registry in a different resource group or subscription, using role assignments scoped to the registry. Separate pre-created identities are used for the control plane and kubelets instead of the previous AKS-managed kubelet identity.
    Owner: @mitchdenny
    Changes: #20919
    ⚠️ Breaking change
    📝 Documentation required

  2. 🌐 Fix Azure Front Door resource-name regression
    Updated the Azure Container Apps CDN/Front Door integration to Azure.Provisioning.Cdn 1.0.0-beta.4, restoring the expected Front Door resource-name character and length rules that had regressed in beta.3.
    Owner: @eerhardt
    Changes: #20855

  3. 🔑 Fix Azure Npgsql username resolution for Base64Url tokens
    The Azure Npgsql integration now correctly resolves the username from Microsoft Entra access tokens that use Base64Url encoding (containing - or _ characters). Previously these tokens failed to decode, causing the database connection to fail.
    Owner: @eerhardt
    Changes: #20880
    🌍 Community contribution by @enhancer13

  4. 🐛 Fix TypeScript Bicep parameter expressions on enum Azure properties
    Fixed TypeScript AppHosts failing to publish when configureInfrastructure assigned a bicep().parameter(...) expression to an enum-valued Azure provisioning property (such as a storage SKU name). String-backed Bicep expressions now flow into enum-valued properties while literal type checking is preserved.
    Owner: @sebastienros
    Changes: #20557

  5. 🔗 Fix Mongo Express connection with single-member replica sets
    AddMongoDB("mongo").WithReplicaSet().WithMongoExpress() previously left Mongo Express crashing after about 30 seconds because it tried to connect to the replica set's localhost member address instead of the server's container-network address. Mongo Express is now configured through a direct connection URL for single-member replica sets, so the two APIs work together without manual connection-string overrides.
    Owner: @sebastienros
    Changes: #20571

  6. 📄 Preserve multiline quoted values in Docker Compose env files
    Publishing Docker Compose output no longer drops continuation lines and the closing quote from multiline quoted .env values, preserving original line endings, escaped quotes, blank lines, and embedded #/= characters. Unterminated quoted values now fail fast with a clear error.
    Owner: @mitchdenny
    Changes: #20620
    🌍 Community contribution by @Benziza

  7. 🐛 Fix SQL Server REPL launch on Windows
    Fixes the SQL Server dashboard REPL failing to launch from Windows checkouts due to CRLF line endings in an embedded shell script. The REPL now launches sqlcmd directly and adds a SqlServerReplOptions callback with SqlServerReplCommand.Version17/Version18 so older or custom images can select an installed client path.
    Owner: @mitchdenny
    Changes: #20704
    ⚠️ Breaking change
    📝 Documentation required

  8. 🩺 Fix SQL Server health check false negatives from pool blocking
    SQL Server health checks for AddSqlServer and AddDatabase now connect using a dedicated connection string with PoolBlockingPeriod.NeverBlock, so a transient failure from other code sharing the same pool can no longer poison health-check results for up to a minute, and SQL resources can become healthy faster during startup.
    Owner: @JamesNK
    Changes: #20534
    🌍 Community contribution by @afscrome

📦 Other

1 improvement, 1 bug fix

Improvements

  1. 🧹 Remove redundant experimental warnings from Azure Sandboxes
    Consumers of Azure Container Apps Sandboxes no longer need to suppress the ASPIREAZURE001 experimental-API warning, since the entire Aspire.Hosting.Azure.Sandboxes package is already prerelease.
    Owner: @eerhardt
    Changes: #20482
    📝 Documentation required

Bug fixes

  1. 💾 Fix Azure Sandbox disk sizing for small tiers
    Deploying an Azure Container Apps Sandbox with the ExtraSmall or AzureSandboxTier.Small tier always failed because the requested disk size exceeded the Azure Dev Compute data plane's cores-based disk cap. Disk sizing is now scaled per tier so every tier deploys successfully.
    Owner: @eerhardt
    Changes: #20461

📄 Templates

1 improvement, 2 bug fixes

Improvements

  1. ⬆️ Raise Aspire's minimum supported .NET version to .NET 10
    Aspire's minimum supported .NET version is raised to .NET 10: shipping libraries and C# templates now target net10.0/net11.0 and no longer support .NET 8 or .NET 9. dotnet new aspire-starter --framework now only accepts net10.0 or net11.0, defaulting to net10.0. Applications targeting .NET 8 or .NET 9 must upgrade before adopting this major version's library packages.
    Owner: @DamianEdwards
    Changes: #20614
    ⚠️ Breaking change
    📝 Documentation required

Bug fixes

  1. 🔒 Fix Log4j vulnerability in Java starter template
    Updates Log4j to 2.25.5 in the CLI's Java starter template and Spring Boot playground samples, fixing CVE-2026-49844 where MapMessage could serialize non-finite floating-point values as invalid JSON.
    Owner: @radical
    Changes: #20830

  2. 🔒 Patch vulnerable JavaScript dependencies in starter templates
    Patches vulnerable JavaScript dependencies (proxy-addr, source-map-js, and several database instrumentation packages) in shipped starter frontend templates, playgrounds, deployment fixtures, and TypeScript SDK tests, so new scaffolds no longer restore vulnerable package versions.
    Owner: @radical
    Changes: #20831

🧪 Testing

2 bug fixes

Bug fixes

  1. 🗂️ Fix FileSystemService access in testing builders
    Accessing FileSystemService on DistributedApplicationTestingBuilder and the generic testing builder no longer throws NotImplementedException, since both wrappers now forward the property to the underlying DistributedApplicationBuilder.
    Owner: @IEvangelist
    Changes: #20966

  2. 🔁 Prevent recursive test runner invocation
    DistributedApplicationTestingBuilder.CreateAsync now detects when the target type belongs to a Microsoft.Testing.Platform test project rather than an AppHost executable, and fails fast with a clear diagnostic instead of recursively relaunching the test runner and leaving stray AppHost/DCP processes behind.
    Owner: @danegsta
    Changes: #20573


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

PRs processed: ✅ 121 included · ❌ 78 excluded · ⏳ 0 unprocessed · 199 total merged in milestone (View full PR tracker) Docs PRs: ✅ 6 included · ❌ 38 excluded · ⏳ 0 unprocessed · 44 total from microsoft/aspire.dev (View docs PR tracker) PRs analyzed through: #20726 merged 2026-10-17 01:36 UTC