Skip to content

Add Vercel deployment integration#1447

Draft
davidfowl wants to merge 33 commits into
mainfrom
davidfowl-vercel-deployment-integration
Draft

Add Vercel deployment integration#1447
davidfowl wants to merge 33 commits into
mainfrom
davidfowl-vercel-deployment-integration

Conversation

@davidfowl

@davidfowl davidfowl commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Closes N/A

Adds a preview CommunityToolkit.Aspire.Hosting.Vercel deployment integration for Vercel Dockerfile/container-image hosting. The integration models Vercel as an Aspire compute environment: one Aspire Vercel environment maps to one Vercel project, and every image-build resource assigned to that environment becomes a Vercel Service in that project.

Vercel docs that enable this integration

Cardinality model

  • One Aspire VercelEnvironmentResource maps to one Vercel project.
  • Every image-build workload targeting that environment becomes a Vercel Service in that project.
  • A single Vercel-targeted resource deploys as the project root service for compatibility.
  • Multiple resources in the same environment require exactly one external HTTP public root service; multiple external HTTP resources in one environment are rejected until explicit route mapping exists.
  • Internal/non-public resources in the same environment become private Vercel Services and can be shared by other services in that environment.
  • Each service gets its own VCR image repository under the environment project: vcr.vercel.com/<owner>/<project>/<service>:<tag>.
  • Same-environment endpoint URL references become Vercel service bindings; cross-environment endpoint references use deterministic production URLs and require production deployments on the referenced Vercel environment.

Code sample and Vercel deployment mapping

This sample deploys one public frontend plus one private backend into a single Vercel project.

C#:

#pragma warning disable ASPIREJAVASCRIPT001
#pragma warning disable CTASPIREVERCEL001

var builder = DistributedApplication.CreateBuilder(args);

var vercel = builder.AddVercelEnvironment("vercel")
    .WithVercelProjectName("my-frontend")
    .WithVercelProductionDeployments();

var backend = builder.AddNodeApp("backend", "../backend", "server.mjs")
    .WithEndpoint(name: "http", scheme: "http", env: "PORT", isExternal: false)
    .WithComputeEnvironment(vercel);

builder.AddNodeApp("frontend", "../frontend", "server.mjs")
    .WithEndpoint(name: "http", scheme: "http", env: "PORT", isExternal: true)
    .WithEnvironment("BACKEND_URL", backend.GetEndpoint("http"))
    .WithComputeEnvironment(vercel);

builder.Build().Run();

TypeScript:

import { createBuilder } from "./.aspire/modules/aspire.mjs";

const builder = await createBuilder();

const vercel = await builder.addVercelEnvironment("vercel");
await vercel.withVercelProjectName("my-frontend");
await vercel.withVercelProductionDeployments();

const backend = await builder.addNodeApp("backend", "../backend", "server.mjs");
await backend.withEndpoint({ name: "http", scheme: "http", env: "PORT", isExternal: false });
await backend.withComputeEnvironment(vercel);

const frontend = await builder.addNodeApp("frontend", "../frontend", "server.mjs");
await frontend.withEndpoint({ name: "http", scheme: "http", env: "PORT", isExternal: true });
await frontend.withEnvironment("BACKEND_URL", await backend.getEndpoint("http"));
await frontend.withComputeEnvironment(vercel);

await builder.build().run();
AppHost code Aspire model Vercel deployment result
AddVercelEnvironment("vercel") Adds one deployment environment. Creates/links one Vercel project for this environment.
.WithVercelProjectName("my-frontend") Sets the environment project identity. Deploys to project my-frontend; production URL is https://my-frontend.vercel.app.
.WithVercelProductionDeployments() Selects production target. Uses vercel deploy --prod and enables deterministic cross-environment production URLs.
backend with isExternal: false Private compute resource in the Vercel environment. Emits private Vercel Service backend; pushes image to vcr.vercel.com/<owner>/my-frontend/backend:<tag>.
frontend with isExternal: true Public root compute resource in the same environment. Emits public root Vercel Service frontend; pushes image to vcr.vercel.com/<owner>/my-frontend/frontend:<tag> and routes public traffic to it.
WithEnvironment("BACKEND_URL", backend.GetEndpoint("http")) Same-environment direct URL reference. Emits a Vercel service binding named BACKEND_URL, giving frontend a private URL for backend.
aspire deploy Runs the deployment pipeline from the AppHost model. Builds/pushes both images, writes one Build Output API tree, runs one vercel deploy --prebuilt, verifies with vercel inspect, and saves project state for destroy.

Mapping diagram

graph TD
    AppHost["Aspire AppHost sample"] --> Env["Vercel environment: vercel"]
    Env --> Project["Vercel project: my-frontend"]

    Project --> Frontend["Service: frontend<br/>public root<br/>external HTTP endpoint"]
    Project --> Backend["Service: backend<br/>private/internal HTTP endpoint"]

    Frontend -- "BACKEND_URL service binding" --> Backend
    Project --> Route["Build Output route<br/>/* -> frontend"]
    Project --> VCR["VCR project repository<br/>vcr.vercel.com/&lt;owner&gt;/my-frontend"]
    VCR --> FrontendImage["/frontend:&lt;tag&gt;<br/>linux/amd64 digest pinned"]
    VCR --> BackendImage["/backend:&lt;tag&gt;<br/>linux/amd64 digest pinned"]
    Project --> Deploy["vercel deploy --prebuilt --prod"]
    Deploy --> Url["https://my-frontend.vercel.app"]
Loading

Additional usage samples

Deploy a .NET project with AddProject

C#:

#pragma warning disable CTASPIREVERCEL001

var builder = DistributedApplication.CreateBuilder(args);

var vercel = builder.AddVercelEnvironment("vercel")
    .WithVercelProductionDeployments();

builder.AddProject<Projects.ApiService>("api")
    .WithEndpoint(name: "http", scheme: "http", env: "PORT", isExternal: true)
    .WithComputeEnvironment(vercel);

builder.Build().Run();

TypeScript:

import { createBuilder } from "./.aspire/modules/aspire.mjs";

const builder = await createBuilder();

const vercel = await builder.addVercelEnvironment("vercel");
await vercel.withVercelProductionDeployments();

const api = await builder.addProject("api", "../ApiService/ApiService.csproj");
await api.withEndpoint({ name: "http", scheme: "http", env: "PORT", isExternal: true });
await api.withComputeEnvironment(vercel);

await builder.build().run();

Deploy a Node.js app with AddNodeApp

C#:

#pragma warning disable ASPIREJAVASCRIPT001
#pragma warning disable CTASPIREVERCEL001

var builder = DistributedApplication.CreateBuilder(args);

var vercel = builder.AddVercelEnvironment("vercel")
    .WithVercelProductionDeployments();

builder.AddNodeApp("api", "../api", "server.mjs")
    .WithEndpoint(name: "http", scheme: "http", env: "PORT", isExternal: true)
    .WithComputeEnvironment(vercel);

builder.Build().Run();

TypeScript:

import { createBuilder } from "./.aspire/modules/aspire.mjs";

const builder = await createBuilder();

const vercel = await builder.addVercelEnvironment("vercel");
await vercel.withVercelProductionDeployments();

const api = await builder.addNodeApp("api", "../api", "server.mjs");
await api.withEndpoint({ name: "http", scheme: "http", env: "PORT", isExternal: true });
await api.withComputeEnvironment(vercel);

await builder.build().run();

Deploy a Next.js app with AddNextJsApp

C#:

#pragma warning disable ASPIREJAVASCRIPT001
#pragma warning disable CTASPIREVERCEL001

var builder = DistributedApplication.CreateBuilder(args);

var vercel = builder.AddVercelEnvironment("vercel")
    .WithVercelProductionDeployments();

builder.AddNextJsApp("web", "../web")
    .WithExternalHttpEndpoints()
    .WithComputeEnvironment(vercel);

builder.Build().Run();

TypeScript:

import { createBuilder } from "./.aspire/modules/aspire.mjs";

const builder = await createBuilder();

const vercel = await builder.addVercelEnvironment("vercel");
await vercel.withVercelProductionDeployments();

const web = await builder.addNextJsApp("web", "../web");
await web.withExternalHttpEndpoints();
await web.withComputeEnvironment(vercel);

await builder.build().run();

Customize the Vercel project name

C#:

var vercel = builder.AddVercelEnvironment("vercel")
    .WithVercelProjectName("my-api");

builder.AddNodeApp("api", "../api", "server.mjs")
    .WithEndpoint(name: "http", scheme: "http", env: "PORT", isExternal: true)
    .WithComputeEnvironment(vercel);

TypeScript:

const vercel = await builder.addVercelEnvironment("vercel");
await vercel.withVercelProjectName("my-api");

const api = await builder.addNodeApp("api", "../api", "server.mjs");
await api.withEndpoint({ name: "http", scheme: "http", env: "PORT", isExternal: true });
await api.withComputeEnvironment(vercel);

Linked projects with .vercel/project.json keep their existing Vercel identity. If multiple targeted source roots are linked, they must all resolve to the same Vercel project because the environment maps to one project.

Implementation notes

  • Project identity: VercelEnvironmentResource owns the Vercel project name/link. Environment-level WithVercelProjectName is the supported API; the old resource-level C# method is retained as a non-exported compatibility method and deployment validation tells users to move the setting to the environment.
  • Grouping: VercelDeploymentProjectGrouper builds one deployment group per Vercel environment. Single-resource deployments remain compatible. Multi-resource deployments require exactly one public root service; the rest become private services in the same project.
  • Publish vs deploy: aspire publish writes a deterministic vercel-deployments.json plan with command shape and environment variable names. aspire deploy resolves values, mutates Vercel, pushes images, writes Build Output API files, deploys prebuilt output, and saves state.
  • Pipeline: aspire deploy --list-steps shows vercel-prepare-project-*, Aspire build-*/push-*, vercel-generate-plan-*, and vercel-deploy-prebuilt-*. The Vercel prepare step runs before Aspire push validation so VCR registry annotations are available to built-in image push steps.
  • Build Output API: Deploy writes one .vercel/output tree for the environment project with root routes, experimentalServicesV2, service manifests, service bindings, and per-service container function configs under .vercel/output/services/<service>/functions/index.func/.vc-config.json.
  • Images: Aspire build/push produces one VCR image per service under the project repository. Deploy resolves each tag to a concrete linux/amd64 digest before writing the container handler, because Vercel Container Images rejected OCI index digests in live validation.
  • Environment variables: Non-secret per-service values go into generated function config. Secret parameters, connection strings, and secret-containing composite values are configured as sensitive Vercel project environment variables through vercel env add --sensitive over stdin.
  • Endpoint references: Same-environment direct URL endpoint references become service bindings. Cross-environment references use deterministic production project URLs and are rejected for preview/custom targets.
  • State/destroy: Deployment state is keyed by Vercel environment project name. Destroy uses saved state, preserves linked/unmanaged projects, removes only Aspire-managed projects, and clears state after successful removal.

Expected failure modes

These failures are validated during aspire publish/deploy preflight before provider mutation so users and agents get a concrete AppHost fix. Deploy preflight validates every Vercel environment in the AppHost before any one environment creates or links a provider project.

Error condition Guidance
Multiple public HTTP resources in one Vercel environment Keep exactly one public workload in that environment, or split public workloads into separate AddVercelEnvironment(...) resources with WithComputeEnvironment(...).
Multiple resources in one environment but no public root Mark exactly one workload public with WithEndpoint(..., isExternal: true) or WithExternalHttpEndpoints(), or deploy only one resource.
Resource-level WithVercelProjectName Move project naming to builder.AddVercelEnvironment("vercel").WithVercelProjectName("my-project").
Multiple linked .vercel/project.json project IDs in one environment Use one Vercel environment per linked project, or remove extra source-root links.
Same-project endpoint reference requests Host/Port instead of a URL Use a direct URL-valued binding such as WithEnvironment("BACKEND_URL", backend.GetEndpoint("http")), or split environments if host/port properties are required.
Cross-environment endpoint reference targets preview/custom deploys Use WithVercelProductionDeployments() on the referenced Vercel environment, or keep services in the same environment and use service bindings.
Two services define the same secret env var name with different values Use distinct names, the same parameter/value, or non-secret per-service values because Vercel project env vars are shared by every service in the project.

Included

  • New CommunityToolkit.Aspire.Hosting.Vercel package with Vercel environment APIs, environment-project naming, Vercel CLI execution, VCR setup, Build Output API generation, deploy, and destroy support.
  • One prepare/login/pull flow per Vercel environment project, with one VCR repository per service.
  • Generated Build Output API layout for Vercel Services, including root routes, experimentalServicesV2, service manifests, container function configs, non-secret env vars, and service bindings.
  • Validation for multiple public roots in one environment, multiple linked projects in one environment, linked/configured project-name conflicts, unsupported endpoint properties, duplicate service names, and project-scoped secret environment variable collisions.
  • README/docs updates covering the environment/project/service mapping, public routing, private services, VCR path shape, pipeline steps, prerequisites, limitations, and validation boundary.
  • TypeScript AppHost exports and Vercel examples.

Validation

  • dotnet build src/CommunityToolkit.Aspire.Hosting.Vercel/CommunityToolkit.Aspire.Hosting.Vercel.csproj --nologo
  • dotnet test tests/CommunityToolkit.Aspire.Hosting.Vercel.Tests/CommunityToolkit.Aspire.Hosting.Vercel.Tests.csproj --no-restore
    • total: 151
    • succeeded: 150
    • skipped: 1 (pwsh unavailable for the TypeScript AppHost start smoke)
  • git diff --check
  • Real post-environment-project Vercel E2E smoke:
    • Scratch AppHost: /Users/davidfowler/.copilot/session-state/28b8f56e-6de0-47f7-a45d-1fda1ba0f978/files/vercel-cardinality-e2e-20260703202823.
    • aspire deploy --list-steps --non-interactive showed one vercel-prepare-project-vercel, two build/push paths, and one vercel-deploy-prebuilt-vercel.
    • aspire deploy --non-interactive deployed one environment project: ct-vercel-card-e2e-20260703202823.
    • Verified VCR pushes used one project-scoped repository with service leaves /backend:<tag> and /frontend:<tag>.
    • Verified vercel inspect --format=json returned READY.
    • Verified the public production URL returned frontend JSON and called the private backend through the BACKEND_URL Vercel service binding.
    • Regenerated aspire publish --non-interactive -o publish-env-project-rerun output and verified both service entries use the same <vercel-project> placeholder.
    • Destroyed with aspire destroy --non-interactive --yes and verified Vercel no longer listed the project.
  • Real three-service Vercel E2E smoke:
    • Scratch AppHost: /Users/davidfowler/.copilot/session-state/28b8f56e-6de0-47f7-a45d-1fda1ba0f978/files/vercel-multi-service-e2e-202607032213.
    • aspire deploy --list-steps --non-interactive showed one project prepare step, three parallel build/push paths, and one prebuilt deploy.
    • aspire deploy --non-interactive deployed one project: ct-vercel-multi-e2e-202607032213.
    • Verified VCR pushes used one project-scoped repository with /backend:<tag>, /frontend:<tag>, and /worker:<tag>.
    • Verified the production URL returned frontend JSON and reached both private services through BACKEND_URL and WORKER_URL Vercel service-binding URLs.
    • Verified vercel inspect --format=json returned READY and three container service outputs: services/backend/index, services/frontend/index, and services/worker/index.
    • Destroyed with aspire destroy --non-interactive --yes and verified vercel project inspect reported no project for ct-vercel-multi-e2e-202607032213.
  • CLI E2E error/deploy matrix:
    • Scratch publish matrix AppHost: /Users/davidfowler/.copilot/session-state/28b8f56e-6de0-47f7-a45d-1fda1ba0f978/files/vercel-e2e-error-matrix.
    • Scratch deploy matrix AppHost: /Users/davidfowler/.copilot/session-state/28b8f56e-6de0-47f7-a45d-1fda1ba0f978/files/vercel-deploy-error-matrix-202607032224.
    • Ran invalid scenarios through real aspire deploy --non-interactive: multiple public roots, no public root, resource-level project naming, same-project host-property references, cross-environment preview references, and multiple linked projects.
    • The first deploy-level run found provider projects could be created before later validation failures for same-project host-property and cross-environment preview reference cases.
    • Fixed prereq ordering so every Vercel environment's deployment configuration is validated before any environment creates/links a provider project.
    • Reran the deploy-level matrix and verified every invalid scenario failed with the expected guidance and every generated Vercel project name was absent afterward.

PR Checklist

  • Created a feature/dev branch in your fork (vs. submitting directly from a commit on main)
  • Based off latest main branch of toolkit
  • PR doesn't include merge commits (always rebase on top of our main, if needed)
  • New integration
    • Docs are written
    • Added description of major feature to project description for NuGet package (4000 total character limit, so don't push entire description over that)
  • Tests for the changes have been added (for bug fixes / features) (if applicable)
  • Contains NO breaking changes
  • Every new API (including internal ones) has full XML docs
  • Code follows all style conventions

Adds a preview Vercel hosting integration for Dockerfile-based deployments, including publish/deploy/destroy pipeline steps, execution configuration processing, TypeScript AppHost exports, docs, examples, and tests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@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/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.sh | bash -s -- 1447

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.ps1) } 1447"

@davidfowl davidfowl temporarily deployed to azure-artifacts June 30, 2026 18:10 — with GitHub Actions Inactive
Adds focused unit coverage for Vercel pipeline step registration, deploy and destroy flows, CLI prerequisite handling, deployment state fallback, and API overloads.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts June 30, 2026 19:34 — with GitHub Actions Inactive
davidfowl and others added 2 commits June 30, 2026 12:54
Refactor Vercel deployments to consume Aspire Dockerfile build annotations instead of Vercel-specific source root and Dockerfile settings. Stage generated or non-default Dockerfiles as Dockerfile before invoking the Vercel CLI, and update tests/docs/examples for the new model.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Update the Vercel example and docs to use Aspire language workload integrations instead of requiring app-authored Dockerfiles. Make PublishAsVercel work for executable-derived language resources that already registered generated Dockerfile metadata.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts June 30, 2026 20:11 — with GitHub Actions Inactive
Remove the Vercel-specific PublishAsVercel marker API and discover Dockerfile-backed compute resources through Aspire's compute environment targeting model. Vercel now uses the single compute environment default and WithComputeEnvironment for ambiguous AppHosts while continuing to consume existing Dockerfile publish metadata from language and project integrations.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts June 30, 2026 20:26 — with GitHub Actions Inactive
Use the standard vercel executable from PATH for deploy and destroy instead of modeling CLI path configuration in the AppHost API.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts June 30, 2026 20:37 — with GitHub Actions Inactive
davidfowl and others added 5 commits June 30, 2026 16:21
Add state-safe deploy/destroy behavior, Vercel inspect verification, staging safeguards, explicit unsupported-feature validation, TypeScript publish coverage, and CI matrix compatibility for the Vercel deployment target.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Make destroy state-first, persist Vercel deployment state incrementally, validate managed project-name uniqueness, and require explicit verified deployment outputs before saving state.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts July 1, 2026 01:04 — with GitHub Actions Inactive
davidfowl and others added 3 commits June 30, 2026 22:10
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts July 1, 2026 05:39 — with GitHub Actions Inactive
davidfowl and others added 8 commits June 30, 2026 22:41
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Break the Vercel deployment implementation into focused partial files for orchestration, plan generation, CLI handling, state, Build Output/VCR setup, environment mapping, model validation, and shared types.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts July 3, 2026 06:37 — with GitHub Actions Inactive
davidfowl and others added 3 commits July 2, 2026 23:41
Move Vercel CLI arguments, output parsing, Docker digest parsing, project naming, Build Output generation, environment mapping, deployment model validation, plan writing, and state handling into focused internal components while keeping the deployment step as the Aspire pipeline coordinator.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Remove the compatibility helper facade so tests exercise the extracted components directly. Centralize shared Vercel protocol constants, remove trivial wrappers, and keep state serialization in the state store.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Replace the loose VercelJson helper with typed DTOs for Vercel CLI, project settings, OIDC token, and Docker manifest JSON shapes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@davidfowl davidfowl temporarily deployed to azure-artifacts July 3, 2026 08:13 — with GitHub Actions Inactive
davidfowl and others added 6 commits July 3, 2026 10:26
Add focused comments and Vercel documentation links for CLI JSON shapes, Build Output API deployment, project linking, generated URLs, VCR auth, and secret environment handling.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add class-level purpose comments across the Vercel deployment components so future maintainers can quickly see each unit's responsibility and why it exists.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Stop rejecting Aspire wait relationships for Vercel deployments and cover the behavior with a deployment-plan regression test.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Stop rejecting Aspire replica annotations for Vercel deployments and cover the behavior with a deployment-plan regression test.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Stop rejecting Aspire health check annotations for Vercel deployments while continuing to reject container and endpoint probes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Replace the standalone Vercel CLI argument bag helper with typed Vercel and Docker runner operations, keeping raw process execution private to the concrete runner and updating tests to exercise the typed seam.

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

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Code Coverage

Package Line Rate Branch Rate Complexity Health
CommunityToolkit.Aspire.Bitwarden.SecretManager 54% 38% 52
CommunityToolkit.Aspire.DuckDB.Api 99% 100% 13
CommunityToolkit.Aspire.DuckDB.NET.Data 67% 77% 32
CommunityToolkit.Aspire.GoFeatureFlag 100% 97% 44
CommunityToolkit.Aspire.Hosting.ActiveMQ 88% 48% 95
CommunityToolkit.Aspire.Hosting.ActiveMQ.MassTransit 100% 100% 15
CommunityToolkit.Aspire.Hosting.Adminer 89% 70% 20
CommunityToolkit.Aspire.Hosting.Azure.Dapr 28% 5% 38
CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis 56% 46% 26
CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder 85% 83% 18
CommunityToolkit.Aspire.Hosting.Azure.Extensions 64% 30% 27
CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager 59% 51% 777
CommunityToolkit.Aspire.Hosting.Bun 88% 69% 20
CommunityToolkit.Aspire.Hosting.Dapr 43% 25% 648
CommunityToolkit.Aspire.Hosting.DbGate 96% 62% 12
CommunityToolkit.Aspire.Hosting.Dbx 94% 59% 68
CommunityToolkit.Aspire.Hosting.Deno 95% 85% 24
CommunityToolkit.Aspire.Hosting.DuckDB 98% 90% 16
CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions 100% 94% 30
CommunityToolkit.Aspire.Hosting.Flagd 80% 100% 16
CommunityToolkit.Aspire.Hosting.Flyway 88% 100% 6
CommunityToolkit.Aspire.Hosting.GoFeatureFlag 80% 50% 24
CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ApiService 100% 100% 3
CommunityToolkit.Aspire.Hosting.Java 86% 75% 207
CommunityToolkit.Aspire.Hosting.Java.ApiApp 65% 50% 11
CommunityToolkit.Aspire.Hosting.Java.WebApp 25% 18% 59
CommunityToolkit.Aspire.Hosting.JavaScript.Extensions 92% 83% 190
CommunityToolkit.Aspire.Hosting.K3s 76% 58% 316
CommunityToolkit.Aspire.Hosting.k6 70% 10% 8
CommunityToolkit.Aspire.Hosting.k6.ApiService 64% 67% 13
CommunityToolkit.Aspire.Hosting.Keycloak.Extensions 100% 100% 11
CommunityToolkit.Aspire.Hosting.KurrentDB 86% 88% 19
CommunityToolkit.Aspire.Hosting.LavinMQ 90% 83% 18
CommunityToolkit.Aspire.Hosting.LavinMQ.MassTransit 100% 100% 15
CommunityToolkit.Aspire.Hosting.Logto 73% 67% 24
CommunityToolkit.Aspire.Hosting.MailPit 91% 100% 13
CommunityToolkit.Aspire.Hosting.McpInspector 85% 60% 100
CommunityToolkit.Aspire.Hosting.McpInspector.McpServer 89% 100% 2
CommunityToolkit.Aspire.Hosting.Meilisearch 95% 85% 30
CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService 82% 100% 15
CommunityToolkit.Aspire.Hosting.Minio 99% 91% 32
CommunityToolkit.Aspire.Hosting.Minio.ApiService 98% 92% 15
CommunityToolkit.Aspire.Hosting.MongoDB.Extensions 88% 81% 18
CommunityToolkit.Aspire.Hosting.MySql.Extensions 94% 88% 44
CommunityToolkit.Aspire.Hosting.Ngrok 55% 43% 106
CommunityToolkit.Aspire.Hosting.Ollama 77% 67% 267
CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector 79% 70% 42
CommunityToolkit.Aspire.Hosting.PapercutSmtp 100% 100% 9
CommunityToolkit.Aspire.Hosting.Perl 85% 76% 745
CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions 91% 87% 54
CommunityToolkit.Aspire.Hosting.PowerShell 76% 59% 107
CommunityToolkit.Aspire.Hosting.Python.Extensions 46% 31% 44
CommunityToolkit.Aspire.Hosting.RavenDB 63% 46% 118
CommunityToolkit.Aspire.Hosting.RavenDB.ApiService 6% 0% 16
CommunityToolkit.Aspire.Hosting.Redis.Extensions 92% 68% 22
CommunityToolkit.Aspire.Hosting.Rust 96% 90% 13
CommunityToolkit.Aspire.Hosting.RustFs 83% 66% 108
CommunityToolkit.Aspire.Hosting.SeaweedFS 88% 80% 49
CommunityToolkit.Aspire.Hosting.Sftp 90% 62% 15
CommunityToolkit.Aspire.Hosting.Sftp.ApiService 94% 100% 10
CommunityToolkit.Aspire.Hosting.Solr 88% 100% 19
CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects 68% 59% 146
CommunityToolkit.Aspire.Hosting.Sqlite 88% 93% 25
CommunityToolkit.Aspire.Hosting.SqlServer.Extensions 86% 79% 48
CommunityToolkit.Aspire.Hosting.Squad 90% 78% 82
CommunityToolkit.Aspire.Hosting.Stripe 50% 17% 119
CommunityToolkit.Aspire.Hosting.SurrealDb 89% 74% 208
CommunityToolkit.Aspire.Hosting.SurrealDb.ApiService 85% 62% 236
CommunityToolkit.Aspire.Hosting.Umami 98% 75% 9
CommunityToolkit.Aspire.Hosting.Vercel 86% 74% 1280
CommunityToolkit.Aspire.Hosting.Zitadel 97% 86% 31
CommunityToolkit.Aspire.KurrentDB 97% 95% 33
CommunityToolkit.Aspire.Logto.Client 53% 62% 38
CommunityToolkit.Aspire.MassTransit.RabbitMQ 100% 100% 24
CommunityToolkit.Aspire.Meilisearch 97% 96% 38
CommunityToolkit.Aspire.Microsoft.Data.Sqlite 94% 85% 26
CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite 71% 73% 117
CommunityToolkit.Aspire.Minio.Client 93% 87% 67
CommunityToolkit.Aspire.OllamaSharp 78% 74% 76
CommunityToolkit.Aspire.RavenDB.Client 89% 73% 87
CommunityToolkit.Aspire.SeaweedFS.Client 95% 86% 93
CommunityToolkit.Aspire.Sftp 94% 94% 54
CommunityToolkit.Aspire.Sqlite.Api 93% 93% 68
CommunityToolkit.Aspire.SurrealDb 87% 73% 40
SeaweedFS.ApiService 100% 100% 15
Summary 77% (13761 / 17912) 64% (4119 / 6473) 7888

@davidfowl davidfowl deployed to azure-artifacts July 3, 2026 19:01 — with GitHub Actions Active
Map public Aspire workloads to Vercel projects and referenced private workloads to Vercel services. Generate service-aware Build Output API artifacts, push service-scoped VCR images, and validate unsupported grouping shapes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant