From 5b9c79c5cb79aef80c84f0b51a89a0c3804979d0 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 05:08:26 +0000
Subject: [PATCH 1/8] Initial plan
From a891d8c6bd355d59c7afc27ad61f97c0adb9816b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 05:34:50 +0000
Subject: [PATCH 2/8] docs: auto-generate and validate README integrations
table
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
---
.../workflows/readme-integrations-check.yml | 27 +++
README.md | 124 ++++++++------
eng/scripts/generate-readme-integrations.py | 158 ++++++++++++++++++
3 files changed, 260 insertions(+), 49 deletions(-)
create mode 100644 .github/workflows/readme-integrations-check.yml
create mode 100755 eng/scripts/generate-readme-integrations.py
diff --git a/.github/workflows/readme-integrations-check.yml b/.github/workflows/readme-integrations-check.yml
new file mode 100644
index 000000000..571d5e97c
--- /dev/null
+++ b/.github/workflows/readme-integrations-check.yml
@@ -0,0 +1,27 @@
+name: README Integrations Check
+
+on:
+ pull_request:
+ paths:
+ - README.md
+ - src/**/CommunityToolkit.Aspire*.csproj
+ - src/**/README.md
+ - eng/scripts/generate-readme-integrations.py
+ - .github/workflows/readme-integrations-check.yml
+
+jobs:
+ validate-readme-integrations:
+ name: Validate integrations table
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+
+ - name: Verify README integrations table is up to date
+ run: python eng/scripts/generate-readme-integrations.py --check
diff --git a/README.md b/README.md
index 3abed65fe..686aeb9f2 100644
--- a/README.md
+++ b/README.md
@@ -12,55 +12,81 @@ All features are contributed by you, our amazing Aspire community, and maintaine
This repository contains the source code for the Aspire Community Toolkit, a collection of community created Integrations and extensions for [Aspire](https://aka.ms/dotnet/aspire).
-| Package | Description |
-| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| - **Learn More**: [`Hosting.Golang`][golang-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields]][golang-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields-preview]][golang-nuget-preview] | A hosting integration Golang apps. |
-| - **Learn More**: [`Hosting.Java`][java-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields]][java-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields-preview]][java-nuget-preview] | An integration for running Java code in Aspire either using the local JDK or using a container. |
-| - **Learn More**: [`Hosting.K3s`][k3s-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.K3s][k3s-shields]][k3s-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.K3s][k3s-shields-preview]][k3s-nuget-preview] | An Aspire hosting integration for [k3s](https://k3s.io/), a lightweight Kubernetes distribution by Rancher. |
-| - **Learn More**: [`Hosting.NodeJS.Extensions`][nodejs-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.NodeJS.Extensions][nodejs-ext-shields]][nodejs-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.JavaScript.Extensions][nodejs-ext-shields-preview]][nodejs-ext-nuget-preview] | An integration that contains some additional extensions for running Node.js applications |
-| - **Learn More**: [`Hosting.Ollama`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields]][ollama-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields-preview]][ollama-nuget-preview] | An Aspire hosting integration leveraging the [Ollama](https://ollama.com) container with support for downloading a model on startup. |
-| - **Learn More**: [`OllamaSharp`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields]][ollamasharp-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields-preview]][ollamasharp-nuget-preview] | An Aspire client integration for the [OllamaSharp](https://github.com/awaescher/OllamaSharp) package. |
-| - **Learn More**: [`Hosting.Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields]][meilisearch-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields-preview]][meilisearch-nuget-preview] | An Aspire hosting integration leveraging the [Meilisearch](https://meilisearch.com) container. |
-| - **Learn More**: [`Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields]][meilisearch-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields-preview]][meilisearch-client-nuget-preview] | An Aspire client integration for the [Meilisearch](https://github.com/meilisearch/meilisearch-dotnet) package. |
-| - **Learn More**: [`Hosting.Azure.DataApiBuilder`][dab-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields]][dab-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields-preview]][dab-nuget-preview] | A hosting integration for the [Azure Data API builder](https://learn.microsoft.com/en-us/azure/data-api-builder/overview). |
-| - **Learn More**: [`Hosting.Deno`][deno-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields]][deno-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields-preview]][deno-nuget-preview] | A hosting integration for the Deno apps. |
-| - **Learn More**: [`Hosting.SqlDatabaseProjects`][sql-database-projects-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields]][sql-database-projects-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields-preview]][sql-database-projects-nuget-preview] | A hosting integration for the SQL Databases Projects. |
-| - **Learn More**: [`Hosting.Rust`][rust-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields]][rust-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields-preview]][rust-nuget-preview] | A hosting integration for the Rust apps. |
-| - **Learn More**: [`Hosting.Bun`][bun-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields]][bun-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields-preview]][bun-nuget-preview] | **Deprecated**: use the core `Aspire.Hosting.JavaScript` `AddBunApp(...)` integration. |
-| - **Learn More**: [`Hosting.Bitwarden.SecretManager`][bitwarden-secret-manager-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager][bitwarden-secret-manager-hosting-shields]][bitwarden-secret-manager-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager][bitwarden-secret-manager-hosting-shields-preview]][bitwarden-secret-manager-hosting-nuget-preview] | A hosting integration for Bitwarden Secrets Manager projects and managed secrets. |
-| - **Learn More**: [`Bitwarden.SecretManager`][bitwarden-secret-manager-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager][bitwarden-secret-manager-client-shields]][bitwarden-secret-manager-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager][bitwarden-secret-manager-client-shields-preview]][bitwarden-secret-manager-client-nuget-preview] | A client integration for authenticating and using the Bitwarden Secrets Manager SDK from Aspire applications. |
-| - **Learn More**: [`Hosting.Perl`][perl-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Perl][perl-shields]][perl-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Perl][perl-shields-preview]][perl-nuget-preview] | A hosting integration for Perl scripts and APIs. |
-| - **Learn More**: [`Hosting.Python.Extensions`][python-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Python.Extensions][python-ext-shields]][python-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions][python-ext-shields-preview]][python-ext-nuget-preview] | An integration that contains some additional extensions for running python applications |
-| - **Learn More**: [`Hosting.KurrentDB`][kurrentdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields]][kurrentdb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields-preview]][kurrentdb-nuget-preview] | An Aspire hosting integration leveraging the [KurrentDB](https://www.kurrent.io) container. |
-| - **Learn More**: [`KurrentDB`][kurrentdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields]][kurrentdb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields-preview]][kurrentdb-client-nuget-preview] | An Aspire client integration for the [KurrentDB](https://github.com/kurrent-io/KurrentDB-Client-Dotnet) package. |
-| - **Learn More**: [`Hosting.Flagd`][flagd-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Flagd][flagd-shields]][flagd-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Flagd][flagd-shields-preview]][flagd-nuget-preview] | An Aspire hosting integration for [flagd](https://flagd.dev), a feature flag evaluation engine. |
-| - **Learn More**: [`Hosting.ActiveMQ`][activemq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields]][activemq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields-preview]][activemq-nuget-preview] | An Aspire hosting integration leveraging the [ActiveMq](https://activemq.apache.org) container. |
-| - **Learn More**: [`Hosting.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields]][sqlite-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields-preview]][sqlite-hosting-nuget-preview] | An Aspire hosting integration to setup a SQLite database with optional SQLite Web as a dev UI. |
-| - **Learn More**: [`Microsoft.Data.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields]][sqlite-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields-preview]][sqlite-nuget-preview] | An Aspire client integration for the Microsoft.Data.Sqlite NuGet package. |
-| - **Learn More**: [`Microsoft.EntityFrameworkCore.Sqlite`][sqlite-ef-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields]][sqlite-ef-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields-preview]][sqlite-ef-nuget-preview] | An Aspire client integration for the Microsoft.EntityFrameworkCore.Sqlite NuGet package. |
-| - **Learn More**: [`Hosting.Dapr`][dapr-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields]][dapr-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields-preview]][dapr-nuget-preview] | An Aspire hosting integration for Dapr. |
-| - **Learn More**: [`Hosting.Azure.Dapr.Redis`][dapr-azureredis-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields]][dapr-azureredis-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields-preview]][dapr-azureredis-nuget-preview] | An extension for the Dapr hosting integration for using Dapr with Azure Redis cache. |
-| - **Learn More**: [`Hosting.RavenDB`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields]][ravendb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields-preview]][ravendb-nuget-preview] | An Aspire integration leveraging the [RavenDB](https://ravendb.net/) container. |
-| - **Learn More**: [`RavenDB.Client`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields]][ravendb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields-preview]][ravendb-client-nuget-preview] | An Aspire client integration for the [RavenDB.Client](https://www.nuget.org/packages/RavenDB.client) package. |
-| - **Learn More**: [`Hosting.GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields]][go-feature-flag-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields-preview]][go-feature-flag-nuget-preview] | An Aspire hosting integration leveraging the [GoFeatureFlag](https://gofeatureflag.org/) container. |
-| - **Learn More**: [`GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields]][go-feature-flag-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields-preview]][go-feature-flag-client-nuget-preview] | An Aspire client integration for the [GoFeatureFlag](https://github.com/open-feature/dotnet-sdk-contrib/tree/main/src/OpenFeature.Providers.GOFeatureFlag) package. |
-| - **Learn More**: [`Hosting.MongoDB.Extensions`][mongodb-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.MongoDB.Extensions][mongodb-ext-shields]][mongodb-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MongoDB.Extensions][mongodb-ext-shields-preview]][mongodb-ext-nuget-preview] | An integration that contains some additional extensions for hosting MongoDB container. |
-| - **Learn More**: [`Hosting.PostgreSQL.Extensions`][postgres-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.PostgreSQL.Extensions][postgres-ext-shields]][postgres-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions][postgres-ext-shields-preview]][postgres-ext-nuget-preview] | An integration that contains some additional extensions for hosting PostgreSQL container. |
-| - **Learn More**: [`Hosting.Redis.Extensions`][redis-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Redis.Extensions][redis-ext-shields]][redis-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions][redis-ext-shields-preview]][redis-ext-nuget-preview] | An integration that contains some additional extensions for hosting Redis container. |
-| - **Learn More**: [`Hosting.SqlServer.Extensions`][sqlserver-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.SqlServer.Extensions][sqlserver-ext-shields]][sqlserver-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlServer.Extensions][sqlserver-ext-shields-preview]][sqlserver-ext-nuget-preview] | An integration that contains some additional extensions for hosting SqlServer container. |
-| - **Learn More**: [`Hosting.LavinMQ`][lavinmq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields]][lavinmq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields-preview]][lavinmq-nuget-preview] | An Aspire hosting integration for [LavinMQ](https://www.lavinmq.com). |
-| - **Learn More**: [`Hosting.MailPit`][mailpit-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields]][mailpit-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields-preview]][mailpit-ext-nuget-preview] | An Aspire integration leveraging the [MailPit](https://mailpit.axllent.org/) container. |
-| - **Learn More**: [`Hosting.k6`][k6-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields]][k6-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields-preview]][k6-nuget-preview] | An Aspire integration leveraging the [Grafana k6](https://k6.io/) container. |
-| - **Learn More**: [`Hosting.MySql.Extensions`][mysql-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.MySql.Extensions][mysql-ext-shields]][mysql-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MySql.Extensions][mysql-ext-shields-preview]][mysql-ext-nuget-preview] | An integration that contains some additional extensions for hosting MySql container. |
-| - **Learn More**: [`Hosting.MinIO`][minio-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields]][minio-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields-preview]][minio-hosting-nuget-preview] | An Aspire hosting integration to setup a [MinIO S3](https://min.io/) storage. |
-| - **Learn More**: [`MinIO.Client`][minio-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Minio.Client][minio-client-shields]][minio-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Client.Minio][minio-client-shields-preview]][minio-client-nuget-preview] | An Aspire client integration for the [MinIO](https://github.com/minio/minio-dotnet) package. |
-| - **Learn More**: [`Hosting.RustFs`][rustfs-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RustFs][rustfs-hosting-shields]][rustfs-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RustFs][rustfs-hosting-shields-preview]][rustfs-hosting-nuget-preview] | An Aspire hosting integration to setup a [RustFs](https://github.com/rustfs/rustfs) S3-compatible storage. |
-| - **Learn More**: [`Hosting.SurrealDb`][surrealdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SurrealDb][surrealdb-shields]][surrealdb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SurrealDb][surrealdb-shields-preview]][surrealdb-nuget-preview] | An Aspire hosting integration leveraging the [SurrealDB](https://surrealdb.com/) container. |
-| - **Learn More**: [`SurrealDb`][surrealdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.SurrealDb][surrealdb-client-shields]][surrealdb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.SurrealDb][surrealdb-client-shields-preview]][surrealdb-client-nuget-preview] | An Aspire client integration for the [SurrealDB](https://github.com/surrealdb/surrealdb.net/) package. |
-| - **Learn More**: [`Hosting.Elasticsearch.Extensions`][elasticsearch-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions][elasticsearch-ext-shields]][elasticsearch-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions][elasticsearch-ext-shields-preview]][elasticsearch-ext-nuget-preview] | An integration that contains some additional extensions for hosting Elasticsearch container. |
-| - **Learn More**: [`Hosting.Umami`][umami-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Umami][umami-shields]][umami-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Umami][umami-shields-preview]][umami-nuget-preview] | An Aspire hosting integration leveraging the [Umami](https://umami.is/) container. |
-| - **Learn More**: [`Hosting.Azure.Extensions`][azure-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Azure.Extensions][azure-ext-shields]][azure-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions][azure-ext-shields-preview]][azure-ext-nuget-preview] | An integration that contains some additional extensions for hosting Azure container. |
-| - **Learn More**: [`Hosting.Squad`][squad-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Squad][squad-shields]][squad-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Squad][squad-shields-preview]][squad-nuget-preview] | An Aspire hosting integration that models a [Squad](https://github.com/bradygaster/squad) AI-agent team as a first-class resource. |
+
+| Package | Description |
+| --- | --- |
+| - **Learn More**: [`Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Bitwarden.SecretManager/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Bitwarden.SecretManager/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Bitwarden.SecretManager/absoluteLatest) | An Aspire client integration for Bitwarden Secrets Manager. |
+| - **Learn More**: [`DuckDB.NET.Data`](src/CommunityToolkit.Aspire.DuckDB.NET.Data/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.DuckDB.NET.Data/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.DuckDB.NET.Data/absoluteLatest) | An Aspire client integration for the DuckDB.NET.Data package. |
+| - **Learn More**: [`GoFeatureFlag`](src/CommunityToolkit.Aspire.GoFeatureFlag/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.GoFeatureFlag/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.GoFeatureFlag/absoluteLatest) | A GO Feature Flag client that integrates with Aspire, including health checks, logging, and telemetry. |
+| - **Learn More**: [`Hosting.ActiveMQ`](src/CommunityToolkit.Aspire.Hosting.ActiveMQ/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.ActiveMQ/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.ActiveMQ/absoluteLatest) | An Aspire hosting package for hosting ActiveMQ. |
+| - **Learn More**: [`Hosting.Adminer`](src/CommunityToolkit.Aspire.Hosting.Adminer/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Adminer/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Adminer/absoluteLatest) | An Aspire hosting integration for the Adminer database management container. |
+| - **Learn More**: [`Hosting.Azure.Dapr`](src/CommunityToolkit.Aspire.Hosting.Azure.Dapr/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr/absoluteLatest) | Azure Dapr support for Aspire. |
+| - **Learn More**: [`Hosting.Azure.Dapr.Redis`](src/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis/absoluteLatest) | An Aspire hosting integration for configuring Azure Cache for Redis as a Dapr state store or pub/sub component in your AppHost. |
+| - **Learn More**: [`Hosting.Azure.DataApiBuilder`](src/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/absoluteLatest) | An Aspire component leveraging the Data API Builder container. |
+| - **Learn More**: [`Hosting.Azure.Extensions`](src/CommunityToolkit.Aspire.Hosting.Azure.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/absoluteLatest) | Azure extensions support for Aspire. |
+| - **Learn More**: [`Hosting.Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/absoluteLatest) | An Aspire hosting integration for Bitwarden Secrets Manager. |
+| - **Learn More**: [`Hosting.Bun`](src/CommunityToolkit.Aspire.Hosting.Bun/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/absoluteLatest) | An Aspire integration for hosting Bun apps. DEPRECATED: Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release. |
+| - **Learn More**: [`Hosting.Dapr`](src/CommunityToolkit.Aspire.Hosting.Dapr/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/absoluteLatest) | Dapr support for Aspire. |
+| - **Learn More**: [`Hosting.DbGate`](src/CommunityToolkit.Aspire.Hosting.DbGate/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/absoluteLatest) | An Aspire hosting integration for the DbGate database management container. |
+| - **Learn More**: [`Hosting.Dbx`](src/CommunityToolkit.Aspire.Hosting.Dbx/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/absoluteLatest) | An Aspire hosting integration for the Dbx database management container. |
+| - **Learn More**: [`Hosting.Deno`](src/CommunityToolkit.Aspire.Hosting.Deno/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Deno/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Deno/absoluteLatest) | An Aspire integration for hosting Deno apps. |
+| - **Learn More**: [`Hosting.DuckDB`](src/CommunityToolkit.Aspire.Hosting.DuckDB/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DuckDB/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DuckDB/absoluteLatest) | An Aspire hosting integration for providing a DuckDB database connection. |
+| - **Learn More**: [`Hosting.Elasticsearch.Extensions`](src/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions/absoluteLatest) | An Aspire hosting integration for extending Elasticsearch resources with additional management tooling. |
+| - **Learn More**: [`Hosting.Flagd`](src/CommunityToolkit.Aspire.Hosting.Flagd/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flagd/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flagd/absoluteLatest) | flagd is a feature flag evaluation engine. Think of it as a ready-made, open source, OpenFeature-compliant feature flag backend system. |
+| - **Learn More**: [`Hosting.Flyway`](src/CommunityToolkit.Aspire.Hosting.Flyway/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flyway/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flyway/absoluteLatest) | An Aspire integration for Flyway database migration tool. |
+| - **Learn More**: [`Hosting.GoFeatureFlag`](src/CommunityToolkit.Aspire.Hosting.GoFeatureFlag/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.GoFeatureFlag/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.GoFeatureFlag/absoluteLatest) | GO Feature Flag support for Aspire. |
+| - **Learn More**: [`Hosting.Golang`](src/CommunityToolkit.Aspire.Hosting.Golang/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Golang/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Golang/absoluteLatest) | An Aspire integration for hosting Golang apps. |
+| - **Learn More**: [`Hosting.Java`](src/CommunityToolkit.Aspire.Hosting.Java/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Java/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Java/absoluteLatest) | An Aspire integration for hosting Java apps using either the Java executable or container image. |
+| - **Learn More**: [`Hosting.JavaScript.Extensions`](src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/absoluteLatest) | An Aspire integration for hosting NodeJS apps using Vite, Yarn, PNPM, or NPM. |
+| - **Learn More**: [`Hosting.K3s`](src/CommunityToolkit.Aspire.Hosting.K3s/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.K3s/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.K3s/absoluteLatest) | An Aspire hosting integration for k3s. Provides AddK3sCluster, AddHelmRelease (via alpine/helm), AddK8sManifest with Kustomize support (via alpine/kubectl), and AddServiceEndpoint for in-process WebSocket port-forwarding. No host-side kubectl or helm required. |
+| - **Learn More**: [`Hosting.k6`](src/CommunityToolkit.Aspire.Hosting.k6/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.k6/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.k6/absoluteLatest) | Grafana k6 support for Aspire. |
+| - **Learn More**: [`Hosting.Keycloak.Extensions`](src/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions/absoluteLatest) | Aspire hosting extensions for Keycloak (includes PostgreSQL integration). |
+| - **Learn More**: [`Hosting.KurrentDB`](src/CommunityToolkit.Aspire.Hosting.KurrentDB/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.KurrentDB/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.KurrentDB/absoluteLatest) | KurrentDB support for Aspire. |
+| - **Learn More**: [`Hosting.LavinMQ`](src/CommunityToolkit.Aspire.Hosting.LavinMQ/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.LavinMQ/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.LavinMQ/absoluteLatest) | An Aspire hosting package for hosting LavinMQ. |
+| - **Learn More**: [`Hosting.Listmonk`](src/CommunityToolkit.Aspire.Hosting.Listmonk/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Listmonk/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Listmonk/absoluteLatest) | listmonk support for Aspire. |
+| - **Learn More**: [`Hosting.Logto`](src/CommunityToolkit.Aspire.Hosting.Logto/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Logto/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Logto/absoluteLatest) | .NET Aspire hosting extensions for Logto (includes PostgreSQL and Redis integration). |
+| - **Learn More**: [`Hosting.MailPit`](src/CommunityToolkit.Aspire.Hosting.MailPit/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MailPit/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MailPit/absoluteLatest) | An Aspire component leveraging the MailPit container. |
+| - **Learn More**: [`Hosting.McpInspector`](src/CommunityToolkit.Aspire.Hosting.McpInspector/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.McpInspector/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.McpInspector/absoluteLatest) | An Aspire hosting integration to run the MCP Inspector against a Model Context Protocol (MCP) server. |
+| - **Learn More**: [`Hosting.Meilisearch`](src/CommunityToolkit.Aspire.Hosting.Meilisearch/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Meilisearch/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Meilisearch/absoluteLatest) | Meilisearch support for Aspire. |
+| - **Learn More**: [`Hosting.Minio`](src/CommunityToolkit.Aspire.Hosting.Minio/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Minio/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Minio/absoluteLatest) | ⚠️ **Deprecated** — An Aspire hosting integration for MinIO. DEPRECATED: The MinIO OSS project has been archived and is no longer maintained. This integration is deprecated and will be removed in a future version. |
+| - **Learn More**: [`Hosting.MongoDB.Extensions`](src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/absoluteLatest) | An Aspire hosting integration for extending MongoDB resources with additional management tooling. |
+| - **Learn More**: [`Hosting.MySql.Extensions`](src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MySql.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MySql.Extensions/absoluteLatest) | An Aspire hosting integration for extending MySQL resources with additional management tooling. |
+| - **Learn More**: [`Hosting.Ngrok`](src/CommunityToolkit.Aspire.Hosting.Ngrok/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ngrok/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ngrok/absoluteLatest) | An Aspire integration for exposing hosted applications via secure, public URLs using ngrok. |
+| - **Learn More**: [`Hosting.Ollama`](src/CommunityToolkit.Aspire.Hosting.Ollama/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ollama/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ollama/absoluteLatest) | An Aspire integration leveraging the Ollama container with support for downloading a model on startup. |
+| - **Learn More**: [`Hosting.OpenTelemetryCollector`](src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/absoluteLatest) | An Aspire hosting integration to add an OpenTelemetry Collector into the OTLP pipeline. |
+| - **Learn More**: [`Hosting.PapercutSmtp`](src/CommunityToolkit.Aspire.Hosting.PapercutSmtp/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PapercutSmtp/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PapercutSmtp/absoluteLatest) | An Aspire component leveraging Papercut SMTP container. |
+| - **Learn More**: [`Hosting.Perl`](src/CommunityToolkit.Aspire.Hosting.Perl/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/absoluteLatest) | An Aspire hosting integration for hosting Perl apps. |
+| - **Learn More**: [`Hosting.PostgreSQL.Extensions`](src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/absoluteLatest) | An Aspire hosting integration for extending PostgreSQL resources with additional management tooling. |
+| - **Learn More**: [`Hosting.PowerShell`](src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/absoluteLatest) | Run powershell scripts in-process with your Aspire AppHost, injecting aspire resources and/or object instances as variables, using the command lines tools of your choice like azure cli, azd, or any other terminal tools. |
+| - **Learn More**: [`Hosting.Python.Extensions`](src/CommunityToolkit.Aspire.Hosting.Python.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/absoluteLatest) | An Aspire integration for hosting Uvicorn apps. |
+| - **Learn More**: [`Hosting.RavenDB`](src/CommunityToolkit.Aspire.Hosting.RavenDB/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/absoluteLatest) | An Aspire integration leveraging the RavenDB container. |
+| - **Learn More**: [`Hosting.Redis.Extensions`](src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/absoluteLatest) | An Aspire hosting integration for extending Redis resources with additional management tooling. |
+| - **Learn More**: [`Hosting.Rust`](src/CommunityToolkit.Aspire.Hosting.Rust/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/absoluteLatest) | An Aspire integration for hosting Rust apps. |
+| - **Learn More**: [`Hosting.RustFs`](src/CommunityToolkit.Aspire.Hosting.RustFs/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RustFs/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RustFs/absoluteLatest) | An Aspire hosting integration for the RustFS S3-compatible object storage container. |
+| - **Learn More**: [`Hosting.SeaweedFS`](src/CommunityToolkit.Aspire.Hosting.SeaweedFS/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SeaweedFS/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SeaweedFS/absoluteLatest) | Provides extension methods and resource definitions for the Aspire AppHost to support running SeaweedFS containers with an S3-compatible API. |
+| - **Learn More**: [`Hosting.Sftp`](src/CommunityToolkit.Aspire.Hosting.Sftp/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sftp/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sftp/absoluteLatest) | Aspire hosting integration for the atmoz SFTP container image. |
+| - **Learn More**: [`Hosting.Solr`](src/CommunityToolkit.Aspire.Hosting.Solr/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Solr/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Solr/absoluteLatest) | An Aspire hosting integration for Apache Solr. |
+| - **Learn More**: [`Hosting.SqlDatabaseProjects`](src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/absoluteLatest) | An Aspire hosting integration capable of deploying SQL Server Database Projects as part of your AppHost. |
+| - **Learn More**: [`Hosting.Sqlite`](src/CommunityToolkit.Aspire.Hosting.Sqlite/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sqlite/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sqlite/absoluteLatest) | An Aspire hosting integration for providing a Sqlite database connection. |
+| - **Learn More**: [`Hosting.SqlServer.Extensions`](src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/absoluteLatest) | An Aspire hosting integration for extending SQL Server resources with additional management tooling. |
+| - **Learn More**: [`Hosting.Squad`](src/CommunityToolkit.Aspire.Hosting.Squad/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Squad/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Squad/absoluteLatest) | An Aspire hosting integration for Squad AI-agent teams. Models a `.squad/` workspace as a first-class Aspire resource that auto-discovers the team roster and exposes it via WithReference for downstream services. |
+| - **Learn More**: [`Hosting.Stripe`](src/CommunityToolkit.Aspire.Hosting.Stripe/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Stripe/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Stripe/absoluteLatest) | An Aspire integration for the Stripe CLI for local webhook forwarding and testing. |
+| - **Learn More**: [`Hosting.SurrealDb`](src/CommunityToolkit.Aspire.Hosting.SurrealDb/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SurrealDb/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SurrealDb/absoluteLatest) | SurrealDB support for Aspire. |
+| - **Learn More**: [`Hosting.Umami`](src/CommunityToolkit.Aspire.Hosting.Umami/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Umami/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Umami/absoluteLatest) | Umami support for Aspire. |
+| - **Learn More**: [`Hosting.Zitadel`](src/CommunityToolkit.Aspire.Hosting.Zitadel/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Zitadel/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Zitadel/absoluteLatest) | An Aspire hosting integration for the ZITADEL identity and access management container. |
+| - **Learn More**: [`KurrentDB`](src/CommunityToolkit.Aspire.KurrentDB/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.KurrentDB/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.KurrentDB/absoluteLatest) | A KurrentDB client that integrates with Aspire, including health checks, logging, and telemetry. |
+| - **Learn More**: [`Logto.Client`](src/CommunityToolkit.Aspire.Logto.Client/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Logto.Client/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Logto.Client/absoluteLatest) | An Aspire client integration for Logto that registers OpenID Connect (OIDC) or JWT authentication services in the dependency injection container. |
+| - **Learn More**: [`MassTransit.RabbitMQ`](src/CommunityToolkit.Aspire.MassTransit.RabbitMQ/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.MassTransit.RabbitMQ/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.MassTransit.RabbitMQ/absoluteLatest) | An Aspire client integration for MassTransit RabbitMQ. |
+| - **Learn More**: [`Meilisearch`](src/CommunityToolkit.Aspire.Meilisearch/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Meilisearch/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Meilisearch/absoluteLatest) | A Meilisearch client that integrates with Aspire, including health checks, logging, and telemetry. |
+| - **Learn More**: [`Microsoft.Data.Sqlite`](src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/absoluteLatest) | An Aspire client integration for the Microsoft.Data.Sqlite.Core package. |
+| - **Learn More**: [`Microsoft.EntityFrameworkCore.Sqlite`](src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/absoluteLatest) | An Aspire client integration for the Microsoft.EntityFrameworkCore.Sqlite package. |
+| - **Learn More**: [`Minio.Client`](src/CommunityToolkit.Aspire.Minio.Client/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Minio.Client/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Minio.Client/absoluteLatest) | ⚠️ **Deprecated** — An Aspire client integration for MinIO. DEPRECATED: The MinIO OSS project has been archived and is no longer maintained. This integration is deprecated and will be removed in a future version. |
+| - **Learn More**: [`OllamaSharp`](src/CommunityToolkit.Aspire.OllamaSharp/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.OllamaSharp/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.OllamaSharp/absoluteLatest) | An Aspire client integration for the OllamaSharp library. |
+| - **Learn More**: [`RavenDB.Client`](src/CommunityToolkit.Aspire.RavenDB.Client/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.RavenDB.Client/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.RavenDB.Client/absoluteLatest) | An Aspire client integration for the RavenDB.Client library. |
+| - **Learn More**: [`SeaweedFS.Client`](src/CommunityToolkit.Aspire.SeaweedFS.Client/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.SeaweedFS.Client/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.SeaweedFS.Client/absoluteLatest) | An Aspire client integration for SeaweedFS using the AWSSDK.S3 client. |
+| - **Learn More**: [`Sftp`](src/CommunityToolkit.Aspire.Sftp/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Sftp/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Sftp/absoluteLatest) | An SFTP client that integrates with Aspire, including health checks, logging, and telemetry. |
+| - **Learn More**: [`SurrealDb`](src/CommunityToolkit.Aspire.SurrealDb/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.SurrealDb/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.SurrealDb/absoluteLatest) | A SurrealDB client that integrates with Aspire, including health checks, logging, and telemetry. |
+
## 🙌 Getting Started
diff --git a/eng/scripts/generate-readme-integrations.py b/eng/scripts/generate-readme-integrations.py
new file mode 100755
index 000000000..c5807e901
--- /dev/null
+++ b/eng/scripts/generate-readme-integrations.py
@@ -0,0 +1,158 @@
+#!/usr/bin/env python3
+"""Generate the integrations table in README.md from src package projects."""
+
+from __future__ import annotations
+
+import argparse
+import difflib
+import re
+import sys
+import xml.etree.ElementTree as ET
+from dataclasses import dataclass
+from pathlib import Path
+
+TABLE_START = ""
+TABLE_END = ""
+
+
+@dataclass(frozen=True)
+class Integration:
+ package_id: str
+ short_name: str
+ description: str
+ readme_path: str
+ deprecated: bool
+
+
+def _find_repo_root() -> Path:
+ return Path(__file__).resolve().parents[2]
+
+
+def _read_property(project: ET.ElementTree, name: str) -> str | None:
+ for element in project.iter():
+ if element.tag.endswith(name):
+ value = (element.text or "").strip()
+ if value:
+ return value
+ return None
+
+
+def _load_integrations(repo_root: Path) -> list[Integration]:
+ integrations: list[Integration] = []
+
+ for project_path in sorted(repo_root.glob("src/**/CommunityToolkit.Aspire*.csproj")):
+ tree = ET.parse(project_path)
+ project = tree.getroot()
+
+ package_id = _read_property(tree, "PackageId") or project_path.stem
+ description = _read_property(tree, "Description")
+ if description is None:
+ continue
+
+ readme = project_path.parent / "README.md"
+ readme_rel = readme.relative_to(repo_root).as_posix() if readme.exists() else ""
+
+ deprecated = False
+ if readme.exists():
+ readme_text = readme.read_text(encoding="utf-8", errors="ignore")
+ deprecated = bool(re.search(r"\bthis integration is deprecated\b", readme_text, re.IGNORECASE))
+
+ if "|" in description:
+ description = description.replace("|", "\\|")
+
+ if deprecated:
+ description = f"⚠️ **Deprecated** — {description}"
+
+ short_name = package_id.removeprefix("CommunityToolkit.Aspire.")
+
+ integrations.append(
+ Integration(
+ package_id=package_id,
+ short_name=short_name,
+ description=description,
+ readme_path=readme_rel,
+ deprecated=deprecated,
+ )
+ )
+
+ integrations.sort(key=lambda item: item.package_id.lower())
+ return integrations
+
+
+def _render_table(integrations: list[Integration]) -> str:
+ lines: list[str] = [
+ "| Package | Description |",
+ "| --- | --- |",
+ ]
+
+ for integration in integrations:
+ docs_link = integration.readme_path or "#"
+ package = integration.package_id
+ cell = (
+ f"- **Learn More**: [`{integration.short_name}`]({docs_link})
"
+ f"- Stable 📦: [](https://nuget.org/packages/{package}/)
"
+ f"- Preview 📦: [)](https://nuget.org/packages/{package}/absoluteLatest)"
+ )
+ lines.append(f"| {cell} | {integration.description} |")
+
+ return "\n".join(lines)
+
+
+def _update_readme(content: str, table: str) -> str:
+ block = f"{TABLE_START}\n{table}\n{TABLE_END}"
+
+ if TABLE_START in content and TABLE_END in content:
+ pattern = re.compile(rf"{re.escape(TABLE_START)}.*?{re.escape(TABLE_END)}", re.DOTALL)
+ return pattern.sub(block, content, count=1)
+
+ table_start = content.find("| Package")
+ section_start = content.find("\n## 🙌 Getting Started")
+ if table_start == -1 or section_start == -1 or section_start <= table_start:
+ raise RuntimeError("Unable to locate integrations table section in README.md")
+
+ return content[:table_start] + block + "\n" + content[section_start:]
+
+
+def main() -> int:
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--check", action="store_true", help="Check if README integrations table is up to date")
+ args = parser.parse_args()
+
+ repo_root = _find_repo_root()
+ readme_path = repo_root / "README.md"
+
+ integrations = _load_integrations(repo_root)
+ table = _render_table(integrations)
+
+ existing = readme_path.read_text(encoding="utf-8")
+ updated = _update_readme(existing, table)
+
+ if args.check:
+ if existing != updated:
+ diff = "".join(
+ difflib.unified_diff(
+ existing.splitlines(keepends=True),
+ updated.splitlines(keepends=True),
+ fromfile="README.md",
+ tofile="README.md (generated)",
+ )
+ )
+ print("README integrations table is out of date.")
+ print("Run: python eng/scripts/generate-readme-integrations.py")
+ print(diff)
+ return 1
+
+ print("README integrations table is up to date.")
+ return 0
+
+ if existing != updated:
+ readme_path.write_text(updated, encoding="utf-8")
+ print("Updated README integrations table.")
+ else:
+ print("README integrations table already up to date.")
+
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
From 30dc6791e5be793b481f01a050ba49ecc50c3b98 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 05:39:23 +0000
Subject: [PATCH 3/8] ci: enforce autogenerated README integrations list
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
---
.../workflows/readme-integrations-check.yml | 4 ++-
README.md | 4 +--
eng/scripts/generate-readme-integrations.py | 31 ++++++++++++-------
3 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/.github/workflows/readme-integrations-check.yml b/.github/workflows/readme-integrations-check.yml
index 571d5e97c..c49cba7e9 100644
--- a/.github/workflows/readme-integrations-check.yml
+++ b/.github/workflows/readme-integrations-check.yml
@@ -5,7 +5,7 @@ on:
paths:
- README.md
- src/**/CommunityToolkit.Aspire*.csproj
- - src/**/README.md
+ - src/CommunityToolkit.Aspire*/README.md
- eng/scripts/generate-readme-integrations.py
- .github/workflows/readme-integrations-check.yml
@@ -13,6 +13,8 @@ jobs:
validate-readme-integrations:
name: Validate integrations table
runs-on: ubuntu-latest
+ permissions:
+ contents: read
steps:
- name: Checkout repository
diff --git a/README.md b/README.md
index 686aeb9f2..2eebe2f8f 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ This repository contains the source code for the Aspire Community Toolkit, a col
| - **Learn More**: [`Hosting.Azure.DataApiBuilder`](src/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/absoluteLatest) | An Aspire component leveraging the Data API Builder container. |
| - **Learn More**: [`Hosting.Azure.Extensions`](src/CommunityToolkit.Aspire.Hosting.Azure.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/absoluteLatest) | Azure extensions support for Aspire. |
| - **Learn More**: [`Hosting.Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/absoluteLatest) | An Aspire hosting integration for Bitwarden Secrets Manager. |
-| - **Learn More**: [`Hosting.Bun`](src/CommunityToolkit.Aspire.Hosting.Bun/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/absoluteLatest) | An Aspire integration for hosting Bun apps. DEPRECATED: Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release. |
+| - **Learn More**: [`Hosting.Bun`](src/CommunityToolkit.Aspire.Hosting.Bun/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/absoluteLatest) | ⚠️ **Deprecated** — An Aspire integration for hosting Bun apps. DEPRECATED: Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release. |
| - **Learn More**: [`Hosting.Dapr`](src/CommunityToolkit.Aspire.Hosting.Dapr/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/absoluteLatest) | Dapr support for Aspire. |
| - **Learn More**: [`Hosting.DbGate`](src/CommunityToolkit.Aspire.Hosting.DbGate/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/absoluteLatest) | An Aspire hosting integration for the DbGate database management container. |
| - **Learn More**: [`Hosting.Dbx`](src/CommunityToolkit.Aspire.Hosting.Dbx/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/absoluteLatest) | An Aspire hosting integration for the Dbx database management container. |
@@ -58,7 +58,7 @@ This repository contains the source code for the Aspire Community Toolkit, a col
| - **Learn More**: [`Hosting.Perl`](src/CommunityToolkit.Aspire.Hosting.Perl/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/absoluteLatest) | An Aspire hosting integration for hosting Perl apps. |
| - **Learn More**: [`Hosting.PostgreSQL.Extensions`](src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/absoluteLatest) | An Aspire hosting integration for extending PostgreSQL resources with additional management tooling. |
| - **Learn More**: [`Hosting.PowerShell`](src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/absoluteLatest) | Run powershell scripts in-process with your Aspire AppHost, injecting aspire resources and/or object instances as variables, using the command lines tools of your choice like azure cli, azd, or any other terminal tools. |
-| - **Learn More**: [`Hosting.Python.Extensions`](src/CommunityToolkit.Aspire.Hosting.Python.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/absoluteLatest) | An Aspire integration for hosting Uvicorn apps. |
+| - **Learn More**: [`Hosting.Python.Extensions`](src/CommunityToolkit.Aspire.Hosting.Python.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/absoluteLatest) | ⚠️ **Deprecated** — An Aspire integration for hosting Uvicorn apps. |
| - **Learn More**: [`Hosting.RavenDB`](src/CommunityToolkit.Aspire.Hosting.RavenDB/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/absoluteLatest) | An Aspire integration leveraging the RavenDB container. |
| - **Learn More**: [`Hosting.Redis.Extensions`](src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/absoluteLatest) | An Aspire hosting integration for extending Redis resources with additional management tooling. |
| - **Learn More**: [`Hosting.Rust`](src/CommunityToolkit.Aspire.Hosting.Rust/README.md)
- Stable 📦: [](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/)
- Preview 📦: [)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/absoluteLatest) | An Aspire integration for hosting Rust apps. |
diff --git a/eng/scripts/generate-readme-integrations.py b/eng/scripts/generate-readme-integrations.py
index c5807e901..76685f03b 100755
--- a/eng/scripts/generate-readme-integrations.py
+++ b/eng/scripts/generate-readme-integrations.py
@@ -28,8 +28,8 @@ def _find_repo_root() -> Path:
return Path(__file__).resolve().parents[2]
-def _read_property(project: ET.ElementTree, name: str) -> str | None:
- for element in project.iter():
+def _read_property(tree: ET.ElementTree, name: str) -> str | None:
+ for element in tree.iter():
if element.tag.endswith(name):
value = (element.text or "").strip()
if value:
@@ -54,8 +54,11 @@ def _load_integrations(repo_root: Path) -> list[Integration]:
deprecated = False
if readme.exists():
- readme_text = readme.read_text(encoding="utf-8", errors="ignore")
- deprecated = bool(re.search(r"\bthis integration is deprecated\b", readme_text, re.IGNORECASE))
+ readme_text = readme.read_text(encoding="utf-8", errors="replace")
+ deprecated = bool(
+ re.search(r"\bdeprecation notice\b", readme_text, re.IGNORECASE)
+ or re.search(r"\bthis (?:package|integration) is deprecated(?:\b| as of)", readme_text, re.IGNORECASE)
+ )
if "|" in description:
description = description.replace("|", "\\|")
@@ -88,10 +91,12 @@ def _render_table(integrations: list[Integration]) -> str:
for integration in integrations:
docs_link = integration.readme_path or "#"
package = integration.package_id
- cell = (
- f"- **Learn More**: [`{integration.short_name}`]({docs_link})
"
- f"- Stable 📦: [](https://nuget.org/packages/{package}/)
"
- f"- Preview 📦: [)](https://nuget.org/packages/{package}/absoluteLatest)"
+ cell = "
".join(
+ [
+ f"- **Learn More**: [`{integration.short_name}`]({docs_link})",
+ f"- Stable 📦: [](https://nuget.org/packages/{package}/)",
+ f"- Preview 📦: [)](https://nuget.org/packages/{package}/absoluteLatest)",
+ ]
)
lines.append(f"| {cell} | {integration.description} |")
@@ -107,8 +112,12 @@ def _update_readme(content: str, table: str) -> str:
table_start = content.find("| Package")
section_start = content.find("\n## 🙌 Getting Started")
- if table_start == -1 or section_start == -1 or section_start <= table_start:
- raise RuntimeError("Unable to locate integrations table section in README.md")
+ if table_start == -1:
+ raise RuntimeError("Unable to locate '| Package' header in README.md")
+ if section_start == -1:
+ raise RuntimeError("Unable to locate '## 🙌 Getting Started' section in README.md")
+ if section_start <= table_start:
+ raise RuntimeError("Integrations table appears after the getting started section in README.md")
return content[:table_start] + block + "\n" + content[section_start:]
@@ -124,7 +133,7 @@ def main() -> int:
integrations = _load_integrations(repo_root)
table = _render_table(integrations)
- existing = readme_path.read_text(encoding="utf-8")
+ existing = readme_path.read_text(encoding="utf-8", errors="replace")
updated = _update_readme(existing, table)
if args.check:
From ed5a4ea14b7adb3ff462f65c6afc1b5c50da3d9a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 05:46:11 +0000
Subject: [PATCH 4/8] Replace README integrations generator with C# file-based
app
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
---
.../workflows/readme-integrations-check.yml | 9 +-
eng/scripts/generate-readme-integrations.cs | 227 ++++++++++++++++++
eng/scripts/generate-readme-integrations.py | 167 -------------
3 files changed, 229 insertions(+), 174 deletions(-)
create mode 100644 eng/scripts/generate-readme-integrations.cs
delete mode 100755 eng/scripts/generate-readme-integrations.py
diff --git a/.github/workflows/readme-integrations-check.yml b/.github/workflows/readme-integrations-check.yml
index c49cba7e9..91f64b9d4 100644
--- a/.github/workflows/readme-integrations-check.yml
+++ b/.github/workflows/readme-integrations-check.yml
@@ -6,7 +6,7 @@ on:
- README.md
- src/**/CommunityToolkit.Aspire*.csproj
- src/CommunityToolkit.Aspire*/README.md
- - eng/scripts/generate-readme-integrations.py
+ - eng/scripts/generate-readme-integrations.cs
- .github/workflows/readme-integrations-check.yml
jobs:
@@ -20,10 +20,5 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- - name: Set up Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.x'
-
- name: Verify README integrations table is up to date
- run: python eng/scripts/generate-readme-integrations.py --check
+ run: dotnet run eng/scripts/generate-readme-integrations.cs -- --check
diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs
new file mode 100644
index 000000000..6c3a1dcef
--- /dev/null
+++ b/eng/scripts/generate-readme-integrations.cs
@@ -0,0 +1,227 @@
+#!/usr/bin/env dotnet run
+
+using System.Diagnostics;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Xml.Linq;
+
+const string TableStart = "";
+const string TableEnd = "";
+
+bool checkOnly = args.Contains("--check", StringComparer.OrdinalIgnoreCase);
+string repoRoot = FindRepoRoot();
+string readmePath = Path.Combine(repoRoot, "README.md");
+
+List integrations = LoadIntegrations(repoRoot);
+string table = RenderTable(integrations);
+
+string existing = File.ReadAllText(readmePath);
+string updated = UpdateReadme(existing, table);
+
+if (checkOnly)
+{
+ if (!string.Equals(existing, updated, StringComparison.Ordinal))
+ {
+ Console.WriteLine("README integrations table is out of date.");
+ Console.WriteLine("Run: dotnet run eng/scripts/generate-readme-integrations.cs");
+ Console.WriteLine(CreateDiff(existing, updated));
+ return 1;
+ }
+
+ Console.WriteLine("README integrations table is up to date.");
+ return 0;
+}
+
+if (!string.Equals(existing, updated, StringComparison.Ordinal))
+{
+ File.WriteAllText(readmePath, updated);
+ Console.WriteLine("Updated README integrations table.");
+}
+else
+{
+ Console.WriteLine("README integrations table already up to date.");
+}
+
+return 0;
+
+static string FindRepoRoot()
+{
+ string? current = Directory.GetCurrentDirectory();
+
+ while (current is not null)
+ {
+ if (File.Exists(Path.Combine(current, "README.md")) &&
+ Directory.Exists(Path.Combine(current, "src")))
+ {
+ return current;
+ }
+
+ DirectoryInfo? parent = Directory.GetParent(current);
+ current = parent?.FullName;
+ }
+
+ throw new InvalidOperationException("Unable to locate repository root.");
+}
+
+static List LoadIntegrations(string repoRoot)
+{
+ List integrations = [];
+ Regex deprecationRegex = new(@"\bdeprecation notice\b|\bthis (?:package|integration) is deprecated(?:\b| as of)", RegexOptions.IgnoreCase);
+
+ foreach (string projectPath in Directory.EnumerateFiles(Path.Combine(repoRoot, "src"), "CommunityToolkit.Aspire*.csproj", SearchOption.AllDirectories).OrderBy(static path => path, StringComparer.OrdinalIgnoreCase))
+ {
+ XDocument project = XDocument.Load(projectPath);
+ string packageId = ReadProperty(project, "PackageId") ?? Path.GetFileNameWithoutExtension(projectPath);
+ string? description = ReadProperty(project, "Description");
+ if (string.IsNullOrWhiteSpace(description))
+ {
+ continue;
+ }
+
+ string readmePath = Path.Combine(Path.GetDirectoryName(projectPath)!, "README.md");
+ string readmeRelativePath = File.Exists(readmePath)
+ ? Path.GetRelativePath(repoRoot, readmePath).Replace('\\', '/')
+ : string.Empty;
+
+ bool deprecated = false;
+ if (File.Exists(readmePath))
+ {
+ string readmeText = File.ReadAllText(readmePath);
+ deprecated = deprecationRegex.IsMatch(readmeText);
+ }
+
+ string normalizedDescription = description.Replace("|", "\\|", StringComparison.Ordinal);
+ if (deprecated)
+ {
+ normalizedDescription = $"⚠️ **Deprecated** — {normalizedDescription}";
+ }
+
+ string shortName = packageId.StartsWith("CommunityToolkit.Aspire.", StringComparison.Ordinal)
+ ? packageId["CommunityToolkit.Aspire.".Length..]
+ : packageId;
+
+ integrations.Add(new Integration(packageId, shortName, normalizedDescription, readmeRelativePath));
+ }
+
+ return integrations.OrderBy(static integration => integration.PackageId, StringComparer.OrdinalIgnoreCase).ToList();
+}
+
+static string? ReadProperty(XDocument project, string propertyName)
+{
+ foreach (XElement element in project.Descendants())
+ {
+ if (string.Equals(element.Name.LocalName, propertyName, StringComparison.Ordinal))
+ {
+ string value = element.Value.Trim();
+ if (!string.IsNullOrEmpty(value))
+ {
+ return value;
+ }
+ }
+ }
+
+ return null;
+}
+
+static string RenderTable(List integrations)
+{
+ List lines =
+ [
+ "| Package | Description |",
+ "| --- | --- |"
+ ];
+
+ foreach (Integration integration in integrations)
+ {
+ string docsLink = string.IsNullOrEmpty(integration.ReadmePath) ? "#" : integration.ReadmePath;
+ string package = integration.PackageId;
+ string cell = string.Join("
", new[]
+ {
+ $"- **Learn More**: [`{integration.ShortName}`]({docsLink})",
+ $"- Stable 📦: [](https://nuget.org/packages/{package}/)",
+ $"- Preview 📦: [)](https://nuget.org/packages/{package}/absoluteLatest)"
+ });
+
+ lines.Add($"| {cell} | {integration.Description} |");
+ }
+
+ return string.Join('\n', lines);
+}
+
+static string UpdateReadme(string content, string table)
+{
+ string block = $"{TableStart}\n{table}\n{TableEnd}";
+
+ if (content.Contains(TableStart, StringComparison.Ordinal) && content.Contains(TableEnd, StringComparison.Ordinal))
+ {
+ Regex pattern = new($"{Regex.Escape(TableStart)}.*?{Regex.Escape(TableEnd)}", RegexOptions.Singleline);
+ return pattern.Replace(content, block, 1);
+ }
+
+ int tableStart = content.IndexOf("| Package", StringComparison.Ordinal);
+ int sectionStart = content.IndexOf("\n## 🙌 Getting Started", StringComparison.Ordinal);
+ if (tableStart < 0)
+ {
+ throw new InvalidOperationException("Unable to locate '| Package' header in README.md");
+ }
+
+ if (sectionStart < 0)
+ {
+ throw new InvalidOperationException("Unable to locate '## 🙌 Getting Started' section in README.md");
+ }
+
+ if (sectionStart <= tableStart)
+ {
+ throw new InvalidOperationException("Integrations table appears after the getting started section in README.md");
+ }
+
+ return string.Concat(content.AsSpan(0, tableStart), block, "\n", content.AsSpan(sectionStart));
+}
+
+static string CreateDiff(string existing, string updated)
+{
+ string tempDirectory = Path.Combine(Path.GetTempPath(), "readme-integrations-diff-" + Guid.NewGuid().ToString("N"));
+ Directory.CreateDirectory(tempDirectory);
+
+ string existingPath = Path.Combine(tempDirectory, "README.md");
+ string generatedPath = Path.Combine(tempDirectory, "README.generated.md");
+ File.WriteAllText(existingPath, existing);
+ File.WriteAllText(generatedPath, updated);
+
+ try
+ {
+ ProcessStartInfo startInfo = new()
+ {
+ FileName = "git",
+ ArgumentList = { "diff", "--no-index", "--", existingPath, generatedPath },
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ UseShellExecute = false
+ };
+
+ using Process? process = Process.Start(startInfo);
+ if (process is null)
+ {
+ return "(Unable to create diff output.)";
+ }
+
+ string output = process.StandardOutput.ReadToEnd();
+ process.WaitForExit();
+
+ if (string.IsNullOrWhiteSpace(output))
+ {
+ string fallback = process.StandardError.ReadToEnd();
+ return string.IsNullOrWhiteSpace(fallback) ? "(Unable to create diff output.)" : fallback;
+ }
+
+ return output
+ .Replace(existingPath, "README.md", StringComparison.Ordinal)
+ .Replace(generatedPath, "README.md (generated)", StringComparison.Ordinal);
+ }
+ finally
+ {
+ Directory.Delete(tempDirectory, recursive: true);
+ }
+}
+
+internal sealed record Integration(string PackageId, string ShortName, string Description, string ReadmePath);
diff --git a/eng/scripts/generate-readme-integrations.py b/eng/scripts/generate-readme-integrations.py
deleted file mode 100755
index 76685f03b..000000000
--- a/eng/scripts/generate-readme-integrations.py
+++ /dev/null
@@ -1,167 +0,0 @@
-#!/usr/bin/env python3
-"""Generate the integrations table in README.md from src package projects."""
-
-from __future__ import annotations
-
-import argparse
-import difflib
-import re
-import sys
-import xml.etree.ElementTree as ET
-from dataclasses import dataclass
-from pathlib import Path
-
-TABLE_START = ""
-TABLE_END = ""
-
-
-@dataclass(frozen=True)
-class Integration:
- package_id: str
- short_name: str
- description: str
- readme_path: str
- deprecated: bool
-
-
-def _find_repo_root() -> Path:
- return Path(__file__).resolve().parents[2]
-
-
-def _read_property(tree: ET.ElementTree, name: str) -> str | None:
- for element in tree.iter():
- if element.tag.endswith(name):
- value = (element.text or "").strip()
- if value:
- return value
- return None
-
-
-def _load_integrations(repo_root: Path) -> list[Integration]:
- integrations: list[Integration] = []
-
- for project_path in sorted(repo_root.glob("src/**/CommunityToolkit.Aspire*.csproj")):
- tree = ET.parse(project_path)
- project = tree.getroot()
-
- package_id = _read_property(tree, "PackageId") or project_path.stem
- description = _read_property(tree, "Description")
- if description is None:
- continue
-
- readme = project_path.parent / "README.md"
- readme_rel = readme.relative_to(repo_root).as_posix() if readme.exists() else ""
-
- deprecated = False
- if readme.exists():
- readme_text = readme.read_text(encoding="utf-8", errors="replace")
- deprecated = bool(
- re.search(r"\bdeprecation notice\b", readme_text, re.IGNORECASE)
- or re.search(r"\bthis (?:package|integration) is deprecated(?:\b| as of)", readme_text, re.IGNORECASE)
- )
-
- if "|" in description:
- description = description.replace("|", "\\|")
-
- if deprecated:
- description = f"⚠️ **Deprecated** — {description}"
-
- short_name = package_id.removeprefix("CommunityToolkit.Aspire.")
-
- integrations.append(
- Integration(
- package_id=package_id,
- short_name=short_name,
- description=description,
- readme_path=readme_rel,
- deprecated=deprecated,
- )
- )
-
- integrations.sort(key=lambda item: item.package_id.lower())
- return integrations
-
-
-def _render_table(integrations: list[Integration]) -> str:
- lines: list[str] = [
- "| Package | Description |",
- "| --- | --- |",
- ]
-
- for integration in integrations:
- docs_link = integration.readme_path or "#"
- package = integration.package_id
- cell = "
".join(
- [
- f"- **Learn More**: [`{integration.short_name}`]({docs_link})",
- f"- Stable 📦: [](https://nuget.org/packages/{package}/)",
- f"- Preview 📦: [)](https://nuget.org/packages/{package}/absoluteLatest)",
- ]
- )
- lines.append(f"| {cell} | {integration.description} |")
-
- return "\n".join(lines)
-
-
-def _update_readme(content: str, table: str) -> str:
- block = f"{TABLE_START}\n{table}\n{TABLE_END}"
-
- if TABLE_START in content and TABLE_END in content:
- pattern = re.compile(rf"{re.escape(TABLE_START)}.*?{re.escape(TABLE_END)}", re.DOTALL)
- return pattern.sub(block, content, count=1)
-
- table_start = content.find("| Package")
- section_start = content.find("\n## 🙌 Getting Started")
- if table_start == -1:
- raise RuntimeError("Unable to locate '| Package' header in README.md")
- if section_start == -1:
- raise RuntimeError("Unable to locate '## 🙌 Getting Started' section in README.md")
- if section_start <= table_start:
- raise RuntimeError("Integrations table appears after the getting started section in README.md")
-
- return content[:table_start] + block + "\n" + content[section_start:]
-
-
-def main() -> int:
- parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument("--check", action="store_true", help="Check if README integrations table is up to date")
- args = parser.parse_args()
-
- repo_root = _find_repo_root()
- readme_path = repo_root / "README.md"
-
- integrations = _load_integrations(repo_root)
- table = _render_table(integrations)
-
- existing = readme_path.read_text(encoding="utf-8", errors="replace")
- updated = _update_readme(existing, table)
-
- if args.check:
- if existing != updated:
- diff = "".join(
- difflib.unified_diff(
- existing.splitlines(keepends=True),
- updated.splitlines(keepends=True),
- fromfile="README.md",
- tofile="README.md (generated)",
- )
- )
- print("README integrations table is out of date.")
- print("Run: python eng/scripts/generate-readme-integrations.py")
- print(diff)
- return 1
-
- print("README integrations table is up to date.")
- return 0
-
- if existing != updated:
- readme_path.write_text(updated, encoding="utf-8")
- print("Updated README integrations table.")
- else:
- print("README integrations table already up to date.")
-
- return 0
-
-
-if __name__ == "__main__":
- sys.exit(main())
From ff672274b8c5f053d4c2157643bfc7654c039d9c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 05:49:49 +0000
Subject: [PATCH 5/8] Polish C# README generator script structure
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
---
eng/scripts/generate-readme-integrations.cs | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs
index 6c3a1dcef..ed0f50485 100644
--- a/eng/scripts/generate-readme-integrations.cs
+++ b/eng/scripts/generate-readme-integrations.cs
@@ -1,7 +1,4 @@
-#!/usr/bin/env dotnet run
-
using System.Diagnostics;
-using System.Text;
using System.Text.RegularExpressions;
using System.Xml.Linq;
@@ -68,7 +65,12 @@ static List LoadIntegrations(string repoRoot)
List integrations = [];
Regex deprecationRegex = new(@"\bdeprecation notice\b|\bthis (?:package|integration) is deprecated(?:\b| as of)", RegexOptions.IgnoreCase);
- foreach (string projectPath in Directory.EnumerateFiles(Path.Combine(repoRoot, "src"), "CommunityToolkit.Aspire*.csproj", SearchOption.AllDirectories).OrderBy(static path => path, StringComparer.OrdinalIgnoreCase))
+ IEnumerable projectFiles = Directory.EnumerateFiles(
+ Path.Combine(repoRoot, "src"),
+ "CommunityToolkit.Aspire*.csproj",
+ SearchOption.AllDirectories);
+
+ foreach (string projectPath in projectFiles.OrderBy(static path => path, StringComparer.OrdinalIgnoreCase))
{
XDocument project = XDocument.Load(projectPath);
string packageId = ReadProperty(project, "PackageId") ?? Path.GetFileNameWithoutExtension(projectPath);
From 1775e4a64a5f4c53ff5a565f00344b4465bb8ce8 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 05:58:48 +0000
Subject: [PATCH 6/8] Fix github-script core redeclaration in integration
codeowner workflow
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
---
.github/workflows/integration-codeowner.yml | 4 ----
1 file changed, 4 deletions(-)
diff --git a/.github/workflows/integration-codeowner.yml b/.github/workflows/integration-codeowner.yml
index 4562423b0..826a24d41 100644
--- a/.github/workflows/integration-codeowner.yml
+++ b/.github/workflows/integration-codeowner.yml
@@ -19,8 +19,6 @@ jobs:
uses: actions/github-script@v9.0.0
with:
script: |
- const core = require('@actions/core');
-
const pr = context.payload.pull_request;
const files = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner,
@@ -101,8 +99,6 @@ jobs:
uses: actions/github-script@v9.0.0
with:
script: |
- const core = require('@actions/core');
-
const comment = context.payload.comment;
const command = comment.body.trim();
const accepted = command === '/codeowner-accept';
From ccbfca102b0a73ab7cd2ed0523283c6c11099ffc Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 10 Jul 2026 04:32:39 +0000
Subject: [PATCH 7/8] Refactor README generator table rendering to
StringBuilder
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
---
eng/scripts/generate-readme-integrations.cs | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs
index ed0f50485..f766931c4 100644
--- a/eng/scripts/generate-readme-integrations.cs
+++ b/eng/scripts/generate-readme-integrations.cs
@@ -1,4 +1,5 @@
using System.Diagnostics;
+using System.Text;
using System.Text.RegularExpressions;
using System.Xml.Linq;
@@ -127,11 +128,9 @@ static List LoadIntegrations(string repoRoot)
static string RenderTable(List integrations)
{
- List lines =
- [
- "| Package | Description |",
- "| --- | --- |"
- ];
+ StringBuilder lines = new();
+ lines.AppendLine("| Package | Description |");
+ lines.AppendLine("| --- | --- |");
foreach (Integration integration in integrations)
{
@@ -144,10 +143,10 @@ static string RenderTable(List integrations)
$"- Preview 📦: [)](https://nuget.org/packages/{package}/absoluteLatest)"
});
- lines.Add($"| {cell} | {integration.Description} |");
+ lines.AppendLine($"| {cell} | {integration.Description} |");
}
- return string.Join('\n', lines);
+ return lines.ToString().TrimEnd('\r', '\n');
}
static string UpdateReadme(string content, string table)
From d42308b1ffe3190d19b02f78084df83e51b66827 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 10 Jul 2026 04:36:20 +0000
Subject: [PATCH 8/8] Refine StringBuilder table rendering newline behavior
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
---
eng/scripts/generate-readme-integrations.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs
index f766931c4..5c1248f3a 100644
--- a/eng/scripts/generate-readme-integrations.cs
+++ b/eng/scripts/generate-readme-integrations.cs
@@ -129,8 +129,8 @@ static List LoadIntegrations(string repoRoot)
static string RenderTable(List integrations)
{
StringBuilder lines = new();
- lines.AppendLine("| Package | Description |");
- lines.AppendLine("| --- | --- |");
+ lines.Append("| Package | Description |\n");
+ lines.Append("| --- | --- |");
foreach (Integration integration in integrations)
{
@@ -143,10 +143,11 @@ static string RenderTable(List integrations)
$"- Preview 📦: [)](https://nuget.org/packages/{package}/absoluteLatest)"
});
- lines.AppendLine($"| {cell} | {integration.Description} |");
+ lines.Append('\n');
+ lines.Append($"| {cell} | {integration.Description} |");
}
- return lines.ToString().TrimEnd('\r', '\n');
+ return lines.ToString();
}
static string UpdateReadme(string content, string table)