Skip to content

Fix Kafka AppHost health-check producer lifetime - #20092

Merged
James Newton-King (JamesNK) merged 1 commit into
mainfrom
davidfowl-kafka-health-check-lifetime
Sep 14, 2026
Merged

James Newton-King (JamesNK) merged 1 commit into
mainfrom
davidfowl-kafka-health-check-lifetime

Conversation

@davidfowl

Copy link
Copy Markdown
Collaborator

Description

Kafka AppHost health checks currently create a new producer on every execution without disposing it, accumulating polling threads over time. Register each resource's KafkaHealthCheck as a DI-owned keyed singleton so checks reuse their producer and AppHost disposal releases it.

This preserves independent configuration for multiple Kafka resources and deferred connection-string initialization, following the existing client integration pattern. No public API, dependency, or producer-default changes are required.

Fixes: #20091

Validation

  • Added public-API regression coverage for DI ownership, reuse across scopes, resource isolation, and connection-string availability. No private reflection.
  • All 28 selected Kafka hosting tests passed, including broker-backed health and WaitFor readiness tests.
  • Ran standalone AppHosts with two real Kafka 8.2.0 brokers each, comparing released 13.5.3 with the patched source. Both used Confluent.Kafka 2.15.0, normal resource monitoring, and 40 additional rounds through HealthCheckService. All 80 additional probe results were healthy.
Live measurement Released 13.5.3 Patched
Total health-check executions 84 84
Distinct health-check instances 84 2
Producer polling threads after the checks 84 2
Producer polling threads after AppHost disposal 84 0

Polling threads were identified using dotnet-stack while the process remained alive after AppHost disposal. The standalone verification used no private reflection. Detailed evidence is attached to #20091. This verifies the lifetime leak, not the original report's exact CPU percentage.

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 20092

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 20092"

@github-actions github-actions Bot added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Sep 13, 2026
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot September 13, 2026 14:30
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

Review tier: Balanced
Findings: None


💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@davidfowl

Copy link
Copy Markdown
Collaborator Author

PR Testing Report

PR Information

  • PR: Fix Kafka AppHost health-check producer lifetime #20092 - Fix Kafka AppHost health-check producer lifetime
  • Head commit: 15c2c650290d5e6bd9b702f8b7c7a197b615ce4b
  • Tested at: September 13, 2026, approximately 15:05-15:09 UTC
  • Environment: macOS ARM64, Docker Engine 28.5.1, local isolated PR CLI install, two real Kafka 8.2.0 containers.

Artifact Version Verification

  • Installed CLI: 13.6.0-pr.20092.g15c2c650, matching the PR head.
  • Kafka package: Aspire.Hosting.Kafka.13.6.0-pr.20092.g15c2c650.nupkg from the downloaded PR hive.
  • Package repository commit: 4848901472371aa592bec6e697abadea5a30cd06. This is the CI merge commit with parents 47a04482488cd63c5b844091c154fcdc018dc718 and the PR head 15c2c650290d5e6bd9b702f8b7c7a197b615ce4b, not a stale package.
  • Artifact-producing run: https://github.com/microsoft/aspire/actions/runs/34762863086
  • Status: Verified. The PR head was checked again after testing and had not changed.

Changes Analyzed

  • src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs: registers a DI-owned keyed singleton per Kafka resource and resolves it from the health-check factory.
  • tests/Aspire.Hosting.Kafka.Tests/AddKafkaTests.cs: public-API coverage for ownership, scoped reuse, distinct resources, and deferred connection availability.
  • Categories: Kafka hosting integration and tests only. No CLI, dashboard, template, client integration, extension, or CI-infrastructure changes.

Test Scenario Executed

Fresh packaged AppHost lifecycle, including outage and recovery

Objective: Validate the shipped PR artifacts, real resource orchestration, dashboard state, health-check reuse, and disposal without private reflection.

Status: Passed.

Created a fresh file-based C# AppHost using the installed PR CLI and the explicit PR template hive:

"$cli" new aspire-empty --name KafkaPrSmoke --output "$temp/KafkaPrSmoke" \
  --source "$hive" --version 13.6.0-pr.20092.g15c2c650 \
  --language csharp --localhost-tld false --suppress-agent-init --non-interactive

Added the PR-version Kafka package and two AddKafka resources. Started the app with:

"$cli" start --apphost "$apphost" --launch-profile http --isolated --format Json --non-interactive

The temporary harness observed public health-check factory results and captured managed stacks using dotnet-stack. It did not replace the checks, inspect private fields, or change producer configuration. It set the public health-check registration timeout to three seconds to bound unavailable-broker probes. Normal Aspire health monitoring remained enabled.

All phases deliberately used the same fresh AppHost so reuse could be verified across failure and recovery:

Phase Coverage Expected and observed result
Before connection availability Boundary Resolving each check throws InvalidOperationException("Connection string is unavailable"). AppHost subsequently starts successfully.
Startup and dashboard Happy path Both real Kafka containers reach Running/Healthy. Dashboard displays both resources.
Repeated healthy probes Happy path 40 rounds, checking both brokers each time, all return Healthy. Exactly one check instance per resource and two producer polling threads.
Stop broker A Unhappy path aspire resource kafka-a stop moves A to Exited; B remains Running/Healthy. Dashboard confirms the isolated failure state.
Repeated unavailable-broker probes Unhappy path Four rounds consistently return A=Unhealthy and B=Healthy. Still one instance per resource and two polling threads.
Restart and recovery Recovery aspire resource kafka-a start, then aspire wait kafka-a --status healthy --timeout 180, succeeds in about 5.7 seconds. Ten further rounds return Healthy for both resources without replacing the checks. Original endpoint allocations are retained.
AppHost disposal Lifecycle StopAsync and DisposeAsync remove both containers. While the console process is still alive, polling threads drop from two to zero.

All CLI follow-up commands supplied the explicit --apphost path.

Lifetime observations

Counts include normal background monitoring as well as explicit probe rounds.

Checkpoint Factory executions Distinct checks Kafka producer polling threads
Ready 3 2 2
After 40 healthy rounds 87 2 2
After four outage rounds 98 2 2
After ten recovery rounds 122 2 2
After AppHost disposal 124 2 0

The captured thread stacks contain Confluent.Kafka.Producer<,>...<StartPollTask>b__0. These are thread-lifetime observations, not a reproduction of the original report's exact CPU percentage.

Evidence

Preserved under the session's files/pr20092-evidence/:

  • apphost.cs: standalone packaged-PR harness.
  • apphost-run.log: sanitized phase/probe output, including PRTEST PASS all scenarios.
  • observations.json and checkpoint *.done files: exact counts.
  • ready.stacks.txt, healthy-probes.stacks.txt, outage-probes.stacks.txt, recovery-probes.stacks.txt, disposed.stacks.txt: live managed stack captures.
  • dashboard-healthy.png, dashboard-outage.png, dashboard-recovered.png: dashboard screenshots.
  • dashboard-outage.txt, dashboard-recovered.txt: browser accessibility snapshots.

Installation, template creation, broker lifecycle, and aspire describe logs are retained alongside this folder as pr20092-*.log. Temporary login-bearing browser/startup logs were removed.

Summary

Validation Status
CLI and Kafka package provenance Passed
Fresh PR-template project and real broker startup Passed
Missing connection-string boundary Passed
Repeated healthy probes and independent resource instances Passed
Unavailable broker isolation Passed
Broker recovery using the same checks Passed
Producer polling-thread cleanup on AppHost disposal Passed

Overall Result

PR Kafka behavior verified against the packaged artifacts.

At the end of this test run, CI had failed VS Code browser-debugger E2E jobs on Linux and Windows, with the aggregate test/final checks consequently failed. Those jobs are outside the changed Kafka area and were not diagnosed by this focused run; their cause is not established here.

Cleanup

The AppHost and detached CLI processes exited; both owned broker containers were removed; the isolated headless browser was closed. The temporary project and PR installation were deleted. Evidence and the harness were retained in session artifacts. The repository working tree remained clean.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The focused implementation follows the established Kafka client pattern and includes appropriate regression coverage.

Review tier: Balanced
Findings: None

@davidfowl

Copy link
Copy Markdown
Collaborator Author

/backport to release/13.5

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/13.5 (link to workflow run)

Register a DI-owned keyed singleton per Kafka resource so repeated health checks reuse their producer and AppHost disposal releases it. Add public-API coverage for singleton ownership, resource isolation, and deferred connection-string availability.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Tests selector

2 / 99 PR test projects · 2 PR jobs · 0 advisory-only targets, from 2 changed files.

Selected PR test projects (2 / 99)

Aspire.Hosting.Kafka.Tests, Aspire.Playground.Tests

Selected PR jobs (2)

extension-e2e, typescript-api-compat

Advisory workflow impact (0)

none


How these were chosen — grouped by what changed

🔧 src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.Kafka.Tests
→ 1 via the project graph: Aspire.Playground.Tests (2 hops)

🧪 tests/Aspire.Hosting.Kafka.Tests/AddKafkaTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Kafka.Tests

Job reasons

Job Triggered by
extension-e2e • src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs
• affected project Aspire.Hosting.Kafka
typescript-api-compat affected project Aspire.Hosting.Kafka

Selection computed for commit f1aa806.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The focused lifecycle fix follows existing Kafka integration patterns and has appropriate regression coverage.

Review tier: Balanced
Findings: None

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the Kafka health-check lifetime change and regression coverage. 0 issues found.

@JamesNK
James Newton-King (JamesNK) merged commit 3ae6d1f into main Sep 14, 2026
240 of 246 checks passed
@JamesNK
James Newton-King (JamesNK) deleted the davidfowl-kafka-health-check-lifetime branch September 14, 2026 03:33
@github-actions github-actions Bot added this to the 13.6 milestone Sep 14, 2026
This was referenced Oct 14, 2026
Mohammed Sanaullah (sanaullahmohammed) pushed a commit to sanaullahmohammed/NexusOps that referenced this pull request Oct 17, 2026
Updated [Aspire.Hosting.JavaScript](https://github.com/microsoft/aspire)
from 13.5.3 to 13.6.1.

<details>
<summary>Release notes</summary>

_Sourced from [Aspire.Hosting.JavaScript's
releases](https://github.com/microsoft/aspire/releases)._

## 13.6.1

## What's New in Aspire 13.6.1

Patch release for Aspire 13.6 that reduces dashboard CPU usage during
sustained metric ingestion, restores scrolling in the Metrics tree,
improves dashboard navigation, fixes container exec watch failures, and
ensures session-scoped containers are cleaned up when stopping .NET
AppHosts on Windows.

### 🐛 Fixes

- 📊 **Dashboard CPU usage could increase during long-running metric
ingestion** — Metric retention repeatedly scanned retained history on
every insertion, causing steadily increasing CPU usage even with a fixed
workload. Cleanup now skips dimensions below capacity and removes only
the oldest surplus points when needed. Existing retention limits and
exemplar behavior are unchanged, and no configuration changes are
required. Regression introduced in 13.6. Fixes
[#​20725](https://github.com/microsoft/aspire/issues/20725).
([#​20747](https://github.com/microsoft/aspire/pull/20747), backport of
[#​20736](https://github.com/microsoft/aspire/pull/20736), @​JamesNK)

- 📈 **The Metrics tree could not be scrolled** — The meter and
instrument tree now scrolls when it exceeds the viewport, allowing you
to reach and select instruments below the fold. Regression introduced in
13.6. Fixes [#​20728](https://github.com/microsoft/aspire/issues/20728).
([#​20762](https://github.com/microsoft/aspire/pull/20762), backport of
[#​20758](https://github.com/microsoft/aspire/pull/20758), @​heyysiri)

- 🧭 **Dashboard navigation could fail after a browser disconnect** —
Pending page-state updates now persist session state before navigating
and skip navigation when the browser has disconnected, avoiding an
unhandled navigation failure. The navigation rail's overflow button also
has consistent sizing, icon alignment, and hover styling in expanded and
collapsed layouts and both light and dark themes.
([#​20545](https://github.com/microsoft/aspire/pull/20545), backport of
[#​20527](https://github.com/microsoft/aspire/pull/20527), @​JamesNK)

- 🖥️ **Container exec watches could terminate shortly after AppHost
startup** — A stalled DCP watch connection could produce a critical
`Watch task over Kubernetes ContainerExec resources terminated
unexpectedly` error and stop subsequent terminal state and log updates
from being observed. Watch connection attempts now retry after timeouts,
and periodic restarts correctly recreate connections without swallowing
unrelated cancellation. Regression introduced in 13.6.0.
([#​20664](https://github.com/microsoft/aspire/pull/20664), backport of
[#​20466](https://github.com/microsoft/aspire/pull/20466), @​radical)

- 🪟 **Session-scoped containers could remain running after stopping a
.NET AppHost on Windows** — AppHosts launched through `dotnet run` or
`dotnet watch` now allow DCP to finish resource cleanup during shutdown,
including existing Ctrl+C and `aspire stop` flows. Persistent resources
remain unaffected, while direct .NET launches and TypeScript/polyglot
AppHosts retain their existing process protection. Fixes
[#​20495](https://github.com/microsoft/aspire/issues/20495).
([#​20514](https://github.com/microsoft/aspire/pull/20514), backport of
[#​20494](https://github.com/microsoft/aspire/pull/20494), @​danegsta)

---

*Full Changelog:
[v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)*

*Full commit:
[3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)*


## 13.6.0

# Aspire 13.6.0

Aspire 13.6 brings persistent application history, a refreshed and more
interactive dashboard, first-party Java and Rust hosting, and new Azure
deployment options. Coordinated .NET builds, portable volume paths,
sharper CLI workflows, and more capable editor tooling make it easier to
build, debug, and deploy applications across languages.

## Highlights

- 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and
resource snapshots let you revisit up to ten application runs, with
read-only access to completed runs and default retention limits of
100,000 console log messages, structured logs, and traces each. The
dashboard now ships as Native AOT and adopts Fluent UI v5 with a
collapsible navigation rail.
- 🖥️ **AppHost-owned terminals and database REPLs** — Experimental
terminal APIs let AppHosts create interactive sessions in a dashboard
dock, dialog, or separate window. Opt-in `WithRepl()` commands open
bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and
Valkey, while `aspire terminal ps` and `aspire terminal tape play`
support discovery and repeatable terminal interactions.
- 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java`
and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot,
Quarkus, and Cargo applications into the app model, with generated
container builds and VS Code debugging. These integrations build on work
that originated in the Aspire Community Toolkit.
- 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet`
integration coordinates compatible projects into shared restore and
build groups and supports .NET SDK container publishing. Portable
volume-path environment variables work across local execution and
deployment, while TypeScript AppHosts gain standard `appsettings.json`
configuration and Deno runtime support.
- ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire
run` and `aspire start`, update repository-local CLI manifests with
`aspire update`, create file-based C# AppHosts with `aspire init
--language csharp --file-based`, and export TypeScript API data with
`aspire sdk export`. Terminal commands no longer need a feature flag,
Linux certificate trust includes Firefox NSS databases, and `aspire stop
--force --volumes` adds explicit cleanup of Aspire-owned volumes.
- 💻 **More capable VS Code tooling** — Coding agents can start and stop
AppHosts through the extension, and the Aspire pane exposes deploy,
publish, and pipeline actions. Multi-root discovery, worktree-scoped
lifecycle operations, preserved launch arguments, clearer debug logs,
and missing-debugger guidance make complex workspaces more predictable.
- ☁️ **New Azure options in preview** — Azure Connector Namespace models
external-service connections and managed MCP server configurations.
Azure Container Apps Sandboxes adds isolated sandbox deployments with
configurable resource tiers and lifecycle policies, while Azure
Container Apps Express offers a simplified environment option for rapid
provisioning.
- ☸️ **More expressive, reliable deployments** — Experimental Azure
Provisioning SDK proxies let polyglot AppHosts customize infrastructure.
Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves
inherited hostnames and embedded parameter values, and AKS gains
persistent-volume provisioning and more reliable cleanup.
- 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB
replica sets join Foundry Toolboxes, remote Foundry Local endpoints,
Blazor WebAssembly debugging, and configurable Dev Tunnel expiration.
Azure Cosmos DB and AI Inference client integrations gain health checks,
and the vNext Cosmos DB emulator sends its own telemetry to the
dashboard.

## ⚠️ Breaking changes

Notable changes include automatic TLS for local MongoDB servers when a
certificate is available, the Linux-based vNext Cosmos DB emulator
becoming the default, new Azure Front Door origin names that can require
cleanup of existing origins, portable connection-string
environment-variable aliases on stricter deployment targets, and
experimental terminal types moving from `Aspire.Hosting.Terminals` to
`Aspire.Hosting.ApplicationModel`.

See the full list and migration guidance in the [Aspire 13.6 breaking
changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes).

## 📖 Learn more

For complete details, examples, migration guidance, and everything new
in this release, read [What's new in Aspire
13.6](https://aspire.dev/whats-new/aspire-13-6/).

Thank you to all the community contributors who helped make Aspire 13.6
possible! 💜

---

_Full Changelog:
[v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_

_Full commit:
[56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_


## 13.5.4

## What's New in Aspire 13.5.4

Patch release for Aspire 13.5 that fixes Kafka health-check resource
leaks, DevTunnel errors with automatically selected regions, misleading
Azure emulator dashboard entries, and unintended changes to generated
starter apps, plus Homebrew compatibility and Radius API diagnostic
updates.

### 🐛 Fixes

- 📨 **Kafka health checks leaked producers and polling threads** — Each
AppHost health-check execution created a new Kafka producer without
disposing it, accumulating background threads over time. Health checks
now reuse a producer per Kafka resource and dispose it with the AppHost,
while keeping multiple Kafka resources independently configured. Fixes
[#​20091](https://github.com/microsoft/aspire/issues/20091).
([#​20094](https://github.com/microsoft/aspire/pull/20094), backport of
[#​20092](https://github.com/microsoft/aspire/pull/20092), @​davidfowl)

- 🌐 **DevTunnels could fail when the region was selected automatically**
— Tunnel setup and health checks now use the cluster-qualified tunnel ID
returned by the DevTunnel CLI for port operations and access queries.
This fixes failures when a bare tunnel ID cannot be resolved for those
operations. Regression introduced in 13.3. Fixes
[#​18790](https://github.com/microsoft/aspire/issues/18790).
([#​19853](https://github.com/microsoft/aspire/pull/19853), backport of
[#​19230](https://github.com/microsoft/aspire/pull/19230), @​Vladipz)

- ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The
dashboard now hides the `azure-environment` resource when no Azure
resources require cloud provisioning, instead of leaving it visible in
**Not started**. It remains visible for apps that combine local
emulators with resources requiring Azure provisioning. No AppHost
changes are needed. Fixes
[#​19617](https://github.com/microsoft/aspire/issues/19617).
([#​19998](https://github.com/microsoft/aspire/pull/19998), backport of
[#​19843](https://github.com/microsoft/aspire/pull/19843), @​eerhardt)

- 🧩 **Starter app generation could alter unrelated JavaScript values** —
Dynamic port replacement could also replace matching numeric literals in
bundled JavaScript, including Bootstrap timing values. Port
substitutions are now restricted to `localhost:` URLs, preserving the
original library files while still configuring the requested ports.
Fixes [#​20030](https://github.com/microsoft/aspire/issues/20030).
([#​20110](https://github.com/microsoft/aspire/pull/20110), backport of
[#​20031](https://github.com/microsoft/aspire/pull/20031),
@​bart-vmware, @​JamesNK)

- 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced
deprecated cask URL and post-install syntax with the supported
equivalents, resolving compatibility issues with current Homebrew while
preserving install-channel metadata.
([#​20119](https://github.com/microsoft/aspire/pull/20119), backport of
[#​19965](https://github.com/microsoft/aspire/pull/19965), @​askpt,
@​joperezr)

- 🧪 **Radius cloud-provider callback interfaces now carry the
experimental diagnostic** — `IAwsRadiusProviderBuilder` and
`IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`,
matching the existing `WithAwsProvider` and `WithAzureProvider` methods.
Code referencing these interfaces directly must now acknowledge the same
experimental API diagnostic.
([#​19874](https://github.com/microsoft/aspire/pull/19874),
@​sebastienros)

---

*Full Changelog:
[v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)*

*Full commit:
[9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)*

Commits viewable in [compare
view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1).
</details>

Updated [Aspire.Hosting.PostgreSQL](https://github.com/microsoft/aspire)
from 13.5.3 to 13.6.1.

<details>
<summary>Release notes</summary>

_Sourced from [Aspire.Hosting.PostgreSQL's
releases](https://github.com/microsoft/aspire/releases)._

## 13.6.1

## What's New in Aspire 13.6.1

Patch release for Aspire 13.6 that reduces dashboard CPU usage during
sustained metric ingestion, restores scrolling in the Metrics tree,
improves dashboard navigation, fixes container exec watch failures, and
ensures session-scoped containers are cleaned up when stopping .NET
AppHosts on Windows.

### 🐛 Fixes

- 📊 **Dashboard CPU usage could increase during long-running metric
ingestion** — Metric retention repeatedly scanned retained history on
every insertion, causing steadily increasing CPU usage even with a fixed
workload. Cleanup now skips dimensions below capacity and removes only
the oldest surplus points when needed. Existing retention limits and
exemplar behavior are unchanged, and no configuration changes are
required. Regression introduced in 13.6. Fixes
[#​20725](https://github.com/microsoft/aspire/issues/20725).
([#​20747](https://github.com/microsoft/aspire/pull/20747), backport of
[#​20736](https://github.com/microsoft/aspire/pull/20736), @​JamesNK)

- 📈 **The Metrics tree could not be scrolled** — The meter and
instrument tree now scrolls when it exceeds the viewport, allowing you
to reach and select instruments below the fold. Regression introduced in
13.6. Fixes [#​20728](https://github.com/microsoft/aspire/issues/20728).
([#​20762](https://github.com/microsoft/aspire/pull/20762), backport of
[#​20758](https://github.com/microsoft/aspire/pull/20758), @​heyysiri)

- 🧭 **Dashboard navigation could fail after a browser disconnect** —
Pending page-state updates now persist session state before navigating
and skip navigation when the browser has disconnected, avoiding an
unhandled navigation failure. The navigation rail's overflow button also
has consistent sizing, icon alignment, and hover styling in expanded and
collapsed layouts and both light and dark themes.
([#​20545](https://github.com/microsoft/aspire/pull/20545), backport of
[#​20527](https://github.com/microsoft/aspire/pull/20527), @​JamesNK)

- 🖥️ **Container exec watches could terminate shortly after AppHost
startup** — A stalled DCP watch connection could produce a critical
`Watch task over Kubernetes ContainerExec resources terminated
unexpectedly` error and stop subsequent terminal state and log updates
from being observed. Watch connection attempts now retry after timeouts,
and periodic restarts correctly recreate connections without swallowing
unrelated cancellation. Regression introduced in 13.6.0.
([#​20664](https://github.com/microsoft/aspire/pull/20664), backport of
[#​20466](https://github.com/microsoft/aspire/pull/20466), @​radical)

- 🪟 **Session-scoped containers could remain running after stopping a
.NET AppHost on Windows** — AppHosts launched through `dotnet run` or
`dotnet watch` now allow DCP to finish resource cleanup during shutdown,
including existing Ctrl+C and `aspire stop` flows. Persistent resources
remain unaffected, while direct .NET launches and TypeScript/polyglot
AppHosts retain their existing process protection. Fixes
[#​20495](https://github.com/microsoft/aspire/issues/20495).
([#​20514](https://github.com/microsoft/aspire/pull/20514), backport of
[#​20494](https://github.com/microsoft/aspire/pull/20494), @​danegsta)

---

*Full Changelog:
[v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)*

*Full commit:
[3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)*


## 13.6.0

# Aspire 13.6.0

Aspire 13.6 brings persistent application history, a refreshed and more
interactive dashboard, first-party Java and Rust hosting, and new Azure
deployment options. Coordinated .NET builds, portable volume paths,
sharper CLI workflows, and more capable editor tooling make it easier to
build, debug, and deploy applications across languages.

## Highlights

- 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and
resource snapshots let you revisit up to ten application runs, with
read-only access to completed runs and default retention limits of
100,000 console log messages, structured logs, and traces each. The
dashboard now ships as Native AOT and adopts Fluent UI v5 with a
collapsible navigation rail.
- 🖥️ **AppHost-owned terminals and database REPLs** — Experimental
terminal APIs let AppHosts create interactive sessions in a dashboard
dock, dialog, or separate window. Opt-in `WithRepl()` commands open
bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and
Valkey, while `aspire terminal ps` and `aspire terminal tape play`
support discovery and repeatable terminal interactions.
- 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java`
and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot,
Quarkus, and Cargo applications into the app model, with generated
container builds and VS Code debugging. These integrations build on work
that originated in the Aspire Community Toolkit.
- 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet`
integration coordinates compatible projects into shared restore and
build groups and supports .NET SDK container publishing. Portable
volume-path environment variables work across local execution and
deployment, while TypeScript AppHosts gain standard `appsettings.json`
configuration and Deno runtime support.
- ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire
run` and `aspire start`, update repository-local CLI manifests with
`aspire update`, create file-based C# AppHosts with `aspire init
--language csharp --file-based`, and export TypeScript API data with
`aspire sdk export`. Terminal commands no longer need a feature flag,
Linux certificate trust includes Firefox NSS databases, and `aspire stop
--force --volumes` adds explicit cleanup of Aspire-owned volumes.
- 💻 **More capable VS Code tooling** — Coding agents can start and stop
AppHosts through the extension, and the Aspire pane exposes deploy,
publish, and pipeline actions. Multi-root discovery, worktree-scoped
lifecycle operations, preserved launch arguments, clearer debug logs,
and missing-debugger guidance make complex workspaces more predictable.
- ☁️ **New Azure options in preview** — Azure Connector Namespace models
external-service connections and managed MCP server configurations.
Azure Container Apps Sandboxes adds isolated sandbox deployments with
configurable resource tiers and lifecycle policies, while Azure
Container Apps Express offers a simplified environment option for rapid
provisioning.
- ☸️ **More expressive, reliable deployments** — Experimental Azure
Provisioning SDK proxies let polyglot AppHosts customize infrastructure.
Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves
inherited hostnames and embedded parameter values, and AKS gains
persistent-volume provisioning and more reliable cleanup.
- 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB
replica sets join Foundry Toolboxes, remote Foundry Local endpoints,
Blazor WebAssembly debugging, and configurable Dev Tunnel expiration.
Azure Cosmos DB and AI Inference client integrations gain health checks,
and the vNext Cosmos DB emulator sends its own telemetry to the
dashboard.

## ⚠️ Breaking changes

Notable changes include automatic TLS for local MongoDB servers when a
certificate is available, the Linux-based vNext Cosmos DB emulator
becoming the default, new Azure Front Door origin names that can require
cleanup of existing origins, portable connection-string
environment-variable aliases on stricter deployment targets, and
experimental terminal types moving from `Aspire.Hosting.Terminals` to
`Aspire.Hosting.ApplicationModel`.

See the full list and migration guidance in the [Aspire 13.6 breaking
changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes).

## 📖 Learn more

For complete details, examples, migration guidance, and everything new
in this release, read [What's new in Aspire
13.6](https://aspire.dev/whats-new/aspire-13-6/).

Thank you to all the community contributors who helped make Aspire 13.6
possible! 💜

---

_Full Changelog:
[v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_

_Full commit:
[56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_


## 13.5.4

## What's New in Aspire 13.5.4

Patch release for Aspire 13.5 that fixes Kafka health-check resource
leaks, DevTunnel errors with automatically selected regions, misleading
Azure emulator dashboard entries, and unintended changes to generated
starter apps, plus Homebrew compatibility and Radius API diagnostic
updates.

### 🐛 Fixes

- 📨 **Kafka health checks leaked producers and polling threads** — Each
AppHost health-check execution created a new Kafka producer without
disposing it, accumulating background threads over time. Health checks
now reuse a producer per Kafka resource and dispose it with the AppHost,
while keeping multiple Kafka resources independently configured. Fixes
[#​20091](https://github.com/microsoft/aspire/issues/20091).
([#​20094](https://github.com/microsoft/aspire/pull/20094), backport of
[#​20092](https://github.com/microsoft/aspire/pull/20092), @​davidfowl)

- 🌐 **DevTunnels could fail when the region was selected automatically**
— Tunnel setup and health checks now use the cluster-qualified tunnel ID
returned by the DevTunnel CLI for port operations and access queries.
This fixes failures when a bare tunnel ID cannot be resolved for those
operations. Regression introduced in 13.3. Fixes
[#​18790](https://github.com/microsoft/aspire/issues/18790).
([#​19853](https://github.com/microsoft/aspire/pull/19853), backport of
[#​19230](https://github.com/microsoft/aspire/pull/19230), @​Vladipz)

- ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The
dashboard now hides the `azure-environment` resource when no Azure
resources require cloud provisioning, instead of leaving it visible in
**Not started**. It remains visible for apps that combine local
emulators with resources requiring Azure provisioning. No AppHost
changes are needed. Fixes
[#​19617](https://github.com/microsoft/aspire/issues/19617).
([#​19998](https://github.com/microsoft/aspire/pull/19998), backport of
[#​19843](https://github.com/microsoft/aspire/pull/19843), @​eerhardt)

- 🧩 **Starter app generation could alter unrelated JavaScript values** —
Dynamic port replacement could also replace matching numeric literals in
bundled JavaScript, including Bootstrap timing values. Port
substitutions are now restricted to `localhost:` URLs, preserving the
original library files while still configuring the requested ports.
Fixes [#​20030](https://github.com/microsoft/aspire/issues/20030).
([#​20110](https://github.com/microsoft/aspire/pull/20110), backport of
[#​20031](https://github.com/microsoft/aspire/pull/20031),
@​bart-vmware, @​JamesNK)

- 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced
deprecated cask URL and post-install syntax with the supported
equivalents, resolving compatibility issues with current Homebrew while
preserving install-channel metadata.
([#​20119](https://github.com/microsoft/aspire/pull/20119), backport of
[#​19965](https://github.com/microsoft/aspire/pull/19965), @​askpt,
@​joperezr)

- 🧪 **Radius cloud-provider callback interfaces now carry the
experimental diagnostic** — `IAwsRadiusProviderBuilder` and
`IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`,
matching the existing `WithAwsProvider` and `WithAzureProvider` methods.
Code referencing these interfaces directly must now acknowledge the same
experimental API diagnostic.
([#​19874](https://github.com/microsoft/aspire/pull/19874),
@​sebastienros)

---

*Full Changelog:
[v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)*

*Full commit:
[9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)*

Commits viewable in [compare
view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1).
</details>

Updated [Aspire.Hosting.RabbitMQ](https://github.com/microsoft/aspire)
from 13.5.3 to 13.6.1.

<details>
<summary>Release notes</summary>

_Sourced from [Aspire.Hosting.RabbitMQ's
releases](https://github.com/microsoft/aspire/releases)._

## 13.6.1

## What's New in Aspire 13.6.1

Patch release for Aspire 13.6 that reduces dashboard CPU usage during
sustained metric ingestion, restores scrolling in the Metrics tree,
improves dashboard navigation, fixes container exec watch failures, and
ensures session-scoped containers are cleaned up when stopping .NET
AppHosts on Windows.

### 🐛 Fixes

- 📊 **Dashboard CPU usage could increase during long-running metric
ingestion** — Metric retention repeatedly scanned retained history on
every insertion, causing steadily increasing CPU usage even with a fixed
workload. Cleanup now skips dimensions below capacity and removes only
the oldest surplus points when needed. Existing retention limits and
exemplar behavior are unchanged, and no configuration changes are
required. Regression introduced in 13.6. Fixes
[#​20725](https://github.com/microsoft/aspire/issues/20725).
([#​20747](https://github.com/microsoft/aspire/pull/20747), backport of
[#​20736](https://github.com/microsoft/aspire/pull/20736), @​JamesNK)

- 📈 **The Metrics tree could not be scrolled** — The meter and
instrument tree now scrolls when it exceeds the viewport, allowing you
to reach and select instruments below the fold. Regression introduced in
13.6. Fixes [#​20728](https://github.com/microsoft/aspire/issues/20728).
([#​20762](https://github.com/microsoft/aspire/pull/20762), backport of
[#​20758](https://github.com/microsoft/aspire/pull/20758), @​heyysiri)

- 🧭 **Dashboard navigation could fail after a browser disconnect** —
Pending page-state updates now persist session state before navigating
and skip navigation when the browser has disconnected, avoiding an
unhandled navigation failure. The navigation rail's overflow button also
has consistent sizing, icon alignment, and hover styling in expanded and
collapsed layouts and both light and dark themes.
([#​20545](https://github.com/microsoft/aspire/pull/20545), backport of
[#​20527](https://github.com/microsoft/aspire/pull/20527), @​JamesNK)

- 🖥️ **Container exec watches could terminate shortly after AppHost
startup** — A stalled DCP watch connection could produce a critical
`Watch task over Kubernetes ContainerExec resources terminated
unexpectedly` error and stop subsequent terminal state and log updates
from being observed. Watch connection attempts now retry after timeouts,
and periodic restarts correctly recreate connections without swallowing
unrelated cancellation. Regression introduced in 13.6.0.
([#​20664](https://github.com/microsoft/aspire/pull/20664), backport of
[#​20466](https://github.com/microsoft/aspire/pull/20466), @​radical)

- 🪟 **Session-scoped containers could remain running after stopping a
.NET AppHost on Windows** — AppHosts launched through `dotnet run` or
`dotnet watch` now allow DCP to finish resource cleanup during shutdown,
including existing Ctrl+C and `aspire stop` flows. Persistent resources
remain unaffected, while direct .NET launches and TypeScript/polyglot
AppHosts retain their existing process protection. Fixes
[#​20495](https://github.com/microsoft/aspire/issues/20495).
([#​20514](https://github.com/microsoft/aspire/pull/20514), backport of
[#​20494](https://github.com/microsoft/aspire/pull/20494), @​danegsta)

---

*Full Changelog:
[v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)*

*Full commit:
[3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)*


## 13.6.0

# Aspire 13.6.0

Aspire 13.6 brings persistent application history, a refreshed and more
interactive dashboard, first-party Java and Rust hosting, and new Azure
deployment options. Coordinated .NET builds, portable volume paths,
sharper CLI workflows, and more capable editor tooling make it easier to
build, debug, and deploy applications across languages.

## Highlights

- 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and
resource snapshots let you revisit up to ten application runs, with
read-only access to completed runs and default retention limits of
100,000 console log messages, structured logs, and traces each. The
dashboard now ships as Native AOT and adopts Fluent UI v5 with a
collapsible navigation rail.
- 🖥️ **AppHost-owned terminals and database REPLs** — Experimental
terminal APIs let AppHosts create interactive sessions in a dashboard
dock, dialog, or separate window. Opt-in `WithRepl()` commands open
bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and
Valkey, while `aspire terminal ps` and `aspire terminal tape play`
support discovery and repeatable terminal interactions.
- 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java`
and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot,
Quarkus, and Cargo applications into the app model, with generated
container builds and VS Code debugging. These integrations build on work
that originated in the Aspire Community Toolkit.
- 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet`
integration coordinates compatible projects into shared restore and
build groups and supports .NET SDK container publishing. Portable
volume-path environment variables work across local execution and
deployment, while TypeScript AppHosts gain standard `appsettings.json`
configuration and Deno runtime support.
- ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire
run` and `aspire start`, update repository-local CLI manifests with
`aspire update`, create file-based C# AppHosts with `aspire init
--language csharp --file-based`, and export TypeScript API data with
`aspire sdk export`. Terminal commands no longer need a feature flag,
Linux certificate trust includes Firefox NSS databases, and `aspire stop
--force --volumes` adds explicit cleanup of Aspire-owned volumes.
- 💻 **More capable VS Code tooling** — Coding agents can start and stop
AppHosts through the extension, and the Aspire pane exposes deploy,
publish, and pipeline actions. Multi-root discovery, worktree-scoped
lifecycle operations, preserved launch arguments, clearer debug logs,
and missing-debugger guidance make complex workspaces more predictable.
- ☁️ **New Azure options in preview** — Azure Connector Namespace models
external-service connections and managed MCP server configurations.
Azure Container Apps Sandboxes adds isolated sandbox deployments with
configurable resource tiers and lifecycle policies, while Azure
Container Apps Express offers a simplified environment option for rapid
provisioning.
- ☸️ **More expressive, reliable deployments** — Experimental Azure
Provisioning SDK proxies let polyglot AppHosts customize infrastructure.
Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves
inherited hostnames and embedded parameter values, and AKS gains
persistent-volume provisioning and more reliable cleanup.
- 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB
replica sets join Foundry Toolboxes, remote Foundry Local endpoints,
Blazor WebAssembly debugging, and configurable Dev Tunnel expiration.
Azure Cosmos DB and AI Inference client integrations gain health checks,
and the vNext Cosmos DB emulator sends its own telemetry to the
dashboard.

## ⚠️ Breaking changes

Notable changes include automatic TLS for local MongoDB servers when a
certificate is available, the Linux-based vNext Cosmos DB emulator
becoming the default, new Azure Front Door origin names that can require
cleanup of existing origins, portable connection-string
environment-variable aliases on stricter deployment targets, and
experimental terminal types moving from `Aspire.Hosting.Terminals` to
`Aspire.Hosting.ApplicationModel`.

See the full list and migration guidance in the [Aspire 13.6 breaking
changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes).

## 📖 Learn more

For complete details, examples, migration guidance, and everything new
in this release, read [What's new in Aspire
13.6](https://aspire.dev/whats-new/aspire-13-6/).

Thank you to all the community contributors who helped make Aspire 13.6
possible! 💜

---

_Full Changelog:
[v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_

_Full commit:
[56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_


## 13.5.4

## What's New in Aspire 13.5.4

Patch release for Aspire 13.5 that fixes Kafka health-check resource
leaks, DevTunnel errors with automatically selected regions, misleading
Azure emulator dashboard entries, and unintended changes to generated
starter apps, plus Homebrew compatibility and Radius API diagnostic
updates.

### 🐛 Fixes

- 📨 **Kafka health checks leaked producers and polling threads** — Each
AppHost health-check execution created a new Kafka producer without
disposing it, accumulating background threads over time. Health checks
now reuse a producer per Kafka resource and dispose it with the AppHost,
while keeping multiple Kafka resources independently configured. Fixes
[#​20091](https://github.com/microsoft/aspire/issues/20091).
([#​20094](https://github.com/microsoft/aspire/pull/20094), backport of
[#​20092](https://github.com/microsoft/aspire/pull/20092), @​davidfowl)

- 🌐 **DevTunnels could fail when the region was selected automatically**
— Tunnel setup and health checks now use the cluster-qualified tunnel ID
returned by the DevTunnel CLI for port operations and access queries.
This fixes failures when a bare tunnel ID cannot be resolved for those
operations. Regression introduced in 13.3. Fixes
[#​18790](https://github.com/microsoft/aspire/issues/18790).
([#​19853](https://github.com/microsoft/aspire/pull/19853), backport of
[#​19230](https://github.com/microsoft/aspire/pull/19230), @​Vladipz)

- ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The
dashboard now hides the `azure-environment` resource when no Azure
resources require cloud provisioning, instead of leaving it visible in
**Not started**. It remains visible for apps that combine local
emulators with resources requiring Azure provisioning. No AppHost
changes are needed. Fixes
[#​19617](https://github.com/microsoft/aspire/issues/19617).
([#​19998](https://github.com/microsoft/aspire/pull/19998), backport of
[#​19843](https://github.com/microsoft/aspire/pull/19843), @​eerhardt)

- 🧩 **Starter app generation could alter unrelated JavaScript values** —
Dynamic port replacement could also replace matching numeric literals in
bundled JavaScript, including Bootstrap timing values. Port
substitutions are now restricted to `localhost:` URLs, preserving the
original library files while still configuring the requested ports.
Fixes [#​20030](https://github.com/microsoft/aspire/issues/20030).
([#​20110](https://github.com/microsoft/aspire/pull/20110), backport of
[#​20031](https://github.com/microsoft/aspire/pull/20031),
@​bart-vmware, @​JamesNK)

- 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced
deprecated cask URL and post-install syntax with the supported
equivalents, resolving compatibility issues with current Homebrew while
preserving install-channel metadata.
([#​20119](https://github.com/microsoft/aspire/pull/20119), backport of
[#​19965](https://github.com/microsoft/aspire/pull/19965), @​askpt,
@​joperezr)

- 🧪 **Radius cloud-provider callback interfaces now carry the
experimental diagnostic** — `IAwsRadiusProviderBuilder` and
`IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`,
matching the existing `WithAwsProvider` and `WithAzureProvider` methods.
Code referencing these interfaces directly must now acknowledge the same
experimental API diagnostic.
([#​19874](https://github.com/microsoft/aspire/pull/19874),
@​sebastienros)

---

*Full Changelog:
[v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)*

*Full commit:
[9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)*

Commits viewable in [compare
view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1).
</details>

Updated [Aspire.Hosting.Redis](https://github.com/microsoft/aspire) from
13.5.3 to 13.6.1.

<details>
<summary>Release notes</summary>

_Sourced from [Aspire.Hosting.Redis's
releases](https://github.com/microsoft/aspire/releases)._

## 13.6.1

## What's New in Aspire 13.6.1

Patch release for Aspire 13.6 that reduces dashboard CPU usage during
sustained metric ingestion, restores scrolling in the Metrics tree,
improves dashboard navigation, fixes container exec watch failures, and
ensures session-scoped containers are cleaned up when stopping .NET
AppHosts on Windows.

### 🐛 Fixes

- 📊 **Dashboard CPU usage could increase during long-running metric
ingestion** — Metric retention repeatedly scanned retained history on
every insertion, causing steadily increasing CPU usage even with a fixed
workload. Cleanup now skips dimensions below capacity and removes only
the oldest surplus points when needed. Existing retention limits and
exemplar behavior are unchanged, and no configuration changes are
required. Regression introduced in 13.6. Fixes
[#​20725](https://github.com/microsoft/aspire/issues/20725).
([#​20747](https://github.com/microsoft/aspire/pull/20747), backport of
[#​20736](https://github.com/microsoft/aspire/pull/20736), @​JamesNK)

- 📈 **The Metrics tree could not be scrolled** — The meter and
instrument tree now scrolls when it exceeds the viewport, allowing you
to reach and select instruments below the fold. Regression introduced in
13.6. Fixes [#​20728](https://github.com/microsoft/aspire/issues/20728).
([#​20762](https://github.com/microsoft/aspire/pull/20762), backport of
[#​20758](https://github.com/microsoft/aspire/pull/20758), @​heyysiri)

- 🧭 **Dashboard navigation could fail after a browser disconnect** —
Pending page-state updates now persist session state before navigating
and skip navigation when the browser has disconnected, avoiding an
unhandled navigation failure. The navigation rail's overflow button also
has consistent sizing, icon alignment, and hover styling in expanded and
collapsed layouts and both light and dark themes.
([#​20545](https://github.com/microsoft/aspire/pull/20545), backport of
[#​20527](https://github.com/microsoft/aspire/pull/20527), @​JamesNK)

- 🖥️ **Container exec watches could terminate shortly after AppHost
startup** — A stalled DCP watch connection could produce a critical
`Watch task over Kubernetes ContainerExec resources terminated
unexpectedly` error and stop subsequent terminal state and log updates
from being observed. Watch connection attempts now retry after timeouts,
and periodic restarts correctly recreate connections without swallowing
unrelated cancellation. Regression introduced in 13.6.0.
([#​20664](https://github.com/microsoft/aspire/pull/20664), backport of
[#​20466](https://github.com/microsoft/aspire/pull/20466), @​radical)

- 🪟 **Session-scoped containers could remain running after stopping a
.NET AppHost on Windows** — AppHosts launched through `dotnet run` or
`dotnet watch` now allow DCP to finish resource cleanup during shutdown,
including existing Ctrl+C and `aspire stop` flows. Persistent resources
remain unaffected, while direct .NET launches and TypeScript/polyglot
AppHosts retain their existing process protection. Fixes
[#​20495](https://github.com/microsoft/aspire/issues/20495).
([#​20514](https://github.com/microsoft/aspire/pull/20514), backport of
[#​20494](https://github.com/microsoft/aspire/pull/20494), @​danegsta)

---

*Full Changelog:
[v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)*

*Full commit:
[3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)*


## 13.6.0

# Aspire 13.6.0

Aspire 13.6 brings persistent application history, a refreshed and more
interactive dashboard, first-party Java and Rust hosting, and new Azure
deployment options. Coordinated .NET builds, portable volume paths,
sharper CLI workflows, and more capable editor tooling make it easier to
build, debug, and deploy applications across languages.

## Highlights

- 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and
resource snapshots let you revisit up to ten application runs, with
read-only access to completed runs and default retention limits of
100,000 console log messages, structured logs, and traces each. The
dashboard now ships as Native AOT and adopts Fluent UI v5 with a
collapsible navigation rail.
- 🖥️ **AppHost-owned terminals and database REPLs** — Experimental
terminal APIs let AppHosts create interactive sessions in a dashboard
dock, dialog, or separate window. Opt-in `WithRepl()` commands open
bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and
Valkey, while `aspire terminal ps` and `aspire terminal tape play`
support discovery and repeatable terminal interactions.
- 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java`
and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot,
Quarkus, and Cargo applications into the app model, with generated
container builds and VS Code debugging. These integrations build on work
that originated in the Aspire Community Toolkit.
- 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet`
integration coordinates compatible projects into shared restore and
build groups and supports .NET SDK container publishing. Portable
volume-path environment variables work across local execution and
deployment, while TypeScript AppHosts gain standard `appsettings.json`
configuration and Deno runtime support.
- ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire
run` and `aspire start`, update repository-local CLI manifests with
`aspire update`, create file-based C# AppHosts with `aspire init
--language csharp --file-based`, and export TypeScript API data with
`aspire sdk export`. Terminal commands no longer need a feature flag,
Linux certificate trust includes Firefox NSS databases, and `aspire stop
--force --volumes` adds explicit cleanup of Aspire-owned volumes.
- 💻 **More capable VS Code tooling** — Coding agents can start and stop
AppHosts through the extension, and the Aspire pane exposes deploy,
publish, and pipeline actions. Multi-root discovery, worktree-scoped
lifecycle operations, preserved launch arguments, clearer debug logs,
and missing-debugger guidance make complex workspaces more predictable.
- ☁️ **New Azure options in preview** — Azure Connector Namespace models
external-service connections and managed MCP server configurations.
Azure Container Apps Sandboxes adds isolated sandbox deployments with
configurable resource tiers and lifecycle policies, while Azure
Container Apps Express offers a simplified environment option for rapid
provisioning.
- ☸️ **More expressive, reliable deployments** — Experimental Azure
Provisioning SDK proxies let polyglot AppHosts customize infrastructure.
Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves
inherited hostnames and embedded parameter values, and AKS gains
persistent-volume provisioning and more reliable cleanup.
- 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB
replica sets join Foundry Toolboxes, remote Foundry Local endpoints,
Blazor WebAssembly debugging, and configurable Dev Tunnel expiration.
Azure Cosmos DB and AI Inference client integrations gain health checks,
and the vNext Cosmos DB emulator sends its own telemetry to the
dashboard.

## ⚠️ Breaking changes

Notable changes include automatic TLS for local MongoDB servers when a
certificate is available, the Linux-based vNext Cosmos DB emulator
becoming the default, new Azure Front Door origin names that can require
cleanup of existing origins, portable connection-string
environment-variable aliases on stricter deployment targets, and
experimental terminal types moving from `Aspire.Hosting.Terminals` to
`Aspire.Hosting.ApplicationModel`.

See the full list and migration guidance in the [Aspire 13.6 breaking
changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes).

## 📖 Learn more

For complete details, examples, migration guidance, and everything new
in this release, read [What's new in Aspire
13.6](https://aspire.dev/whats-new/aspire-13-6/).

Thank you to all the community contributors who helped make Aspire 13.6
possible! 💜

---

_Full Changelog:
[v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_

_Full commit:
[56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_


## 13.5.4

## What's New in Aspire 13.5.4

Patch release for Aspire 13.5 that fixes Kafka health-check resource
leaks, DevTunnel errors with automatically selected regions, misleading
Azure emulator dashboard entries, and unintended changes to generated
starter apps, plus Homebrew compatibility and Radius API diagnostic
updates.

### 🐛 Fixes

- 📨 **Kafka health checks leaked producers and polling threads** — Each
AppHost health-check execution created a new Kafka producer without
disposing it, accumulating background threads over time. Health checks
now reuse a producer per Kafka resource and dispose it with the AppHost,
while keeping multiple Kafka resources independently configured. Fixes
[#​20091](https://github.com/microsoft/aspire/issues/20091).
([#​20094](https://github.com/microsoft/aspire/pull/20094), backport of
[#​20092](https://github.com/microsoft/aspire/pull/20092), @​davidfowl)

- 🌐 **DevTunnels could fail when the region was selected automatically**
— Tunnel setup and health checks now use the cluster-qualified tunnel ID
returned by the DevTunnel CLI for port operations and access queries.
This fixes failures when a bare tunnel ID cannot be resolved for those
operations. Regression introduced in 13.3. Fixes
[#​18790](https://github.com/microsoft/aspire/issues/18790).
([#​19853](https://github.com/microsoft/aspire/pull/19853), backport of
[#​19230](https://github.com/microsoft/aspire/pull/19230), @​Vladipz)

- ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The
dashboard now hides the `azure-environment` resource when no Azure
resources require cloud provisioning, instead of leaving it visible in
**Not started**. It remains visible for apps that combine local
emulators with resources requiring Azure provisioning. No AppHost
changes are needed. Fixes
[#​19617](https://github.com/microsoft/aspire/issues/19617).
([#​19998](https://github.com/microsoft/aspire/pull/19998), backport of
[#​19843](https://github.com/microsoft/aspire/pull/19843), @​eerhardt)

- 🧩 **Starter app generation could alter unrelated JavaScript values** —
Dynamic port replacement could also replace matching numeric literals in
bundled JavaScript, including Bootstrap timing values. Port
substitutions are now restricted to `localhost:` URLs, preserving the
original library files while still configuring the requested ports.
Fixes [#​20030](https://github.com/microsoft/aspire/issues/20030).
([#​20110](https://github.com/microsoft/aspire/pull/20110), backport of
[#​20031](https://github.com/microsoft/aspire/pull/20031),
@​bart-vmware, @​JamesNK)

- 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced
deprecated cask URL and post-install syntax with the supported
equivalents, resolving compatibility issues with current Homebrew while
preserving install-channel metadata.
([#​20119](https://github.com/microsoft/aspire/pull/20119), backport of
[#​19965](https://github.com/microsoft/aspire/pull/19965), @​askpt,
@​joperezr)

- 🧪 **Radius cloud-provider callback interfaces now carry the
experimental diagnostic** — `IAwsRadiusProviderBuilder` and
`IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`,
matching the existing `WithAwsProvider` and `WithAzureProvider` methods.
Code referencing these interfaces directly must now acknowledge the same
experimental API diagnostic.
([#​19874](https://github.com/microsoft/aspire/pull/19874),
@​sebastienros)

---

*Full Changelog:
[v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)*

*Full commit:
[9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)*

Commits viewable in [compare
view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1).
</details>

Updated [Aspire.Hosting.Testing](https://github.com/microsoft/aspire)
from 13.5.3 to 13.6.1.

<details>
<summary>Release notes</summary>

_Sourced from [Aspire.Hosting.Testing's
releases](https://github.com/microsoft/aspire/releases)._

## 13.6.1

## What's New in Aspire 13.6.1

Patch release for Aspire 13.6 that reduces dashboard CPU usage during
sustained metric ingestion, restores scrolling in the Metrics tree,
improves dashboard navigation, fixes container exec watch failures, and
ensures session-scoped containers are cleaned up when stopping .NET
AppHosts on Windows.

### 🐛 Fixes

- 📊 **Dashboard CPU usage could increase during long-running metric
ingestion** — Metric retention repeatedly scanned retained history on
every insertion, causing steadily increasing CPU usage even with a fixed
workload. Cleanup now skips dimensions below capacity and removes only
the oldest surplus points when needed. Existing retention limits and
exemplar behavior are unchanged, and no configuration changes are
required. Regression introduced in 13.6. Fixes
[#​20725](https://github.com/microsoft/aspire/issues/20725).
([#​20747](https://github.com/microsoft/aspire/pull/20747), backport of
[#​20736](https://github.com/microsoft/aspire/pull/20736), @​JamesNK)

- 📈 **The Metrics tree could not be scrolled** — The meter and
instrument tree now scrolls when it exceeds the viewport, allowing you
to reach and select instruments below the fold. Regression introduced in
13.6. Fixes [#​20728](https://github.com/microsoft/aspire/issues/20728).
([#​20762](https://github.com/microsoft/aspire/pull/20762), backport of
[#​20758](https://github.com/microsoft/aspire/pull/20758), @​heyysiri)

- 🧭 **Dashboard navigation could fail after a browser disconnect** —
Pending page-state updates now persist session state before navigating
and skip navigation when the browser has disconnected, avoiding an
unhandled navigation failure. The navigation rail's overflow button also
has consistent sizing, icon alignment, and hover styling in expanded and
collapsed layouts and both light and dark themes.
([#​20545](https://github.com/microsoft/aspire/pull/20545), backport of
[#​20527](https://github.com/microsoft/aspire/pull/20527), @​JamesNK)

- 🖥️ **Container exec watches could terminate shortly after AppHost
startup** — A stalled DCP watch connection could produce a critical
`Watch task over Kubernetes ContainerExec resources terminated
unexpectedly` error and stop subsequent terminal state and log updates
from being observed. Watch connection attempts now retry after timeouts,
and periodic restarts correctly recreate connections without swallowing
unrelated cancellation. Regression introduced in 13.6.0.
([#​20664](https://github.com/microsoft/aspire/pull/20664), backport of
[#​20466](https://github.com/microsoft/aspire/pull/20466), @​radical)

- 🪟 **Session-scoped containers could remain running after stopping a
.NET AppHost on Windows** — AppHosts launched through `dotnet run` or
`dotnet watch` now allow DCP to finish resource cleanup during shutdown,
including existing Ctrl+C and `aspire stop` flows. Persistent resources
remain unaffected, while direct .NET launches and TypeScript/polyglot
AppHosts retain their existing process protection. Fixes
[#​20495](https://github.com/microsoft/aspire/issues/20495).
([#​20514](https://github.com/microsoft/aspire/pull/20514), backport of
[#​20494](https://github.com/microsoft/aspire/pull/20494), @​danegsta)

---

*Full Changelog:
[v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)*

*Full commit:
[3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)*


## 13.6.0

# Aspire 13.6.0

Aspire 13.6 brings persistent application history, a refreshed and more
interactive dashboard, first-party Java and Rust hosting, and new Azure
deployment options. Coordinated .NET builds, portable volume paths,
sharper CLI workflows, and more capable editor tooling make it easier to
build, debug, and deploy applications across languages.

## Highlights

- 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and
resource snapshots let you revisit up to ten application runs, with
read-only access to completed runs and default retention limits of
100,000 console log messages, structured logs, and traces each. The
dashboard now ships as Native AOT and adopts Fluent UI v5 with a
collapsible navigation rail.
- 🖥️ **AppHost-owned terminals and database REPLs** — Experimental
terminal APIs let AppHosts create interactive sessions in a dashboard
dock, dialog, or separate window. Opt-in `WithRepl()` commands open
bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and
Valkey, while `aspire terminal ps` and `aspire terminal tape play`
support discovery and repeatable terminal interactions.
- 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java`
and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot,
Quarkus, and Cargo applications into the app model, with generated
container builds and VS Code debugging. These integrations build on work
that originated in the Aspire Community Toolkit.
- 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet`
integration coordinates compatible projects into shared restore and
build groups and supports .NET SDK container publishing. Portable
volume-path environment variables work across local execution and
deployment, while TypeScript AppHosts gain standard `appsettings.json`
configuration and Deno runtime support.
- ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire
run` and `aspire start`, update repository-local CLI manifests with
`aspire update`, create file-based C# AppHosts with `aspire init
--language csharp --file-based`, and export TypeScript API data with
`aspire sdk export`. Terminal commands no longer need a feature flag,
Linux certificate trust includes Firefox NSS databases, and `aspire stop
--force --volumes` adds explicit cleanup of Aspire-owned volumes.
- 💻 **More capable VS Code tooling** — Coding agents can start and stop
AppHosts through the extension, and the Aspire pane exposes deploy,
publish, and pipeline actions. Multi-root discovery, worktree-scoped
lifecycle operations, preserved launch arguments, clearer debug logs,
and missing-debugger guidance make complex workspaces more predictable.
- ☁️ **New Azure options in preview** — Azure Connector Namespace models
external-service connections and managed MCP server configurations.
Azure Container Apps Sandboxes adds isolated sandbox deployments with
configurable resource tiers and lifecycle policies, while Azure
Container Apps Express offers a simplified environment option for rapid
provisioning.
- ☸️ **More expressive, reliable deployments** — Experimental Azure
Provisioning SDK proxies let polyglot AppHosts customize infrastructure.
Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves
inherited hostnames and embedded parameter values, and AKS gains
persistent-volume provisioning and more reliable cleanup.
- 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB
replica sets join Foundry Toolboxes, remote Foundry Local endpoints,
Blazor WebAssembly debugging, and configurable Dev Tunnel expiration.
Azure Cosmos DB and AI Inference client integrations gain health checks,
and the vNext Cosmos DB emulator sends its own telemetry to the
dashboard.

## ⚠️ Breaking changes

Notable changes include automatic TLS for local MongoDB servers when a
certificate is available, the Linux-based vNext Cosmos DB emulator
becoming the default, new Azure Front Door origin names that can require
cleanup of existing origins, portable connection-string
environment-variable aliases on stricter deployment targets, and
experimental terminal types moving from `Aspire.Hosting.Terminals` to
`Aspire.Hosting.ApplicationModel`.

See the full list and migration guidance in the [Aspire 13.6 breaking
changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes).

## 📖 Learn more

For complete details, examples, migration guidance, and everything new
in this release, read [What's new in Aspire
13.6](https://aspire.dev/whats-new/aspire-13-6/).

Thank you to all the community contributors who helped make Aspire 13.6
possible! 💜

---

_Full Changelog:
[v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_

_Full commit:
[56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_


## 13.5.4

## What's New in Aspire 13.5.4

Patch release for Aspire 13.5 that fixes Kafka health-check resource
leaks, DevTunnel errors with automatically selected regions, misleading
Azure emulator dashboard entries, and unintended changes to generated
starter apps, plus Homebrew compatibility and Radius API diagnostic
updates.

### 🐛 Fixes

- 📨 **Kafka health checks leaked producers and polling threads** — Each
AppHost health-check execution created a new Kafka producer without
disposing it, accumulating background threads over time. Health checks
now reuse a producer per Kafka resource and dispose it with the AppHost,
while keeping multiple Kafka resources independently configured. Fixes
[#​20091](https://github.com/microsoft/aspire/issues/20091).
([#​20094](https://github.com/microsoft/aspire/pull/20094), backport of
[#​20092](https://github.com/microsoft/aspire/pull/20092), @​davidfowl)

- 🌐 **DevTunnels could fail when the region was selected automatically**
— Tunnel setup and health checks now use the cluster-qualified tunnel ID
returned by the DevTunnel CLI for port operations and access queries.
This fixes failures when a bare tunnel ID cannot be resolved for those
operations. Regression introduced in 13.3. Fixes
[#​18790](https://github.com/microsoft/aspire/issues/18790).
([#​19853](https://github.com/microsoft/aspire/pull/19853), backport of
[#​19230](https://github.com/microsoft/aspire/pull/19230), @​Vladipz)

- ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The
dashboard now hides the `azure-environment` resource when no Azure
resources require cloud provisioning, instead of leaving it visible in
**Not started**. It remains visible for apps that combine local
emulators with resources requiring Azure provisioning. No AppHost
changes are needed. Fixes
[#​19617](https://github.com/microsoft/aspire/issues/19617).
([#​19998](https://github.com/microsoft/aspire/pull/19998), backport of
[#​19843](https://github.com/microsoft/aspire/pull/19843), @​eerhardt)

- 🧩 **Starter app generation could alter unrelated JavaScript values** —
Dynamic port replacement could also replace matching numeric literals in
bundled JavaScript, including Bootstrap timing values. Port
substitutions are now restricted to `localhost:` URLs, preserving the
original library files while still configuring the requested ports.
Fixes [#​20030](https://github.com/microsoft/aspire/issues/20030).
([#​20110](https://github.com/microsoft/aspire/pull/20110), backport of
[#​20031](https://github.com/microsoft/aspire/pull/20031),
@​bart-vmware, @​JamesNK)

- 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced
deprecated cask URL and post-install syntax with the supported
equivalents, resolving compatibility issues with current Homebrew while
preserving install-channel metadata.
([#​20119](https://github.com/microsoft/aspire/pull/20119), backport of
[#​19965](https://github.com/microsoft/aspire/pull/19965), @​askpt,
@​joperezr)

- 🧪 **Radius cloud-provider callback interfaces now carry the
experimental diagnostic** — `IAwsRadiusProviderBuilder` and
`IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`,
matching the existing `WithAwsProvider` and `WithAzureProvider` methods.
Code referencing these interfaces directly must now acknowledge the same
experimental API diagnostic.
([#​19874](https://github.com/microsoft/aspire/pull/19874),
@​sebastienros)

---

*Full Changelog:
[v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)*

*Full commit:
[9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)*

Commits viewable in [compare
view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1).
</details>

Updated
[Aspire.Npgsql.EntityFrameworkCore.PostgreSQL](https://github.com/microsoft/aspire)
from 13.5.3 to 13.6.1.

<details>
<summary>Release notes</summary>

_Sourced from [Aspire.Npgsql.EntityFrameworkCore.PostgreSQL's
releases](https://github.com/microsoft/aspire/releases)._

## 13.6.1

## What's New in Aspire 13.6.1

Patch release for Aspire 13.6 that reduces dashboard CPU usage during
sustained metric ingestion, restores scrolling in the Metrics tree,
improves dashboard navigation, fixes container exec watch failures, and
ensures session-scoped containers are cleaned up when stopping .NET
AppHosts on Windows.

### 🐛 Fixes

- 📊 **Dashboard CPU usage could increase during long-running metric
ingestion** — Metric retention repeatedly scanned retained history on
every insertion, causing steadily increasing CPU usage even with a fixed
workload. Cleanup now skips dimensions below capacity and removes only
the oldest surplus points when needed. Existing retention limits and
exemplar behavior are unchanged, and no configuration changes are
required. Regression introduced in 13.6. Fixes
[#​20725](https://github.com/microsoft/aspire/issues/20725).
([#​20747](https://github.com/microsoft/aspire/pull/20747), backport of
[#​20736](https://github.com/microsoft/aspire/pull/20736), @​JamesNK)

- 📈 **The Metrics tree could not be scrolled** — The meter and
instrument tree now scrolls when it exceeds the viewport, allowing you
to reach and select instruments below the fold. Regression introduced in
13.6. Fixes [#​20728](https://github.com/microsoft/aspire/issues/20728).
([#​20762](https://github.com/microsoft/aspire/pull/20762), backport of
[#​20758](https://github.com/microsoft/aspire/pull/20758), @​heyysiri)

- 🧭 **Dashboard navigation could fail after a browser disconnect** —
Pending page-state updates now persist session state before navigating
and skip navigation when the browser has disconnected, avoiding an
unhandled navigation failure. The navigation rail's overflow button also
has consistent sizing, icon alignment, and hover styling in expanded and
collapsed layouts and both light and dark themes.
([#​20545](https://github.com/microsoft/aspire/pull/20545), backport of
[#​20527](https://github.com/microsoft/aspire/pull/20527), @​JamesNK)

- 🖥️ **Container exec watches could terminate shortly after AppHost
startup** — A stalled DCP watch connection could produce a critical
`Watch task over Kubernetes ContainerExec resources terminated
unexpectedly` error and …
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 17, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Kafka AppHost health checks leak producer threads and cause high CPU

4 participants